aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/acpi/Kconfig2
-rw-r--r--drivers/acpi/nfit/core.c19
-rw-r--r--drivers/acpi/nfit/mce.c8
-rw-r--r--drivers/ata/libata-core.c2
-rw-r--r--drivers/ata/sata_rcar.c6
-rw-r--r--drivers/block/floppy.c3
-rw-r--r--drivers/block/xen-blkfront.c1
-rw-r--r--drivers/clk/clk-fixed-factor.c1
-rw-r--r--drivers/clk/meson/axg.c13
-rw-r--r--drivers/clk/meson/gxbb.c12
-rw-r--r--drivers/clk/qcom/gcc-qcs404.c2
-rw-r--r--drivers/clocksource/i8253.c14
-rw-r--r--drivers/cpufreq/imx6q-cpufreq.c7
-rw-r--r--drivers/cpuidle/cpuidle-arm.c40
-rw-r--r--drivers/crypto/hisilicon/sec/sec_algs.c31
-rw-r--r--drivers/firmware/efi/arm-init.c4
-rw-r--r--drivers/firmware/efi/arm-runtime.c2
-rw-r--r--drivers/firmware/efi/efi.c35
-rw-r--r--drivers/firmware/efi/libstub/arm-stub.c3
-rw-r--r--drivers/firmware/efi/libstub/fdt.c4
-rw-r--r--drivers/firmware/efi/memmap.c3
-rw-r--r--drivers/firmware/efi/runtime-wrappers.c2
-rw-r--r--drivers/gpu/drm/Makefile2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/Makefile3
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c25
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c25
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c120
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c33
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c117
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h39
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c39
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c11
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h54
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c49
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c21
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c25
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h8
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c223
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h61
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c28
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h8
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c282
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.h98
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c28
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h15
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c105
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c18
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c38
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c100
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c140
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h13
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c18
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c36
-rw-r--r--drivers/gpu/drm/amd/amdgpu/ci_dpm.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik_sdma.c66
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c144
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c276
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c351
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c382
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c25
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c110
-rw-r--r--drivers/gpu/drm/amd/amdgpu/kv_dpm.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c25
-rw-r--r--drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/psp_v11_0.c141
-rw-r--r--drivers/gpu/drm/amd/amdgpu/psp_v3_1.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c69
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c69
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c702
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si_dma.c68
-rw-r--r--drivers/gpu/drm/amd/amdgpu/ta_xgmi_if.h130
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c29
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c28
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c76
-rw-r--r--drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c74
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v2_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v3_0.c13
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v4_0.c15
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c42
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vega10_ih.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c1
-rw-r--r--drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c3
-rw-r--r--drivers/gpu/drm/amd/amdkfd/cik_regs.h2
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_chardev.c21
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_crat.c9
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_device.c12
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c24
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c3
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c5
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_pasid.c5
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_priv.h1
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_process.c34
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_topology.c10
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c183
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h78
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c2
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c5
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c115
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c79
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h1
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c20
-rw-r--r--drivers/gpu/drm/amd/display/dc/bios/bios_parser.c2
-rw-r--r--drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c2
-rw-r--r--drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.c93
-rw-r--r--drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.h4
-rw-r--r--drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c32
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc.c60
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_debug.c7
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link.c59
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_resource.c76
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_stream.c1
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_surface.c1
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc.h10
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_bios_types.h5
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_link.h11
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/Makefile2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_abm.c104
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c879
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.h (renamed from drivers/gpu/drm/amd/display/dc/dce/dce_clocks.h)105
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c947
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h52
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c73
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h5
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c25
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c282
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h11
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c33
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c39
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c20
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c3
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c41
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/Makefile2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c379
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.h37
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c253
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c163
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h20
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c8
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c17
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c32
-rw-r--r--drivers/gpu/drm/amd/display/dc/dm_pp_smu.h28
-rw-r--r--drivers/gpu/drm/amd/display/dc/dm_services_types.h18
-rw-r--r--drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h3
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/core_types.h5
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/abm.h12
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h (renamed from drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h)34
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h44
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h16
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h3
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h4
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h20
-rw-r--r--drivers/gpu/drm/amd/display/dc/inc/resource.h3
-rw-r--r--drivers/gpu/drm/amd/display/modules/color/color_gamma.c186
-rw-r--r--drivers/gpu/drm/amd/display/modules/color/color_gamma.h11
-rw-r--r--drivers/gpu/drm/amd/display/modules/freesync/freesync.c37
-rw-r--r--drivers/gpu/drm/amd/include/amd_shared.h4
-rw-r--r--drivers/gpu/drm/amd/include/atomfirmware.h7
-rw-r--r--drivers/gpu/drm/amd/include/kgd_kfd_interface.h115
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/smu7_powertune.c12
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c32
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c36
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c192
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h1
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/hwmgr.h1
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/smu7_common.h4
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h3
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c1
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/smu10_smumgr.c1
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c49
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c3
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c1
-rw-r--r--drivers/gpu/drm/ast/ast_drv.h2
-rw-r--r--drivers/gpu/drm/ast/ast_ttm.c64
-rw-r--r--drivers/gpu/drm/bochs/bochs.h2
-rw-r--r--drivers/gpu/drm/bochs/bochs_mm.c61
-rw-r--r--drivers/gpu/drm/cirrus/cirrus_drv.h2
-rw-r--r--drivers/gpu/drm/cirrus/cirrus_ttm.c64
-rw-r--r--drivers/gpu/drm/drm_atomic.c5
-rw-r--r--drivers/gpu/drm/drm_atomic_helper.c4
-rw-r--r--drivers/gpu/drm/drm_atomic_uapi.c4
-rw-r--r--drivers/gpu/drm/drm_connector.c41
-rw-r--r--drivers/gpu/drm/drm_dp_helper.c90
-rw-r--r--drivers/gpu/drm/drm_dp_mst_topology.c3
-rw-r--r--drivers/gpu/drm/drm_drv.c2
-rw-r--r--drivers/gpu/drm/drm_global.c137
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_sched.c7
-rw-r--r--drivers/gpu/drm/exynos/exynos5433_drm_decon.c9
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_crtc.c11
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_drv.h1
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_dsi.c14
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fbdev.c2
-rw-r--r--drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h2
-rw-r--r--drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c57
-rw-r--r--drivers/gpu/drm/i915/Makefile6
-rw-r--r--drivers/gpu/drm/i915/gvt/gtt.c115
-rw-r--r--drivers/gpu/drm/i915/gvt/gtt.h10
-rw-r--r--drivers/gpu/drm/i915/gvt/handlers.c8
-rw-r--r--drivers/gpu/drm/i915/gvt/mmio_context.c2
-rw-r--r--drivers/gpu/drm/i915/gvt/scheduler.c28
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c241
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c113
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h241
-rw-r--r--drivers/gpu/drm/i915/i915_fixed.h143
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c67
-rw-r--r--drivers/gpu/drm/i915/i915_gem.h4
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c13
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.h1
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c9
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c251
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.h47
-rw-r--r--drivers/gpu/drm/i915/i915_gpu_error.c33
-rw-r--r--drivers/gpu/drm/i915/i915_gpu_error.h8
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c83
-rw-r--r--drivers/gpu/drm/i915/i915_oa_bdw.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_bdw.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_bxt.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_bxt.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_cflgt2.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_cflgt2.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_cflgt3.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_cflgt3.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_chv.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_chv.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_cnl.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_cnl.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_glk.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_glk.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_hsw.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_hsw.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_icl.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_icl.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_kblgt2.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_kblgt2.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_kblgt3.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_kblgt3.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_sklgt2.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_sklgt2.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_sklgt3.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_sklgt3.h27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_sklgt4.c27
-rw-r--r--drivers/gpu/drm/i915/i915_oa_sklgt4.h27
-rw-r--r--drivers/gpu/drm/i915/i915_params.c9
-rw-r--r--drivers/gpu/drm/i915/i915_params.h1
-rw-r--r--drivers/gpu/drm/i915/i915_pci.c71
-rw-r--r--drivers/gpu/drm/i915/i915_perf.c49
-rw-r--r--drivers/gpu/drm/i915/i915_query.c3
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h822
-rw-r--r--drivers/gpu/drm/i915/i915_request.c118
-rw-r--r--drivers/gpu/drm/i915/i915_request.h13
-rw-r--r--drivers/gpu/drm/i915/i915_scheduler.c399
-rw-r--r--drivers/gpu/drm/i915/i915_scheduler.h36
-rw-r--r--drivers/gpu/drm/i915/i915_syncmap.c2
-rw-r--r--drivers/gpu/drm/i915/i915_timeline.h19
-rw-r--r--drivers/gpu/drm/i915/i915_utils.h2
-rw-r--r--drivers/gpu/drm/i915/i915_vma.c8
-rw-r--r--drivers/gpu/drm/i915/icl_dsi.c858
-rw-r--r--drivers/gpu/drm/i915/intel_atomic.c118
-rw-r--r--drivers/gpu/drm/i915/intel_atomic_plane.c118
-rw-r--r--drivers/gpu/drm/i915/intel_audio.c34
-rw-r--r--drivers/gpu/drm/i915/intel_bios.c89
-rw-r--r--drivers/gpu/drm/i915/intel_cdclk.c57
-rw-r--r--drivers/gpu/drm/i915/intel_color.c3
-rw-r--r--drivers/gpu/drm/i915/intel_combo_phy.c254
-rw-r--r--drivers/gpu/drm/i915/intel_connector.c (renamed from drivers/gpu/drm/i915/intel_modes.c)129
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c11
-rw-r--r--drivers/gpu/drm/i915/intel_csr.c162
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c482
-rw-r--r--drivers/gpu/drm/i915/intel_device_info.c71
-rw-r--r--drivers/gpu/drm/i915/intel_device_info.h20
-rw-r--r--drivers/gpu/drm/i915/intel_display.c1986
-rw-r--r--drivers/gpu/drm/i915/intel_display.h37
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c831
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c41
-rw-r--r--drivers/gpu/drm/i915/intel_dpio_phy.c4
-rw-r--r--drivers/gpu/drm/i915/intel_dpll_mgr.c117
-rw-r--r--drivers/gpu/drm/i915/intel_dpll_mgr.h8
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h233
-rw-r--r--drivers/gpu/drm/i915/intel_dsi.c128
-rw-r--r--drivers/gpu/drm/i915/intel_dsi.h30
-rw-r--r--drivers/gpu/drm/i915/intel_dsi_vbt.c284
-rw-r--r--drivers/gpu/drm/i915/intel_dvo.c10
-rw-r--r--drivers/gpu/drm/i915/intel_engine_cs.c31
-rw-r--r--drivers/gpu/drm/i915/intel_fbc.c10
-rw-r--r--drivers/gpu/drm/i915/intel_fbdev.c8
-rw-r--r--drivers/gpu/drm/i915/intel_guc.c45
-rw-r--r--drivers/gpu/drm/i915/intel_guc.h5
-rw-r--r--drivers/gpu/drm/i915/intel_guc_fw.c113
-rw-r--r--drivers/gpu/drm/i915/intel_guc_fwif.h41
-rw-r--r--drivers/gpu/drm/i915/intel_guc_reg.h12
-rw-r--r--drivers/gpu/drm/i915/intel_guc_submission.c216
-rw-r--r--drivers/gpu/drm/i915/intel_hdcp.c214
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c213
-rw-r--r--drivers/gpu/drm/i915/intel_hotplug.c131
-rw-r--r--drivers/gpu/drm/i915/intel_huc.c7
-rw-r--r--drivers/gpu/drm/i915/intel_lpe_audio.c4
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c328
-rw-r--r--drivers/gpu/drm/i915/intel_lspcon.c347
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c67
-rw-r--r--drivers/gpu/drm/i915/intel_opregion.c158
-rw-r--r--drivers/gpu/drm/i915/intel_opregion.h15
-rw-r--r--drivers/gpu/drm/i915/intel_overlay.c4
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c13
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c525
-rw-r--r--drivers/gpu/drm/i915/intel_psr.c248
-rw-r--r--drivers/gpu/drm/i915/intel_quirks.c169
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c45
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h24
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c358
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c56
-rw-r--r--drivers/gpu/drm/i915/intel_sprite.c737
-rw-r--r--drivers/gpu/drm/i915/intel_tv.c10
-rw-r--r--drivers/gpu/drm/i915/intel_uc.c2
-rw-r--r--drivers/gpu/drm/i915/intel_uc_fw.h7
-rw-r--r--drivers/gpu/drm/i915/intel_uncore.c2
-rw-r--r--drivers/gpu/drm/i915/intel_vbt_defs.h7
-rw-r--r--drivers/gpu/drm/i915/intel_workarounds.c46
-rw-r--r--drivers/gpu/drm/i915/selftests/huge_pages.c36
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem_context.c428
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem_evict.c2
-rw-r--r--drivers/gpu/drm/i915/selftests/i915_gem_gtt.c10
-rw-r--r--drivers/gpu/drm/i915/selftests/intel_guc.c59
-rw-r--r--drivers/gpu/drm/i915/selftests/intel_hangcheck.c7
-rw-r--r--drivers/gpu/drm/i915/selftests/intel_lrc.c267
-rw-r--r--drivers/gpu/drm/i915/selftests/mock_engine.c2
-rw-r--r--drivers/gpu/drm/i915/vlv_dsi.c190
-rw-r--r--drivers/gpu/drm/meson/meson_venc.c15
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_drv.h2
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_ttm.c64
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drv.h2
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_ttm.c67
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dsi.c22
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dss.c11
-rw-r--r--drivers/gpu/drm/omapdrm/dss/hdmi4.c37
-rw-r--r--drivers/gpu/drm/omapdrm/dss/hdmi5.c27
-rw-r--r--drivers/gpu/drm/omapdrm/dss/venc.c7
-rw-r--r--drivers/gpu/drm/omapdrm/omap_crtc.c6
-rw-r--r--drivers/gpu/drm/qxl/qxl_drv.h3
-rw-r--r--drivers/gpu/drm/qxl/qxl_ttm.c61
-rw-r--r--drivers/gpu/drm/radeon/r300.c4
-rw-r--r--drivers/gpu/drm/radeon/r420.c1
-rw-r--r--drivers/gpu/drm/radeon/radeon.h3
-rw-r--r--drivers/gpu/drm/radeon/radeon_legacy_tv.c10
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_ttm.c65
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_crtc.c30
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_drv.c31
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_kms.c2
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_du_plane.c3
-rw-r--r--drivers/gpu/drm/rcar-du/rcar_lvds.c1
-rw-r--r--drivers/gpu/drm/scheduler/sched_entity.c10
-rw-r--r--drivers/gpu/drm/scheduler/sched_main.c33
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo.c69
-rw-r--r--drivers/gpu/drm/ttm/ttm_execbuf_util.c2
-rw-r--r--drivers/gpu/drm/ttm/ttm_memory.c14
-rw-r--r--drivers/gpu/drm/v3d/v3d_sched.c5
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_drv.h3
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_ttm.c62
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.c15
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.h6
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c54
-rw-r--r--drivers/gpu/vga/vga_switcheroo.c3
-rw-r--r--drivers/hid/hid-alps.c18
-rw-r--r--drivers/hid/hid-asus.c3
-rw-r--r--drivers/hid/hid-ids.h3
-rw-r--r--drivers/hid/hid-quirks.c1
-rw-r--r--drivers/hid/i2c-hid/i2c-hid-core.c19
-rw-r--r--drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c8
-rw-r--r--drivers/hid/usbhid/hiddev.c18
-rw-r--r--drivers/hwmon/hwmon.c8
-rw-r--r--drivers/hwmon/ibmpowernv.c7
-rw-r--r--drivers/i2c/busses/Kconfig11
-rw-r--r--drivers/i2c/busses/Makefile1
-rw-r--r--drivers/i2c/busses/i2c-nvidia-gpu.c368
-rw-r--r--drivers/i2c/busses/i2c-qcom-geni.c15
-rw-r--r--drivers/leds/trigger/ledtrig-pattern.c27
-rw-r--r--drivers/mtd/devices/Kconfig2
-rw-r--r--drivers/mtd/maps/sa1100-flash.c10
-rw-r--r--drivers/mtd/nand/raw/nand_base.c1
-rw-r--r--drivers/mtd/spi-nor/cadence-quadspi.c2
-rw-r--r--drivers/mtd/spi-nor/spi-nor.c6
-rw-r--r--drivers/net/bonding/bond_main.c4
-rw-r--r--drivers/net/dsa/microchip/ksz_common.c10
-rw-r--r--drivers/net/dsa/mv88e6xxx/global1.c2
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c8
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_hw.h6
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_main.c10
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_nic.c18
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_nic.h2
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/aq_ring.c35
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c61
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c8
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h3
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h18
-rw-r--r--drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c21
-rw-r--r--drivers/net/ethernet/atheros/alx/alx.h1
-rw-r--r--drivers/net/ethernet/atheros/alx/main.c2
-rw-r--r--drivers/net/ethernet/broadcom/bcmsysport.c15
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmgenet.c13
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3_enet.c3
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c10
-rw-r--r--drivers/net/ethernet/ibm/ibmvnic.c2
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_main.c8
-rw-r--r--drivers/net/ethernet/intel/ice/ice.h4
-rw-r--r--drivers/net/ethernet/intel/ice/ice_common.c3
-rw-r--r--drivers/net/ethernet/intel/ice/ice_ethtool.c7
-rw-r--r--drivers/net/ethernet/intel/ice/ice_hw_autogen.h2
-rw-r--r--drivers/net/ethernet/intel/ice/ice_lib.c3
-rw-r--r--drivers/net/ethernet/intel/ice/ice_main.c86
-rw-r--r--drivers/net/ethernet/intel/ice/ice_switch.c12
-rw-r--r--drivers/net/ethernet/intel/ice/ice_switch.h2
-rw-r--r--drivers/net/ethernet/intel/ice/ice_txrx.c11
-rw-r--r--drivers/net/ethernet/intel/ice/ice_txrx.h17
-rw-r--r--drivers/net/ethernet/intel/ice/ice_type.h2
-rw-r--r--drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c4
-rw-r--r--drivers/net/ethernet/intel/igb/igb_ptp.c12
-rw-r--r--drivers/net/ethernet/marvell/mvneta.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_tx.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.c1
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_fcoe.c11
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_iscsi.c1
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_l2.c12
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_mcp.c7
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_rdma.c1
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_roce.c1
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_sp.h14
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_sp_commands.c22
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_spq.c69
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_sriov.c1
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c8
-rw-r--r--drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c6
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/common.h3
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/descs_com.h2
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/enh_desc.c2
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/ring_mode.c2
-rw-r--r--drivers/net/fddi/defza.c7
-rw-r--r--drivers/net/fddi/defza.h3
-rw-r--r--drivers/net/phy/broadcom.c18
-rw-r--r--drivers/net/phy/realtek.c2
-rw-r--r--drivers/net/usb/smsc95xx.c9
-rw-r--r--drivers/nvme/host/core.c4
-rw-r--r--drivers/nvme/host/multipath.c1
-rw-r--r--drivers/nvme/target/core.c2
-rw-r--r--drivers/nvme/target/rdma.c19
-rw-r--r--drivers/of/device.c4
-rw-r--r--drivers/of/of_numa.c9
-rw-r--r--drivers/pci/pci-acpi.c5
-rw-r--r--drivers/pinctrl/meson/pinctrl-meson-gxbb.c2
-rw-r--r--drivers/pinctrl/meson/pinctrl-meson-gxl.c2
-rw-r--r--drivers/pinctrl/meson/pinctrl-meson.c2
-rw-r--r--drivers/pinctrl/meson/pinctrl-meson8.c2
-rw-r--r--drivers/pinctrl/meson/pinctrl-meson8b.c2
-rw-r--r--drivers/rtc/hctosys.c4
-rw-r--r--drivers/rtc/rtc-cmos.c16
-rw-r--r--drivers/rtc/rtc-pcf2127.c3
-rw-r--r--drivers/s390/net/qeth_core.h27
-rw-r--r--drivers/s390/net/qeth_core_main.c172
-rw-r--r--drivers/s390/net/qeth_core_mpc.h4
-rw-r--r--drivers/s390/net/qeth_l2_main.c39
-rw-r--r--drivers/s390/net/qeth_l3_main.c207
-rw-r--r--drivers/scsi/Kconfig1
-rw-r--r--drivers/scsi/NCR5380.c2
-rw-r--r--drivers/scsi/hisi_sas/hisi_sas_v1_hw.c2
-rw-r--r--drivers/scsi/hisi_sas/hisi_sas_v2_hw.c2
-rw-r--r--drivers/scsi/hisi_sas/hisi_sas_v3_hw.c2
-rw-r--r--drivers/scsi/lpfc/lpfc_debugfs.c2
-rw-r--r--drivers/scsi/myrb.c3
-rw-r--r--drivers/scsi/myrs.c13
-rw-r--r--drivers/scsi/qla2xxx/qla_init.c1
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c2
-rw-r--r--drivers/scsi/scsi_lib.c8
-rw-r--r--drivers/scsi/ufs/ufshcd.c7
-rw-r--r--drivers/staging/vboxvideo/vbox_drv.h2
-rw-r--r--drivers/staging/vboxvideo/vbox_ttm.c65
-rw-r--r--drivers/target/target_core_transport.c4
-rw-r--r--drivers/tty/serial/sh-sci.c8
-rw-r--r--drivers/tty/tty_baudrate.c4
-rw-r--r--drivers/tty/vt/vt.c2
-rw-r--r--drivers/usb/typec/ucsi/Kconfig10
-rw-r--r--drivers/usb/typec/ucsi/Makefile2
-rw-r--r--drivers/usb/typec/ucsi/ucsi_ccg.c307
-rw-r--r--drivers/xen/grant-table.c2
-rw-r--r--drivers/xen/privcmd-buf.c22
506 files changed, 17044 insertions, 11895 deletions
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
index 8f3a444c6ea9..7cea769c37df 100644
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -512,7 +512,7 @@ config CRC_PMIC_OPREGION
512 512
513config XPOWER_PMIC_OPREGION 513config XPOWER_PMIC_OPREGION
514 bool "ACPI operation region support for XPower AXP288 PMIC" 514 bool "ACPI operation region support for XPower AXP288 PMIC"
515 depends on MFD_AXP20X_I2C && IOSF_MBI 515 depends on MFD_AXP20X_I2C && IOSF_MBI=y
516 help 516 help
517 This config adds ACPI operation region support for XPower AXP288 PMIC. 517 This config adds ACPI operation region support for XPower AXP288 PMIC.
518 518
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index f8c638f3c946..14d9f5bea015 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -2928,9 +2928,9 @@ static int acpi_nfit_query_poison(struct acpi_nfit_desc *acpi_desc)
2928 return rc; 2928 return rc;
2929 2929
2930 if (ars_status_process_records(acpi_desc)) 2930 if (ars_status_process_records(acpi_desc))
2931 return -ENOMEM; 2931 dev_err(acpi_desc->dev, "Failed to process ARS records\n");
2932 2932
2933 return 0; 2933 return rc;
2934} 2934}
2935 2935
2936static int ars_register(struct acpi_nfit_desc *acpi_desc, 2936static int ars_register(struct acpi_nfit_desc *acpi_desc,
@@ -3341,8 +3341,6 @@ static int acpi_nfit_clear_to_send(struct nvdimm_bus_descriptor *nd_desc,
3341 struct nvdimm *nvdimm, unsigned int cmd) 3341 struct nvdimm *nvdimm, unsigned int cmd)
3342{ 3342{
3343 struct acpi_nfit_desc *acpi_desc = to_acpi_nfit_desc(nd_desc); 3343 struct acpi_nfit_desc *acpi_desc = to_acpi_nfit_desc(nd_desc);
3344 struct nfit_spa *nfit_spa;
3345 int rc = 0;
3346 3344
3347 if (nvdimm) 3345 if (nvdimm)
3348 return 0; 3346 return 0;
@@ -3355,17 +3353,10 @@ static int acpi_nfit_clear_to_send(struct nvdimm_bus_descriptor *nd_desc,
3355 * just needs guarantees that any ARS it initiates are not 3353 * just needs guarantees that any ARS it initiates are not
3356 * interrupted by any intervening start requests from userspace. 3354 * interrupted by any intervening start requests from userspace.
3357 */ 3355 */
3358 mutex_lock(&acpi_desc->init_mutex); 3356 if (work_busy(&acpi_desc->dwork.work))
3359 list_for_each_entry(nfit_spa, &acpi_desc->spas, list) 3357 return -EBUSY;
3360 if (acpi_desc->scrub_spa
3361 || test_bit(ARS_REQ_SHORT, &nfit_spa->ars_state)
3362 || test_bit(ARS_REQ_LONG, &nfit_spa->ars_state)) {
3363 rc = -EBUSY;
3364 break;
3365 }
3366 mutex_unlock(&acpi_desc->init_mutex);
3367 3358
3368 return rc; 3359 return 0;
3369} 3360}
3370 3361
3371int acpi_nfit_ars_rescan(struct acpi_nfit_desc *acpi_desc, 3362int acpi_nfit_ars_rescan(struct acpi_nfit_desc *acpi_desc,
diff --git a/drivers/acpi/nfit/mce.c b/drivers/acpi/nfit/mce.c
index e9626bf6ca29..d6c1b10f6c25 100644
--- a/drivers/acpi/nfit/mce.c
+++ b/drivers/acpi/nfit/mce.c
@@ -25,8 +25,12 @@ static int nfit_handle_mce(struct notifier_block *nb, unsigned long val,
25 struct acpi_nfit_desc *acpi_desc; 25 struct acpi_nfit_desc *acpi_desc;
26 struct nfit_spa *nfit_spa; 26 struct nfit_spa *nfit_spa;
27 27
28 /* We only care about memory errors */ 28 /* We only care about uncorrectable memory errors */
29 if (!mce_is_memory_error(mce)) 29 if (!mce_is_memory_error(mce) || mce_is_correctable(mce))
30 return NOTIFY_DONE;
31
32 /* Verify the address reported in the MCE is valid. */
33 if (!mce_usable_address(mce))
30 return NOTIFY_DONE; 34 return NOTIFY_DONE;
31 35
32 /* 36 /*
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 6e594644cb1d..a7f5202a4815 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -4553,7 +4553,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
4553 /* These specific Samsung models/firmware-revs do not handle LPM well */ 4553 /* These specific Samsung models/firmware-revs do not handle LPM well */
4554 { "SAMSUNG MZMPC128HBFU-000MV", "CXM14M1Q", ATA_HORKAGE_NOLPM, }, 4554 { "SAMSUNG MZMPC128HBFU-000MV", "CXM14M1Q", ATA_HORKAGE_NOLPM, },
4555 { "SAMSUNG SSD PM830 mSATA *", "CXM13D1Q", ATA_HORKAGE_NOLPM, }, 4555 { "SAMSUNG SSD PM830 mSATA *", "CXM13D1Q", ATA_HORKAGE_NOLPM, },
4556 { "SAMSUNG MZ7TD256HAFV-000L9", "DXT02L5Q", ATA_HORKAGE_NOLPM, }, 4556 { "SAMSUNG MZ7TD256HAFV-000L9", NULL, ATA_HORKAGE_NOLPM, },
4557 4557
4558 /* devices that don't properly handle queued TRIM commands */ 4558 /* devices that don't properly handle queued TRIM commands */
4559 { "Micron_M500IT_*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM | 4559 { "Micron_M500IT_*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM |
diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c
index 10ecb232245d..4b1ff5bc256a 100644
--- a/drivers/ata/sata_rcar.c
+++ b/drivers/ata/sata_rcar.c
@@ -1,14 +1,10 @@
1// SPDX-License-Identifier: GPL-2.0+
1/* 2/*
2 * Renesas R-Car SATA driver 3 * Renesas R-Car SATA driver
3 * 4 *
4 * Author: Vladimir Barinov <source@cogentembedded.com> 5 * Author: Vladimir Barinov <source@cogentembedded.com>
5 * Copyright (C) 2013-2015 Cogent Embedded, Inc. 6 * Copyright (C) 2013-2015 Cogent Embedded, Inc.
6 * Copyright (C) 2013-2015 Renesas Solutions Corp. 7 * Copyright (C) 2013-2015 Renesas Solutions Corp.
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 */ 8 */
13 9
14#include <linux/kernel.h> 10#include <linux/kernel.h>
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
index a8cfa011c284..fb23578e9a41 100644
--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -4148,10 +4148,11 @@ static int __floppy_read_block_0(struct block_device *bdev, int drive)
4148 bio.bi_end_io = floppy_rb0_cb; 4148 bio.bi_end_io = floppy_rb0_cb;
4149 bio_set_op_attrs(&bio, REQ_OP_READ, 0); 4149 bio_set_op_attrs(&bio, REQ_OP_READ, 0);
4150 4150
4151 init_completion(&cbdata.complete);
4152
4151 submit_bio(&bio); 4153 submit_bio(&bio);
4152 process_fd_request(); 4154 process_fd_request();
4153 4155
4154 init_completion(&cbdata.complete);
4155 wait_for_completion(&cbdata.complete); 4156 wait_for_completion(&cbdata.complete);
4156 4157
4157 __free_page(page); 4158 __free_page(page);
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 56452cabce5b..0ed4b200fa58 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -1919,6 +1919,7 @@ static int negotiate_mq(struct blkfront_info *info)
1919 GFP_KERNEL); 1919 GFP_KERNEL);
1920 if (!info->rinfo) { 1920 if (!info->rinfo) {
1921 xenbus_dev_fatal(info->xbdev, -ENOMEM, "allocating ring_info structure"); 1921 xenbus_dev_fatal(info->xbdev, -ENOMEM, "allocating ring_info structure");
1922 info->nr_rings = 0;
1922 return -ENOMEM; 1923 return -ENOMEM;
1923 } 1924 }
1924 1925
diff --git a/drivers/clk/clk-fixed-factor.c b/drivers/clk/clk-fixed-factor.c
index ef0ca9414f37..ff83e899df71 100644
--- a/drivers/clk/clk-fixed-factor.c
+++ b/drivers/clk/clk-fixed-factor.c
@@ -210,6 +210,7 @@ static int of_fixed_factor_clk_remove(struct platform_device *pdev)
210{ 210{
211 struct clk *clk = platform_get_drvdata(pdev); 211 struct clk *clk = platform_get_drvdata(pdev);
212 212
213 of_clk_del_provider(pdev->dev.of_node);
213 clk_unregister_fixed_factor(clk); 214 clk_unregister_fixed_factor(clk);
214 215
215 return 0; 216 return 0;
diff --git a/drivers/clk/meson/axg.c b/drivers/clk/meson/axg.c
index c981159b02c0..792735d7e46e 100644
--- a/drivers/clk/meson/axg.c
+++ b/drivers/clk/meson/axg.c
@@ -325,6 +325,7 @@ static struct clk_regmap axg_fclk_div2 = {
325 .ops = &clk_regmap_gate_ops, 325 .ops = &clk_regmap_gate_ops,
326 .parent_names = (const char *[]){ "fclk_div2_div" }, 326 .parent_names = (const char *[]){ "fclk_div2_div" },
327 .num_parents = 1, 327 .num_parents = 1,
328 .flags = CLK_IS_CRITICAL,
328 }, 329 },
329}; 330};
330 331
@@ -349,6 +350,18 @@ static struct clk_regmap axg_fclk_div3 = {
349 .ops = &clk_regmap_gate_ops, 350 .ops = &clk_regmap_gate_ops,
350 .parent_names = (const char *[]){ "fclk_div3_div" }, 351 .parent_names = (const char *[]){ "fclk_div3_div" },
351 .num_parents = 1, 352 .num_parents = 1,
353 /*
354 * FIXME:
355 * This clock, as fdiv2, is used by the SCPI FW and is required
356 * by the platform to operate correctly.
357 * Until the following condition are met, we need this clock to
358 * be marked as critical:
359 * a) The SCPI generic driver claims and enable all the clocks
360 * it needs
361 * b) CCF has a clock hand-off mechanism to make the sure the
362 * clock stays on until the proper driver comes along
363 */
364 .flags = CLK_IS_CRITICAL,
352 }, 365 },
353}; 366};
354 367
diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c
index 9309cfaaa464..4ada9668fd49 100644
--- a/drivers/clk/meson/gxbb.c
+++ b/drivers/clk/meson/gxbb.c
@@ -506,6 +506,18 @@ static struct clk_regmap gxbb_fclk_div3 = {
506 .ops = &clk_regmap_gate_ops, 506 .ops = &clk_regmap_gate_ops,
507 .parent_names = (const char *[]){ "fclk_div3_div" }, 507 .parent_names = (const char *[]){ "fclk_div3_div" },
508 .num_parents = 1, 508 .num_parents = 1,
509 /*
510 * FIXME:
511 * This clock, as fdiv2, is used by the SCPI FW and is required
512 * by the platform to operate correctly.
513 * Until the following condition are met, we need this clock to
514 * be marked as critical:
515 * a) The SCPI generic driver claims and enable all the clocks
516 * it needs
517 * b) CCF has a clock hand-off mechanism to make the sure the
518 * clock stays on until the proper driver comes along
519 */
520 .flags = CLK_IS_CRITICAL,
509 }, 521 },
510}; 522};
511 523
diff --git a/drivers/clk/qcom/gcc-qcs404.c b/drivers/clk/qcom/gcc-qcs404.c
index e4ca6a45f313..ef1b267cb058 100644
--- a/drivers/clk/qcom/gcc-qcs404.c
+++ b/drivers/clk/qcom/gcc-qcs404.c
@@ -265,7 +265,7 @@ static struct clk_fixed_factor cxo = {
265 .div = 1, 265 .div = 1,
266 .hw.init = &(struct clk_init_data){ 266 .hw.init = &(struct clk_init_data){
267 .name = "cxo", 267 .name = "cxo",
268 .parent_names = (const char *[]){ "xo_board" }, 268 .parent_names = (const char *[]){ "xo-board" },
269 .num_parents = 1, 269 .num_parents = 1,
270 .ops = &clk_fixed_factor_ops, 270 .ops = &clk_fixed_factor_ops,
271 }, 271 },
diff --git a/drivers/clocksource/i8253.c b/drivers/clocksource/i8253.c
index 9c38895542f4..d4350bb10b83 100644
--- a/drivers/clocksource/i8253.c
+++ b/drivers/clocksource/i8253.c
@@ -20,6 +20,13 @@
20DEFINE_RAW_SPINLOCK(i8253_lock); 20DEFINE_RAW_SPINLOCK(i8253_lock);
21EXPORT_SYMBOL(i8253_lock); 21EXPORT_SYMBOL(i8253_lock);
22 22
23/*
24 * Handle PIT quirk in pit_shutdown() where zeroing the counter register
25 * restarts the PIT, negating the shutdown. On platforms with the quirk,
26 * platform specific code can set this to false.
27 */
28bool i8253_clear_counter_on_shutdown __ro_after_init = true;
29
23#ifdef CONFIG_CLKSRC_I8253 30#ifdef CONFIG_CLKSRC_I8253
24/* 31/*
25 * Since the PIT overflows every tick, its not very useful 32 * Since the PIT overflows every tick, its not very useful
@@ -109,8 +116,11 @@ static int pit_shutdown(struct clock_event_device *evt)
109 raw_spin_lock(&i8253_lock); 116 raw_spin_lock(&i8253_lock);
110 117
111 outb_p(0x30, PIT_MODE); 118 outb_p(0x30, PIT_MODE);
112 outb_p(0, PIT_CH0); 119
113 outb_p(0, PIT_CH0); 120 if (i8253_clear_counter_on_shutdown) {
121 outb_p(0, PIT_CH0);
122 outb_p(0, PIT_CH0);
123 }
114 124
115 raw_spin_unlock(&i8253_lock); 125 raw_spin_unlock(&i8253_lock);
116 return 0; 126 return 0;
diff --git a/drivers/cpufreq/imx6q-cpufreq.c b/drivers/cpufreq/imx6q-cpufreq.c
index 8cfee0ab804b..d8c3595e9023 100644
--- a/drivers/cpufreq/imx6q-cpufreq.c
+++ b/drivers/cpufreq/imx6q-cpufreq.c
@@ -160,8 +160,13 @@ static int imx6q_set_target(struct cpufreq_policy *policy, unsigned int index)
160 /* Ensure the arm clock divider is what we expect */ 160 /* Ensure the arm clock divider is what we expect */
161 ret = clk_set_rate(clks[ARM].clk, new_freq * 1000); 161 ret = clk_set_rate(clks[ARM].clk, new_freq * 1000);
162 if (ret) { 162 if (ret) {
163 int ret1;
164
163 dev_err(cpu_dev, "failed to set clock rate: %d\n", ret); 165 dev_err(cpu_dev, "failed to set clock rate: %d\n", ret);
164 regulator_set_voltage_tol(arm_reg, volt_old, 0); 166 ret1 = regulator_set_voltage_tol(arm_reg, volt_old, 0);
167 if (ret1)
168 dev_warn(cpu_dev,
169 "failed to restore vddarm voltage: %d\n", ret1);
165 return ret; 170 return ret;
166 } 171 }
167 172
diff --git a/drivers/cpuidle/cpuidle-arm.c b/drivers/cpuidle/cpuidle-arm.c
index 073557f433eb..3a407a3ef22b 100644
--- a/drivers/cpuidle/cpuidle-arm.c
+++ b/drivers/cpuidle/cpuidle-arm.c
@@ -82,7 +82,6 @@ static int __init arm_idle_init_cpu(int cpu)
82{ 82{
83 int ret; 83 int ret;
84 struct cpuidle_driver *drv; 84 struct cpuidle_driver *drv;
85 struct cpuidle_device *dev;
86 85
87 drv = kmemdup(&arm_idle_driver, sizeof(*drv), GFP_KERNEL); 86 drv = kmemdup(&arm_idle_driver, sizeof(*drv), GFP_KERNEL);
88 if (!drv) 87 if (!drv)
@@ -103,13 +102,6 @@ static int __init arm_idle_init_cpu(int cpu)
103 goto out_kfree_drv; 102 goto out_kfree_drv;
104 } 103 }
105 104
106 ret = cpuidle_register_driver(drv);
107 if (ret) {
108 if (ret != -EBUSY)
109 pr_err("Failed to register cpuidle driver\n");
110 goto out_kfree_drv;
111 }
112
113 /* 105 /*
114 * Call arch CPU operations in order to initialize 106 * Call arch CPU operations in order to initialize
115 * idle states suspend back-end specific data 107 * idle states suspend back-end specific data
@@ -117,37 +109,21 @@ static int __init arm_idle_init_cpu(int cpu)
117 ret = arm_cpuidle_init(cpu); 109 ret = arm_cpuidle_init(cpu);
118 110
119 /* 111 /*
120 * Skip the cpuidle device initialization if the reported 112 * Allow the initialization to continue for other CPUs, if the reported
121 * failure is a HW misconfiguration/breakage (-ENXIO). 113 * failure is a HW misconfiguration/breakage (-ENXIO).
122 */ 114 */
123 if (ret == -ENXIO)
124 return 0;
125
126 if (ret) { 115 if (ret) {
127 pr_err("CPU %d failed to init idle CPU ops\n", cpu); 116 pr_err("CPU %d failed to init idle CPU ops\n", cpu);
128 goto out_unregister_drv; 117 ret = ret == -ENXIO ? 0 : ret;
129 } 118 goto out_kfree_drv;
130
131 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
132 if (!dev) {
133 ret = -ENOMEM;
134 goto out_unregister_drv;
135 } 119 }
136 dev->cpu = cpu;
137 120
138 ret = cpuidle_register_device(dev); 121 ret = cpuidle_register(drv, NULL);
139 if (ret) { 122 if (ret)
140 pr_err("Failed to register cpuidle device for CPU %d\n", 123 goto out_kfree_drv;
141 cpu);
142 goto out_kfree_dev;
143 }
144 124
145 return 0; 125 return 0;
146 126
147out_kfree_dev:
148 kfree(dev);
149out_unregister_drv:
150 cpuidle_unregister_driver(drv);
151out_kfree_drv: 127out_kfree_drv:
152 kfree(drv); 128 kfree(drv);
153 return ret; 129 return ret;
@@ -178,9 +154,7 @@ out_fail:
178 while (--cpu >= 0) { 154 while (--cpu >= 0) {
179 dev = per_cpu(cpuidle_devices, cpu); 155 dev = per_cpu(cpuidle_devices, cpu);
180 drv = cpuidle_get_cpu_driver(dev); 156 drv = cpuidle_get_cpu_driver(dev);
181 cpuidle_unregister_device(dev); 157 cpuidle_unregister(drv);
182 cpuidle_unregister_driver(drv);
183 kfree(dev);
184 kfree(drv); 158 kfree(drv);
185 } 159 }
186 160
diff --git a/drivers/crypto/hisilicon/sec/sec_algs.c b/drivers/crypto/hisilicon/sec/sec_algs.c
index f7d6d690116e..cdc4f9a171d9 100644
--- a/drivers/crypto/hisilicon/sec/sec_algs.c
+++ b/drivers/crypto/hisilicon/sec/sec_algs.c
@@ -732,6 +732,7 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
732 int *splits_in_nents; 732 int *splits_in_nents;
733 int *splits_out_nents = NULL; 733 int *splits_out_nents = NULL;
734 struct sec_request_el *el, *temp; 734 struct sec_request_el *el, *temp;
735 bool split = skreq->src != skreq->dst;
735 736
736 mutex_init(&sec_req->lock); 737 mutex_init(&sec_req->lock);
737 sec_req->req_base = &skreq->base; 738 sec_req->req_base = &skreq->base;
@@ -750,7 +751,7 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
750 if (ret) 751 if (ret)
751 goto err_free_split_sizes; 752 goto err_free_split_sizes;
752 753
753 if (skreq->src != skreq->dst) { 754 if (split) {
754 sec_req->len_out = sg_nents(skreq->dst); 755 sec_req->len_out = sg_nents(skreq->dst);
755 ret = sec_map_and_split_sg(skreq->dst, split_sizes, steps, 756 ret = sec_map_and_split_sg(skreq->dst, split_sizes, steps,
756 &splits_out, &splits_out_nents, 757 &splits_out, &splits_out_nents,
@@ -785,8 +786,9 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
785 split_sizes[i], 786 split_sizes[i],
786 skreq->src != skreq->dst, 787 skreq->src != skreq->dst,
787 splits_in[i], splits_in_nents[i], 788 splits_in[i], splits_in_nents[i],
788 splits_out[i], 789 split ? splits_out[i] : NULL,
789 splits_out_nents[i], info); 790 split ? splits_out_nents[i] : 0,
791 info);
790 if (IS_ERR(el)) { 792 if (IS_ERR(el)) {
791 ret = PTR_ERR(el); 793 ret = PTR_ERR(el);
792 goto err_free_elements; 794 goto err_free_elements;
@@ -806,13 +808,6 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
806 * more refined but this is unlikely to happen so no need. 808 * more refined but this is unlikely to happen so no need.
807 */ 809 */
808 810
809 /* Cleanup - all elements in pointer arrays have been coppied */
810 kfree(splits_in_nents);
811 kfree(splits_in);
812 kfree(splits_out_nents);
813 kfree(splits_out);
814 kfree(split_sizes);
815
816 /* Grab a big lock for a long time to avoid concurrency issues */ 811 /* Grab a big lock for a long time to avoid concurrency issues */
817 mutex_lock(&queue->queuelock); 812 mutex_lock(&queue->queuelock);
818 813
@@ -827,13 +822,13 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
827 (!queue->havesoftqueue || 822 (!queue->havesoftqueue ||
828 kfifo_avail(&queue->softqueue) > steps)) || 823 kfifo_avail(&queue->softqueue) > steps)) ||
829 !list_empty(&ctx->backlog)) { 824 !list_empty(&ctx->backlog)) {
825 ret = -EBUSY;
830 if ((skreq->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) { 826 if ((skreq->base.flags & CRYPTO_TFM_REQ_MAY_BACKLOG)) {
831 list_add_tail(&sec_req->backlog_head, &ctx->backlog); 827 list_add_tail(&sec_req->backlog_head, &ctx->backlog);
832 mutex_unlock(&queue->queuelock); 828 mutex_unlock(&queue->queuelock);
833 return -EBUSY; 829 goto out;
834 } 830 }
835 831
836 ret = -EBUSY;
837 mutex_unlock(&queue->queuelock); 832 mutex_unlock(&queue->queuelock);
838 goto err_free_elements; 833 goto err_free_elements;
839 } 834 }
@@ -842,7 +837,15 @@ static int sec_alg_skcipher_crypto(struct skcipher_request *skreq,
842 if (ret) 837 if (ret)
843 goto err_free_elements; 838 goto err_free_elements;
844 839
845 return -EINPROGRESS; 840 ret = -EINPROGRESS;
841out:
842 /* Cleanup - all elements in pointer arrays have been copied */
843 kfree(splits_in_nents);
844 kfree(splits_in);
845 kfree(splits_out_nents);
846 kfree(splits_out);
847 kfree(split_sizes);
848 return ret;
846 849
847err_free_elements: 850err_free_elements:
848 list_for_each_entry_safe(el, temp, &sec_req->elements, head) { 851 list_for_each_entry_safe(el, temp, &sec_req->elements, head) {
@@ -854,7 +857,7 @@ err_free_elements:
854 crypto_skcipher_ivsize(atfm), 857 crypto_skcipher_ivsize(atfm),
855 DMA_BIDIRECTIONAL); 858 DMA_BIDIRECTIONAL);
856err_unmap_out_sg: 859err_unmap_out_sg:
857 if (skreq->src != skreq->dst) 860 if (split)
858 sec_unmap_sg_on_err(skreq->dst, steps, splits_out, 861 sec_unmap_sg_on_err(skreq->dst, steps, splits_out,
859 splits_out_nents, sec_req->len_out, 862 splits_out_nents, sec_req->len_out,
860 info->dev); 863 info->dev);
diff --git a/drivers/firmware/efi/arm-init.c b/drivers/firmware/efi/arm-init.c
index 388a929baf95..1a6a77df8a5e 100644
--- a/drivers/firmware/efi/arm-init.c
+++ b/drivers/firmware/efi/arm-init.c
@@ -265,6 +265,10 @@ void __init efi_init(void)
265 (params.mmap & ~PAGE_MASK))); 265 (params.mmap & ~PAGE_MASK)));
266 266
267 init_screen_info(); 267 init_screen_info();
268
269 /* ARM does not permit early mappings to persist across paging_init() */
270 if (IS_ENABLED(CONFIG_ARM))
271 efi_memmap_unmap();
268} 272}
269 273
270static int __init register_gop_device(void) 274static int __init register_gop_device(void)
diff --git a/drivers/firmware/efi/arm-runtime.c b/drivers/firmware/efi/arm-runtime.c
index 922cfb813109..a00934d263c5 100644
--- a/drivers/firmware/efi/arm-runtime.c
+++ b/drivers/firmware/efi/arm-runtime.c
@@ -110,7 +110,7 @@ static int __init arm_enable_runtime_services(void)
110{ 110{
111 u64 mapsize; 111 u64 mapsize;
112 112
113 if (!efi_enabled(EFI_BOOT) || !efi_enabled(EFI_MEMMAP)) { 113 if (!efi_enabled(EFI_BOOT)) {
114 pr_info("EFI services will not be available.\n"); 114 pr_info("EFI services will not be available.\n");
115 return 0; 115 return 0;
116 } 116 }
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
index 249eb70691b0..fad7c62cfc0e 100644
--- a/drivers/firmware/efi/efi.c
+++ b/drivers/firmware/efi/efi.c
@@ -592,7 +592,11 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
592 592
593 early_memunmap(tbl, sizeof(*tbl)); 593 early_memunmap(tbl, sizeof(*tbl));
594 } 594 }
595 return 0;
596}
595 597
598int __init efi_apply_persistent_mem_reservations(void)
599{
596 if (efi.mem_reserve != EFI_INVALID_TABLE_ADDR) { 600 if (efi.mem_reserve != EFI_INVALID_TABLE_ADDR) {
597 unsigned long prsv = efi.mem_reserve; 601 unsigned long prsv = efi.mem_reserve;
598 602
@@ -963,36 +967,43 @@ bool efi_is_table_address(unsigned long phys_addr)
963} 967}
964 968
965static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock); 969static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock);
970static struct linux_efi_memreserve *efi_memreserve_root __ro_after_init;
966 971
967int efi_mem_reserve_persistent(phys_addr_t addr, u64 size) 972int efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
968{ 973{
969 struct linux_efi_memreserve *rsv, *parent; 974 struct linux_efi_memreserve *rsv;
970 975
971 if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR) 976 if (!efi_memreserve_root)
972 return -ENODEV; 977 return -ENODEV;
973 978
974 rsv = kmalloc(sizeof(*rsv), GFP_KERNEL); 979 rsv = kmalloc(sizeof(*rsv), GFP_ATOMIC);
975 if (!rsv) 980 if (!rsv)
976 return -ENOMEM; 981 return -ENOMEM;
977 982
978 parent = memremap(efi.mem_reserve, sizeof(*rsv), MEMREMAP_WB);
979 if (!parent) {
980 kfree(rsv);
981 return -ENOMEM;
982 }
983
984 rsv->base = addr; 983 rsv->base = addr;
985 rsv->size = size; 984 rsv->size = size;
986 985
987 spin_lock(&efi_mem_reserve_persistent_lock); 986 spin_lock(&efi_mem_reserve_persistent_lock);
988 rsv->next = parent->next; 987 rsv->next = efi_memreserve_root->next;
989 parent->next = __pa(rsv); 988 efi_memreserve_root->next = __pa(rsv);
990 spin_unlock(&efi_mem_reserve_persistent_lock); 989 spin_unlock(&efi_mem_reserve_persistent_lock);
991 990
992 memunmap(parent); 991 return 0;
992}
993 993
994static int __init efi_memreserve_root_init(void)
995{
996 if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR)
997 return -ENODEV;
998
999 efi_memreserve_root = memremap(efi.mem_reserve,
1000 sizeof(*efi_memreserve_root),
1001 MEMREMAP_WB);
1002 if (!efi_memreserve_root)
1003 return -ENOMEM;
994 return 0; 1004 return 0;
995} 1005}
1006early_initcall(efi_memreserve_root_init);
996 1007
997#ifdef CONFIG_KEXEC 1008#ifdef CONFIG_KEXEC
998static int update_efi_random_seed(struct notifier_block *nb, 1009static int update_efi_random_seed(struct notifier_block *nb,
diff --git a/drivers/firmware/efi/libstub/arm-stub.c b/drivers/firmware/efi/libstub/arm-stub.c
index 30ac0c975f8a..3d36142cf812 100644
--- a/drivers/firmware/efi/libstub/arm-stub.c
+++ b/drivers/firmware/efi/libstub/arm-stub.c
@@ -75,6 +75,9 @@ void install_memreserve_table(efi_system_table_t *sys_table_arg)
75 efi_guid_t memreserve_table_guid = LINUX_EFI_MEMRESERVE_TABLE_GUID; 75 efi_guid_t memreserve_table_guid = LINUX_EFI_MEMRESERVE_TABLE_GUID;
76 efi_status_t status; 76 efi_status_t status;
77 77
78 if (IS_ENABLED(CONFIG_ARM))
79 return;
80
78 status = efi_call_early(allocate_pool, EFI_LOADER_DATA, sizeof(*rsv), 81 status = efi_call_early(allocate_pool, EFI_LOADER_DATA, sizeof(*rsv),
79 (void **)&rsv); 82 (void **)&rsv);
80 if (status != EFI_SUCCESS) { 83 if (status != EFI_SUCCESS) {
diff --git a/drivers/firmware/efi/libstub/fdt.c b/drivers/firmware/efi/libstub/fdt.c
index 8830fa601e45..0c0d2312f4a8 100644
--- a/drivers/firmware/efi/libstub/fdt.c
+++ b/drivers/firmware/efi/libstub/fdt.c
@@ -158,6 +158,10 @@ static efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
158 return efi_status; 158 return efi_status;
159 } 159 }
160 } 160 }
161
162 /* shrink the FDT back to its minimum size */
163 fdt_pack(fdt);
164
161 return EFI_SUCCESS; 165 return EFI_SUCCESS;
162 166
163fdt_set_fail: 167fdt_set_fail:
diff --git a/drivers/firmware/efi/memmap.c b/drivers/firmware/efi/memmap.c
index fa2904fb841f..38b686c67b17 100644
--- a/drivers/firmware/efi/memmap.c
+++ b/drivers/firmware/efi/memmap.c
@@ -118,6 +118,9 @@ int __init efi_memmap_init_early(struct efi_memory_map_data *data)
118 118
119void __init efi_memmap_unmap(void) 119void __init efi_memmap_unmap(void)
120{ 120{
121 if (!efi_enabled(EFI_MEMMAP))
122 return;
123
121 if (!efi.memmap.late) { 124 if (!efi.memmap.late) {
122 unsigned long size; 125 unsigned long size;
123 126
diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c
index a19d845bdb06..8903b9ccfc2b 100644
--- a/drivers/firmware/efi/runtime-wrappers.c
+++ b/drivers/firmware/efi/runtime-wrappers.c
@@ -67,7 +67,7 @@ struct efi_runtime_work efi_rts_work;
67 } \ 67 } \
68 \ 68 \
69 init_completion(&efi_rts_work.efi_rts_comp); \ 69 init_completion(&efi_rts_work.efi_rts_comp); \
70 INIT_WORK_ONSTACK(&efi_rts_work.work, efi_call_rts); \ 70 INIT_WORK(&efi_rts_work.work, efi_call_rts); \
71 efi_rts_work.arg1 = _arg1; \ 71 efi_rts_work.arg1 = _arg1; \
72 efi_rts_work.arg2 = _arg2; \ 72 efi_rts_work.arg2 = _arg2; \
73 efi_rts_work.arg3 = _arg3; \ 73 efi_rts_work.arg3 = _arg3; \
diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 7c88f12096c5..1fafc2f8e8f9 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -11,7 +11,7 @@ drm-y := drm_auth.o drm_bufs.o drm_cache.o \
11 drm_sysfs.o drm_hashtab.o drm_mm.o \ 11 drm_sysfs.o drm_hashtab.o drm_mm.o \
12 drm_crtc.o drm_fourcc.o drm_modes.o drm_edid.o \ 12 drm_crtc.o drm_fourcc.o drm_modes.o drm_edid.o \
13 drm_encoder_slave.o \ 13 drm_encoder_slave.o \
14 drm_trace_points.o drm_global.o drm_prime.o \ 14 drm_trace_points.o drm_prime.o \
15 drm_rect.o drm_vma_manager.o drm_flip_work.o \ 15 drm_rect.o drm_vma_manager.o drm_flip_work.o \
16 drm_modeset_lock.o drm_atomic.o drm_bridge.o \ 16 drm_modeset_lock.o drm_atomic.o drm_bridge.o \
17 drm_framebuffer.o drm_connector.o drm_blend.o \ 17 drm_framebuffer.o drm_connector.o drm_blend.o \
diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile
index 138cb787d27e..f76bcb9c45e4 100644
--- a/drivers/gpu/drm/amd/amdgpu/Makefile
+++ b/drivers/gpu/drm/amd/amdgpu/Makefile
@@ -53,7 +53,7 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \
53 amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o \ 53 amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o \
54 amdgpu_gtt_mgr.o amdgpu_vram_mgr.o amdgpu_virt.o amdgpu_atomfirmware.o \ 54 amdgpu_gtt_mgr.o amdgpu_vram_mgr.o amdgpu_virt.o amdgpu_atomfirmware.o \
55 amdgpu_vf_error.o amdgpu_sched.o amdgpu_debugfs.o amdgpu_ids.o \ 55 amdgpu_vf_error.o amdgpu_sched.o amdgpu_debugfs.o amdgpu_ids.o \
56 amdgpu_gmc.o amdgpu_xgmi.o 56 amdgpu_gmc.o amdgpu_xgmi.o amdgpu_csa.o
57 57
58# add asic specific block 58# add asic specific block
59amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \ 59amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \
@@ -105,6 +105,7 @@ amdgpu-y += \
105# add GFX block 105# add GFX block
106amdgpu-y += \ 106amdgpu-y += \
107 amdgpu_gfx.o \ 107 amdgpu_gfx.o \
108 amdgpu_rlc.o \
108 gfx_v8_0.o \ 109 gfx_v8_0.o \
109 gfx_v9_0.o 110 gfx_v9_0.o
110 111
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index d0102cfc8efb..42f882c633ee 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -75,6 +75,7 @@
75#include "amdgpu_sdma.h" 75#include "amdgpu_sdma.h"
76#include "amdgpu_dm.h" 76#include "amdgpu_dm.h"
77#include "amdgpu_virt.h" 77#include "amdgpu_virt.h"
78#include "amdgpu_csa.h"
78#include "amdgpu_gart.h" 79#include "amdgpu_gart.h"
79#include "amdgpu_debugfs.h" 80#include "amdgpu_debugfs.h"
80#include "amdgpu_job.h" 81#include "amdgpu_job.h"
@@ -151,6 +152,7 @@ extern int amdgpu_compute_multipipe;
151extern int amdgpu_gpu_recovery; 152extern int amdgpu_gpu_recovery;
152extern int amdgpu_emu_mode; 153extern int amdgpu_emu_mode;
153extern uint amdgpu_smu_memory_pool_size; 154extern uint amdgpu_smu_memory_pool_size;
155extern uint amdgpu_dc_feature_mask;
154extern struct amdgpu_mgpu_info mgpu_info; 156extern struct amdgpu_mgpu_info mgpu_info;
155 157
156#ifdef CONFIG_DRM_AMDGPU_SI 158#ifdef CONFIG_DRM_AMDGPU_SI
@@ -432,7 +434,7 @@ typedef enum _AMDGPU_DOORBELL64_ASSIGNMENT
432 * default non-graphics QWORD index is 0xe0 - 0xFF inclusive 434 * default non-graphics QWORD index is 0xe0 - 0xFF inclusive
433 */ 435 */
434 436
435 /* sDMA engines reserved from 0xe0 -oxef */ 437 /* sDMA engines reserved from 0xe0 -0xef */
436 AMDGPU_DOORBELL64_sDMA_ENGINE0 = 0xE0, 438 AMDGPU_DOORBELL64_sDMA_ENGINE0 = 0xE0,
437 AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE0 = 0xE1, 439 AMDGPU_DOORBELL64_sDMA_HI_PRI_ENGINE0 = 0xE1,
438 AMDGPU_DOORBELL64_sDMA_ENGINE1 = 0xE8, 440 AMDGPU_DOORBELL64_sDMA_ENGINE1 = 0xE8,
@@ -830,7 +832,6 @@ struct amdgpu_device {
830 bool need_dma32; 832 bool need_dma32;
831 bool need_swiotlb; 833 bool need_swiotlb;
832 bool accel_working; 834 bool accel_working;
833 struct work_struct reset_work;
834 struct notifier_block acpi_nb; 835 struct notifier_block acpi_nb;
835 struct amdgpu_i2c_chan *i2c_bus[AMDGPU_MAX_I2C_BUS]; 836 struct amdgpu_i2c_chan *i2c_bus[AMDGPU_MAX_I2C_BUS];
836 struct amdgpu_debugfs debugfs[AMDGPU_DEBUGFS_MAX_COMPONENTS]; 837 struct amdgpu_debugfs debugfs[AMDGPU_DEBUGFS_MAX_COMPONENTS];
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index c31a8849e9f8..60f9a87e9c74 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -144,7 +144,7 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
144 KGD_MAX_QUEUES); 144 KGD_MAX_QUEUES);
145 145
146 /* remove the KIQ bit as well */ 146 /* remove the KIQ bit as well */
147 if (adev->gfx.kiq.ring.ready) 147 if (adev->gfx.kiq.ring.sched.ready)
148 clear_bit(amdgpu_gfx_queue_to_bit(adev, 148 clear_bit(amdgpu_gfx_queue_to_bit(adev,
149 adev->gfx.kiq.ring.me - 1, 149 adev->gfx.kiq.ring.me - 1,
150 adev->gfx.kiq.ring.pipe, 150 adev->gfx.kiq.ring.pipe,
@@ -268,9 +268,9 @@ void amdgpu_amdkfd_gpu_reset(struct kgd_dev *kgd)
268 amdgpu_device_gpu_recover(adev, NULL); 268 amdgpu_device_gpu_recover(adev, NULL);
269} 269}
270 270
271int alloc_gtt_mem(struct kgd_dev *kgd, size_t size, 271int amdgpu_amdkfd_alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
272 void **mem_obj, uint64_t *gpu_addr, 272 void **mem_obj, uint64_t *gpu_addr,
273 void **cpu_ptr, bool mqd_gfx9) 273 void **cpu_ptr, bool mqd_gfx9)
274{ 274{
275 struct amdgpu_device *adev = (struct amdgpu_device *)kgd; 275 struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
276 struct amdgpu_bo *bo = NULL; 276 struct amdgpu_bo *bo = NULL;
@@ -340,7 +340,7 @@ allocate_mem_reserve_bo_failed:
340 return r; 340 return r;
341} 341}
342 342
343void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj) 343void amdgpu_amdkfd_free_gtt_mem(struct kgd_dev *kgd, void *mem_obj)
344{ 344{
345 struct amdgpu_bo *bo = (struct amdgpu_bo *) mem_obj; 345 struct amdgpu_bo *bo = (struct amdgpu_bo *) mem_obj;
346 346
@@ -351,8 +351,8 @@ void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj)
351 amdgpu_bo_unref(&(bo)); 351 amdgpu_bo_unref(&(bo));
352} 352}
353 353
354void get_local_mem_info(struct kgd_dev *kgd, 354void amdgpu_amdkfd_get_local_mem_info(struct kgd_dev *kgd,
355 struct kfd_local_mem_info *mem_info) 355 struct kfd_local_mem_info *mem_info)
356{ 356{
357 struct amdgpu_device *adev = (struct amdgpu_device *)kgd; 357 struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
358 uint64_t address_mask = adev->dev->dma_mask ? ~*adev->dev->dma_mask : 358 uint64_t address_mask = adev->dev->dma_mask ? ~*adev->dev->dma_mask :
@@ -383,7 +383,7 @@ void get_local_mem_info(struct kgd_dev *kgd,
383 mem_info->mem_clk_max = 100; 383 mem_info->mem_clk_max = 100;
384} 384}
385 385
386uint64_t get_gpu_clock_counter(struct kgd_dev *kgd) 386uint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct kgd_dev *kgd)
387{ 387{
388 struct amdgpu_device *adev = (struct amdgpu_device *)kgd; 388 struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
389 389
@@ -392,7 +392,7 @@ uint64_t get_gpu_clock_counter(struct kgd_dev *kgd)
392 return 0; 392 return 0;
393} 393}
394 394
395uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd) 395uint32_t amdgpu_amdkfd_get_max_engine_clock_in_mhz(struct kgd_dev *kgd)
396{ 396{
397 struct amdgpu_device *adev = (struct amdgpu_device *)kgd; 397 struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
398 398
@@ -405,7 +405,7 @@ uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd)
405 return 100; 405 return 100;
406} 406}
407 407
408void get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info) 408void amdgpu_amdkfd_get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info)
409{ 409{
410 struct amdgpu_device *adev = (struct amdgpu_device *)kgd; 410 struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
411 struct amdgpu_cu_info acu_info = adev->gfx.cu_info; 411 struct amdgpu_cu_info acu_info = adev->gfx.cu_info;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index 8e0d4f7196b4..bcf587b4ba98 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -134,16 +134,16 @@ int amdgpu_amdkfd_post_reset(struct amdgpu_device *adev);
134void amdgpu_amdkfd_gpu_reset(struct kgd_dev *kgd); 134void amdgpu_amdkfd_gpu_reset(struct kgd_dev *kgd);
135 135
136/* Shared API */ 136/* Shared API */
137int alloc_gtt_mem(struct kgd_dev *kgd, size_t size, 137int amdgpu_amdkfd_alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
138 void **mem_obj, uint64_t *gpu_addr, 138 void **mem_obj, uint64_t *gpu_addr,
139 void **cpu_ptr, bool mqd_gfx9); 139 void **cpu_ptr, bool mqd_gfx9);
140void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj); 140void amdgpu_amdkfd_free_gtt_mem(struct kgd_dev *kgd, void *mem_obj);
141void get_local_mem_info(struct kgd_dev *kgd, 141void amdgpu_amdkfd_get_local_mem_info(struct kgd_dev *kgd,
142 struct kfd_local_mem_info *mem_info); 142 struct kfd_local_mem_info *mem_info);
143uint64_t get_gpu_clock_counter(struct kgd_dev *kgd); 143uint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct kgd_dev *kgd);
144 144
145uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd); 145uint32_t amdgpu_amdkfd_get_max_engine_clock_in_mhz(struct kgd_dev *kgd);
146void get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info); 146void amdgpu_amdkfd_get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info);
147uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd); 147uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd);
148uint64_t amdgpu_amdkfd_get_hive_id(struct kgd_dev *kgd); 148uint64_t amdgpu_amdkfd_get_hive_id(struct kgd_dev *kgd);
149 149
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
index 244d9834a381..72a357dae070 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
@@ -173,13 +173,6 @@ static int get_tile_config(struct kgd_dev *kgd,
173} 173}
174 174
175static const struct kfd2kgd_calls kfd2kgd = { 175static const struct kfd2kgd_calls kfd2kgd = {
176 .init_gtt_mem_allocation = alloc_gtt_mem,
177 .free_gtt_mem = free_gtt_mem,
178 .get_local_mem_info = get_local_mem_info,
179 .get_gpu_clock_counter = get_gpu_clock_counter,
180 .get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
181 .alloc_pasid = amdgpu_pasid_alloc,
182 .free_pasid = amdgpu_pasid_free,
183 .program_sh_mem_settings = kgd_program_sh_mem_settings, 176 .program_sh_mem_settings = kgd_program_sh_mem_settings,
184 .set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping, 177 .set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping,
185 .init_interrupts = kgd_init_interrupts, 178 .init_interrupts = kgd_init_interrupts,
@@ -200,28 +193,10 @@ static const struct kfd2kgd_calls kfd2kgd = {
200 .get_fw_version = get_fw_version, 193 .get_fw_version = get_fw_version,
201 .set_scratch_backing_va = set_scratch_backing_va, 194 .set_scratch_backing_va = set_scratch_backing_va,
202 .get_tile_config = get_tile_config, 195 .get_tile_config = get_tile_config,
203 .get_cu_info = get_cu_info,
204 .get_vram_usage = amdgpu_amdkfd_get_vram_usage,
205 .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
206 .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
207 .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
208 .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
209 .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
210 .set_vm_context_page_table_base = set_vm_context_page_table_base, 196 .set_vm_context_page_table_base = set_vm_context_page_table_base,
211 .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
212 .free_memory_of_gpu = amdgpu_amdkfd_gpuvm_free_memory_of_gpu,
213 .map_memory_to_gpu = amdgpu_amdkfd_gpuvm_map_memory_to_gpu,
214 .unmap_memory_to_gpu = amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu,
215 .sync_memory = amdgpu_amdkfd_gpuvm_sync_memory,
216 .map_gtt_bo_to_kernel = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel,
217 .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos,
218 .invalidate_tlbs = invalidate_tlbs, 197 .invalidate_tlbs = invalidate_tlbs,
219 .invalidate_tlbs_vmid = invalidate_tlbs_vmid, 198 .invalidate_tlbs_vmid = invalidate_tlbs_vmid,
220 .submit_ib = amdgpu_amdkfd_submit_ib,
221 .get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info,
222 .read_vmid_from_vmfault_reg = read_vmid_from_vmfault_reg, 199 .read_vmid_from_vmfault_reg = read_vmid_from_vmfault_reg,
223 .gpu_recover = amdgpu_amdkfd_gpu_reset,
224 .set_compute_idle = amdgpu_amdkfd_set_compute_idle
225}; 200};
226 201
227struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void) 202struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
index 9f149914ad6c..0e2a56b6a9b6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
@@ -128,13 +128,6 @@ static int get_tile_config(struct kgd_dev *kgd,
128} 128}
129 129
130static const struct kfd2kgd_calls kfd2kgd = { 130static const struct kfd2kgd_calls kfd2kgd = {
131 .init_gtt_mem_allocation = alloc_gtt_mem,
132 .free_gtt_mem = free_gtt_mem,
133 .get_local_mem_info = get_local_mem_info,
134 .get_gpu_clock_counter = get_gpu_clock_counter,
135 .get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
136 .alloc_pasid = amdgpu_pasid_alloc,
137 .free_pasid = amdgpu_pasid_free,
138 .program_sh_mem_settings = kgd_program_sh_mem_settings, 131 .program_sh_mem_settings = kgd_program_sh_mem_settings,
139 .set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping, 132 .set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping,
140 .init_interrupts = kgd_init_interrupts, 133 .init_interrupts = kgd_init_interrupts,
@@ -157,27 +150,9 @@ static const struct kfd2kgd_calls kfd2kgd = {
157 .get_fw_version = get_fw_version, 150 .get_fw_version = get_fw_version,
158 .set_scratch_backing_va = set_scratch_backing_va, 151 .set_scratch_backing_va = set_scratch_backing_va,
159 .get_tile_config = get_tile_config, 152 .get_tile_config = get_tile_config,
160 .get_cu_info = get_cu_info,
161 .get_vram_usage = amdgpu_amdkfd_get_vram_usage,
162 .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
163 .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
164 .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
165 .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
166 .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
167 .set_vm_context_page_table_base = set_vm_context_page_table_base, 153 .set_vm_context_page_table_base = set_vm_context_page_table_base,
168 .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
169 .free_memory_of_gpu = amdgpu_amdkfd_gpuvm_free_memory_of_gpu,
170 .map_memory_to_gpu = amdgpu_amdkfd_gpuvm_map_memory_to_gpu,
171 .unmap_memory_to_gpu = amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu,
172 .sync_memory = amdgpu_amdkfd_gpuvm_sync_memory,
173 .map_gtt_bo_to_kernel = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel,
174 .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos,
175 .invalidate_tlbs = invalidate_tlbs, 154 .invalidate_tlbs = invalidate_tlbs,
176 .invalidate_tlbs_vmid = invalidate_tlbs_vmid, 155 .invalidate_tlbs_vmid = invalidate_tlbs_vmid,
177 .submit_ib = amdgpu_amdkfd_submit_ib,
178 .get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info,
179 .gpu_recover = amdgpu_amdkfd_gpu_reset,
180 .set_compute_idle = amdgpu_amdkfd_set_compute_idle
181}; 156};
182 157
183struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void) 158struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
index 42cb4c4e0929..03b604c96d94 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
@@ -46,38 +46,9 @@
46#include "v9_structs.h" 46#include "v9_structs.h"
47#include "soc15.h" 47#include "soc15.h"
48#include "soc15d.h" 48#include "soc15d.h"
49#include "mmhub_v1_0.h"
50#include "gfxhub_v1_0.h"
49 51
50/* HACK: MMHUB and GC both have VM-related register with the same
51 * names but different offsets. Define the MMHUB register we need here
52 * with a prefix. A proper solution would be to move the functions
53 * programming these registers into gfx_v9_0.c and mmhub_v1_0.c
54 * respectively.
55 */
56#define mmMMHUB_VM_INVALIDATE_ENG16_REQ 0x06f3
57#define mmMMHUB_VM_INVALIDATE_ENG16_REQ_BASE_IDX 0
58
59#define mmMMHUB_VM_INVALIDATE_ENG16_ACK 0x0705
60#define mmMMHUB_VM_INVALIDATE_ENG16_ACK_BASE_IDX 0
61
62#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32 0x072b
63#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32_BASE_IDX 0
64#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32 0x072c
65#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32_BASE_IDX 0
66
67#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32 0x074b
68#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32_BASE_IDX 0
69#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32 0x074c
70#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32_BASE_IDX 0
71
72#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32 0x076b
73#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32_BASE_IDX 0
74#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32 0x076c
75#define mmMMHUB_VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32_BASE_IDX 0
76
77#define mmMMHUB_VM_INVALIDATE_ENG16_ADDR_RANGE_LO32 0x0727
78#define mmMMHUB_VM_INVALIDATE_ENG16_ADDR_RANGE_LO32_BASE_IDX 0
79#define mmMMHUB_VM_INVALIDATE_ENG16_ADDR_RANGE_HI32 0x0728
80#define mmMMHUB_VM_INVALIDATE_ENG16_ADDR_RANGE_HI32_BASE_IDX 0
81 52
82#define V9_PIPE_PER_MEC (4) 53#define V9_PIPE_PER_MEC (4)
83#define V9_QUEUES_PER_PIPE_MEC (8) 54#define V9_QUEUES_PER_PIPE_MEC (8)
@@ -167,13 +138,6 @@ static int amdgpu_amdkfd_get_tile_config(struct kgd_dev *kgd,
167} 138}
168 139
169static const struct kfd2kgd_calls kfd2kgd = { 140static const struct kfd2kgd_calls kfd2kgd = {
170 .init_gtt_mem_allocation = alloc_gtt_mem,
171 .free_gtt_mem = free_gtt_mem,
172 .get_local_mem_info = get_local_mem_info,
173 .get_gpu_clock_counter = get_gpu_clock_counter,
174 .get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
175 .alloc_pasid = amdgpu_pasid_alloc,
176 .free_pasid = amdgpu_pasid_free,
177 .program_sh_mem_settings = kgd_program_sh_mem_settings, 141 .program_sh_mem_settings = kgd_program_sh_mem_settings,
178 .set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping, 142 .set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping,
179 .init_interrupts = kgd_init_interrupts, 143 .init_interrupts = kgd_init_interrupts,
@@ -196,26 +160,9 @@ static const struct kfd2kgd_calls kfd2kgd = {
196 .get_fw_version = get_fw_version, 160 .get_fw_version = get_fw_version,
197 .set_scratch_backing_va = set_scratch_backing_va, 161 .set_scratch_backing_va = set_scratch_backing_va,
198 .get_tile_config = amdgpu_amdkfd_get_tile_config, 162 .get_tile_config = amdgpu_amdkfd_get_tile_config,
199 .get_cu_info = get_cu_info,
200 .get_vram_usage = amdgpu_amdkfd_get_vram_usage,
201 .create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
202 .acquire_process_vm = amdgpu_amdkfd_gpuvm_acquire_process_vm,
203 .destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
204 .release_process_vm = amdgpu_amdkfd_gpuvm_release_process_vm,
205 .get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
206 .set_vm_context_page_table_base = set_vm_context_page_table_base, 163 .set_vm_context_page_table_base = set_vm_context_page_table_base,
207 .alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
208 .free_memory_of_gpu = amdgpu_amdkfd_gpuvm_free_memory_of_gpu,
209 .map_memory_to_gpu = amdgpu_amdkfd_gpuvm_map_memory_to_gpu,
210 .unmap_memory_to_gpu = amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu,
211 .sync_memory = amdgpu_amdkfd_gpuvm_sync_memory,
212 .map_gtt_bo_to_kernel = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel,
213 .restore_process_bos = amdgpu_amdkfd_gpuvm_restore_process_bos,
214 .invalidate_tlbs = invalidate_tlbs, 164 .invalidate_tlbs = invalidate_tlbs,
215 .invalidate_tlbs_vmid = invalidate_tlbs_vmid, 165 .invalidate_tlbs_vmid = invalidate_tlbs_vmid,
216 .submit_ib = amdgpu_amdkfd_submit_ib,
217 .gpu_recover = amdgpu_amdkfd_gpu_reset,
218 .set_compute_idle = amdgpu_amdkfd_set_compute_idle,
219 .get_hive_id = amdgpu_amdkfd_get_hive_id, 166 .get_hive_id = amdgpu_amdkfd_get_hive_id,
220}; 167};
221 168
@@ -785,15 +732,6 @@ static uint16_t get_atc_vmid_pasid_mapping_pasid(struct kgd_dev *kgd,
785static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid) 732static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid)
786{ 733{
787 struct amdgpu_device *adev = (struct amdgpu_device *) kgd; 734 struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
788 uint32_t req = (1 << vmid) |
789 (0 << VM_INVALIDATE_ENG16_REQ__FLUSH_TYPE__SHIFT) | /* legacy */
790 VM_INVALIDATE_ENG16_REQ__INVALIDATE_L2_PTES_MASK |
791 VM_INVALIDATE_ENG16_REQ__INVALIDATE_L2_PDE0_MASK |
792 VM_INVALIDATE_ENG16_REQ__INVALIDATE_L2_PDE1_MASK |
793 VM_INVALIDATE_ENG16_REQ__INVALIDATE_L2_PDE2_MASK |
794 VM_INVALIDATE_ENG16_REQ__INVALIDATE_L1_PTES_MASK;
795
796 mutex_lock(&adev->srbm_mutex);
797 735
798 /* Use legacy mode tlb invalidation. 736 /* Use legacy mode tlb invalidation.
799 * 737 *
@@ -810,34 +748,7 @@ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid)
810 * TODO 2: support range-based invalidation, requires kfg2kgd 748 * TODO 2: support range-based invalidation, requires kfg2kgd
811 * interface change 749 * interface change
812 */ 750 */
813 WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_INVALIDATE_ENG16_ADDR_RANGE_LO32), 751 amdgpu_gmc_flush_gpu_tlb(adev, vmid, 0);
814 0xffffffff);
815 WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_INVALIDATE_ENG16_ADDR_RANGE_HI32),
816 0x0000001f);
817
818 WREG32(SOC15_REG_OFFSET(MMHUB, 0,
819 mmMMHUB_VM_INVALIDATE_ENG16_ADDR_RANGE_LO32),
820 0xffffffff);
821 WREG32(SOC15_REG_OFFSET(MMHUB, 0,
822 mmMMHUB_VM_INVALIDATE_ENG16_ADDR_RANGE_HI32),
823 0x0000001f);
824
825 WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_INVALIDATE_ENG16_REQ), req);
826
827 WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmMMHUB_VM_INVALIDATE_ENG16_REQ),
828 req);
829
830 while (!(RREG32(SOC15_REG_OFFSET(GC, 0, mmVM_INVALIDATE_ENG16_ACK)) &
831 (1 << vmid)))
832 cpu_relax();
833
834 while (!(RREG32(SOC15_REG_OFFSET(MMHUB, 0,
835 mmMMHUB_VM_INVALIDATE_ENG16_ACK)) &
836 (1 << vmid)))
837 cpu_relax();
838
839 mutex_unlock(&adev->srbm_mutex);
840
841} 752}
842 753
843static int invalidate_tlbs_with_kiq(struct amdgpu_device *adev, uint16_t pasid) 754static int invalidate_tlbs_with_kiq(struct amdgpu_device *adev, uint16_t pasid)
@@ -876,7 +787,7 @@ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
876 if (adev->in_gpu_reset) 787 if (adev->in_gpu_reset)
877 return -EIO; 788 return -EIO;
878 789
879 if (ring->ready) 790 if (ring->sched.ready)
880 return invalidate_tlbs_with_kiq(adev, pasid); 791 return invalidate_tlbs_with_kiq(adev, pasid);
881 792
882 for (vmid = 0; vmid < 16; vmid++) { 793 for (vmid = 0; vmid < 16; vmid++) {
@@ -1016,7 +927,6 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
1016 uint64_t page_table_base) 927 uint64_t page_table_base)
1017{ 928{
1018 struct amdgpu_device *adev = get_amdgpu_device(kgd); 929 struct amdgpu_device *adev = get_amdgpu_device(kgd);
1019 uint64_t base = page_table_base | AMDGPU_PTE_VALID;
1020 930
1021 if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) { 931 if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
1022 pr_err("trying to set page table base for wrong VMID %u\n", 932 pr_err("trying to set page table base for wrong VMID %u\n",
@@ -1028,25 +938,7 @@ static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
1028 * now, all processes share the same address space size, like 938 * now, all processes share the same address space size, like
1029 * on GFX8 and older. 939 * on GFX8 and older.
1030 */ 940 */
1031 WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmMMHUB_VM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32) + (vmid*2), 0); 941 mmhub_v1_0_setup_vm_pt_regs(adev, vmid, page_table_base);
1032 WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmMMHUB_VM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32) + (vmid*2), 0);
1033
1034 WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmMMHUB_VM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32) + (vmid*2),
1035 lower_32_bits(adev->vm_manager.max_pfn - 1));
1036 WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmMMHUB_VM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32) + (vmid*2),
1037 upper_32_bits(adev->vm_manager.max_pfn - 1));
1038
1039 WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmMMHUB_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32) + (vmid*2), lower_32_bits(base));
1040 WREG32(SOC15_REG_OFFSET(MMHUB, 0, mmMMHUB_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32) + (vmid*2), upper_32_bits(base));
1041
1042 WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32) + (vmid*2), 0);
1043 WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32) + (vmid*2), 0);
1044
1045 WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32) + (vmid*2),
1046 lower_32_bits(adev->vm_manager.max_pfn - 1));
1047 WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32) + (vmid*2),
1048 upper_32_bits(adev->vm_manager.max_pfn - 1));
1049 942
1050 WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32) + (vmid*2), lower_32_bits(base)); 943 gfxhub_v1_0_setup_vm_pt_regs(adev, vmid, page_table_base);
1051 WREG32(SOC15_REG_OFFSET(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32) + (vmid*2), upper_32_bits(base));
1052} 944}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
index 8816c697b205..ceadeeadfa56 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
@@ -330,7 +330,9 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
330 case CHIP_TOPAZ: 330 case CHIP_TOPAZ:
331 if (((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x81)) || 331 if (((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x81)) ||
332 ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x83)) || 332 ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x83)) ||
333 ((adev->pdev->device == 0x6907) && (adev->pdev->revision == 0x87))) { 333 ((adev->pdev->device == 0x6907) && (adev->pdev->revision == 0x87)) ||
334 ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0xD1)) ||
335 ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0xD3))) {
334 info->is_kicker = true; 336 info->is_kicker = true;
335 strcpy(fw_name, "amdgpu/topaz_k_smc.bin"); 337 strcpy(fw_name, "amdgpu/topaz_k_smc.bin");
336 } else 338 } else
@@ -351,7 +353,6 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
351 if (type == CGS_UCODE_ID_SMU) { 353 if (type == CGS_UCODE_ID_SMU) {
352 if (((adev->pdev->device == 0x67ef) && 354 if (((adev->pdev->device == 0x67ef) &&
353 ((adev->pdev->revision == 0xe0) || 355 ((adev->pdev->revision == 0xe0) ||
354 (adev->pdev->revision == 0xe2) ||
355 (adev->pdev->revision == 0xe5))) || 356 (adev->pdev->revision == 0xe5))) ||
356 ((adev->pdev->device == 0x67ff) && 357 ((adev->pdev->device == 0x67ff) &&
357 ((adev->pdev->revision == 0xcf) || 358 ((adev->pdev->revision == 0xcf) ||
@@ -359,8 +360,13 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
359 (adev->pdev->revision == 0xff)))) { 360 (adev->pdev->revision == 0xff)))) {
360 info->is_kicker = true; 361 info->is_kicker = true;
361 strcpy(fw_name, "amdgpu/polaris11_k_smc.bin"); 362 strcpy(fw_name, "amdgpu/polaris11_k_smc.bin");
362 } else 363 } else if ((adev->pdev->device == 0x67ef) &&
364 (adev->pdev->revision == 0xe2)) {
365 info->is_kicker = true;
366 strcpy(fw_name, "amdgpu/polaris11_k2_smc.bin");
367 } else {
363 strcpy(fw_name, "amdgpu/polaris11_smc.bin"); 368 strcpy(fw_name, "amdgpu/polaris11_smc.bin");
369 }
364 } else if (type == CGS_UCODE_ID_SMU_SK) { 370 } else if (type == CGS_UCODE_ID_SMU_SK) {
365 strcpy(fw_name, "amdgpu/polaris11_smc_sk.bin"); 371 strcpy(fw_name, "amdgpu/polaris11_smc_sk.bin");
366 } 372 }
@@ -378,14 +384,31 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
378 (adev->pdev->revision == 0xef))) { 384 (adev->pdev->revision == 0xef))) {
379 info->is_kicker = true; 385 info->is_kicker = true;
380 strcpy(fw_name, "amdgpu/polaris10_k_smc.bin"); 386 strcpy(fw_name, "amdgpu/polaris10_k_smc.bin");
381 } else 387 } else if ((adev->pdev->device == 0x67df) &&
388 ((adev->pdev->revision == 0xe1) ||
389 (adev->pdev->revision == 0xf7))) {
390 info->is_kicker = true;
391 strcpy(fw_name, "amdgpu/polaris10_k2_smc.bin");
392 } else {
382 strcpy(fw_name, "amdgpu/polaris10_smc.bin"); 393 strcpy(fw_name, "amdgpu/polaris10_smc.bin");
394 }
383 } else if (type == CGS_UCODE_ID_SMU_SK) { 395 } else if (type == CGS_UCODE_ID_SMU_SK) {
384 strcpy(fw_name, "amdgpu/polaris10_smc_sk.bin"); 396 strcpy(fw_name, "amdgpu/polaris10_smc_sk.bin");
385 } 397 }
386 break; 398 break;
387 case CHIP_POLARIS12: 399 case CHIP_POLARIS12:
388 strcpy(fw_name, "amdgpu/polaris12_smc.bin"); 400 if (((adev->pdev->device == 0x6987) &&
401 ((adev->pdev->revision == 0xc0) ||
402 (adev->pdev->revision == 0xc3))) ||
403 ((adev->pdev->device == 0x6981) &&
404 ((adev->pdev->revision == 0x00) ||
405 (adev->pdev->revision == 0x01) ||
406 (adev->pdev->revision == 0x10)))) {
407 info->is_kicker = true;
408 strcpy(fw_name, "amdgpu/polaris12_k_smc.bin");
409 } else {
410 strcpy(fw_name, "amdgpu/polaris12_smc.bin");
411 }
389 break; 412 break;
390 case CHIP_VEGAM: 413 case CHIP_VEGAM:
391 strcpy(fw_name, "amdgpu/vegam_smc.bin"); 414 strcpy(fw_name, "amdgpu/vegam_smc.bin");
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 35bc8fc3bc70..024dfbd87f11 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -1260,8 +1260,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
1260 return 0; 1260 return 0;
1261 1261
1262error_abort: 1262error_abort:
1263 dma_fence_put(&job->base.s_fence->finished); 1263 drm_sched_job_cleanup(&job->base);
1264 job->base.s_fence = NULL;
1265 amdgpu_mn_unlock(p->mn); 1264 amdgpu_mn_unlock(p->mn);
1266 1265
1267error_unlock: 1266error_unlock:
@@ -1285,7 +1284,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
1285 1284
1286 r = amdgpu_cs_parser_init(&parser, data); 1285 r = amdgpu_cs_parser_init(&parser, data);
1287 if (r) { 1286 if (r) {
1288 DRM_ERROR("Failed to initialize parser !\n"); 1287 DRM_ERROR("Failed to initialize parser %d!\n", r);
1289 goto out; 1288 goto out;
1290 } 1289 }
1291 1290
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
new file mode 100644
index 000000000000..0c590ddf250a
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
@@ -0,0 +1,117 @@
1/*
2 * Copyright 2016 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21
22 * * Author: Monk.liu@amd.com
23 */
24
25#include "amdgpu.h"
26
27uint64_t amdgpu_csa_vaddr(struct amdgpu_device *adev)
28{
29 uint64_t addr = adev->vm_manager.max_pfn << AMDGPU_GPU_PAGE_SHIFT;
30
31 addr -= AMDGPU_VA_RESERVED_SIZE;
32 addr = amdgpu_gmc_sign_extend(addr);
33
34 return addr;
35}
36
37int amdgpu_allocate_static_csa(struct amdgpu_device *adev, struct amdgpu_bo **bo,
38 u32 domain, uint32_t size)
39{
40 int r;
41 void *ptr;
42
43 r = amdgpu_bo_create_kernel(adev, size, PAGE_SIZE,
44 domain, bo,
45 NULL, &ptr);
46 if (!bo)
47 return -ENOMEM;
48
49 memset(ptr, 0, size);
50 return 0;
51}
52
53void amdgpu_free_static_csa(struct amdgpu_bo **bo)
54{
55 amdgpu_bo_free_kernel(bo, NULL, NULL);
56}
57
58/*
59 * amdgpu_map_static_csa should be called during amdgpu_vm_init
60 * it maps virtual address amdgpu_csa_vaddr() to this VM, and each command
61 * submission of GFX should use this virtual address within META_DATA init
62 * package to support SRIOV gfx preemption.
63 */
64int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
65 struct amdgpu_bo *bo, struct amdgpu_bo_va **bo_va,
66 uint64_t csa_addr, uint32_t size)
67{
68 struct ww_acquire_ctx ticket;
69 struct list_head list;
70 struct amdgpu_bo_list_entry pd;
71 struct ttm_validate_buffer csa_tv;
72 int r;
73
74 INIT_LIST_HEAD(&list);
75 INIT_LIST_HEAD(&csa_tv.head);
76 csa_tv.bo = &bo->tbo;
77 csa_tv.shared = true;
78
79 list_add(&csa_tv.head, &list);
80 amdgpu_vm_get_pd_bo(vm, &list, &pd);
81
82 r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL);
83 if (r) {
84 DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r);
85 return r;
86 }
87
88 *bo_va = amdgpu_vm_bo_add(adev, vm, bo);
89 if (!*bo_va) {
90 ttm_eu_backoff_reservation(&ticket, &list);
91 DRM_ERROR("failed to create bo_va for static CSA\n");
92 return -ENOMEM;
93 }
94
95 r = amdgpu_vm_alloc_pts(adev, (*bo_va)->base.vm, csa_addr,
96 size);
97 if (r) {
98 DRM_ERROR("failed to allocate pts for static CSA, err=%d\n", r);
99 amdgpu_vm_bo_rmv(adev, *bo_va);
100 ttm_eu_backoff_reservation(&ticket, &list);
101 return r;
102 }
103
104 r = amdgpu_vm_bo_map(adev, *bo_va, csa_addr, 0, size,
105 AMDGPU_PTE_READABLE | AMDGPU_PTE_WRITEABLE |
106 AMDGPU_PTE_EXECUTABLE);
107
108 if (r) {
109 DRM_ERROR("failed to do bo_map on static CSA, err=%d\n", r);
110 amdgpu_vm_bo_rmv(adev, *bo_va);
111 ttm_eu_backoff_reservation(&ticket, &list);
112 return r;
113 }
114
115 ttm_eu_backoff_reservation(&ticket, &list);
116 return 0;
117}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h
new file mode 100644
index 000000000000..524b4437a021
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h
@@ -0,0 +1,39 @@
1/*
2 * Copyright 2016 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Author: Monk.liu@amd.com
23 */
24
25#ifndef AMDGPU_CSA_MANAGER_H
26#define AMDGPU_CSA_MANAGER_H
27
28#define AMDGPU_CSA_SIZE (128 * 1024)
29
30uint32_t amdgpu_get_total_csa_size(struct amdgpu_device *adev);
31uint64_t amdgpu_csa_vaddr(struct amdgpu_device *adev);
32int amdgpu_allocate_static_csa(struct amdgpu_device *adev, struct amdgpu_bo **bo,
33 u32 domain, uint32_t size);
34int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
35 struct amdgpu_bo *bo, struct amdgpu_bo_va **bo_va,
36 uint64_t csa_addr, uint32_t size);
37void amdgpu_free_static_csa(struct amdgpu_bo **bo);
38
39#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 30bc345d6fdf..590588a82471 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1656,7 +1656,9 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)
1656 1656
1657 /* right after GMC hw init, we create CSA */ 1657 /* right after GMC hw init, we create CSA */
1658 if (amdgpu_sriov_vf(adev)) { 1658 if (amdgpu_sriov_vf(adev)) {
1659 r = amdgpu_allocate_static_csa(adev); 1659 r = amdgpu_allocate_static_csa(adev, &adev->virt.csa_obj,
1660 AMDGPU_GEM_DOMAIN_VRAM,
1661 AMDGPU_CSA_SIZE);
1660 if (r) { 1662 if (r) {
1661 DRM_ERROR("allocate CSA failed %d\n", r); 1663 DRM_ERROR("allocate CSA failed %d\n", r);
1662 return r; 1664 return r;
@@ -1681,7 +1683,8 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)
1681 if (r) 1683 if (r)
1682 return r; 1684 return r;
1683 1685
1684 amdgpu_xgmi_add_device(adev); 1686 if (adev->gmc.xgmi.num_physical_nodes > 1)
1687 amdgpu_xgmi_add_device(adev);
1685 amdgpu_amdkfd_device_init(adev); 1688 amdgpu_amdkfd_device_init(adev);
1686 1689
1687 if (amdgpu_sriov_vf(adev)) 1690 if (amdgpu_sriov_vf(adev))
@@ -1890,7 +1893,7 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
1890 1893
1891 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) { 1894 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
1892 amdgpu_ucode_free_bo(adev); 1895 amdgpu_ucode_free_bo(adev);
1893 amdgpu_free_static_csa(adev); 1896 amdgpu_free_static_csa(&adev->virt.csa_obj);
1894 amdgpu_device_wb_fini(adev); 1897 amdgpu_device_wb_fini(adev);
1895 amdgpu_device_vram_scratch_fini(adev); 1898 amdgpu_device_vram_scratch_fini(adev);
1896 } 1899 }
@@ -3295,13 +3298,35 @@ bool amdgpu_device_should_recover_gpu(struct amdgpu_device *adev)
3295 return false; 3298 return false;
3296 } 3299 }
3297 3300
3298 if (amdgpu_gpu_recovery == 0 || (amdgpu_gpu_recovery == -1 && 3301 if (amdgpu_gpu_recovery == 0)
3299 !amdgpu_sriov_vf(adev))) { 3302 goto disabled;
3300 DRM_INFO("GPU recovery disabled.\n"); 3303
3301 return false; 3304 if (amdgpu_sriov_vf(adev))
3305 return true;
3306
3307 if (amdgpu_gpu_recovery == -1) {
3308 switch (adev->asic_type) {
3309 case CHIP_TOPAZ:
3310 case CHIP_TONGA:
3311 case CHIP_FIJI:
3312 case CHIP_POLARIS10:
3313 case CHIP_POLARIS11:
3314 case CHIP_POLARIS12:
3315 case CHIP_VEGAM:
3316 case CHIP_VEGA20:
3317 case CHIP_VEGA10:
3318 case CHIP_VEGA12:
3319 break;
3320 default:
3321 goto disabled;
3322 }
3302 } 3323 }
3303 3324
3304 return true; 3325 return true;
3326
3327disabled:
3328 DRM_INFO("GPU recovery disabled.\n");
3329 return false;
3305} 3330}
3306 3331
3307/** 3332/**
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 943dbf3c5da1..8de55f7f1a3a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -127,6 +127,9 @@ int amdgpu_compute_multipipe = -1;
127int amdgpu_gpu_recovery = -1; /* auto */ 127int amdgpu_gpu_recovery = -1; /* auto */
128int amdgpu_emu_mode = 0; 128int amdgpu_emu_mode = 0;
129uint amdgpu_smu_memory_pool_size = 0; 129uint amdgpu_smu_memory_pool_size = 0;
130/* FBC (bit 0) disabled by default*/
131uint amdgpu_dc_feature_mask = 0;
132
130struct amdgpu_mgpu_info mgpu_info = { 133struct amdgpu_mgpu_info mgpu_info = {
131 .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex), 134 .mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),
132}; 135};
@@ -631,6 +634,14 @@ module_param(halt_if_hws_hang, int, 0644);
631MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)"); 634MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)");
632#endif 635#endif
633 636
637/**
638 * DOC: dcfeaturemask (uint)
639 * Override display features enabled. See enum DC_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h.
640 * The default is the current set of stable display features.
641 */
642MODULE_PARM_DESC(dcfeaturemask, "all stable DC features enabled (default))");
643module_param_named(dcfeaturemask, amdgpu_dc_feature_mask, uint, 0444);
644
634static const struct pci_device_id pciidlist[] = { 645static const struct pci_device_id pciidlist[] = {
635#ifdef CONFIG_DRM_AMDGPU_SI 646#ifdef CONFIG_DRM_AMDGPU_SI
636 {0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI}, 647 {0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
index 5448cf27654e..ee47c11e92ce 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
@@ -398,9 +398,9 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,
398 ring->fence_drv.irq_type = irq_type; 398 ring->fence_drv.irq_type = irq_type;
399 ring->fence_drv.initialized = true; 399 ring->fence_drv.initialized = true;
400 400
401 dev_dbg(adev->dev, "fence driver on ring %d use gpu addr 0x%016llx, " 401 DRM_DEV_DEBUG(adev->dev, "fence driver on ring %s use gpu addr "
402 "cpu addr 0x%p\n", ring->idx, 402 "0x%016llx, cpu addr 0x%p\n", ring->name,
403 ring->fence_drv.gpu_addr, ring->fence_drv.cpu_addr); 403 ring->fence_drv.gpu_addr, ring->fence_drv.cpu_addr);
404 return 0; 404 return 0;
405} 405}
406 406
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index 11fea28f8ad3..6d11e1721147 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -248,7 +248,7 @@ int amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset,
248 } 248 }
249 mb(); 249 mb();
250 amdgpu_asic_flush_hdp(adev, NULL); 250 amdgpu_asic_flush_hdp(adev, NULL);
251 amdgpu_gmc_flush_gpu_tlb(adev, 0); 251 amdgpu_gmc_flush_gpu_tlb(adev, 0, 0);
252 return 0; 252 return 0;
253} 253}
254 254
@@ -259,6 +259,8 @@ int amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset,
259 * @offset: offset into the GPU's gart aperture 259 * @offset: offset into the GPU's gart aperture
260 * @pages: number of pages to bind 260 * @pages: number of pages to bind
261 * @dma_addr: DMA addresses of pages 261 * @dma_addr: DMA addresses of pages
262 * @flags: page table entry flags
263 * @dst: CPU address of the gart table
262 * 264 *
263 * Map the dma_addresses into GART entries (all asics). 265 * Map the dma_addresses into GART entries (all asics).
264 * Returns 0 for success, -EINVAL for failure. 266 * Returns 0 for success, -EINVAL for failure.
@@ -331,7 +333,7 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset,
331 333
332 mb(); 334 mb();
333 amdgpu_asic_flush_hdp(adev, NULL); 335 amdgpu_asic_flush_hdp(adev, NULL);
334 amdgpu_gmc_flush_gpu_tlb(adev, 0); 336 amdgpu_gmc_flush_gpu_tlb(adev, 0, 0);
335 return 0; 337 return 0;
336} 338}
337 339
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
index 9ff62887e4e3..afa2e2877d87 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
@@ -41,6 +41,7 @@ struct amdgpu_bo;
41 41
42struct amdgpu_gart { 42struct amdgpu_gart {
43 struct amdgpu_bo *bo; 43 struct amdgpu_bo *bo;
44 /* CPU kmapped address of gart table */
44 void *ptr; 45 void *ptr;
45 unsigned num_gpu_pages; 46 unsigned num_gpu_pages;
46 unsigned num_cpu_pages; 47 unsigned num_cpu_pages;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
index 1a656b8657f7..6a70c0b7105f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
@@ -25,6 +25,7 @@
25#include <drm/drmP.h> 25#include <drm/drmP.h>
26#include "amdgpu.h" 26#include "amdgpu.h"
27#include "amdgpu_gfx.h" 27#include "amdgpu_gfx.h"
28#include "amdgpu_rlc.h"
28 29
29/* delay 0.1 second to enable gfx off feature */ 30/* delay 0.1 second to enable gfx off feature */
30#define GFX_OFF_DELAY_ENABLE msecs_to_jiffies(100) 31#define GFX_OFF_DELAY_ENABLE msecs_to_jiffies(100)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
index b61b5c11aead..f790e15bcd08 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
@@ -29,6 +29,7 @@
29 */ 29 */
30#include "clearstate_defs.h" 30#include "clearstate_defs.h"
31#include "amdgpu_ring.h" 31#include "amdgpu_ring.h"
32#include "amdgpu_rlc.h"
32 33
33/* GFX current status */ 34/* GFX current status */
34#define AMDGPU_GFX_NORMAL_MODE 0x00000000L 35#define AMDGPU_GFX_NORMAL_MODE 0x00000000L
@@ -37,59 +38,6 @@
37#define AMDGPU_GFX_CG_DISABLED_MODE 0x00000004L 38#define AMDGPU_GFX_CG_DISABLED_MODE 0x00000004L
38#define AMDGPU_GFX_LBPW_DISABLED_MODE 0x00000008L 39#define AMDGPU_GFX_LBPW_DISABLED_MODE 0x00000008L
39 40
40
41struct amdgpu_rlc_funcs {
42 void (*enter_safe_mode)(struct amdgpu_device *adev);
43 void (*exit_safe_mode)(struct amdgpu_device *adev);
44};
45
46struct amdgpu_rlc {
47 /* for power gating */
48 struct amdgpu_bo *save_restore_obj;
49 uint64_t save_restore_gpu_addr;
50 volatile uint32_t *sr_ptr;
51 const u32 *reg_list;
52 u32 reg_list_size;
53 /* for clear state */
54 struct amdgpu_bo *clear_state_obj;
55 uint64_t clear_state_gpu_addr;
56 volatile uint32_t *cs_ptr;
57 const struct cs_section_def *cs_data;
58 u32 clear_state_size;
59 /* for cp tables */
60 struct amdgpu_bo *cp_table_obj;
61 uint64_t cp_table_gpu_addr;
62 volatile uint32_t *cp_table_ptr;
63 u32 cp_table_size;
64
65 /* safe mode for updating CG/PG state */
66 bool in_safe_mode;
67 const struct amdgpu_rlc_funcs *funcs;
68
69 /* for firmware data */
70 u32 save_and_restore_offset;
71 u32 clear_state_descriptor_offset;
72 u32 avail_scratch_ram_locations;
73 u32 reg_restore_list_size;
74 u32 reg_list_format_start;
75 u32 reg_list_format_separate_start;
76 u32 starting_offsets_start;
77 u32 reg_list_format_size_bytes;
78 u32 reg_list_size_bytes;
79 u32 reg_list_format_direct_reg_list_length;
80 u32 save_restore_list_cntl_size_bytes;
81 u32 save_restore_list_gpm_size_bytes;
82 u32 save_restore_list_srm_size_bytes;
83
84 u32 *register_list_format;
85 u32 *register_restore;
86 u8 *save_restore_list_cntl;
87 u8 *save_restore_list_gpm;
88 u8 *save_restore_list_srm;
89
90 bool is_rlc_v2_1;
91};
92
93#define AMDGPU_MAX_COMPUTE_QUEUES KGD_MAX_QUEUES 41#define AMDGPU_MAX_COMPUTE_QUEUES KGD_MAX_QUEUES
94 42
95struct amdgpu_mec { 43struct amdgpu_mec {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
index 6fa7ef446e46..8c57924c075f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
@@ -64,7 +64,7 @@ struct amdgpu_vmhub {
64struct amdgpu_gmc_funcs { 64struct amdgpu_gmc_funcs {
65 /* flush the vm tlb via mmio */ 65 /* flush the vm tlb via mmio */
66 void (*flush_gpu_tlb)(struct amdgpu_device *adev, 66 void (*flush_gpu_tlb)(struct amdgpu_device *adev,
67 uint32_t vmid); 67 uint32_t vmid, uint32_t flush_type);
68 /* flush the vm tlb via ring */ 68 /* flush the vm tlb via ring */
69 uint64_t (*emit_flush_gpu_tlb)(struct amdgpu_ring *ring, unsigned vmid, 69 uint64_t (*emit_flush_gpu_tlb)(struct amdgpu_ring *ring, unsigned vmid,
70 uint64_t pd_addr); 70 uint64_t pd_addr);
@@ -89,7 +89,7 @@ struct amdgpu_gmc_funcs {
89 89
90struct amdgpu_xgmi { 90struct amdgpu_xgmi {
91 /* from psp */ 91 /* from psp */
92 u64 device_id; 92 u64 node_id;
93 u64 hive_id; 93 u64 hive_id;
94 /* fixed per family */ 94 /* fixed per family */
95 u64 node_segment_size; 95 u64 node_segment_size;
@@ -151,7 +151,7 @@ struct amdgpu_gmc {
151 struct amdgpu_xgmi xgmi; 151 struct amdgpu_xgmi xgmi;
152}; 152};
153 153
154#define amdgpu_gmc_flush_gpu_tlb(adev, vmid) (adev)->gmc.gmc_funcs->flush_gpu_tlb((adev), (vmid)) 154#define amdgpu_gmc_flush_gpu_tlb(adev, vmid, type) (adev)->gmc.gmc_funcs->flush_gpu_tlb((adev), (vmid), (type))
155#define amdgpu_gmc_emit_flush_gpu_tlb(r, vmid, addr) (r)->adev->gmc.gmc_funcs->emit_flush_gpu_tlb((r), (vmid), (addr)) 155#define amdgpu_gmc_emit_flush_gpu_tlb(r, vmid, addr) (r)->adev->gmc.gmc_funcs->emit_flush_gpu_tlb((r), (vmid), (addr))
156#define amdgpu_gmc_emit_pasid_mapping(r, vmid, pasid) (r)->adev->gmc.gmc_funcs->emit_pasid_mapping((r), (vmid), (pasid)) 156#define amdgpu_gmc_emit_pasid_mapping(r, vmid, pasid) (r)->adev->gmc.gmc_funcs->emit_pasid_mapping((r), (vmid), (pasid))
157#define amdgpu_gmc_set_pte_pde(adev, pt, idx, addr, flags) (adev)->gmc.gmc_funcs->set_pte_pde((adev), (pt), (idx), (addr), (flags)) 157#define amdgpu_gmc_set_pte_pde(adev, pt, idx, addr, flags) (adev)->gmc.gmc_funcs->set_pte_pde((adev), (pt), (idx), (addr), (flags))
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index b8963b725dfa..c48207b377bc 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -146,7 +146,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
146 fence_ctx = 0; 146 fence_ctx = 0;
147 } 147 }
148 148
149 if (!ring->ready) { 149 if (!ring->sched.ready) {
150 dev_err(adev->dev, "couldn't schedule ib on ring <%s>\n", ring->name); 150 dev_err(adev->dev, "couldn't schedule ib on ring <%s>\n", ring->name);
151 return -EINVAL; 151 return -EINVAL;
152 } 152 }
@@ -221,8 +221,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
221 !amdgpu_sriov_vf(adev)) /* for SRIOV preemption, Preamble CE ib must be inserted anyway */ 221 !amdgpu_sriov_vf(adev)) /* for SRIOV preemption, Preamble CE ib must be inserted anyway */
222 continue; 222 continue;
223 223
224 amdgpu_ring_emit_ib(ring, ib, job ? job->vmid : 0, 224 amdgpu_ring_emit_ib(ring, job, ib, need_ctx_switch);
225 need_ctx_switch);
226 need_ctx_switch = false; 225 need_ctx_switch = false;
227 } 226 }
228 227
@@ -347,19 +346,14 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)
347 tmo_gfx = 8 * AMDGPU_IB_TEST_TIMEOUT; 346 tmo_gfx = 8 * AMDGPU_IB_TEST_TIMEOUT;
348 } 347 }
349 348
350 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 349 for (i = 0; i < adev->num_rings; ++i) {
351 struct amdgpu_ring *ring = adev->rings[i]; 350 struct amdgpu_ring *ring = adev->rings[i];
352 long tmo; 351 long tmo;
353 352
354 if (!ring || !ring->ready) 353 /* KIQ rings don't have an IB test because we never submit IBs
355 continue; 354 * to them and they have no interrupt support.
356
357 /* skip IB tests for KIQ in general for the below reasons:
358 * 1. We never submit IBs to the KIQ
359 * 2. KIQ doesn't use the EOP interrupts,
360 * we use some other CP interrupt.
361 */ 355 */
362 if (ring->funcs->type == AMDGPU_RING_TYPE_KIQ) 356 if (!ring->sched.ready || !ring->funcs->test_ib)
363 continue; 357 continue;
364 358
365 /* MM engine need more time */ 359 /* MM engine need more time */
@@ -374,20 +368,23 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)
374 tmo = tmo_gfx; 368 tmo = tmo_gfx;
375 369
376 r = amdgpu_ring_test_ib(ring, tmo); 370 r = amdgpu_ring_test_ib(ring, tmo);
377 if (r) { 371 if (!r) {
378 ring->ready = false; 372 DRM_DEV_DEBUG(adev->dev, "ib test on %s succeeded\n",
379 373 ring->name);
380 if (ring == &adev->gfx.gfx_ring[0]) { 374 continue;
381 /* oh, oh, that's really bad */ 375 }
382 DRM_ERROR("amdgpu: failed testing IB on GFX ring (%d).\n", r); 376
383 adev->accel_working = false; 377 ring->sched.ready = false;
384 return r; 378 DRM_DEV_ERROR(adev->dev, "IB test failed on %s (%d).\n",
385 379 ring->name, r);
386 } else { 380
387 /* still not good, but we can live with it */ 381 if (ring == &adev->gfx.gfx_ring[0]) {
388 DRM_ERROR("amdgpu: failed testing IB on ring %d (%d).\n", i, r); 382 /* oh, oh, that's really bad */
389 ret = r; 383 adev->accel_working = false;
390 } 384 return r;
385
386 } else {
387 ret = r;
391 } 388 }
392 } 389 }
393 return ret; 390 return ret;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
index 52c17f6219a7..6b6524f04ce0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
@@ -94,23 +94,6 @@ static void amdgpu_hotplug_work_func(struct work_struct *work)
94} 94}
95 95
96/** 96/**
97 * amdgpu_irq_reset_work_func - execute GPU reset
98 *
99 * @work: work struct pointer
100 *
101 * Execute scheduled GPU reset (Cayman+).
102 * This function is called when the IRQ handler thinks we need a GPU reset.
103 */
104static void amdgpu_irq_reset_work_func(struct work_struct *work)
105{
106 struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
107 reset_work);
108
109 if (!amdgpu_sriov_vf(adev) && amdgpu_device_should_recover_gpu(adev))
110 amdgpu_device_gpu_recover(adev, NULL);
111}
112
113/**
114 * amdgpu_irq_disable_all - disable *all* interrupts 97 * amdgpu_irq_disable_all - disable *all* interrupts
115 * 98 *
116 * @adev: amdgpu device pointer 99 * @adev: amdgpu device pointer
@@ -262,15 +245,12 @@ int amdgpu_irq_init(struct amdgpu_device *adev)
262 amdgpu_hotplug_work_func); 245 amdgpu_hotplug_work_func);
263 } 246 }
264 247
265 INIT_WORK(&adev->reset_work, amdgpu_irq_reset_work_func);
266
267 adev->irq.installed = true; 248 adev->irq.installed = true;
268 r = drm_irq_install(adev->ddev, adev->ddev->pdev->irq); 249 r = drm_irq_install(adev->ddev, adev->ddev->pdev->irq);
269 if (r) { 250 if (r) {
270 adev->irq.installed = false; 251 adev->irq.installed = false;
271 if (!amdgpu_device_has_dc_support(adev)) 252 if (!amdgpu_device_has_dc_support(adev))
272 flush_work(&adev->hotplug_work); 253 flush_work(&adev->hotplug_work);
273 cancel_work_sync(&adev->reset_work);
274 return r; 254 return r;
275 } 255 }
276 adev->ddev->max_vblank_count = 0x00ffffff; 256 adev->ddev->max_vblank_count = 0x00ffffff;
@@ -299,7 +279,6 @@ void amdgpu_irq_fini(struct amdgpu_device *adev)
299 pci_disable_msi(adev->pdev); 279 pci_disable_msi(adev->pdev);
300 if (!amdgpu_device_has_dc_support(adev)) 280 if (!amdgpu_device_has_dc_support(adev))
301 flush_work(&adev->hotplug_work); 281 flush_work(&adev->hotplug_work);
302 cancel_work_sync(&adev->reset_work);
303 } 282 }
304 283
305 for (i = 0; i < AMDGPU_IRQ_CLIENTID_MAX; ++i) { 284 for (i = 0; i < AMDGPU_IRQ_CLIENTID_MAX; ++i) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index 755f733bf0d9..e0af44fd6a0c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -112,6 +112,8 @@ static void amdgpu_job_free_cb(struct drm_sched_job *s_job)
112 struct amdgpu_ring *ring = to_amdgpu_ring(s_job->sched); 112 struct amdgpu_ring *ring = to_amdgpu_ring(s_job->sched);
113 struct amdgpu_job *job = to_amdgpu_job(s_job); 113 struct amdgpu_job *job = to_amdgpu_job(s_job);
114 114
115 drm_sched_job_cleanup(s_job);
116
115 amdgpu_ring_priority_put(ring, s_job->s_priority); 117 amdgpu_ring_priority_put(ring, s_job->s_priority);
116 dma_fence_put(job->fence); 118 dma_fence_put(job->fence);
117 amdgpu_sync_free(&job->sync); 119 amdgpu_sync_free(&job->sync);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
index 57cfe78a262b..e1b46a6703de 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
@@ -33,6 +33,8 @@
33#define to_amdgpu_job(sched_job) \ 33#define to_amdgpu_job(sched_job) \
34 container_of((sched_job), struct amdgpu_job, base) 34 container_of((sched_job), struct amdgpu_job, base)
35 35
36#define AMDGPU_JOB_GET_VMID(job) ((job) ? (job)->vmid : 0)
37
36struct amdgpu_fence; 38struct amdgpu_fence;
37 39
38struct amdgpu_job { 40struct amdgpu_job {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 81732a84c2ab..9b3164c0f861 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -336,7 +336,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
336 case AMDGPU_HW_IP_GFX: 336 case AMDGPU_HW_IP_GFX:
337 type = AMD_IP_BLOCK_TYPE_GFX; 337 type = AMD_IP_BLOCK_TYPE_GFX;
338 for (i = 0; i < adev->gfx.num_gfx_rings; i++) 338 for (i = 0; i < adev->gfx.num_gfx_rings; i++)
339 if (adev->gfx.gfx_ring[i].ready) 339 if (adev->gfx.gfx_ring[i].sched.ready)
340 ++num_rings; 340 ++num_rings;
341 ib_start_alignment = 32; 341 ib_start_alignment = 32;
342 ib_size_alignment = 32; 342 ib_size_alignment = 32;
@@ -344,7 +344,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
344 case AMDGPU_HW_IP_COMPUTE: 344 case AMDGPU_HW_IP_COMPUTE:
345 type = AMD_IP_BLOCK_TYPE_GFX; 345 type = AMD_IP_BLOCK_TYPE_GFX;
346 for (i = 0; i < adev->gfx.num_compute_rings; i++) 346 for (i = 0; i < adev->gfx.num_compute_rings; i++)
347 if (adev->gfx.compute_ring[i].ready) 347 if (adev->gfx.compute_ring[i].sched.ready)
348 ++num_rings; 348 ++num_rings;
349 ib_start_alignment = 32; 349 ib_start_alignment = 32;
350 ib_size_alignment = 32; 350 ib_size_alignment = 32;
@@ -352,7 +352,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
352 case AMDGPU_HW_IP_DMA: 352 case AMDGPU_HW_IP_DMA:
353 type = AMD_IP_BLOCK_TYPE_SDMA; 353 type = AMD_IP_BLOCK_TYPE_SDMA;
354 for (i = 0; i < adev->sdma.num_instances; i++) 354 for (i = 0; i < adev->sdma.num_instances; i++)
355 if (adev->sdma.instance[i].ring.ready) 355 if (adev->sdma.instance[i].ring.sched.ready)
356 ++num_rings; 356 ++num_rings;
357 ib_start_alignment = 256; 357 ib_start_alignment = 256;
358 ib_size_alignment = 4; 358 ib_size_alignment = 4;
@@ -363,7 +363,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
363 if (adev->uvd.harvest_config & (1 << i)) 363 if (adev->uvd.harvest_config & (1 << i))
364 continue; 364 continue;
365 365
366 if (adev->uvd.inst[i].ring.ready) 366 if (adev->uvd.inst[i].ring.sched.ready)
367 ++num_rings; 367 ++num_rings;
368 } 368 }
369 ib_start_alignment = 64; 369 ib_start_alignment = 64;
@@ -372,7 +372,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
372 case AMDGPU_HW_IP_VCE: 372 case AMDGPU_HW_IP_VCE:
373 type = AMD_IP_BLOCK_TYPE_VCE; 373 type = AMD_IP_BLOCK_TYPE_VCE;
374 for (i = 0; i < adev->vce.num_rings; i++) 374 for (i = 0; i < adev->vce.num_rings; i++)
375 if (adev->vce.ring[i].ready) 375 if (adev->vce.ring[i].sched.ready)
376 ++num_rings; 376 ++num_rings;
377 ib_start_alignment = 4; 377 ib_start_alignment = 4;
378 ib_size_alignment = 1; 378 ib_size_alignment = 1;
@@ -384,7 +384,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
384 continue; 384 continue;
385 385
386 for (j = 0; j < adev->uvd.num_enc_rings; j++) 386 for (j = 0; j < adev->uvd.num_enc_rings; j++)
387 if (adev->uvd.inst[i].ring_enc[j].ready) 387 if (adev->uvd.inst[i].ring_enc[j].sched.ready)
388 ++num_rings; 388 ++num_rings;
389 } 389 }
390 ib_start_alignment = 64; 390 ib_start_alignment = 64;
@@ -392,7 +392,7 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
392 break; 392 break;
393 case AMDGPU_HW_IP_VCN_DEC: 393 case AMDGPU_HW_IP_VCN_DEC:
394 type = AMD_IP_BLOCK_TYPE_VCN; 394 type = AMD_IP_BLOCK_TYPE_VCN;
395 if (adev->vcn.ring_dec.ready) 395 if (adev->vcn.ring_dec.sched.ready)
396 ++num_rings; 396 ++num_rings;
397 ib_start_alignment = 16; 397 ib_start_alignment = 16;
398 ib_size_alignment = 16; 398 ib_size_alignment = 16;
@@ -400,14 +400,14 @@ static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
400 case AMDGPU_HW_IP_VCN_ENC: 400 case AMDGPU_HW_IP_VCN_ENC:
401 type = AMD_IP_BLOCK_TYPE_VCN; 401 type = AMD_IP_BLOCK_TYPE_VCN;
402 for (i = 0; i < adev->vcn.num_enc_rings; i++) 402 for (i = 0; i < adev->vcn.num_enc_rings; i++)
403 if (adev->vcn.ring_enc[i].ready) 403 if (adev->vcn.ring_enc[i].sched.ready)
404 ++num_rings; 404 ++num_rings;
405 ib_start_alignment = 64; 405 ib_start_alignment = 64;
406 ib_size_alignment = 1; 406 ib_size_alignment = 1;
407 break; 407 break;
408 case AMDGPU_HW_IP_VCN_JPEG: 408 case AMDGPU_HW_IP_VCN_JPEG:
409 type = AMD_IP_BLOCK_TYPE_VCN; 409 type = AMD_IP_BLOCK_TYPE_VCN;
410 if (adev->vcn.ring_jpeg.ready) 410 if (adev->vcn.ring_jpeg.sched.ready)
411 ++num_rings; 411 ++num_rings;
412 ib_start_alignment = 16; 412 ib_start_alignment = 16;
413 ib_size_alignment = 16; 413 ib_size_alignment = 16;
@@ -978,7 +978,10 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
978 } 978 }
979 979
980 if (amdgpu_sriov_vf(adev)) { 980 if (amdgpu_sriov_vf(adev)) {
981 r = amdgpu_map_static_csa(adev, &fpriv->vm, &fpriv->csa_va); 981 uint64_t csa_addr = amdgpu_csa_vaddr(adev) & AMDGPU_GMC_HOLE_MASK;
982
983 r = amdgpu_map_static_csa(adev, &fpriv->vm, adev->virt.csa_obj,
984 &fpriv->csa_va, csa_addr, AMDGPU_CSA_SIZE);
982 if (r) 985 if (r)
983 goto error_vm; 986 goto error_vm;
984 } 987 }
@@ -1048,8 +1051,8 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
1048 pasid = fpriv->vm.pasid; 1051 pasid = fpriv->vm.pasid;
1049 pd = amdgpu_bo_ref(fpriv->vm.root.base.bo); 1052 pd = amdgpu_bo_ref(fpriv->vm.root.base.bo);
1050 1053
1051 amdgpu_vm_fini(adev, &fpriv->vm);
1052 amdgpu_ctx_mgr_fini(&fpriv->ctx_mgr); 1054 amdgpu_ctx_mgr_fini(&fpriv->ctx_mgr);
1055 amdgpu_vm_fini(adev, &fpriv->vm);
1053 1056
1054 if (pasid) 1057 if (pasid)
1055 amdgpu_pasid_free_delayed(pd->tbo.resv, pasid); 1058 amdgpu_pasid_free_delayed(pd->tbo.resv, pasid);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index b9e9e8b02fb7..11723d8fffbd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -57,7 +57,6 @@ struct amdgpu_hpd;
57#define to_amdgpu_connector(x) container_of(x, struct amdgpu_connector, base) 57#define to_amdgpu_connector(x) container_of(x, struct amdgpu_connector, base)
58#define to_amdgpu_encoder(x) container_of(x, struct amdgpu_encoder, base) 58#define to_amdgpu_encoder(x) container_of(x, struct amdgpu_encoder, base)
59#define to_amdgpu_framebuffer(x) container_of(x, struct amdgpu_framebuffer, base) 59#define to_amdgpu_framebuffer(x) container_of(x, struct amdgpu_framebuffer, base)
60#define to_amdgpu_plane(x) container_of(x, struct amdgpu_plane, base)
61 60
62#define to_dm_plane_state(x) container_of(x, struct dm_plane_state, base); 61#define to_dm_plane_state(x) container_of(x, struct dm_plane_state, base);
63 62
@@ -325,7 +324,7 @@ struct amdgpu_mode_info {
325 struct card_info *atom_card_info; 324 struct card_info *atom_card_info;
326 bool mode_config_initialized; 325 bool mode_config_initialized;
327 struct amdgpu_crtc *crtcs[AMDGPU_MAX_CRTCS]; 326 struct amdgpu_crtc *crtcs[AMDGPU_MAX_CRTCS];
328 struct amdgpu_plane *planes[AMDGPU_MAX_PLANES]; 327 struct drm_plane *planes[AMDGPU_MAX_PLANES];
329 struct amdgpu_afmt *afmt[AMDGPU_MAX_AFMT_BLOCKS]; 328 struct amdgpu_afmt *afmt[AMDGPU_MAX_AFMT_BLOCKS];
330 /* DVI-I properties */ 329 /* DVI-I properties */
331 struct drm_property *coherent_mode_property; 330 struct drm_property *coherent_mode_property;
@@ -434,11 +433,6 @@ struct amdgpu_crtc {
434 struct drm_pending_vblank_event *event; 433 struct drm_pending_vblank_event *event;
435}; 434};
436 435
437struct amdgpu_plane {
438 struct drm_plane base;
439 enum drm_plane_type plane_type;
440};
441
442struct amdgpu_encoder_atom_dig { 436struct amdgpu_encoder_atom_dig {
443 bool linkb; 437 bool linkb;
444 /* atom dig */ 438 /* atom dig */
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
index 59cc678de8c1..7235cd0b0fa9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
@@ -2129,7 +2129,7 @@ void amdgpu_pm_compute_clocks(struct amdgpu_device *adev)
2129 2129
2130 for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 2130 for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
2131 struct amdgpu_ring *ring = adev->rings[i]; 2131 struct amdgpu_ring *ring = adev->rings[i];
2132 if (ring && ring->ready) 2132 if (ring && ring->sched.ready)
2133 amdgpu_fence_wait_empty(ring); 2133 amdgpu_fence_wait_empty(ring);
2134 } 2134 }
2135 2135
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 25d2f3e757f1..e05dc66b1090 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -90,6 +90,8 @@ static int psp_sw_fini(void *handle)
90 adev->psp.sos_fw = NULL; 90 adev->psp.sos_fw = NULL;
91 release_firmware(adev->psp.asd_fw); 91 release_firmware(adev->psp.asd_fw);
92 adev->psp.asd_fw = NULL; 92 adev->psp.asd_fw = NULL;
93 release_firmware(adev->psp.ta_fw);
94 adev->psp.ta_fw = NULL;
93 return 0; 95 return 0;
94} 96}
95 97
@@ -118,21 +120,25 @@ int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
118static int 120static int
119psp_cmd_submit_buf(struct psp_context *psp, 121psp_cmd_submit_buf(struct psp_context *psp,
120 struct amdgpu_firmware_info *ucode, 122 struct amdgpu_firmware_info *ucode,
121 struct psp_gfx_cmd_resp *cmd, uint64_t fence_mc_addr, 123 struct psp_gfx_cmd_resp *cmd, uint64_t fence_mc_addr)
122 int index)
123{ 124{
124 int ret; 125 int ret;
126 int index;
125 127
126 memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE); 128 memset(psp->cmd_buf_mem, 0, PSP_CMD_BUFFER_SIZE);
127 129
128 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp)); 130 memcpy(psp->cmd_buf_mem, cmd, sizeof(struct psp_gfx_cmd_resp));
129 131
132 index = atomic_inc_return(&psp->fence_value);
130 ret = psp_cmd_submit(psp, ucode, psp->cmd_buf_mc_addr, 133 ret = psp_cmd_submit(psp, ucode, psp->cmd_buf_mc_addr,
131 fence_mc_addr, index); 134 fence_mc_addr, index);
135 if (ret) {
136 atomic_dec(&psp->fence_value);
137 return ret;
138 }
132 139
133 while (*((unsigned int *)psp->fence_buf) != index) { 140 while (*((unsigned int *)psp->fence_buf) != index)
134 msleep(1); 141 msleep(1);
135 }
136 142
137 /* the status field must be 0 after FW is loaded */ 143 /* the status field must be 0 after FW is loaded */
138 if (ucode && psp->cmd_buf_mem->resp.status) { 144 if (ucode && psp->cmd_buf_mem->resp.status) {
@@ -191,7 +197,7 @@ static int psp_tmr_load(struct psp_context *psp)
191 PSP_TMR_SIZE, psp->tmr_mc_addr); 197 PSP_TMR_SIZE, psp->tmr_mc_addr);
192 198
193 ret = psp_cmd_submit_buf(psp, NULL, cmd, 199 ret = psp_cmd_submit_buf(psp, NULL, cmd,
194 psp->fence_buf_mc_addr, 1); 200 psp->fence_buf_mc_addr);
195 if (ret) 201 if (ret)
196 goto failed; 202 goto failed;
197 203
@@ -258,13 +264,194 @@ static int psp_asd_load(struct psp_context *psp)
258 psp->asd_ucode_size, PSP_ASD_SHARED_MEM_SIZE); 264 psp->asd_ucode_size, PSP_ASD_SHARED_MEM_SIZE);
259 265
260 ret = psp_cmd_submit_buf(psp, NULL, cmd, 266 ret = psp_cmd_submit_buf(psp, NULL, cmd,
261 psp->fence_buf_mc_addr, 2); 267 psp->fence_buf_mc_addr);
268
269 kfree(cmd);
270
271 return ret;
272}
273
274static void psp_prep_xgmi_ta_load_cmd_buf(struct psp_gfx_cmd_resp *cmd,
275 uint64_t xgmi_ta_mc, uint64_t xgmi_mc_shared,
276 uint32_t xgmi_ta_size, uint32_t shared_size)
277{
278 cmd->cmd_id = GFX_CMD_ID_LOAD_TA;
279 cmd->cmd.cmd_load_ta.app_phy_addr_lo = lower_32_bits(xgmi_ta_mc);
280 cmd->cmd.cmd_load_ta.app_phy_addr_hi = upper_32_bits(xgmi_ta_mc);
281 cmd->cmd.cmd_load_ta.app_len = xgmi_ta_size;
282
283 cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_lo = lower_32_bits(xgmi_mc_shared);
284 cmd->cmd.cmd_load_ta.cmd_buf_phy_addr_hi = upper_32_bits(xgmi_mc_shared);
285 cmd->cmd.cmd_load_ta.cmd_buf_len = shared_size;
286}
287
288static int psp_xgmi_init_shared_buf(struct psp_context *psp)
289{
290 int ret;
291
292 /*
293 * Allocate 16k memory aligned to 4k from Frame Buffer (local
294 * physical) for xgmi ta <-> Driver
295 */
296 ret = amdgpu_bo_create_kernel(psp->adev, PSP_XGMI_SHARED_MEM_SIZE,
297 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
298 &psp->xgmi_context.xgmi_shared_bo,
299 &psp->xgmi_context.xgmi_shared_mc_addr,
300 &psp->xgmi_context.xgmi_shared_buf);
301
302 return ret;
303}
304
305static int psp_xgmi_load(struct psp_context *psp)
306{
307 int ret;
308 struct psp_gfx_cmd_resp *cmd;
309
310 /*
311 * TODO: bypass the loading in sriov for now
312 */
313 if (amdgpu_sriov_vf(psp->adev))
314 return 0;
315
316 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
317 if (!cmd)
318 return -ENOMEM;
319
320 memset(psp->fw_pri_buf, 0, PSP_1_MEG);
321 memcpy(psp->fw_pri_buf, psp->ta_xgmi_start_addr, psp->ta_xgmi_ucode_size);
322
323 psp_prep_xgmi_ta_load_cmd_buf(cmd, psp->fw_pri_mc_addr,
324 psp->xgmi_context.xgmi_shared_mc_addr,
325 psp->ta_xgmi_ucode_size, PSP_XGMI_SHARED_MEM_SIZE);
326
327 ret = psp_cmd_submit_buf(psp, NULL, cmd,
328 psp->fence_buf_mc_addr);
329
330 if (!ret) {
331 psp->xgmi_context.initialized = 1;
332 psp->xgmi_context.session_id = cmd->resp.session_id;
333 }
334
335 kfree(cmd);
336
337 return ret;
338}
339
340static void psp_prep_xgmi_ta_unload_cmd_buf(struct psp_gfx_cmd_resp *cmd,
341 uint32_t xgmi_session_id)
342{
343 cmd->cmd_id = GFX_CMD_ID_UNLOAD_TA;
344 cmd->cmd.cmd_unload_ta.session_id = xgmi_session_id;
345}
346
347static int psp_xgmi_unload(struct psp_context *psp)
348{
349 int ret;
350 struct psp_gfx_cmd_resp *cmd;
351
352 /*
353 * TODO: bypass the unloading in sriov for now
354 */
355 if (amdgpu_sriov_vf(psp->adev))
356 return 0;
357
358 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
359 if (!cmd)
360 return -ENOMEM;
361
362 psp_prep_xgmi_ta_unload_cmd_buf(cmd, psp->xgmi_context.session_id);
363
364 ret = psp_cmd_submit_buf(psp, NULL, cmd,
365 psp->fence_buf_mc_addr);
262 366
263 kfree(cmd); 367 kfree(cmd);
264 368
265 return ret; 369 return ret;
266} 370}
267 371
372static void psp_prep_xgmi_ta_invoke_cmd_buf(struct psp_gfx_cmd_resp *cmd,
373 uint32_t ta_cmd_id,
374 uint32_t xgmi_session_id)
375{
376 cmd->cmd_id = GFX_CMD_ID_INVOKE_CMD;
377 cmd->cmd.cmd_invoke_cmd.session_id = xgmi_session_id;
378 cmd->cmd.cmd_invoke_cmd.ta_cmd_id = ta_cmd_id;
379 /* Note: cmd_invoke_cmd.buf is not used for now */
380}
381
382int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id)
383{
384 int ret;
385 struct psp_gfx_cmd_resp *cmd;
386
387 /*
388 * TODO: bypass the loading in sriov for now
389 */
390 if (amdgpu_sriov_vf(psp->adev))
391 return 0;
392
393 cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
394 if (!cmd)
395 return -ENOMEM;
396
397 psp_prep_xgmi_ta_invoke_cmd_buf(cmd, ta_cmd_id,
398 psp->xgmi_context.session_id);
399
400 ret = psp_cmd_submit_buf(psp, NULL, cmd,
401 psp->fence_buf_mc_addr);
402
403 kfree(cmd);
404
405 return ret;
406}
407
408static int psp_xgmi_terminate(struct psp_context *psp)
409{
410 int ret;
411
412 if (!psp->xgmi_context.initialized)
413 return 0;
414
415 ret = psp_xgmi_unload(psp);
416 if (ret)
417 return ret;
418
419 psp->xgmi_context.initialized = 0;
420
421 /* free xgmi shared memory */
422 amdgpu_bo_free_kernel(&psp->xgmi_context.xgmi_shared_bo,
423 &psp->xgmi_context.xgmi_shared_mc_addr,
424 &psp->xgmi_context.xgmi_shared_buf);
425
426 return 0;
427}
428
429static int psp_xgmi_initialize(struct psp_context *psp)
430{
431 struct ta_xgmi_shared_memory *xgmi_cmd;
432 int ret;
433
434 if (!psp->xgmi_context.initialized) {
435 ret = psp_xgmi_init_shared_buf(psp);
436 if (ret)
437 return ret;
438 }
439
440 /* Load XGMI TA */
441 ret = psp_xgmi_load(psp);
442 if (ret)
443 return ret;
444
445 /* Initialize XGMI session */
446 xgmi_cmd = (struct ta_xgmi_shared_memory *)(psp->xgmi_context.xgmi_shared_buf);
447 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
448 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__INITIALIZE;
449
450 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
451
452 return ret;
453}
454
268static int psp_hw_start(struct psp_context *psp) 455static int psp_hw_start(struct psp_context *psp)
269{ 456{
270 struct amdgpu_device *adev = psp->adev; 457 struct amdgpu_device *adev = psp->adev;
@@ -292,6 +479,15 @@ static int psp_hw_start(struct psp_context *psp)
292 if (ret) 479 if (ret)
293 return ret; 480 return ret;
294 481
482 if (adev->gmc.xgmi.num_physical_nodes > 1) {
483 ret = psp_xgmi_initialize(psp);
484 /* Warning the XGMI seesion initialize failure
485 * Instead of stop driver initialization
486 */
487 if (ret)
488 dev_err(psp->adev->dev,
489 "XGMI: Failed to initialize XGMI session\n");
490 }
295 return 0; 491 return 0;
296} 492}
297 493
@@ -321,7 +517,7 @@ static int psp_np_fw_load(struct psp_context *psp)
321 return ret; 517 return ret;
322 518
323 ret = psp_cmd_submit_buf(psp, ucode, psp->cmd, 519 ret = psp_cmd_submit_buf(psp, ucode, psp->cmd,
324 psp->fence_buf_mc_addr, i + 3); 520 psp->fence_buf_mc_addr);
325 if (ret) 521 if (ret)
326 return ret; 522 return ret;
327 523
@@ -452,6 +648,10 @@ static int psp_hw_fini(void *handle)
452 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) 648 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
453 return 0; 649 return 0;
454 650
651 if (adev->gmc.xgmi.num_physical_nodes > 1 &&
652 psp->xgmi_context.initialized == 1)
653 psp_xgmi_terminate(psp);
654
455 psp_ring_destroy(psp, PSP_RING_TYPE__KM); 655 psp_ring_destroy(psp, PSP_RING_TYPE__KM);
456 656
457 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf); 657 amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf);
@@ -479,6 +679,15 @@ static int psp_suspend(void *handle)
479 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) 679 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
480 return 0; 680 return 0;
481 681
682 if (adev->gmc.xgmi.num_physical_nodes > 1 &&
683 psp->xgmi_context.initialized == 1) {
684 ret = psp_xgmi_terminate(psp);
685 if (ret) {
686 DRM_ERROR("Failed to terminate xgmi ta\n");
687 return ret;
688 }
689 }
690
482 ret = psp_ring_stop(psp, PSP_RING_TYPE__KM); 691 ret = psp_ring_stop(psp, PSP_RING_TYPE__KM);
483 if (ret) { 692 if (ret) {
484 DRM_ERROR("PSP ring stop failed\n"); 693 DRM_ERROR("PSP ring stop failed\n");
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
index 8b8720e9c3f0..9ec5d1a666a6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
@@ -27,14 +27,17 @@
27 27
28#include "amdgpu.h" 28#include "amdgpu.h"
29#include "psp_gfx_if.h" 29#include "psp_gfx_if.h"
30#include "ta_xgmi_if.h"
30 31
31#define PSP_FENCE_BUFFER_SIZE 0x1000 32#define PSP_FENCE_BUFFER_SIZE 0x1000
32#define PSP_CMD_BUFFER_SIZE 0x1000 33#define PSP_CMD_BUFFER_SIZE 0x1000
33#define PSP_ASD_SHARED_MEM_SIZE 0x4000 34#define PSP_ASD_SHARED_MEM_SIZE 0x4000
35#define PSP_XGMI_SHARED_MEM_SIZE 0x4000
34#define PSP_1_MEG 0x100000 36#define PSP_1_MEG 0x100000
35#define PSP_TMR_SIZE 0x400000 37#define PSP_TMR_SIZE 0x400000
36 38
37struct psp_context; 39struct psp_context;
40struct psp_xgmi_node_info;
38struct psp_xgmi_topology_info; 41struct psp_xgmi_topology_info;
39 42
40enum psp_ring_type 43enum psp_ring_type
@@ -80,12 +83,20 @@ struct psp_funcs
80 enum AMDGPU_UCODE_ID ucode_type); 83 enum AMDGPU_UCODE_ID ucode_type);
81 bool (*smu_reload_quirk)(struct psp_context *psp); 84 bool (*smu_reload_quirk)(struct psp_context *psp);
82 int (*mode1_reset)(struct psp_context *psp); 85 int (*mode1_reset)(struct psp_context *psp);
83 uint64_t (*xgmi_get_device_id)(struct psp_context *psp); 86 uint64_t (*xgmi_get_node_id)(struct psp_context *psp);
84 uint64_t (*xgmi_get_hive_id)(struct psp_context *psp); 87 uint64_t (*xgmi_get_hive_id)(struct psp_context *psp);
85 int (*xgmi_get_topology_info)(struct psp_context *psp, int number_devices, 88 int (*xgmi_get_topology_info)(struct psp_context *psp, int number_devices,
86 struct psp_xgmi_topology_info *topology); 89 struct psp_xgmi_topology_info *topology);
87 int (*xgmi_set_topology_info)(struct psp_context *psp, int number_devices, 90 int (*xgmi_set_topology_info)(struct psp_context *psp, int number_devices,
88 struct psp_xgmi_topology_info *topology); 91 struct psp_xgmi_topology_info *topology);
92};
93
94struct psp_xgmi_context {
95 uint8_t initialized;
96 uint32_t session_id;
97 struct amdgpu_bo *xgmi_shared_bo;
98 uint64_t xgmi_shared_mc_addr;
99 void *xgmi_shared_buf;
89}; 100};
90 101
91struct psp_context 102struct psp_context
@@ -96,7 +107,7 @@ struct psp_context
96 107
97 const struct psp_funcs *funcs; 108 const struct psp_funcs *funcs;
98 109
99 /* fence buffer */ 110 /* firmware buffer */
100 struct amdgpu_bo *fw_pri_bo; 111 struct amdgpu_bo *fw_pri_bo;
101 uint64_t fw_pri_mc_addr; 112 uint64_t fw_pri_mc_addr;
102 void *fw_pri_buf; 113 void *fw_pri_buf;
@@ -134,6 +145,16 @@ struct psp_context
134 struct amdgpu_bo *cmd_buf_bo; 145 struct amdgpu_bo *cmd_buf_bo;
135 uint64_t cmd_buf_mc_addr; 146 uint64_t cmd_buf_mc_addr;
136 struct psp_gfx_cmd_resp *cmd_buf_mem; 147 struct psp_gfx_cmd_resp *cmd_buf_mem;
148
149 /* fence value associated with cmd buffer */
150 atomic_t fence_value;
151
152 /* xgmi ta firmware and buffer */
153 const struct firmware *ta_fw;
154 uint32_t ta_xgmi_ucode_version;
155 uint32_t ta_xgmi_ucode_size;
156 uint8_t *ta_xgmi_start_addr;
157 struct psp_xgmi_context xgmi_context;
137}; 158};
138 159
139struct amdgpu_psp_funcs { 160struct amdgpu_psp_funcs {
@@ -141,21 +162,17 @@ struct amdgpu_psp_funcs {
141 enum AMDGPU_UCODE_ID); 162 enum AMDGPU_UCODE_ID);
142}; 163};
143 164
165#define AMDGPU_XGMI_MAX_CONNECTED_NODES 64
166struct psp_xgmi_node_info {
167 uint64_t node_id;
168 uint8_t num_hops;
169 uint8_t is_sharing_enabled;
170 enum ta_xgmi_assigned_sdma_engine sdma_engine;
171};
172
144struct psp_xgmi_topology_info { 173struct psp_xgmi_topology_info {
145 /* Generated by PSP to identify the GPU instance within xgmi connection */ 174 uint32_t num_nodes;
146 uint64_t device_id; 175 struct psp_xgmi_node_info nodes[AMDGPU_XGMI_MAX_CONNECTED_NODES];
147 /*
148 * If all bits set to 0 , driver indicates it wants to retrieve the xgmi
149 * connection vector topology, but not access enable the connections
150 * if some or all bits are set to 1, driver indicates it want to retrieve the
151 * current xgmi topology and access enable the link to GPU[i] associated
152 * with the bit position in the vector.
153 * On return,: bits indicated which xgmi links are present/active depending
154 * on the value passed in. The relative bit offset for the relative GPU index
155 * within the hive is always marked active.
156 */
157 uint32_t connection_mask;
158 uint32_t reserved; /* must be 0 */
159}; 176};
160 177
161#define psp_prep_cmd_buf(ucode, type) (psp)->funcs->prep_cmd_buf((ucode), (type)) 178#define psp_prep_cmd_buf(ucode, type) (psp)->funcs->prep_cmd_buf((ucode), (type))
@@ -177,8 +194,8 @@ struct psp_xgmi_topology_info {
177 ((psp)->funcs->smu_reload_quirk ? (psp)->funcs->smu_reload_quirk((psp)) : false) 194 ((psp)->funcs->smu_reload_quirk ? (psp)->funcs->smu_reload_quirk((psp)) : false)
178#define psp_mode1_reset(psp) \ 195#define psp_mode1_reset(psp) \
179 ((psp)->funcs->mode1_reset ? (psp)->funcs->mode1_reset((psp)) : false) 196 ((psp)->funcs->mode1_reset ? (psp)->funcs->mode1_reset((psp)) : false)
180#define psp_xgmi_get_device_id(psp) \ 197#define psp_xgmi_get_node_id(psp) \
181 ((psp)->funcs->xgmi_get_device_id ? (psp)->funcs->xgmi_get_device_id((psp)) : 0) 198 ((psp)->funcs->xgmi_get_node_id ? (psp)->funcs->xgmi_get_node_id((psp)) : 0)
182#define psp_xgmi_get_hive_id(psp) \ 199#define psp_xgmi_get_hive_id(psp) \
183 ((psp)->funcs->xgmi_get_hive_id ? (psp)->funcs->xgmi_get_hive_id((psp)) : 0) 200 ((psp)->funcs->xgmi_get_hive_id ? (psp)->funcs->xgmi_get_hive_id((psp)) : 0)
184#define psp_xgmi_get_topology_info(psp, num_device, topology) \ 201#define psp_xgmi_get_topology_info(psp, num_device, topology) \
@@ -199,6 +216,8 @@ extern int psp_wait_for(struct psp_context *psp, uint32_t reg_index,
199extern const struct amdgpu_ip_block_version psp_v10_0_ip_block; 216extern const struct amdgpu_ip_block_version psp_v10_0_ip_block;
200 217
201int psp_gpu_reset(struct amdgpu_device *adev); 218int psp_gpu_reset(struct amdgpu_device *adev);
219int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id);
220
202extern const struct amdgpu_ip_block_version psp_v11_0_ip_block; 221extern const struct amdgpu_ip_block_version psp_v11_0_ip_block;
203 222
204#endif 223#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index b70e85ec147d..5b75bdc8dc28 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -338,7 +338,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
338 */ 338 */
339void amdgpu_ring_fini(struct amdgpu_ring *ring) 339void amdgpu_ring_fini(struct amdgpu_ring *ring)
340{ 340{
341 ring->ready = false; 341 ring->sched.ready = false;
342 342
343 /* Not to finish a ring which is not initialized */ 343 /* Not to finish a ring which is not initialized */
344 if (!(ring->adev) || !(ring->adev->rings[ring->idx])) 344 if (!(ring->adev) || !(ring->adev->rings[ring->idx]))
@@ -500,3 +500,29 @@ static void amdgpu_debugfs_ring_fini(struct amdgpu_ring *ring)
500 debugfs_remove(ring->ent); 500 debugfs_remove(ring->ent);
501#endif 501#endif
502} 502}
503
504/**
505 * amdgpu_ring_test_helper - tests ring and set sched readiness status
506 *
507 * @ring: ring to try the recovery on
508 *
509 * Tests ring and set sched readiness status
510 *
511 * Returns 0 on success, error on failure.
512 */
513int amdgpu_ring_test_helper(struct amdgpu_ring *ring)
514{
515 struct amdgpu_device *adev = ring->adev;
516 int r;
517
518 r = amdgpu_ring_test_ring(ring);
519 if (r)
520 DRM_DEV_ERROR(adev->dev, "ring %s test failed (%d)\n",
521 ring->name, r);
522 else
523 DRM_DEV_DEBUG(adev->dev, "ring test on %s succeeded\n",
524 ring->name);
525
526 ring->sched.ready = !r;
527 return r;
528}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
index 4caa301ce454..0beb01fef83f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
@@ -129,8 +129,9 @@ struct amdgpu_ring_funcs {
129 unsigned emit_ib_size; 129 unsigned emit_ib_size;
130 /* command emit functions */ 130 /* command emit functions */
131 void (*emit_ib)(struct amdgpu_ring *ring, 131 void (*emit_ib)(struct amdgpu_ring *ring,
132 struct amdgpu_job *job,
132 struct amdgpu_ib *ib, 133 struct amdgpu_ib *ib,
133 unsigned vmid, bool ctx_switch); 134 bool ctx_switch);
134 void (*emit_fence)(struct amdgpu_ring *ring, uint64_t addr, 135 void (*emit_fence)(struct amdgpu_ring *ring, uint64_t addr,
135 uint64_t seq, unsigned flags); 136 uint64_t seq, unsigned flags);
136 void (*emit_pipeline_sync)(struct amdgpu_ring *ring); 137 void (*emit_pipeline_sync)(struct amdgpu_ring *ring);
@@ -189,7 +190,6 @@ struct amdgpu_ring {
189 uint64_t gpu_addr; 190 uint64_t gpu_addr;
190 uint64_t ptr_mask; 191 uint64_t ptr_mask;
191 uint32_t buf_mask; 192 uint32_t buf_mask;
192 bool ready;
193 u32 idx; 193 u32 idx;
194 u32 me; 194 u32 me;
195 u32 pipe; 195 u32 pipe;
@@ -229,7 +229,7 @@ struct amdgpu_ring {
229#define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r)) 229#define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
230#define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r)) 230#define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
231#define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r)) 231#define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
232#define amdgpu_ring_emit_ib(r, ib, vmid, c) (r)->funcs->emit_ib((r), (ib), (vmid), (c)) 232#define amdgpu_ring_emit_ib(r, job, ib, c) ((r)->funcs->emit_ib((r), (job), (ib), (c)))
233#define amdgpu_ring_emit_pipeline_sync(r) (r)->funcs->emit_pipeline_sync((r)) 233#define amdgpu_ring_emit_pipeline_sync(r) (r)->funcs->emit_pipeline_sync((r))
234#define amdgpu_ring_emit_vm_flush(r, vmid, addr) (r)->funcs->emit_vm_flush((r), (vmid), (addr)) 234#define amdgpu_ring_emit_vm_flush(r, vmid, addr) (r)->funcs->emit_vm_flush((r), (vmid), (addr))
235#define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags)) 235#define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags))
@@ -313,4 +313,6 @@ static inline void amdgpu_ring_write_multiple(struct amdgpu_ring *ring,
313 ring->count_dw -= count_dw; 313 ring->count_dw -= count_dw;
314} 314}
315 315
316int amdgpu_ring_test_helper(struct amdgpu_ring *ring);
317
316#endif 318#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c
new file mode 100644
index 000000000000..c8793e6cc3c5
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.c
@@ -0,0 +1,282 @@
1/*
2 * Copyright 2014 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 *
24 */
25#include <linux/firmware.h>
26#include "amdgpu.h"
27#include "amdgpu_gfx.h"
28#include "amdgpu_rlc.h"
29
30/**
31 * amdgpu_gfx_rlc_enter_safe_mode - Set RLC into safe mode
32 *
33 * @adev: amdgpu_device pointer
34 *
35 * Set RLC enter into safe mode if RLC is enabled and haven't in safe mode.
36 */
37void amdgpu_gfx_rlc_enter_safe_mode(struct amdgpu_device *adev)
38{
39 if (adev->gfx.rlc.in_safe_mode)
40 return;
41
42 /* if RLC is not enabled, do nothing */
43 if (!adev->gfx.rlc.funcs->is_rlc_enabled(adev))
44 return;
45
46 if (adev->cg_flags &
47 (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG |
48 AMD_CG_SUPPORT_GFX_3D_CGCG)) {
49 adev->gfx.rlc.funcs->set_safe_mode(adev);
50 adev->gfx.rlc.in_safe_mode = true;
51 }
52}
53
54/**
55 * amdgpu_gfx_rlc_exit_safe_mode - Set RLC out of safe mode
56 *
57 * @adev: amdgpu_device pointer
58 *
59 * Set RLC exit safe mode if RLC is enabled and have entered into safe mode.
60 */
61void amdgpu_gfx_rlc_exit_safe_mode(struct amdgpu_device *adev)
62{
63 if (!(adev->gfx.rlc.in_safe_mode))
64 return;
65
66 /* if RLC is not enabled, do nothing */
67 if (!adev->gfx.rlc.funcs->is_rlc_enabled(adev))
68 return;
69
70 if (adev->cg_flags &
71 (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG |
72 AMD_CG_SUPPORT_GFX_3D_CGCG)) {
73 adev->gfx.rlc.funcs->unset_safe_mode(adev);
74 adev->gfx.rlc.in_safe_mode = false;
75 }
76}
77
78/**
79 * amdgpu_gfx_rlc_init_sr - Init save restore block
80 *
81 * @adev: amdgpu_device pointer
82 * @dws: the size of save restore block
83 *
84 * Allocate and setup value to save restore block of rlc.
85 * Returns 0 on succeess or negative error code if allocate failed.
86 */
87int amdgpu_gfx_rlc_init_sr(struct amdgpu_device *adev, u32 dws)
88{
89 const u32 *src_ptr;
90 volatile u32 *dst_ptr;
91 u32 i;
92 int r;
93
94 /* allocate save restore block */
95 r = amdgpu_bo_create_reserved(adev, dws * 4, PAGE_SIZE,
96 AMDGPU_GEM_DOMAIN_VRAM,
97 &adev->gfx.rlc.save_restore_obj,
98 &adev->gfx.rlc.save_restore_gpu_addr,
99 (void **)&adev->gfx.rlc.sr_ptr);
100 if (r) {
101 dev_warn(adev->dev, "(%d) create RLC sr bo failed\n", r);
102 amdgpu_gfx_rlc_fini(adev);
103 return r;
104 }
105
106 /* write the sr buffer */
107 src_ptr = adev->gfx.rlc.reg_list;
108 dst_ptr = adev->gfx.rlc.sr_ptr;
109 for (i = 0; i < adev->gfx.rlc.reg_list_size; i++)
110 dst_ptr[i] = cpu_to_le32(src_ptr[i]);
111 amdgpu_bo_kunmap(adev->gfx.rlc.save_restore_obj);
112 amdgpu_bo_unreserve(adev->gfx.rlc.save_restore_obj);
113
114 return 0;
115}
116
117/**
118 * amdgpu_gfx_rlc_init_csb - Init clear state block
119 *
120 * @adev: amdgpu_device pointer
121 *
122 * Allocate and setup value to clear state block of rlc.
123 * Returns 0 on succeess or negative error code if allocate failed.
124 */
125int amdgpu_gfx_rlc_init_csb(struct amdgpu_device *adev)
126{
127 volatile u32 *dst_ptr;
128 u32 dws;
129 int r;
130
131 /* allocate clear state block */
132 adev->gfx.rlc.clear_state_size = dws = adev->gfx.rlc.funcs->get_csb_size(adev);
133 r = amdgpu_bo_create_reserved(adev, dws * 4, PAGE_SIZE,
134 AMDGPU_GEM_DOMAIN_VRAM,
135 &adev->gfx.rlc.clear_state_obj,
136 &adev->gfx.rlc.clear_state_gpu_addr,
137 (void **)&adev->gfx.rlc.cs_ptr);
138 if (r) {
139 dev_err(adev->dev, "(%d) failed to create rlc csb bo\n", r);
140 amdgpu_gfx_rlc_fini(adev);
141 return r;
142 }
143
144 /* set up the cs buffer */
145 dst_ptr = adev->gfx.rlc.cs_ptr;
146 adev->gfx.rlc.funcs->get_csb_buffer(adev, dst_ptr);
147 amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj);
148 amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
149 amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
150
151 return 0;
152}
153
154/**
155 * amdgpu_gfx_rlc_init_cpt - Init cp table
156 *
157 * @adev: amdgpu_device pointer
158 *
159 * Allocate and setup value to cp table of rlc.
160 * Returns 0 on succeess or negative error code if allocate failed.
161 */
162int amdgpu_gfx_rlc_init_cpt(struct amdgpu_device *adev)
163{
164 int r;
165
166 r = amdgpu_bo_create_reserved(adev, adev->gfx.rlc.cp_table_size,
167 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
168 &adev->gfx.rlc.cp_table_obj,
169 &adev->gfx.rlc.cp_table_gpu_addr,
170 (void **)&adev->gfx.rlc.cp_table_ptr);
171 if (r) {
172 dev_err(adev->dev, "(%d) failed to create cp table bo\n", r);
173 amdgpu_gfx_rlc_fini(adev);
174 return r;
175 }
176
177 /* set up the cp table */
178 amdgpu_gfx_rlc_setup_cp_table(adev);
179 amdgpu_bo_kunmap(adev->gfx.rlc.cp_table_obj);
180 amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj);
181
182 return 0;
183}
184
185/**
186 * amdgpu_gfx_rlc_setup_cp_table - setup cp the buffer of cp table
187 *
188 * @adev: amdgpu_device pointer
189 *
190 * Write cp firmware data into cp table.
191 */
192void amdgpu_gfx_rlc_setup_cp_table(struct amdgpu_device *adev)
193{
194 const __le32 *fw_data;
195 volatile u32 *dst_ptr;
196 int me, i, max_me;
197 u32 bo_offset = 0;
198 u32 table_offset, table_size;
199
200 max_me = adev->gfx.rlc.funcs->get_cp_table_num(adev);
201
202 /* write the cp table buffer */
203 dst_ptr = adev->gfx.rlc.cp_table_ptr;
204 for (me = 0; me < max_me; me++) {
205 if (me == 0) {
206 const struct gfx_firmware_header_v1_0 *hdr =
207 (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data;
208 fw_data = (const __le32 *)
209 (adev->gfx.ce_fw->data +
210 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
211 table_offset = le32_to_cpu(hdr->jt_offset);
212 table_size = le32_to_cpu(hdr->jt_size);
213 } else if (me == 1) {
214 const struct gfx_firmware_header_v1_0 *hdr =
215 (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data;
216 fw_data = (const __le32 *)
217 (adev->gfx.pfp_fw->data +
218 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
219 table_offset = le32_to_cpu(hdr->jt_offset);
220 table_size = le32_to_cpu(hdr->jt_size);
221 } else if (me == 2) {
222 const struct gfx_firmware_header_v1_0 *hdr =
223 (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
224 fw_data = (const __le32 *)
225 (adev->gfx.me_fw->data +
226 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
227 table_offset = le32_to_cpu(hdr->jt_offset);
228 table_size = le32_to_cpu(hdr->jt_size);
229 } else if (me == 3) {
230 const struct gfx_firmware_header_v1_0 *hdr =
231 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
232 fw_data = (const __le32 *)
233 (adev->gfx.mec_fw->data +
234 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
235 table_offset = le32_to_cpu(hdr->jt_offset);
236 table_size = le32_to_cpu(hdr->jt_size);
237 } else if (me == 4) {
238 const struct gfx_firmware_header_v1_0 *hdr =
239 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data;
240 fw_data = (const __le32 *)
241 (adev->gfx.mec2_fw->data +
242 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
243 table_offset = le32_to_cpu(hdr->jt_offset);
244 table_size = le32_to_cpu(hdr->jt_size);
245 }
246
247 for (i = 0; i < table_size; i ++) {
248 dst_ptr[bo_offset + i] =
249 cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
250 }
251
252 bo_offset += table_size;
253 }
254}
255
256/**
257 * amdgpu_gfx_rlc_fini - Free BO which used for RLC
258 *
259 * @adev: amdgpu_device pointer
260 *
261 * Free three BO which is used for rlc_save_restore_block, rlc_clear_state_block
262 * and rlc_jump_table_block.
263 */
264void amdgpu_gfx_rlc_fini(struct amdgpu_device *adev)
265{
266 /* save restore block */
267 if (adev->gfx.rlc.save_restore_obj) {
268 amdgpu_bo_free_kernel(&adev->gfx.rlc.save_restore_obj,
269 &adev->gfx.rlc.save_restore_gpu_addr,
270 (void **)&adev->gfx.rlc.sr_ptr);
271 }
272
273 /* clear state block */
274 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj,
275 &adev->gfx.rlc.clear_state_gpu_addr,
276 (void **)&adev->gfx.rlc.cs_ptr);
277
278 /* jump table block */
279 amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj,
280 &adev->gfx.rlc.cp_table_gpu_addr,
281 (void **)&adev->gfx.rlc.cp_table_ptr);
282}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.h
new file mode 100644
index 000000000000..49a8ab52113b
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.h
@@ -0,0 +1,98 @@
1/*
2 * Copyright 2014 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#ifndef __AMDGPU_RLC_H__
25#define __AMDGPU_RLC_H__
26
27#include "clearstate_defs.h"
28
29struct amdgpu_rlc_funcs {
30 bool (*is_rlc_enabled)(struct amdgpu_device *adev);
31 void (*set_safe_mode)(struct amdgpu_device *adev);
32 void (*unset_safe_mode)(struct amdgpu_device *adev);
33 int (*init)(struct amdgpu_device *adev);
34 u32 (*get_csb_size)(struct amdgpu_device *adev);
35 void (*get_csb_buffer)(struct amdgpu_device *adev, volatile u32 *buffer);
36 int (*get_cp_table_num)(struct amdgpu_device *adev);
37 int (*resume)(struct amdgpu_device *adev);
38 void (*stop)(struct amdgpu_device *adev);
39 void (*reset)(struct amdgpu_device *adev);
40 void (*start)(struct amdgpu_device *adev);
41};
42
43struct amdgpu_rlc {
44 /* for power gating */
45 struct amdgpu_bo *save_restore_obj;
46 uint64_t save_restore_gpu_addr;
47 volatile uint32_t *sr_ptr;
48 const u32 *reg_list;
49 u32 reg_list_size;
50 /* for clear state */
51 struct amdgpu_bo *clear_state_obj;
52 uint64_t clear_state_gpu_addr;
53 volatile uint32_t *cs_ptr;
54 const struct cs_section_def *cs_data;
55 u32 clear_state_size;
56 /* for cp tables */
57 struct amdgpu_bo *cp_table_obj;
58 uint64_t cp_table_gpu_addr;
59 volatile uint32_t *cp_table_ptr;
60 u32 cp_table_size;
61
62 /* safe mode for updating CG/PG state */
63 bool in_safe_mode;
64 const struct amdgpu_rlc_funcs *funcs;
65
66 /* for firmware data */
67 u32 save_and_restore_offset;
68 u32 clear_state_descriptor_offset;
69 u32 avail_scratch_ram_locations;
70 u32 reg_restore_list_size;
71 u32 reg_list_format_start;
72 u32 reg_list_format_separate_start;
73 u32 starting_offsets_start;
74 u32 reg_list_format_size_bytes;
75 u32 reg_list_size_bytes;
76 u32 reg_list_format_direct_reg_list_length;
77 u32 save_restore_list_cntl_size_bytes;
78 u32 save_restore_list_gpm_size_bytes;
79 u32 save_restore_list_srm_size_bytes;
80
81 u32 *register_list_format;
82 u32 *register_restore;
83 u8 *save_restore_list_cntl;
84 u8 *save_restore_list_gpm;
85 u8 *save_restore_list_srm;
86
87 bool is_rlc_v2_1;
88};
89
90void amdgpu_gfx_rlc_enter_safe_mode(struct amdgpu_device *adev);
91void amdgpu_gfx_rlc_exit_safe_mode(struct amdgpu_device *adev);
92int amdgpu_gfx_rlc_init_sr(struct amdgpu_device *adev, u32 dws);
93int amdgpu_gfx_rlc_init_csb(struct amdgpu_device *adev);
94int amdgpu_gfx_rlc_init_cpt(struct amdgpu_device *adev);
95void amdgpu_gfx_rlc_setup_cp_table(struct amdgpu_device *adev);
96void amdgpu_gfx_rlc_fini(struct amdgpu_device *adev);
97
98#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
index bc9244b429ef..115bb0c99b0f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
@@ -28,17 +28,31 @@
28 * GPU SDMA IP block helpers function. 28 * GPU SDMA IP block helpers function.
29 */ 29 */
30 30
31struct amdgpu_sdma_instance * amdgpu_get_sdma_instance(struct amdgpu_ring *ring) 31struct amdgpu_sdma_instance *amdgpu_sdma_get_instance_from_ring(struct amdgpu_ring *ring)
32{ 32{
33 struct amdgpu_device *adev = ring->adev; 33 struct amdgpu_device *adev = ring->adev;
34 int i; 34 int i;
35 35
36 for (i = 0; i < adev->sdma.num_instances; i++) 36 for (i = 0; i < adev->sdma.num_instances; i++)
37 if (&adev->sdma.instance[i].ring == ring) 37 if (ring == &adev->sdma.instance[i].ring ||
38 break; 38 ring == &adev->sdma.instance[i].page)
39 return &adev->sdma.instance[i];
39 40
40 if (i < AMDGPU_MAX_SDMA_INSTANCES) 41 return NULL;
41 return &adev->sdma.instance[i]; 42}
42 else 43
43 return NULL; 44int amdgpu_sdma_get_index_from_ring(struct amdgpu_ring *ring, uint32_t *index)
45{
46 struct amdgpu_device *adev = ring->adev;
47 int i;
48
49 for (i = 0; i < adev->sdma.num_instances; i++) {
50 if (ring == &adev->sdma.instance[i].ring ||
51 ring == &adev->sdma.instance[i].page) {
52 *index = i;
53 return 0;
54 }
55 }
56
57 return -EINVAL;
44} 58}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
index 500113ec65ca..16b1a6ae5ba6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
@@ -41,6 +41,7 @@ struct amdgpu_sdma_instance {
41 uint32_t feature_version; 41 uint32_t feature_version;
42 42
43 struct amdgpu_ring ring; 43 struct amdgpu_ring ring;
44 struct amdgpu_ring page;
44 bool burst_nop; 45 bool burst_nop;
45}; 46};
46 47
@@ -50,6 +51,7 @@ struct amdgpu_sdma {
50 struct amdgpu_irq_src illegal_inst_irq; 51 struct amdgpu_irq_src illegal_inst_irq;
51 int num_instances; 52 int num_instances;
52 uint32_t srbm_soft_reset; 53 uint32_t srbm_soft_reset;
54 bool has_page_queue;
53}; 55};
54 56
55/* 57/*
@@ -92,6 +94,7 @@ struct amdgpu_buffer_funcs {
92#define amdgpu_emit_fill_buffer(adev, ib, s, d, b) (adev)->mman.buffer_funcs->emit_fill_buffer((ib), (s), (d), (b)) 94#define amdgpu_emit_fill_buffer(adev, ib, s, d, b) (adev)->mman.buffer_funcs->emit_fill_buffer((ib), (s), (d), (b))
93 95
94struct amdgpu_sdma_instance * 96struct amdgpu_sdma_instance *
95amdgpu_get_sdma_instance(struct amdgpu_ring *ring); 97amdgpu_sdma_get_instance_from_ring(struct amdgpu_ring *ring);
98int amdgpu_sdma_get_index_from_ring(struct amdgpu_ring *ring, uint32_t *index);
96 99
97#endif 100#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
index e9bf70e2ac51..626abca770a0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
@@ -218,6 +218,7 @@ TRACE_EVENT(amdgpu_vm_grab_id,
218 TP_ARGS(vm, ring, job), 218 TP_ARGS(vm, ring, job),
219 TP_STRUCT__entry( 219 TP_STRUCT__entry(
220 __field(u32, pasid) 220 __field(u32, pasid)
221 __string(ring, ring->name)
221 __field(u32, ring) 222 __field(u32, ring)
222 __field(u32, vmid) 223 __field(u32, vmid)
223 __field(u32, vm_hub) 224 __field(u32, vm_hub)
@@ -227,14 +228,14 @@ TRACE_EVENT(amdgpu_vm_grab_id,
227 228
228 TP_fast_assign( 229 TP_fast_assign(
229 __entry->pasid = vm->pasid; 230 __entry->pasid = vm->pasid;
230 __entry->ring = ring->idx; 231 __assign_str(ring, ring->name)
231 __entry->vmid = job->vmid; 232 __entry->vmid = job->vmid;
232 __entry->vm_hub = ring->funcs->vmhub, 233 __entry->vm_hub = ring->funcs->vmhub,
233 __entry->pd_addr = job->vm_pd_addr; 234 __entry->pd_addr = job->vm_pd_addr;
234 __entry->needs_flush = job->vm_needs_flush; 235 __entry->needs_flush = job->vm_needs_flush;
235 ), 236 ),
236 TP_printk("pasid=%d, ring=%u, id=%u, hub=%u, pd_addr=%010Lx needs_flush=%u", 237 TP_printk("pasid=%d, ring=%s, id=%u, hub=%u, pd_addr=%010Lx needs_flush=%u",
237 __entry->pasid, __entry->ring, __entry->vmid, 238 __entry->pasid, __get_str(ring), __entry->vmid,
238 __entry->vm_hub, __entry->pd_addr, __entry->needs_flush) 239 __entry->vm_hub, __entry->pd_addr, __entry->needs_flush)
239); 240);
240 241
@@ -366,20 +367,20 @@ TRACE_EVENT(amdgpu_vm_flush,
366 uint64_t pd_addr), 367 uint64_t pd_addr),
367 TP_ARGS(ring, vmid, pd_addr), 368 TP_ARGS(ring, vmid, pd_addr),
368 TP_STRUCT__entry( 369 TP_STRUCT__entry(
369 __field(u32, ring) 370 __string(ring, ring->name)
370 __field(u32, vmid) 371 __field(u32, vmid)
371 __field(u32, vm_hub) 372 __field(u32, vm_hub)
372 __field(u64, pd_addr) 373 __field(u64, pd_addr)
373 ), 374 ),
374 375
375 TP_fast_assign( 376 TP_fast_assign(
376 __entry->ring = ring->idx; 377 __assign_str(ring, ring->name)
377 __entry->vmid = vmid; 378 __entry->vmid = vmid;
378 __entry->vm_hub = ring->funcs->vmhub; 379 __entry->vm_hub = ring->funcs->vmhub;
379 __entry->pd_addr = pd_addr; 380 __entry->pd_addr = pd_addr;
380 ), 381 ),
381 TP_printk("ring=%u, id=%u, hub=%u, pd_addr=%010Lx", 382 TP_printk("ring=%s, id=%u, hub=%u, pd_addr=%010Lx",
382 __entry->ring, __entry->vmid, 383 __get_str(ring), __entry->vmid,
383 __entry->vm_hub,__entry->pd_addr) 384 __entry->vm_hub,__entry->pd_addr)
384); 385);
385 386
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index a44fc12ae1f9..c91ec3101d00 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -61,100 +61,6 @@ static int amdgpu_map_buffer(struct ttm_buffer_object *bo,
61static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev); 61static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev);
62static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev); 62static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev);
63 63
64/*
65 * Global memory.
66 */
67
68/**
69 * amdgpu_ttm_mem_global_init - Initialize and acquire reference to
70 * memory object
71 *
72 * @ref: Object for initialization.
73 *
74 * This is called by drm_global_item_ref() when an object is being
75 * initialized.
76 */
77static int amdgpu_ttm_mem_global_init(struct drm_global_reference *ref)
78{
79 return ttm_mem_global_init(ref->object);
80}
81
82/**
83 * amdgpu_ttm_mem_global_release - Drop reference to a memory object
84 *
85 * @ref: Object being removed
86 *
87 * This is called by drm_global_item_unref() when an object is being
88 * released.
89 */
90static void amdgpu_ttm_mem_global_release(struct drm_global_reference *ref)
91{
92 ttm_mem_global_release(ref->object);
93}
94
95/**
96 * amdgpu_ttm_global_init - Initialize global TTM memory reference structures.
97 *
98 * @adev: AMDGPU device for which the global structures need to be registered.
99 *
100 * This is called as part of the AMDGPU ttm init from amdgpu_ttm_init()
101 * during bring up.
102 */
103static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
104{
105 struct drm_global_reference *global_ref;
106 int r;
107
108 /* ensure reference is false in case init fails */
109 adev->mman.mem_global_referenced = false;
110
111 global_ref = &adev->mman.mem_global_ref;
112 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
113 global_ref->size = sizeof(struct ttm_mem_global);
114 global_ref->init = &amdgpu_ttm_mem_global_init;
115 global_ref->release = &amdgpu_ttm_mem_global_release;
116 r = drm_global_item_ref(global_ref);
117 if (r) {
118 DRM_ERROR("Failed setting up TTM memory accounting "
119 "subsystem.\n");
120 goto error_mem;
121 }
122
123 adev->mman.bo_global_ref.mem_glob =
124 adev->mman.mem_global_ref.object;
125 global_ref = &adev->mman.bo_global_ref.ref;
126 global_ref->global_type = DRM_GLOBAL_TTM_BO;
127 global_ref->size = sizeof(struct ttm_bo_global);
128 global_ref->init = &ttm_bo_global_init;
129 global_ref->release = &ttm_bo_global_release;
130 r = drm_global_item_ref(global_ref);
131 if (r) {
132 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
133 goto error_bo;
134 }
135
136 mutex_init(&adev->mman.gtt_window_lock);
137
138 adev->mman.mem_global_referenced = true;
139
140 return 0;
141
142error_bo:
143 drm_global_item_unref(&adev->mman.mem_global_ref);
144error_mem:
145 return r;
146}
147
148static void amdgpu_ttm_global_fini(struct amdgpu_device *adev)
149{
150 if (adev->mman.mem_global_referenced) {
151 mutex_destroy(&adev->mman.gtt_window_lock);
152 drm_global_item_unref(&adev->mman.bo_global_ref.ref);
153 drm_global_item_unref(&adev->mman.mem_global_ref);
154 adev->mman.mem_global_referenced = false;
155 }
156}
157
158static int amdgpu_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags) 64static int amdgpu_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
159{ 65{
160 return 0; 66 return 0;
@@ -1758,14 +1664,10 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
1758 int r; 1664 int r;
1759 u64 vis_vram_limit; 1665 u64 vis_vram_limit;
1760 1666
1761 /* initialize global references for vram/gtt */ 1667 mutex_init(&adev->mman.gtt_window_lock);
1762 r = amdgpu_ttm_global_init(adev); 1668
1763 if (r) {
1764 return r;
1765 }
1766 /* No others user of address space so set it to 0 */ 1669 /* No others user of address space so set it to 0 */
1767 r = ttm_bo_device_init(&adev->mman.bdev, 1670 r = ttm_bo_device_init(&adev->mman.bdev,
1768 adev->mman.bo_global_ref.ref.object,
1769 &amdgpu_bo_driver, 1671 &amdgpu_bo_driver,
1770 adev->ddev->anon_inode->i_mapping, 1672 adev->ddev->anon_inode->i_mapping,
1771 DRM_FILE_PAGE_OFFSET, 1673 DRM_FILE_PAGE_OFFSET,
@@ -1922,7 +1824,6 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
1922 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GWS); 1824 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GWS);
1923 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA); 1825 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA);
1924 ttm_bo_device_release(&adev->mman.bdev); 1826 ttm_bo_device_release(&adev->mman.bdev);
1925 amdgpu_ttm_global_fini(adev);
1926 adev->mman.initialized = false; 1827 adev->mman.initialized = false;
1927 DRM_INFO("amdgpu: ttm finalized\n"); 1828 DRM_INFO("amdgpu: ttm finalized\n");
1928} 1829}
@@ -2069,7 +1970,7 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset,
2069 unsigned i; 1970 unsigned i;
2070 int r; 1971 int r;
2071 1972
2072 if (direct_submit && !ring->ready) { 1973 if (direct_submit && !ring->sched.ready) {
2073 DRM_ERROR("Trying to move memory with ring turned off.\n"); 1974 DRM_ERROR("Trying to move memory with ring turned off.\n");
2074 return -EINVAL; 1975 return -EINVAL;
2075 } 1976 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
index fe8f276e9811..b5b2d101f7db 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
@@ -39,8 +39,6 @@
39#define AMDGPU_GTT_NUM_TRANSFER_WINDOWS 2 39#define AMDGPU_GTT_NUM_TRANSFER_WINDOWS 2
40 40
41struct amdgpu_mman { 41struct amdgpu_mman {
42 struct ttm_bo_global_ref bo_global_ref;
43 struct drm_global_reference mem_global_ref;
44 struct ttm_bo_device bdev; 42 struct ttm_bo_device bdev;
45 bool mem_global_referenced; 43 bool mem_global_referenced;
46 bool initialized; 44 bool initialized;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
index aa6641b944a0..7ac25a1c7853 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
@@ -58,6 +58,17 @@ struct psp_firmware_header_v1_0 {
58}; 58};
59 59
60/* version_major=1, version_minor=0 */ 60/* version_major=1, version_minor=0 */
61struct ta_firmware_header_v1_0 {
62 struct common_firmware_header header;
63 uint32_t ta_xgmi_ucode_version;
64 uint32_t ta_xgmi_offset_bytes;
65 uint32_t ta_xgmi_size_bytes;
66 uint32_t ta_ras_ucode_version;
67 uint32_t ta_ras_offset_bytes;
68 uint32_t ta_ras_size_bytes;
69};
70
71/* version_major=1, version_minor=0 */
61struct gfx_firmware_header_v1_0 { 72struct gfx_firmware_header_v1_0 {
62 struct common_firmware_header header; 73 struct common_firmware_header header;
63 uint32_t ucode_feature_version; 74 uint32_t ucode_feature_version;
@@ -170,6 +181,7 @@ union amdgpu_firmware_header {
170 struct mc_firmware_header_v1_0 mc; 181 struct mc_firmware_header_v1_0 mc;
171 struct smc_firmware_header_v1_0 smc; 182 struct smc_firmware_header_v1_0 smc;
172 struct psp_firmware_header_v1_0 psp; 183 struct psp_firmware_header_v1_0 psp;
184 struct ta_firmware_header_v1_0 ta;
173 struct gfx_firmware_header_v1_0 gfx; 185 struct gfx_firmware_header_v1_0 gfx;
174 struct rlc_firmware_header_v1_0 rlc; 186 struct rlc_firmware_header_v1_0 rlc;
175 struct rlc_firmware_header_v2_0 rlc_v2_0; 187 struct rlc_firmware_header_v2_0 rlc_v2_0;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index e5a6db6beab7..69896f451e8a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -1243,30 +1243,20 @@ int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout)
1243{ 1243{
1244 struct dma_fence *fence; 1244 struct dma_fence *fence;
1245 long r; 1245 long r;
1246 uint32_t ip_instance = ring->me;
1247 1246
1248 r = amdgpu_uvd_get_create_msg(ring, 1, NULL); 1247 r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
1249 if (r) { 1248 if (r)
1250 DRM_ERROR("amdgpu: (%d)failed to get create msg (%ld).\n", ip_instance, r);
1251 goto error; 1249 goto error;
1252 }
1253 1250
1254 r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence); 1251 r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
1255 if (r) { 1252 if (r)
1256 DRM_ERROR("amdgpu: (%d)failed to get destroy ib (%ld).\n", ip_instance, r);
1257 goto error; 1253 goto error;
1258 }
1259 1254
1260 r = dma_fence_wait_timeout(fence, false, timeout); 1255 r = dma_fence_wait_timeout(fence, false, timeout);
1261 if (r == 0) { 1256 if (r == 0)
1262 DRM_ERROR("amdgpu: (%d)IB test timed out.\n", ip_instance);
1263 r = -ETIMEDOUT; 1257 r = -ETIMEDOUT;
1264 } else if (r < 0) { 1258 else if (r > 0)
1265 DRM_ERROR("amdgpu: (%d)fence wait failed (%ld).\n", ip_instance, r);
1266 } else {
1267 DRM_DEBUG("ib test on (%d)ring %d succeeded\n", ip_instance, ring->idx);
1268 r = 0; 1259 r = 0;
1269 }
1270 1260
1271 dma_fence_put(fence); 1261 dma_fence_put(fence);
1272 1262
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 5f3f54073818..98a1b2ce2b9d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -1032,8 +1032,10 @@ out:
1032 * @ib: the IB to execute 1032 * @ib: the IB to execute
1033 * 1033 *
1034 */ 1034 */
1035void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib, 1035void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring,
1036 unsigned vmid, bool ctx_switch) 1036 struct amdgpu_job *job,
1037 struct amdgpu_ib *ib,
1038 bool ctx_switch)
1037{ 1039{
1038 amdgpu_ring_write(ring, VCE_CMD_IB); 1040 amdgpu_ring_write(ring, VCE_CMD_IB);
1039 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); 1041 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
@@ -1079,11 +1081,9 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring)
1079 return 0; 1081 return 0;
1080 1082
1081 r = amdgpu_ring_alloc(ring, 16); 1083 r = amdgpu_ring_alloc(ring, 16);
1082 if (r) { 1084 if (r)
1083 DRM_ERROR("amdgpu: vce failed to lock ring %d (%d).\n",
1084 ring->idx, r);
1085 return r; 1085 return r;
1086 } 1086
1087 amdgpu_ring_write(ring, VCE_CMD_END); 1087 amdgpu_ring_write(ring, VCE_CMD_END);
1088 amdgpu_ring_commit(ring); 1088 amdgpu_ring_commit(ring);
1089 1089
@@ -1093,14 +1093,8 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring)
1093 DRM_UDELAY(1); 1093 DRM_UDELAY(1);
1094 } 1094 }
1095 1095
1096 if (i < timeout) { 1096 if (i >= timeout)
1097 DRM_DEBUG("ring test on %d succeeded in %d usecs\n",
1098 ring->idx, i);
1099 } else {
1100 DRM_ERROR("amdgpu: ring %d test failed\n",
1101 ring->idx);
1102 r = -ETIMEDOUT; 1097 r = -ETIMEDOUT;
1103 }
1104 1098
1105 return r; 1099 return r;
1106} 1100}
@@ -1121,27 +1115,19 @@ int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout)
1121 return 0; 1115 return 0;
1122 1116
1123 r = amdgpu_vce_get_create_msg(ring, 1, NULL); 1117 r = amdgpu_vce_get_create_msg(ring, 1, NULL);
1124 if (r) { 1118 if (r)
1125 DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
1126 goto error; 1119 goto error;
1127 }
1128 1120
1129 r = amdgpu_vce_get_destroy_msg(ring, 1, true, &fence); 1121 r = amdgpu_vce_get_destroy_msg(ring, 1, true, &fence);
1130 if (r) { 1122 if (r)
1131 DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
1132 goto error; 1123 goto error;
1133 }
1134 1124
1135 r = dma_fence_wait_timeout(fence, false, timeout); 1125 r = dma_fence_wait_timeout(fence, false, timeout);
1136 if (r == 0) { 1126 if (r == 0)
1137 DRM_ERROR("amdgpu: IB test timed out.\n");
1138 r = -ETIMEDOUT; 1127 r = -ETIMEDOUT;
1139 } else if (r < 0) { 1128 else if (r > 0)
1140 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
1141 } else {
1142 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
1143 r = 0; 1129 r = 0;
1144 } 1130
1145error: 1131error:
1146 dma_fence_put(fence); 1132 dma_fence_put(fence);
1147 return r; 1133 return r;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
index a1f209eed4c4..50293652af14 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
@@ -65,8 +65,8 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
65void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp); 65void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp);
66int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx); 66int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx);
67int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx); 67int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx);
68void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib, 68void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_job *job,
69 unsigned vmid, bool ctx_switch); 69 struct amdgpu_ib *ib, bool ctx_switch);
70void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, 70void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
71 unsigned flags); 71 unsigned flags);
72int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring); 72int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 27da13df2f11..e2e42e3fbcf3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -425,11 +425,9 @@ int amdgpu_vcn_dec_ring_test_ring(struct amdgpu_ring *ring)
425 425
426 WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0xCAFEDEAD); 426 WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0xCAFEDEAD);
427 r = amdgpu_ring_alloc(ring, 3); 427 r = amdgpu_ring_alloc(ring, 3);
428 if (r) { 428 if (r)
429 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n",
430 ring->idx, r);
431 return r; 429 return r;
432 } 430
433 amdgpu_ring_write(ring, 431 amdgpu_ring_write(ring,
434 PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0)); 432 PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0));
435 amdgpu_ring_write(ring, 0xDEADBEEF); 433 amdgpu_ring_write(ring, 0xDEADBEEF);
@@ -441,14 +439,9 @@ int amdgpu_vcn_dec_ring_test_ring(struct amdgpu_ring *ring)
441 DRM_UDELAY(1); 439 DRM_UDELAY(1);
442 } 440 }
443 441
444 if (i < adev->usec_timeout) { 442 if (i >= adev->usec_timeout)
445 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", 443 r = -ETIMEDOUT;
446 ring->idx, i); 444
447 } else {
448 DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
449 ring->idx, tmp);
450 r = -EINVAL;
451 }
452 return r; 445 return r;
453} 446}
454 447
@@ -570,30 +563,20 @@ int amdgpu_vcn_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout)
570 long r; 563 long r;
571 564
572 r = amdgpu_vcn_dec_get_create_msg(ring, 1, NULL); 565 r = amdgpu_vcn_dec_get_create_msg(ring, 1, NULL);
573 if (r) { 566 if (r)
574 DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
575 goto error; 567 goto error;
576 }
577 568
578 r = amdgpu_vcn_dec_get_destroy_msg(ring, 1, &fence); 569 r = amdgpu_vcn_dec_get_destroy_msg(ring, 1, &fence);
579 if (r) { 570 if (r)
580 DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
581 goto error; 571 goto error;
582 }
583 572
584 r = dma_fence_wait_timeout(fence, false, timeout); 573 r = dma_fence_wait_timeout(fence, false, timeout);
585 if (r == 0) { 574 if (r == 0)
586 DRM_ERROR("amdgpu: IB test timed out.\n");
587 r = -ETIMEDOUT; 575 r = -ETIMEDOUT;
588 } else if (r < 0) { 576 else if (r > 0)
589 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
590 } else {
591 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
592 r = 0; 577 r = 0;
593 }
594 578
595 dma_fence_put(fence); 579 dma_fence_put(fence);
596
597error: 580error:
598 return r; 581 return r;
599} 582}
@@ -606,11 +589,9 @@ int amdgpu_vcn_enc_ring_test_ring(struct amdgpu_ring *ring)
606 int r; 589 int r;
607 590
608 r = amdgpu_ring_alloc(ring, 16); 591 r = amdgpu_ring_alloc(ring, 16);
609 if (r) { 592 if (r)
610 DRM_ERROR("amdgpu: vcn enc failed to lock ring %d (%d).\n",
611 ring->idx, r);
612 return r; 593 return r;
613 } 594
614 amdgpu_ring_write(ring, VCN_ENC_CMD_END); 595 amdgpu_ring_write(ring, VCN_ENC_CMD_END);
615 amdgpu_ring_commit(ring); 596 amdgpu_ring_commit(ring);
616 597
@@ -620,14 +601,8 @@ int amdgpu_vcn_enc_ring_test_ring(struct amdgpu_ring *ring)
620 DRM_UDELAY(1); 601 DRM_UDELAY(1);
621 } 602 }
622 603
623 if (i < adev->usec_timeout) { 604 if (i >= adev->usec_timeout)
624 DRM_DEBUG("ring test on %d succeeded in %d usecs\n",
625 ring->idx, i);
626 } else {
627 DRM_ERROR("amdgpu: ring %d test failed\n",
628 ring->idx);
629 r = -ETIMEDOUT; 605 r = -ETIMEDOUT;
630 }
631 606
632 return r; 607 return r;
633} 608}
@@ -742,27 +717,19 @@ int amdgpu_vcn_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout)
742 long r; 717 long r;
743 718
744 r = amdgpu_vcn_enc_get_create_msg(ring, 1, NULL); 719 r = amdgpu_vcn_enc_get_create_msg(ring, 1, NULL);
745 if (r) { 720 if (r)
746 DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
747 goto error; 721 goto error;
748 }
749 722
750 r = amdgpu_vcn_enc_get_destroy_msg(ring, 1, &fence); 723 r = amdgpu_vcn_enc_get_destroy_msg(ring, 1, &fence);
751 if (r) { 724 if (r)
752 DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
753 goto error; 725 goto error;
754 }
755 726
756 r = dma_fence_wait_timeout(fence, false, timeout); 727 r = dma_fence_wait_timeout(fence, false, timeout);
757 if (r == 0) { 728 if (r == 0)
758 DRM_ERROR("amdgpu: IB test timed out.\n");
759 r = -ETIMEDOUT; 729 r = -ETIMEDOUT;
760 } else if (r < 0) { 730 else if (r > 0)
761 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
762 } else {
763 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
764 r = 0; 731 r = 0;
765 } 732
766error: 733error:
767 dma_fence_put(fence); 734 dma_fence_put(fence);
768 return r; 735 return r;
@@ -778,11 +745,8 @@ int amdgpu_vcn_jpeg_ring_test_ring(struct amdgpu_ring *ring)
778 WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0xCAFEDEAD); 745 WREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0xCAFEDEAD);
779 r = amdgpu_ring_alloc(ring, 3); 746 r = amdgpu_ring_alloc(ring, 3);
780 747
781 if (r) { 748 if (r)
782 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n",
783 ring->idx, r);
784 return r; 749 return r;
785 }
786 750
787 amdgpu_ring_write(ring, 751 amdgpu_ring_write(ring,
788 PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0, 0, 0)); 752 PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9), 0, 0, 0));
@@ -796,14 +760,8 @@ int amdgpu_vcn_jpeg_ring_test_ring(struct amdgpu_ring *ring)
796 DRM_UDELAY(1); 760 DRM_UDELAY(1);
797 } 761 }
798 762
799 if (i < adev->usec_timeout) { 763 if (i >= adev->usec_timeout)
800 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", 764 r = -ETIMEDOUT;
801 ring->idx, i);
802 } else {
803 DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
804 ring->idx, tmp);
805 r = -EINVAL;
806 }
807 765
808 return r; 766 return r;
809} 767}
@@ -856,21 +814,18 @@ int amdgpu_vcn_jpeg_ring_test_ib(struct amdgpu_ring *ring, long timeout)
856 long r = 0; 814 long r = 0;
857 815
858 r = amdgpu_vcn_jpeg_set_reg(ring, 1, &fence); 816 r = amdgpu_vcn_jpeg_set_reg(ring, 1, &fence);
859 if (r) { 817 if (r)
860 DRM_ERROR("amdgpu: failed to set jpeg register (%ld).\n", r);
861 goto error; 818 goto error;
862 }
863 819
864 r = dma_fence_wait_timeout(fence, false, timeout); 820 r = dma_fence_wait_timeout(fence, false, timeout);
865 if (r == 0) { 821 if (r == 0) {
866 DRM_ERROR("amdgpu: IB test timed out.\n");
867 r = -ETIMEDOUT; 822 r = -ETIMEDOUT;
868 goto error; 823 goto error;
869 } else if (r < 0) { 824 } else if (r < 0) {
870 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
871 goto error; 825 goto error;
872 } else 826 } else {
873 r = 0; 827 r = 0;
828 }
874 829
875 for (i = 0; i < adev->usec_timeout; i++) { 830 for (i = 0; i < adev->usec_timeout; i++) {
876 tmp = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9)); 831 tmp = RREG32(SOC15_REG_OFFSET(UVD, 0, mmUVD_SCRATCH9));
@@ -879,15 +834,10 @@ int amdgpu_vcn_jpeg_ring_test_ib(struct amdgpu_ring *ring, long timeout)
879 DRM_UDELAY(1); 834 DRM_UDELAY(1);
880 } 835 }
881 836
882 if (i < adev->usec_timeout) 837 if (i >= adev->usec_timeout)
883 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx); 838 r = -ETIMEDOUT;
884 else {
885 DRM_ERROR("ib test failed (0x%08X)\n", tmp);
886 r = -EINVAL;
887 }
888 839
889 dma_fence_put(fence); 840 dma_fence_put(fence);
890
891error: 841error:
892 return r; 842 return r;
893} 843}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
index f2f358aa0597..cfee74732edb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
@@ -23,16 +23,6 @@
23 23
24#include "amdgpu.h" 24#include "amdgpu.h"
25 25
26uint64_t amdgpu_csa_vaddr(struct amdgpu_device *adev)
27{
28 uint64_t addr = adev->vm_manager.max_pfn << AMDGPU_GPU_PAGE_SHIFT;
29
30 addr -= AMDGPU_VA_RESERVED_SIZE;
31 addr = amdgpu_gmc_sign_extend(addr);
32
33 return addr;
34}
35
36bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev) 26bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev)
37{ 27{
38 /* By now all MMIO pages except mailbox are blocked */ 28 /* By now all MMIO pages except mailbox are blocked */
@@ -41,88 +31,6 @@ bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev)
41 return RREG32_NO_KIQ(0xc040) == 0xffffffff; 31 return RREG32_NO_KIQ(0xc040) == 0xffffffff;
42} 32}
43 33
44int amdgpu_allocate_static_csa(struct amdgpu_device *adev)
45{
46 int r;
47 void *ptr;
48
49 r = amdgpu_bo_create_kernel(adev, AMDGPU_CSA_SIZE, PAGE_SIZE,
50 AMDGPU_GEM_DOMAIN_VRAM, &adev->virt.csa_obj,
51 &adev->virt.csa_vmid0_addr, &ptr);
52 if (r)
53 return r;
54
55 memset(ptr, 0, AMDGPU_CSA_SIZE);
56 return 0;
57}
58
59void amdgpu_free_static_csa(struct amdgpu_device *adev) {
60 amdgpu_bo_free_kernel(&adev->virt.csa_obj,
61 &adev->virt.csa_vmid0_addr,
62 NULL);
63}
64
65/*
66 * amdgpu_map_static_csa should be called during amdgpu_vm_init
67 * it maps virtual address amdgpu_csa_vaddr() to this VM, and each command
68 * submission of GFX should use this virtual address within META_DATA init
69 * package to support SRIOV gfx preemption.
70 */
71int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
72 struct amdgpu_bo_va **bo_va)
73{
74 uint64_t csa_addr = amdgpu_csa_vaddr(adev) & AMDGPU_GMC_HOLE_MASK;
75 struct ww_acquire_ctx ticket;
76 struct list_head list;
77 struct amdgpu_bo_list_entry pd;
78 struct ttm_validate_buffer csa_tv;
79 int r;
80
81 INIT_LIST_HEAD(&list);
82 INIT_LIST_HEAD(&csa_tv.head);
83 csa_tv.bo = &adev->virt.csa_obj->tbo;
84 csa_tv.shared = true;
85
86 list_add(&csa_tv.head, &list);
87 amdgpu_vm_get_pd_bo(vm, &list, &pd);
88
89 r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL);
90 if (r) {
91 DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r);
92 return r;
93 }
94
95 *bo_va = amdgpu_vm_bo_add(adev, vm, adev->virt.csa_obj);
96 if (!*bo_va) {
97 ttm_eu_backoff_reservation(&ticket, &list);
98 DRM_ERROR("failed to create bo_va for static CSA\n");
99 return -ENOMEM;
100 }
101
102 r = amdgpu_vm_alloc_pts(adev, (*bo_va)->base.vm, csa_addr,
103 AMDGPU_CSA_SIZE);
104 if (r) {
105 DRM_ERROR("failed to allocate pts for static CSA, err=%d\n", r);
106 amdgpu_vm_bo_rmv(adev, *bo_va);
107 ttm_eu_backoff_reservation(&ticket, &list);
108 return r;
109 }
110
111 r = amdgpu_vm_bo_map(adev, *bo_va, csa_addr, 0, AMDGPU_CSA_SIZE,
112 AMDGPU_PTE_READABLE | AMDGPU_PTE_WRITEABLE |
113 AMDGPU_PTE_EXECUTABLE);
114
115 if (r) {
116 DRM_ERROR("failed to do bo_map on static CSA, err=%d\n", r);
117 amdgpu_vm_bo_rmv(adev, *bo_va);
118 ttm_eu_backoff_reservation(&ticket, &list);
119 return r;
120 }
121
122 ttm_eu_backoff_reservation(&ticket, &list);
123 return 0;
124}
125
126void amdgpu_virt_init_setting(struct amdgpu_device *adev) 34void amdgpu_virt_init_setting(struct amdgpu_device *adev)
127{ 35{
128 /* enable virtual display */ 36 /* enable virtual display */
@@ -162,9 +70,7 @@ uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg)
162 if (r < 1 && (adev->in_gpu_reset || in_interrupt())) 70 if (r < 1 && (adev->in_gpu_reset || in_interrupt()))
163 goto failed_kiq_read; 71 goto failed_kiq_read;
164 72
165 if (in_interrupt()) 73 might_sleep();
166 might_sleep();
167
168 while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) { 74 while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) {
169 msleep(MAX_KIQ_REG_BAILOUT_INTERVAL); 75 msleep(MAX_KIQ_REG_BAILOUT_INTERVAL);
170 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT); 76 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
@@ -210,9 +116,7 @@ void amdgpu_virt_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v)
210 if (r < 1 && (adev->in_gpu_reset || in_interrupt())) 116 if (r < 1 && (adev->in_gpu_reset || in_interrupt()))
211 goto failed_kiq_write; 117 goto failed_kiq_write;
212 118
213 if (in_interrupt()) 119 might_sleep();
214 might_sleep();
215
216 while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) { 120 while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) {
217 121
218 msleep(MAX_KIQ_REG_BAILOUT_INTERVAL); 122 msleep(MAX_KIQ_REG_BAILOUT_INTERVAL);
@@ -228,6 +132,46 @@ failed_kiq_write:
228 pr_err("failed to write reg:%x\n", reg); 132 pr_err("failed to write reg:%x\n", reg);
229} 133}
230 134
135void amdgpu_virt_kiq_reg_write_reg_wait(struct amdgpu_device *adev,
136 uint32_t reg0, uint32_t reg1,
137 uint32_t ref, uint32_t mask)
138{
139 struct amdgpu_kiq *kiq = &adev->gfx.kiq;
140 struct amdgpu_ring *ring = &kiq->ring;
141 signed long r, cnt = 0;
142 unsigned long flags;
143 uint32_t seq;
144
145 spin_lock_irqsave(&kiq->ring_lock, flags);
146 amdgpu_ring_alloc(ring, 32);
147 amdgpu_ring_emit_reg_write_reg_wait(ring, reg0, reg1,
148 ref, mask);
149 amdgpu_fence_emit_polling(ring, &seq);
150 amdgpu_ring_commit(ring);
151 spin_unlock_irqrestore(&kiq->ring_lock, flags);
152
153 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
154
155 /* don't wait anymore for IRQ context */
156 if (r < 1 && in_interrupt())
157 goto failed_kiq;
158
159 might_sleep();
160 while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) {
161
162 msleep(MAX_KIQ_REG_BAILOUT_INTERVAL);
163 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
164 }
165
166 if (cnt > MAX_KIQ_REG_TRY)
167 goto failed_kiq;
168
169 return;
170
171failed_kiq:
172 pr_err("failed to write reg %x wait reg %x\n", reg0, reg1);
173}
174
231/** 175/**
232 * amdgpu_virt_request_full_gpu() - request full gpu access 176 * amdgpu_virt_request_full_gpu() - request full gpu access
233 * @amdgpu: amdgpu device. 177 * @amdgpu: amdgpu device.
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
index 880ac113a3a9..0728fbc9a692 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
@@ -238,7 +238,6 @@ typedef struct amdgim_vf2pf_info_v2 amdgim_vf2pf_info ;
238struct amdgpu_virt { 238struct amdgpu_virt {
239 uint32_t caps; 239 uint32_t caps;
240 struct amdgpu_bo *csa_obj; 240 struct amdgpu_bo *csa_obj;
241 uint64_t csa_vmid0_addr;
242 bool chained_ib_support; 241 bool chained_ib_support;
243 uint32_t reg_val_offs; 242 uint32_t reg_val_offs;
244 struct amdgpu_irq_src ack_irq; 243 struct amdgpu_irq_src ack_irq;
@@ -251,8 +250,6 @@ struct amdgpu_virt {
251 uint32_t gim_feature; 250 uint32_t gim_feature;
252}; 251};
253 252
254#define AMDGPU_CSA_SIZE (8 * 1024)
255
256#define amdgpu_sriov_enabled(adev) \ 253#define amdgpu_sriov_enabled(adev) \
257((adev)->virt.caps & AMDGPU_SRIOV_CAPS_ENABLE_IOV) 254((adev)->virt.caps & AMDGPU_SRIOV_CAPS_ENABLE_IOV)
258 255
@@ -277,17 +274,13 @@ static inline bool is_virtual_machine(void)
277#endif 274#endif
278} 275}
279 276
280struct amdgpu_vm;
281
282uint64_t amdgpu_csa_vaddr(struct amdgpu_device *adev);
283bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev); 277bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev);
284int amdgpu_allocate_static_csa(struct amdgpu_device *adev);
285int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,
286 struct amdgpu_bo_va **bo_va);
287void amdgpu_free_static_csa(struct amdgpu_device *adev);
288void amdgpu_virt_init_setting(struct amdgpu_device *adev); 278void amdgpu_virt_init_setting(struct amdgpu_device *adev);
289uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg); 279uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg);
290void amdgpu_virt_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v); 280void amdgpu_virt_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v);
281void amdgpu_virt_kiq_reg_write_reg_wait(struct amdgpu_device *adev,
282 uint32_t reg0, uint32_t rreg1,
283 uint32_t ref, uint32_t mask);
291int amdgpu_virt_request_full_gpu(struct amdgpu_device *adev, bool init); 284int amdgpu_virt_request_full_gpu(struct amdgpu_device *adev, bool init);
292int amdgpu_virt_release_full_gpu(struct amdgpu_device *adev, bool init); 285int amdgpu_virt_release_full_gpu(struct amdgpu_device *adev, bool init);
293int amdgpu_virt_reset_gpu(struct amdgpu_device *adev); 286int amdgpu_virt_reset_gpu(struct amdgpu_device *adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index d6c47972062a..58a2363040dd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -1632,13 +1632,6 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
1632 continue; 1632 continue;
1633 } 1633 }
1634 1634
1635 /* First check if the entry is already handled */
1636 if (cursor.pfn < frag_start) {
1637 cursor.entry->huge = true;
1638 amdgpu_vm_pt_next(adev, &cursor);
1639 continue;
1640 }
1641
1642 /* If it isn't already handled it can't be a huge page */ 1635 /* If it isn't already handled it can't be a huge page */
1643 if (cursor.entry->huge) { 1636 if (cursor.entry->huge) {
1644 /* Add the entry to the relocated list to update it. */ 1637 /* Add the entry to the relocated list to update it. */
@@ -1701,8 +1694,17 @@ static int amdgpu_vm_update_ptes(struct amdgpu_pte_update_params *params,
1701 } 1694 }
1702 } while (frag_start < entry_end); 1695 } while (frag_start < entry_end);
1703 1696
1704 if (frag >= shift) 1697 if (amdgpu_vm_pt_descendant(adev, &cursor)) {
1698 /* Mark all child entries as huge */
1699 while (cursor.pfn < frag_start) {
1700 cursor.entry->huge = true;
1701 amdgpu_vm_pt_next(adev, &cursor);
1702 }
1703
1704 } else if (frag >= shift) {
1705 /* or just move on to the next on the same level. */
1705 amdgpu_vm_pt_next(adev, &cursor); 1706 amdgpu_vm_pt_next(adev, &cursor);
1707 }
1706 } 1708 }
1707 1709
1708 return 0; 1710 return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
index 897afbb348c1..909216a9b447 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c
@@ -63,7 +63,7 @@ static struct amdgpu_hive_info *amdgpu_get_xgmi_hive(struct amdgpu_device *adev)
63 63
64int amdgpu_xgmi_add_device(struct amdgpu_device *adev) 64int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
65{ 65{
66 struct psp_xgmi_topology_info tmp_topology[AMDGPU_MAX_XGMI_DEVICE_PER_HIVE]; 66 struct psp_xgmi_topology_info *tmp_topology;
67 struct amdgpu_hive_info *hive; 67 struct amdgpu_hive_info *hive;
68 struct amdgpu_xgmi *entry; 68 struct amdgpu_xgmi *entry;
69 struct amdgpu_device *tmp_adev; 69 struct amdgpu_device *tmp_adev;
@@ -73,10 +73,12 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
73 if ((adev->asic_type < CHIP_VEGA20) || 73 if ((adev->asic_type < CHIP_VEGA20) ||
74 (adev->flags & AMD_IS_APU) ) 74 (adev->flags & AMD_IS_APU) )
75 return 0; 75 return 0;
76 adev->gmc.xgmi.device_id = psp_xgmi_get_device_id(&adev->psp); 76 adev->gmc.xgmi.node_id = psp_xgmi_get_node_id(&adev->psp);
77 adev->gmc.xgmi.hive_id = psp_xgmi_get_hive_id(&adev->psp); 77 adev->gmc.xgmi.hive_id = psp_xgmi_get_hive_id(&adev->psp);
78 78
79 memset(&tmp_topology[0], 0, sizeof(tmp_topology)); 79 tmp_topology = kzalloc(sizeof(struct psp_xgmi_topology_info), GFP_KERNEL);
80 if (!tmp_topology)
81 return -ENOMEM;
80 mutex_lock(&xgmi_mutex); 82 mutex_lock(&xgmi_mutex);
81 hive = amdgpu_get_xgmi_hive(adev); 83 hive = amdgpu_get_xgmi_hive(adev);
82 if (!hive) 84 if (!hive)
@@ -84,23 +86,28 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
84 86
85 list_add_tail(&adev->gmc.xgmi.head, &hive->device_list); 87 list_add_tail(&adev->gmc.xgmi.head, &hive->device_list);
86 list_for_each_entry(entry, &hive->device_list, head) 88 list_for_each_entry(entry, &hive->device_list, head)
87 tmp_topology[count++].device_id = entry->device_id; 89 tmp_topology->nodes[count++].node_id = entry->node_id;
88 90
89 ret = psp_xgmi_get_topology_info(&adev->psp, count, tmp_topology); 91 /* Each psp need to get the latest topology */
90 if (ret) { 92 list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head) {
91 dev_err(adev->dev, 93 ret = psp_xgmi_get_topology_info(&tmp_adev->psp, count, tmp_topology);
92 "XGMI: Get topology failure on device %llx, hive %llx, ret %d", 94 if (ret) {
93 adev->gmc.xgmi.device_id, 95 dev_err(tmp_adev->dev,
94 adev->gmc.xgmi.hive_id, ret); 96 "XGMI: Get topology failure on device %llx, hive %llx, ret %d",
95 goto exit; 97 tmp_adev->gmc.xgmi.node_id,
98 tmp_adev->gmc.xgmi.hive_id, ret);
99 /* To do : continue with some node failed or disable the whole hive */
100 break;
101 }
96 } 102 }
103
97 /* Each psp need to set the latest topology */ 104 /* Each psp need to set the latest topology */
98 list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head) { 105 list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head) {
99 ret = psp_xgmi_set_topology_info(&tmp_adev->psp, count, tmp_topology); 106 ret = psp_xgmi_set_topology_info(&tmp_adev->psp, count, tmp_topology);
100 if (ret) { 107 if (ret) {
101 dev_err(tmp_adev->dev, 108 dev_err(tmp_adev->dev,
102 "XGMI: Set topology failure on device %llx, hive %llx, ret %d", 109 "XGMI: Set topology failure on device %llx, hive %llx, ret %d",
103 tmp_adev->gmc.xgmi.device_id, 110 tmp_adev->gmc.xgmi.node_id,
104 tmp_adev->gmc.xgmi.hive_id, ret); 111 tmp_adev->gmc.xgmi.hive_id, ret);
105 /* To do : continue with some node failed or disable the whole hive */ 112 /* To do : continue with some node failed or disable the whole hive */
106 break; 113 break;
@@ -113,7 +120,6 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
113 120
114exit: 121exit:
115 mutex_unlock(&xgmi_mutex); 122 mutex_unlock(&xgmi_mutex);
123 kfree(tmp_topology);
116 return ret; 124 return ret;
117} 125}
118
119
diff --git a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
index 79220a91abe3..86e14c754dd4 100644
--- a/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/ci_dpm.c
@@ -743,19 +743,19 @@ static int ci_enable_didt(struct amdgpu_device *adev, bool enable)
743 743
744 if (pi->caps_sq_ramping || pi->caps_db_ramping || 744 if (pi->caps_sq_ramping || pi->caps_db_ramping ||
745 pi->caps_td_ramping || pi->caps_tcp_ramping) { 745 pi->caps_td_ramping || pi->caps_tcp_ramping) {
746 adev->gfx.rlc.funcs->enter_safe_mode(adev); 746 amdgpu_gfx_rlc_enter_safe_mode(adev);
747 747
748 if (enable) { 748 if (enable) {
749 ret = ci_program_pt_config_registers(adev, didt_config_ci); 749 ret = ci_program_pt_config_registers(adev, didt_config_ci);
750 if (ret) { 750 if (ret) {
751 adev->gfx.rlc.funcs->exit_safe_mode(adev); 751 amdgpu_gfx_rlc_exit_safe_mode(adev);
752 return ret; 752 return ret;
753 } 753 }
754 } 754 }
755 755
756 ci_do_enable_didt(adev, enable); 756 ci_do_enable_didt(adev, enable);
757 757
758 adev->gfx.rlc.funcs->exit_safe_mode(adev); 758 amdgpu_gfx_rlc_exit_safe_mode(adev);
759 } 759 }
760 760
761 return 0; 761 return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
index b918c8886b75..45795191de1f 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
@@ -198,7 +198,7 @@ static void cik_sdma_ring_set_wptr(struct amdgpu_ring *ring)
198 198
199static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) 199static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
200{ 200{
201 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring); 201 struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
202 int i; 202 int i;
203 203
204 for (i = 0; i < count; i++) 204 for (i = 0; i < count; i++)
@@ -218,9 +218,11 @@ static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
218 * Schedule an IB in the DMA ring (CIK). 218 * Schedule an IB in the DMA ring (CIK).
219 */ 219 */
220static void cik_sdma_ring_emit_ib(struct amdgpu_ring *ring, 220static void cik_sdma_ring_emit_ib(struct amdgpu_ring *ring,
221 struct amdgpu_job *job,
221 struct amdgpu_ib *ib, 222 struct amdgpu_ib *ib,
222 unsigned vmid, bool ctx_switch) 223 bool ctx_switch)
223{ 224{
225 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
224 u32 extra_bits = vmid & 0xf; 226 u32 extra_bits = vmid & 0xf;
225 227
226 /* IB packet must end on a 8 DW boundary */ 228 /* IB packet must end on a 8 DW boundary */
@@ -316,8 +318,8 @@ static void cik_sdma_gfx_stop(struct amdgpu_device *adev)
316 WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i], rb_cntl); 318 WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i], rb_cntl);
317 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], 0); 319 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], 0);
318 } 320 }
319 sdma0->ready = false; 321 sdma0->sched.ready = false;
320 sdma1->ready = false; 322 sdma1->sched.ready = false;
321} 323}
322 324
323/** 325/**
@@ -494,18 +496,16 @@ static int cik_sdma_gfx_resume(struct amdgpu_device *adev)
494 /* enable DMA IBs */ 496 /* enable DMA IBs */
495 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl); 497 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl);
496 498
497 ring->ready = true; 499 ring->sched.ready = true;
498 } 500 }
499 501
500 cik_sdma_enable(adev, true); 502 cik_sdma_enable(adev, true);
501 503
502 for (i = 0; i < adev->sdma.num_instances; i++) { 504 for (i = 0; i < adev->sdma.num_instances; i++) {
503 ring = &adev->sdma.instance[i].ring; 505 ring = &adev->sdma.instance[i].ring;
504 r = amdgpu_ring_test_ring(ring); 506 r = amdgpu_ring_test_helper(ring);
505 if (r) { 507 if (r)
506 ring->ready = false;
507 return r; 508 return r;
508 }
509 509
510 if (adev->mman.buffer_funcs_ring == ring) 510 if (adev->mman.buffer_funcs_ring == ring)
511 amdgpu_ttm_set_buffer_funcs_status(adev, true); 511 amdgpu_ttm_set_buffer_funcs_status(adev, true);
@@ -618,21 +618,17 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)
618 u64 gpu_addr; 618 u64 gpu_addr;
619 619
620 r = amdgpu_device_wb_get(adev, &index); 620 r = amdgpu_device_wb_get(adev, &index);
621 if (r) { 621 if (r)
622 dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
623 return r; 622 return r;
624 }
625 623
626 gpu_addr = adev->wb.gpu_addr + (index * 4); 624 gpu_addr = adev->wb.gpu_addr + (index * 4);
627 tmp = 0xCAFEDEAD; 625 tmp = 0xCAFEDEAD;
628 adev->wb.wb[index] = cpu_to_le32(tmp); 626 adev->wb.wb[index] = cpu_to_le32(tmp);
629 627
630 r = amdgpu_ring_alloc(ring, 5); 628 r = amdgpu_ring_alloc(ring, 5);
631 if (r) { 629 if (r)
632 DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r); 630 goto error_free_wb;
633 amdgpu_device_wb_free(adev, index); 631
634 return r;
635 }
636 amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0)); 632 amdgpu_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0));
637 amdgpu_ring_write(ring, lower_32_bits(gpu_addr)); 633 amdgpu_ring_write(ring, lower_32_bits(gpu_addr));
638 amdgpu_ring_write(ring, upper_32_bits(gpu_addr)); 634 amdgpu_ring_write(ring, upper_32_bits(gpu_addr));
@@ -647,15 +643,11 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)
647 DRM_UDELAY(1); 643 DRM_UDELAY(1);
648 } 644 }
649 645
650 if (i < adev->usec_timeout) { 646 if (i >= adev->usec_timeout)
651 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", ring->idx, i); 647 r = -ETIMEDOUT;
652 } else {
653 DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
654 ring->idx, tmp);
655 r = -EINVAL;
656 }
657 amdgpu_device_wb_free(adev, index);
658 648
649error_free_wb:
650 amdgpu_device_wb_free(adev, index);
659 return r; 651 return r;
660} 652}
661 653
@@ -678,20 +670,16 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
678 long r; 670 long r;
679 671
680 r = amdgpu_device_wb_get(adev, &index); 672 r = amdgpu_device_wb_get(adev, &index);
681 if (r) { 673 if (r)
682 dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
683 return r; 674 return r;
684 }
685 675
686 gpu_addr = adev->wb.gpu_addr + (index * 4); 676 gpu_addr = adev->wb.gpu_addr + (index * 4);
687 tmp = 0xCAFEDEAD; 677 tmp = 0xCAFEDEAD;
688 adev->wb.wb[index] = cpu_to_le32(tmp); 678 adev->wb.wb[index] = cpu_to_le32(tmp);
689 memset(&ib, 0, sizeof(ib)); 679 memset(&ib, 0, sizeof(ib));
690 r = amdgpu_ib_get(adev, NULL, 256, &ib); 680 r = amdgpu_ib_get(adev, NULL, 256, &ib);
691 if (r) { 681 if (r)
692 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
693 goto err0; 682 goto err0;
694 }
695 683
696 ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE, 684 ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE,
697 SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 685 SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
@@ -706,21 +694,16 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
706 694
707 r = dma_fence_wait_timeout(f, false, timeout); 695 r = dma_fence_wait_timeout(f, false, timeout);
708 if (r == 0) { 696 if (r == 0) {
709 DRM_ERROR("amdgpu: IB test timed out\n");
710 r = -ETIMEDOUT; 697 r = -ETIMEDOUT;
711 goto err1; 698 goto err1;
712 } else if (r < 0) { 699 } else if (r < 0) {
713 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
714 goto err1; 700 goto err1;
715 } 701 }
716 tmp = le32_to_cpu(adev->wb.wb[index]); 702 tmp = le32_to_cpu(adev->wb.wb[index]);
717 if (tmp == 0xDEADBEEF) { 703 if (tmp == 0xDEADBEEF)
718 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
719 r = 0; 704 r = 0;
720 } else { 705 else
721 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
722 r = -EINVAL; 706 r = -EINVAL;
723 }
724 707
725err1: 708err1:
726 amdgpu_ib_free(adev, &ib, NULL); 709 amdgpu_ib_free(adev, &ib, NULL);
@@ -822,7 +805,7 @@ static void cik_sdma_vm_set_pte_pde(struct amdgpu_ib *ib, uint64_t pe,
822 */ 805 */
823static void cik_sdma_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib) 806static void cik_sdma_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
824{ 807{
825 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring); 808 struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
826 u32 pad_count; 809 u32 pad_count;
827 int i; 810 int i;
828 811
@@ -1214,8 +1197,11 @@ static int cik_sdma_process_illegal_inst_irq(struct amdgpu_device *adev,
1214 struct amdgpu_irq_src *source, 1197 struct amdgpu_irq_src *source,
1215 struct amdgpu_iv_entry *entry) 1198 struct amdgpu_iv_entry *entry)
1216{ 1199{
1200 u8 instance_id;
1201
1217 DRM_ERROR("Illegal instruction in SDMA command stream\n"); 1202 DRM_ERROR("Illegal instruction in SDMA command stream\n");
1218 schedule_work(&adev->reset_work); 1203 instance_id = (entry->ring_id & 0x3) >> 0;
1204 drm_sched_fault(&adev->sdma.instance[instance_id].ring.sched);
1219 return 0; 1205 return 0;
1220} 1206}
1221 1207
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
index d76eb27945dc..1dc3013ea1d5 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
@@ -1775,18 +1775,15 @@ static int gfx_v6_0_ring_test_ring(struct amdgpu_ring *ring)
1775 int r; 1775 int r;
1776 1776
1777 r = amdgpu_gfx_scratch_get(adev, &scratch); 1777 r = amdgpu_gfx_scratch_get(adev, &scratch);
1778 if (r) { 1778 if (r)
1779 DRM_ERROR("amdgpu: cp failed to get scratch reg (%d).\n", r);
1780 return r; 1779 return r;
1781 } 1780
1782 WREG32(scratch, 0xCAFEDEAD); 1781 WREG32(scratch, 0xCAFEDEAD);
1783 1782
1784 r = amdgpu_ring_alloc(ring, 3); 1783 r = amdgpu_ring_alloc(ring, 3);
1785 if (r) { 1784 if (r)
1786 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n", ring->idx, r); 1785 goto error_free_scratch;
1787 amdgpu_gfx_scratch_free(adev, scratch); 1786
1788 return r;
1789 }
1790 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); 1787 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
1791 amdgpu_ring_write(ring, (scratch - PACKET3_SET_CONFIG_REG_START)); 1788 amdgpu_ring_write(ring, (scratch - PACKET3_SET_CONFIG_REG_START));
1792 amdgpu_ring_write(ring, 0xDEADBEEF); 1789 amdgpu_ring_write(ring, 0xDEADBEEF);
@@ -1798,13 +1795,11 @@ static int gfx_v6_0_ring_test_ring(struct amdgpu_ring *ring)
1798 break; 1795 break;
1799 DRM_UDELAY(1); 1796 DRM_UDELAY(1);
1800 } 1797 }
1801 if (i < adev->usec_timeout) { 1798
1802 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", ring->idx, i); 1799 if (i >= adev->usec_timeout)
1803 } else { 1800 r = -ETIMEDOUT;
1804 DRM_ERROR("amdgpu: ring %d test failed (scratch(0x%04X)=0x%08X)\n", 1801
1805 ring->idx, scratch, tmp); 1802error_free_scratch:
1806 r = -EINVAL;
1807 }
1808 amdgpu_gfx_scratch_free(adev, scratch); 1803 amdgpu_gfx_scratch_free(adev, scratch);
1809 return r; 1804 return r;
1810} 1805}
@@ -1845,9 +1840,11 @@ static void gfx_v6_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr,
1845} 1840}
1846 1841
1847static void gfx_v6_0_ring_emit_ib(struct amdgpu_ring *ring, 1842static void gfx_v6_0_ring_emit_ib(struct amdgpu_ring *ring,
1843 struct amdgpu_job *job,
1848 struct amdgpu_ib *ib, 1844 struct amdgpu_ib *ib,
1849 unsigned vmid, bool ctx_switch) 1845 bool ctx_switch)
1850{ 1846{
1847 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
1851 u32 header, control = 0; 1848 u32 header, control = 0;
1852 1849
1853 /* insert SWITCH_BUFFER packet before first IB in the ring frame */ 1850 /* insert SWITCH_BUFFER packet before first IB in the ring frame */
@@ -1892,17 +1889,15 @@ static int gfx_v6_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
1892 long r; 1889 long r;
1893 1890
1894 r = amdgpu_gfx_scratch_get(adev, &scratch); 1891 r = amdgpu_gfx_scratch_get(adev, &scratch);
1895 if (r) { 1892 if (r)
1896 DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r);
1897 return r; 1893 return r;
1898 } 1894
1899 WREG32(scratch, 0xCAFEDEAD); 1895 WREG32(scratch, 0xCAFEDEAD);
1900 memset(&ib, 0, sizeof(ib)); 1896 memset(&ib, 0, sizeof(ib));
1901 r = amdgpu_ib_get(adev, NULL, 256, &ib); 1897 r = amdgpu_ib_get(adev, NULL, 256, &ib);
1902 if (r) { 1898 if (r)
1903 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
1904 goto err1; 1899 goto err1;
1905 } 1900
1906 ib.ptr[0] = PACKET3(PACKET3_SET_CONFIG_REG, 1); 1901 ib.ptr[0] = PACKET3(PACKET3_SET_CONFIG_REG, 1);
1907 ib.ptr[1] = ((scratch - PACKET3_SET_CONFIG_REG_START)); 1902 ib.ptr[1] = ((scratch - PACKET3_SET_CONFIG_REG_START));
1908 ib.ptr[2] = 0xDEADBEEF; 1903 ib.ptr[2] = 0xDEADBEEF;
@@ -1914,22 +1909,16 @@ static int gfx_v6_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
1914 1909
1915 r = dma_fence_wait_timeout(f, false, timeout); 1910 r = dma_fence_wait_timeout(f, false, timeout);
1916 if (r == 0) { 1911 if (r == 0) {
1917 DRM_ERROR("amdgpu: IB test timed out\n");
1918 r = -ETIMEDOUT; 1912 r = -ETIMEDOUT;
1919 goto err2; 1913 goto err2;
1920 } else if (r < 0) { 1914 } else if (r < 0) {
1921 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
1922 goto err2; 1915 goto err2;
1923 } 1916 }
1924 tmp = RREG32(scratch); 1917 tmp = RREG32(scratch);
1925 if (tmp == 0xDEADBEEF) { 1918 if (tmp == 0xDEADBEEF)
1926 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
1927 r = 0; 1919 r = 0;
1928 } else { 1920 else
1929 DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n",
1930 scratch, tmp);
1931 r = -EINVAL; 1921 r = -EINVAL;
1932 }
1933 1922
1934err2: 1923err2:
1935 amdgpu_ib_free(adev, &ib, NULL); 1924 amdgpu_ib_free(adev, &ib, NULL);
@@ -1950,9 +1939,9 @@ static void gfx_v6_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)
1950 CP_ME_CNTL__CE_HALT_MASK)); 1939 CP_ME_CNTL__CE_HALT_MASK));
1951 WREG32(mmSCRATCH_UMSK, 0); 1940 WREG32(mmSCRATCH_UMSK, 0);
1952 for (i = 0; i < adev->gfx.num_gfx_rings; i++) 1941 for (i = 0; i < adev->gfx.num_gfx_rings; i++)
1953 adev->gfx.gfx_ring[i].ready = false; 1942 adev->gfx.gfx_ring[i].sched.ready = false;
1954 for (i = 0; i < adev->gfx.num_compute_rings; i++) 1943 for (i = 0; i < adev->gfx.num_compute_rings; i++)
1955 adev->gfx.compute_ring[i].ready = false; 1944 adev->gfx.compute_ring[i].sched.ready = false;
1956 } 1945 }
1957 udelay(50); 1946 udelay(50);
1958} 1947}
@@ -2124,12 +2113,9 @@ static int gfx_v6_0_cp_gfx_resume(struct amdgpu_device *adev)
2124 2113
2125 /* start the rings */ 2114 /* start the rings */
2126 gfx_v6_0_cp_gfx_start(adev); 2115 gfx_v6_0_cp_gfx_start(adev);
2127 ring->ready = true; 2116 r = amdgpu_ring_test_helper(ring);
2128 r = amdgpu_ring_test_ring(ring); 2117 if (r)
2129 if (r) {
2130 ring->ready = false;
2131 return r; 2118 return r;
2132 }
2133 2119
2134 return 0; 2120 return 0;
2135} 2121}
@@ -2227,14 +2213,11 @@ static int gfx_v6_0_cp_compute_resume(struct amdgpu_device *adev)
2227 WREG32(mmCP_RB2_CNTL, tmp); 2213 WREG32(mmCP_RB2_CNTL, tmp);
2228 WREG32(mmCP_RB2_BASE, ring->gpu_addr >> 8); 2214 WREG32(mmCP_RB2_BASE, ring->gpu_addr >> 8);
2229 2215
2230 adev->gfx.compute_ring[0].ready = false;
2231 adev->gfx.compute_ring[1].ready = false;
2232 2216
2233 for (i = 0; i < 2; i++) { 2217 for (i = 0; i < 2; i++) {
2234 r = amdgpu_ring_test_ring(&adev->gfx.compute_ring[i]); 2218 r = amdgpu_ring_test_helper(&adev->gfx.compute_ring[i]);
2235 if (r) 2219 if (r)
2236 return r; 2220 return r;
2237 adev->gfx.compute_ring[i].ready = true;
2238 } 2221 }
2239 2222
2240 return 0; 2223 return 0;
@@ -2368,18 +2351,11 @@ static void gfx_v6_0_ring_emit_wreg(struct amdgpu_ring *ring,
2368 amdgpu_ring_write(ring, val); 2351 amdgpu_ring_write(ring, val);
2369} 2352}
2370 2353
2371static void gfx_v6_0_rlc_fini(struct amdgpu_device *adev)
2372{
2373 amdgpu_bo_free_kernel(&adev->gfx.rlc.save_restore_obj, NULL, NULL);
2374 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, NULL, NULL);
2375 amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj, NULL, NULL);
2376}
2377
2378static int gfx_v6_0_rlc_init(struct amdgpu_device *adev) 2354static int gfx_v6_0_rlc_init(struct amdgpu_device *adev)
2379{ 2355{
2380 const u32 *src_ptr; 2356 const u32 *src_ptr;
2381 volatile u32 *dst_ptr; 2357 volatile u32 *dst_ptr;
2382 u32 dws, i; 2358 u32 dws;
2383 u64 reg_list_mc_addr; 2359 u64 reg_list_mc_addr;
2384 const struct cs_section_def *cs_data; 2360 const struct cs_section_def *cs_data;
2385 int r; 2361 int r;
@@ -2394,26 +2370,10 @@ static int gfx_v6_0_rlc_init(struct amdgpu_device *adev)
2394 cs_data = adev->gfx.rlc.cs_data; 2370 cs_data = adev->gfx.rlc.cs_data;
2395 2371
2396 if (src_ptr) { 2372 if (src_ptr) {
2397 /* save restore block */ 2373 /* init save restore block */
2398 r = amdgpu_bo_create_reserved(adev, dws * 4, PAGE_SIZE, 2374 r = amdgpu_gfx_rlc_init_sr(adev, dws);
2399 AMDGPU_GEM_DOMAIN_VRAM, 2375 if (r)
2400 &adev->gfx.rlc.save_restore_obj,
2401 &adev->gfx.rlc.save_restore_gpu_addr,
2402 (void **)&adev->gfx.rlc.sr_ptr);
2403 if (r) {
2404 dev_warn(adev->dev, "(%d) create RLC sr bo failed\n",
2405 r);
2406 gfx_v6_0_rlc_fini(adev);
2407 return r; 2376 return r;
2408 }
2409
2410 /* write the sr buffer */
2411 dst_ptr = adev->gfx.rlc.sr_ptr;
2412 for (i = 0; i < adev->gfx.rlc.reg_list_size; i++)
2413 dst_ptr[i] = cpu_to_le32(src_ptr[i]);
2414
2415 amdgpu_bo_kunmap(adev->gfx.rlc.save_restore_obj);
2416 amdgpu_bo_unreserve(adev->gfx.rlc.save_restore_obj);
2417 } 2377 }
2418 2378
2419 if (cs_data) { 2379 if (cs_data) {
@@ -2428,7 +2388,7 @@ static int gfx_v6_0_rlc_init(struct amdgpu_device *adev)
2428 (void **)&adev->gfx.rlc.cs_ptr); 2388 (void **)&adev->gfx.rlc.cs_ptr);
2429 if (r) { 2389 if (r) {
2430 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r); 2390 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r);
2431 gfx_v6_0_rlc_fini(adev); 2391 amdgpu_gfx_rlc_fini(adev);
2432 return r; 2392 return r;
2433 } 2393 }
2434 2394
@@ -2549,8 +2509,8 @@ static int gfx_v6_0_rlc_resume(struct amdgpu_device *adev)
2549 if (!adev->gfx.rlc_fw) 2509 if (!adev->gfx.rlc_fw)
2550 return -EINVAL; 2510 return -EINVAL;
2551 2511
2552 gfx_v6_0_rlc_stop(adev); 2512 adev->gfx.rlc.funcs->stop(adev);
2553 gfx_v6_0_rlc_reset(adev); 2513 adev->gfx.rlc.funcs->reset(adev);
2554 gfx_v6_0_init_pg(adev); 2514 gfx_v6_0_init_pg(adev);
2555 gfx_v6_0_init_cg(adev); 2515 gfx_v6_0_init_cg(adev);
2556 2516
@@ -2578,7 +2538,7 @@ static int gfx_v6_0_rlc_resume(struct amdgpu_device *adev)
2578 WREG32(mmRLC_UCODE_ADDR, 0); 2538 WREG32(mmRLC_UCODE_ADDR, 0);
2579 2539
2580 gfx_v6_0_enable_lbpw(adev, gfx_v6_0_lbpw_supported(adev)); 2540 gfx_v6_0_enable_lbpw(adev, gfx_v6_0_lbpw_supported(adev));
2581 gfx_v6_0_rlc_start(adev); 2541 adev->gfx.rlc.funcs->start(adev);
2582 2542
2583 return 0; 2543 return 0;
2584} 2544}
@@ -3075,6 +3035,14 @@ static const struct amdgpu_gfx_funcs gfx_v6_0_gfx_funcs = {
3075 .select_me_pipe_q = &gfx_v6_0_select_me_pipe_q 3035 .select_me_pipe_q = &gfx_v6_0_select_me_pipe_q
3076}; 3036};
3077 3037
3038static const struct amdgpu_rlc_funcs gfx_v6_0_rlc_funcs = {
3039 .init = gfx_v6_0_rlc_init,
3040 .resume = gfx_v6_0_rlc_resume,
3041 .stop = gfx_v6_0_rlc_stop,
3042 .reset = gfx_v6_0_rlc_reset,
3043 .start = gfx_v6_0_rlc_start
3044};
3045
3078static int gfx_v6_0_early_init(void *handle) 3046static int gfx_v6_0_early_init(void *handle)
3079{ 3047{
3080 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3048 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -3082,6 +3050,7 @@ static int gfx_v6_0_early_init(void *handle)
3082 adev->gfx.num_gfx_rings = GFX6_NUM_GFX_RINGS; 3050 adev->gfx.num_gfx_rings = GFX6_NUM_GFX_RINGS;
3083 adev->gfx.num_compute_rings = GFX6_NUM_COMPUTE_RINGS; 3051 adev->gfx.num_compute_rings = GFX6_NUM_COMPUTE_RINGS;
3084 adev->gfx.funcs = &gfx_v6_0_gfx_funcs; 3052 adev->gfx.funcs = &gfx_v6_0_gfx_funcs;
3053 adev->gfx.rlc.funcs = &gfx_v6_0_rlc_funcs;
3085 gfx_v6_0_set_ring_funcs(adev); 3054 gfx_v6_0_set_ring_funcs(adev);
3086 gfx_v6_0_set_irq_funcs(adev); 3055 gfx_v6_0_set_irq_funcs(adev);
3087 3056
@@ -3114,7 +3083,7 @@ static int gfx_v6_0_sw_init(void *handle)
3114 return r; 3083 return r;
3115 } 3084 }
3116 3085
3117 r = gfx_v6_0_rlc_init(adev); 3086 r = adev->gfx.rlc.funcs->init(adev);
3118 if (r) { 3087 if (r) {
3119 DRM_ERROR("Failed to init rlc BOs!\n"); 3088 DRM_ERROR("Failed to init rlc BOs!\n");
3120 return r; 3089 return r;
@@ -3165,7 +3134,7 @@ static int gfx_v6_0_sw_fini(void *handle)
3165 for (i = 0; i < adev->gfx.num_compute_rings; i++) 3134 for (i = 0; i < adev->gfx.num_compute_rings; i++)
3166 amdgpu_ring_fini(&adev->gfx.compute_ring[i]); 3135 amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
3167 3136
3168 gfx_v6_0_rlc_fini(adev); 3137 amdgpu_gfx_rlc_fini(adev);
3169 3138
3170 return 0; 3139 return 0;
3171} 3140}
@@ -3177,7 +3146,7 @@ static int gfx_v6_0_hw_init(void *handle)
3177 3146
3178 gfx_v6_0_constants_init(adev); 3147 gfx_v6_0_constants_init(adev);
3179 3148
3180 r = gfx_v6_0_rlc_resume(adev); 3149 r = adev->gfx.rlc.funcs->resume(adev);
3181 if (r) 3150 if (r)
3182 return r; 3151 return r;
3183 3152
@@ -3195,7 +3164,7 @@ static int gfx_v6_0_hw_fini(void *handle)
3195 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3164 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
3196 3165
3197 gfx_v6_0_cp_enable(adev, false); 3166 gfx_v6_0_cp_enable(adev, false);
3198 gfx_v6_0_rlc_stop(adev); 3167 adev->gfx.rlc.funcs->stop(adev);
3199 gfx_v6_0_fini_pg(adev); 3168 gfx_v6_0_fini_pg(adev);
3200 3169
3201 return 0; 3170 return 0;
@@ -3393,12 +3362,31 @@ static int gfx_v6_0_eop_irq(struct amdgpu_device *adev,
3393 return 0; 3362 return 0;
3394} 3363}
3395 3364
3365static void gfx_v6_0_fault(struct amdgpu_device *adev,
3366 struct amdgpu_iv_entry *entry)
3367{
3368 struct amdgpu_ring *ring;
3369
3370 switch (entry->ring_id) {
3371 case 0:
3372 ring = &adev->gfx.gfx_ring[0];
3373 break;
3374 case 1:
3375 case 2:
3376 ring = &adev->gfx.compute_ring[entry->ring_id - 1];
3377 break;
3378 default:
3379 return;
3380 }
3381 drm_sched_fault(&ring->sched);
3382}
3383
3396static int gfx_v6_0_priv_reg_irq(struct amdgpu_device *adev, 3384static int gfx_v6_0_priv_reg_irq(struct amdgpu_device *adev,
3397 struct amdgpu_irq_src *source, 3385 struct amdgpu_irq_src *source,
3398 struct amdgpu_iv_entry *entry) 3386 struct amdgpu_iv_entry *entry)
3399{ 3387{
3400 DRM_ERROR("Illegal register access in command stream\n"); 3388 DRM_ERROR("Illegal register access in command stream\n");
3401 schedule_work(&adev->reset_work); 3389 gfx_v6_0_fault(adev, entry);
3402 return 0; 3390 return 0;
3403} 3391}
3404 3392
@@ -3407,7 +3395,7 @@ static int gfx_v6_0_priv_inst_irq(struct amdgpu_device *adev,
3407 struct amdgpu_iv_entry *entry) 3395 struct amdgpu_iv_entry *entry)
3408{ 3396{
3409 DRM_ERROR("Illegal instruction in command stream\n"); 3397 DRM_ERROR("Illegal instruction in command stream\n");
3410 schedule_work(&adev->reset_work); 3398 gfx_v6_0_fault(adev, entry);
3411 return 0; 3399 return 0;
3412} 3400}
3413 3401
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index 0e72bc09939a..f467b9bd090d 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -882,7 +882,6 @@ static const u32 kalindi_rlc_save_restore_register_list[] =
882 882
883static u32 gfx_v7_0_get_csb_size(struct amdgpu_device *adev); 883static u32 gfx_v7_0_get_csb_size(struct amdgpu_device *adev);
884static void gfx_v7_0_get_csb_buffer(struct amdgpu_device *adev, volatile u32 *buffer); 884static void gfx_v7_0_get_csb_buffer(struct amdgpu_device *adev, volatile u32 *buffer);
885static void gfx_v7_0_init_cp_pg_table(struct amdgpu_device *adev);
886static void gfx_v7_0_init_pg(struct amdgpu_device *adev); 885static void gfx_v7_0_init_pg(struct amdgpu_device *adev);
887static void gfx_v7_0_get_cu_info(struct amdgpu_device *adev); 886static void gfx_v7_0_get_cu_info(struct amdgpu_device *adev);
888 887
@@ -2064,17 +2063,14 @@ static int gfx_v7_0_ring_test_ring(struct amdgpu_ring *ring)
2064 int r; 2063 int r;
2065 2064
2066 r = amdgpu_gfx_scratch_get(adev, &scratch); 2065 r = amdgpu_gfx_scratch_get(adev, &scratch);
2067 if (r) { 2066 if (r)
2068 DRM_ERROR("amdgpu: cp failed to get scratch reg (%d).\n", r);
2069 return r; 2067 return r;
2070 } 2068
2071 WREG32(scratch, 0xCAFEDEAD); 2069 WREG32(scratch, 0xCAFEDEAD);
2072 r = amdgpu_ring_alloc(ring, 3); 2070 r = amdgpu_ring_alloc(ring, 3);
2073 if (r) { 2071 if (r)
2074 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n", ring->idx, r); 2072 goto error_free_scratch;
2075 amdgpu_gfx_scratch_free(adev, scratch); 2073
2076 return r;
2077 }
2078 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1)); 2074 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
2079 amdgpu_ring_write(ring, (scratch - PACKET3_SET_UCONFIG_REG_START)); 2075 amdgpu_ring_write(ring, (scratch - PACKET3_SET_UCONFIG_REG_START));
2080 amdgpu_ring_write(ring, 0xDEADBEEF); 2076 amdgpu_ring_write(ring, 0xDEADBEEF);
@@ -2086,13 +2082,10 @@ static int gfx_v7_0_ring_test_ring(struct amdgpu_ring *ring)
2086 break; 2082 break;
2087 DRM_UDELAY(1); 2083 DRM_UDELAY(1);
2088 } 2084 }
2089 if (i < adev->usec_timeout) { 2085 if (i >= adev->usec_timeout)
2090 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", ring->idx, i); 2086 r = -ETIMEDOUT;
2091 } else { 2087
2092 DRM_ERROR("amdgpu: ring %d test failed (scratch(0x%04X)=0x%08X)\n", 2088error_free_scratch:
2093 ring->idx, scratch, tmp);
2094 r = -EINVAL;
2095 }
2096 amdgpu_gfx_scratch_free(adev, scratch); 2089 amdgpu_gfx_scratch_free(adev, scratch);
2097 return r; 2090 return r;
2098} 2091}
@@ -2233,9 +2226,11 @@ static void gfx_v7_0_ring_emit_fence_compute(struct amdgpu_ring *ring,
2233 * on the gfx ring for execution by the GPU. 2226 * on the gfx ring for execution by the GPU.
2234 */ 2227 */
2235static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, 2228static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
2236 struct amdgpu_ib *ib, 2229 struct amdgpu_job *job,
2237 unsigned vmid, bool ctx_switch) 2230 struct amdgpu_ib *ib,
2231 bool ctx_switch)
2238{ 2232{
2233 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
2239 u32 header, control = 0; 2234 u32 header, control = 0;
2240 2235
2241 /* insert SWITCH_BUFFER packet before first IB in the ring frame */ 2236 /* insert SWITCH_BUFFER packet before first IB in the ring frame */
@@ -2262,9 +2257,11 @@ static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
2262} 2257}
2263 2258
2264static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring, 2259static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
2260 struct amdgpu_job *job,
2265 struct amdgpu_ib *ib, 2261 struct amdgpu_ib *ib,
2266 unsigned vmid, bool ctx_switch) 2262 bool ctx_switch)
2267{ 2263{
2264 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
2268 u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24); 2265 u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24);
2269 2266
2270 amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); 2267 amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
@@ -2316,17 +2313,15 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
2316 long r; 2313 long r;
2317 2314
2318 r = amdgpu_gfx_scratch_get(adev, &scratch); 2315 r = amdgpu_gfx_scratch_get(adev, &scratch);
2319 if (r) { 2316 if (r)
2320 DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r);
2321 return r; 2317 return r;
2322 } 2318
2323 WREG32(scratch, 0xCAFEDEAD); 2319 WREG32(scratch, 0xCAFEDEAD);
2324 memset(&ib, 0, sizeof(ib)); 2320 memset(&ib, 0, sizeof(ib));
2325 r = amdgpu_ib_get(adev, NULL, 256, &ib); 2321 r = amdgpu_ib_get(adev, NULL, 256, &ib);
2326 if (r) { 2322 if (r)
2327 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
2328 goto err1; 2323 goto err1;
2329 } 2324
2330 ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1); 2325 ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
2331 ib.ptr[1] = ((scratch - PACKET3_SET_UCONFIG_REG_START)); 2326 ib.ptr[1] = ((scratch - PACKET3_SET_UCONFIG_REG_START));
2332 ib.ptr[2] = 0xDEADBEEF; 2327 ib.ptr[2] = 0xDEADBEEF;
@@ -2338,22 +2333,16 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
2338 2333
2339 r = dma_fence_wait_timeout(f, false, timeout); 2334 r = dma_fence_wait_timeout(f, false, timeout);
2340 if (r == 0) { 2335 if (r == 0) {
2341 DRM_ERROR("amdgpu: IB test timed out\n");
2342 r = -ETIMEDOUT; 2336 r = -ETIMEDOUT;
2343 goto err2; 2337 goto err2;
2344 } else if (r < 0) { 2338 } else if (r < 0) {
2345 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
2346 goto err2; 2339 goto err2;
2347 } 2340 }
2348 tmp = RREG32(scratch); 2341 tmp = RREG32(scratch);
2349 if (tmp == 0xDEADBEEF) { 2342 if (tmp == 0xDEADBEEF)
2350 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
2351 r = 0; 2343 r = 0;
2352 } else { 2344 else
2353 DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n",
2354 scratch, tmp);
2355 r = -EINVAL; 2345 r = -EINVAL;
2356 }
2357 2346
2358err2: 2347err2:
2359 amdgpu_ib_free(adev, &ib, NULL); 2348 amdgpu_ib_free(adev, &ib, NULL);
@@ -2403,7 +2392,7 @@ static void gfx_v7_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)
2403 } else { 2392 } else {
2404 WREG32(mmCP_ME_CNTL, (CP_ME_CNTL__ME_HALT_MASK | CP_ME_CNTL__PFP_HALT_MASK | CP_ME_CNTL__CE_HALT_MASK)); 2393 WREG32(mmCP_ME_CNTL, (CP_ME_CNTL__ME_HALT_MASK | CP_ME_CNTL__PFP_HALT_MASK | CP_ME_CNTL__CE_HALT_MASK));
2405 for (i = 0; i < adev->gfx.num_gfx_rings; i++) 2394 for (i = 0; i < adev->gfx.num_gfx_rings; i++)
2406 adev->gfx.gfx_ring[i].ready = false; 2395 adev->gfx.gfx_ring[i].sched.ready = false;
2407 } 2396 }
2408 udelay(50); 2397 udelay(50);
2409} 2398}
@@ -2613,12 +2602,9 @@ static int gfx_v7_0_cp_gfx_resume(struct amdgpu_device *adev)
2613 2602
2614 /* start the ring */ 2603 /* start the ring */
2615 gfx_v7_0_cp_gfx_start(adev); 2604 gfx_v7_0_cp_gfx_start(adev);
2616 ring->ready = true; 2605 r = amdgpu_ring_test_helper(ring);
2617 r = amdgpu_ring_test_ring(ring); 2606 if (r)
2618 if (r) {
2619 ring->ready = false;
2620 return r; 2607 return r;
2621 }
2622 2608
2623 return 0; 2609 return 0;
2624} 2610}
@@ -2675,7 +2661,7 @@ static void gfx_v7_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)
2675 } else { 2661 } else {
2676 WREG32(mmCP_MEC_CNTL, (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); 2662 WREG32(mmCP_MEC_CNTL, (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK));
2677 for (i = 0; i < adev->gfx.num_compute_rings; i++) 2663 for (i = 0; i < adev->gfx.num_compute_rings; i++)
2678 adev->gfx.compute_ring[i].ready = false; 2664 adev->gfx.compute_ring[i].sched.ready = false;
2679 } 2665 }
2680 udelay(50); 2666 udelay(50);
2681} 2667}
@@ -2781,7 +2767,7 @@ static int gfx_v7_0_mec_init(struct amdgpu_device *adev)
2781 * GFX7_MEC_HPD_SIZE * 2; 2767 * GFX7_MEC_HPD_SIZE * 2;
2782 2768
2783 r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE, 2769 r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE,
2784 AMDGPU_GEM_DOMAIN_GTT, 2770 AMDGPU_GEM_DOMAIN_VRAM,
2785 &adev->gfx.mec.hpd_eop_obj, 2771 &adev->gfx.mec.hpd_eop_obj,
2786 &adev->gfx.mec.hpd_eop_gpu_addr, 2772 &adev->gfx.mec.hpd_eop_gpu_addr,
2787 (void **)&hpd); 2773 (void **)&hpd);
@@ -3106,10 +3092,7 @@ static int gfx_v7_0_cp_compute_resume(struct amdgpu_device *adev)
3106 3092
3107 for (i = 0; i < adev->gfx.num_compute_rings; i++) { 3093 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
3108 ring = &adev->gfx.compute_ring[i]; 3094 ring = &adev->gfx.compute_ring[i];
3109 ring->ready = true; 3095 amdgpu_ring_test_helper(ring);
3110 r = amdgpu_ring_test_ring(ring);
3111 if (r)
3112 ring->ready = false;
3113 } 3096 }
3114 3097
3115 return 0; 3098 return 0;
@@ -3268,18 +3251,10 @@ static void gfx_v7_0_ring_emit_wreg(struct amdgpu_ring *ring,
3268 * The RLC is a multi-purpose microengine that handles a 3251 * The RLC is a multi-purpose microengine that handles a
3269 * variety of functions. 3252 * variety of functions.
3270 */ 3253 */
3271static void gfx_v7_0_rlc_fini(struct amdgpu_device *adev)
3272{
3273 amdgpu_bo_free_kernel(&adev->gfx.rlc.save_restore_obj, NULL, NULL);
3274 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, NULL, NULL);
3275 amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj, NULL, NULL);
3276}
3277
3278static int gfx_v7_0_rlc_init(struct amdgpu_device *adev) 3254static int gfx_v7_0_rlc_init(struct amdgpu_device *adev)
3279{ 3255{
3280 const u32 *src_ptr; 3256 const u32 *src_ptr;
3281 volatile u32 *dst_ptr; 3257 u32 dws;
3282 u32 dws, i;
3283 const struct cs_section_def *cs_data; 3258 const struct cs_section_def *cs_data;
3284 int r; 3259 int r;
3285 3260
@@ -3306,66 +3281,23 @@ static int gfx_v7_0_rlc_init(struct amdgpu_device *adev)
3306 cs_data = adev->gfx.rlc.cs_data; 3281 cs_data = adev->gfx.rlc.cs_data;
3307 3282
3308 if (src_ptr) { 3283 if (src_ptr) {
3309 /* save restore block */ 3284 /* init save restore block */
3310 r = amdgpu_bo_create_reserved(adev, dws * 4, PAGE_SIZE, 3285 r = amdgpu_gfx_rlc_init_sr(adev, dws);
3311 AMDGPU_GEM_DOMAIN_VRAM, 3286 if (r)
3312 &adev->gfx.rlc.save_restore_obj,
3313 &adev->gfx.rlc.save_restore_gpu_addr,
3314 (void **)&adev->gfx.rlc.sr_ptr);
3315 if (r) {
3316 dev_warn(adev->dev, "(%d) create, pin or map of RLC sr bo failed\n", r);
3317 gfx_v7_0_rlc_fini(adev);
3318 return r; 3287 return r;
3319 }
3320
3321 /* write the sr buffer */
3322 dst_ptr = adev->gfx.rlc.sr_ptr;
3323 for (i = 0; i < adev->gfx.rlc.reg_list_size; i++)
3324 dst_ptr[i] = cpu_to_le32(src_ptr[i]);
3325 amdgpu_bo_kunmap(adev->gfx.rlc.save_restore_obj);
3326 amdgpu_bo_unreserve(adev->gfx.rlc.save_restore_obj);
3327 } 3288 }
3328 3289
3329 if (cs_data) { 3290 if (cs_data) {
3330 /* clear state block */ 3291 /* init clear state block */
3331 adev->gfx.rlc.clear_state_size = dws = gfx_v7_0_get_csb_size(adev); 3292 r = amdgpu_gfx_rlc_init_csb(adev);
3332 3293 if (r)
3333 r = amdgpu_bo_create_reserved(adev, dws * 4, PAGE_SIZE,
3334 AMDGPU_GEM_DOMAIN_VRAM,
3335 &adev->gfx.rlc.clear_state_obj,
3336 &adev->gfx.rlc.clear_state_gpu_addr,
3337 (void **)&adev->gfx.rlc.cs_ptr);
3338 if (r) {
3339 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r);
3340 gfx_v7_0_rlc_fini(adev);
3341 return r; 3294 return r;
3342 }
3343
3344 /* set up the cs buffer */
3345 dst_ptr = adev->gfx.rlc.cs_ptr;
3346 gfx_v7_0_get_csb_buffer(adev, dst_ptr);
3347 amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj);
3348 amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
3349 } 3295 }
3350 3296
3351 if (adev->gfx.rlc.cp_table_size) { 3297 if (adev->gfx.rlc.cp_table_size) {
3352 3298 r = amdgpu_gfx_rlc_init_cpt(adev);
3353 r = amdgpu_bo_create_reserved(adev, adev->gfx.rlc.cp_table_size, 3299 if (r)
3354 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM,
3355 &adev->gfx.rlc.cp_table_obj,
3356 &adev->gfx.rlc.cp_table_gpu_addr,
3357 (void **)&adev->gfx.rlc.cp_table_ptr);
3358 if (r) {
3359 dev_warn(adev->dev, "(%d) create RLC cp table bo failed\n", r);
3360 gfx_v7_0_rlc_fini(adev);
3361 return r; 3300 return r;
3362 }
3363
3364 gfx_v7_0_init_cp_pg_table(adev);
3365
3366 amdgpu_bo_kunmap(adev->gfx.rlc.cp_table_obj);
3367 amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj);
3368
3369 } 3301 }
3370 3302
3371 return 0; 3303 return 0;
@@ -3446,7 +3378,12 @@ static u32 gfx_v7_0_halt_rlc(struct amdgpu_device *adev)
3446 return orig; 3378 return orig;
3447} 3379}
3448 3380
3449static void gfx_v7_0_enter_rlc_safe_mode(struct amdgpu_device *adev) 3381static bool gfx_v7_0_is_rlc_enabled(struct amdgpu_device *adev)
3382{
3383 return true;
3384}
3385
3386static void gfx_v7_0_set_safe_mode(struct amdgpu_device *adev)
3450{ 3387{
3451 u32 tmp, i, mask; 3388 u32 tmp, i, mask;
3452 3389
@@ -3468,7 +3405,7 @@ static void gfx_v7_0_enter_rlc_safe_mode(struct amdgpu_device *adev)
3468 } 3405 }
3469} 3406}
3470 3407
3471static void gfx_v7_0_exit_rlc_safe_mode(struct amdgpu_device *adev) 3408static void gfx_v7_0_unset_safe_mode(struct amdgpu_device *adev)
3472{ 3409{
3473 u32 tmp; 3410 u32 tmp;
3474 3411
@@ -3545,13 +3482,13 @@ static int gfx_v7_0_rlc_resume(struct amdgpu_device *adev)
3545 adev->gfx.rlc_feature_version = le32_to_cpu( 3482 adev->gfx.rlc_feature_version = le32_to_cpu(
3546 hdr->ucode_feature_version); 3483 hdr->ucode_feature_version);
3547 3484
3548 gfx_v7_0_rlc_stop(adev); 3485 adev->gfx.rlc.funcs->stop(adev);
3549 3486
3550 /* disable CG */ 3487 /* disable CG */
3551 tmp = RREG32(mmRLC_CGCG_CGLS_CTRL) & 0xfffffffc; 3488 tmp = RREG32(mmRLC_CGCG_CGLS_CTRL) & 0xfffffffc;
3552 WREG32(mmRLC_CGCG_CGLS_CTRL, tmp); 3489 WREG32(mmRLC_CGCG_CGLS_CTRL, tmp);
3553 3490
3554 gfx_v7_0_rlc_reset(adev); 3491 adev->gfx.rlc.funcs->reset(adev);
3555 3492
3556 gfx_v7_0_init_pg(adev); 3493 gfx_v7_0_init_pg(adev);
3557 3494
@@ -3582,7 +3519,7 @@ static int gfx_v7_0_rlc_resume(struct amdgpu_device *adev)
3582 if (adev->asic_type == CHIP_BONAIRE) 3519 if (adev->asic_type == CHIP_BONAIRE)
3583 WREG32(mmRLC_DRIVER_CPDMA_STATUS, 0); 3520 WREG32(mmRLC_DRIVER_CPDMA_STATUS, 0);
3584 3521
3585 gfx_v7_0_rlc_start(adev); 3522 adev->gfx.rlc.funcs->start(adev);
3586 3523
3587 return 0; 3524 return 0;
3588} 3525}
@@ -3784,72 +3721,12 @@ static void gfx_v7_0_enable_gds_pg(struct amdgpu_device *adev, bool enable)
3784 WREG32(mmRLC_PG_CNTL, data); 3721 WREG32(mmRLC_PG_CNTL, data);
3785} 3722}
3786 3723
3787static void gfx_v7_0_init_cp_pg_table(struct amdgpu_device *adev) 3724static int gfx_v7_0_cp_pg_table_num(struct amdgpu_device *adev)
3788{ 3725{
3789 const __le32 *fw_data;
3790 volatile u32 *dst_ptr;
3791 int me, i, max_me = 4;
3792 u32 bo_offset = 0;
3793 u32 table_offset, table_size;
3794
3795 if (adev->asic_type == CHIP_KAVERI) 3726 if (adev->asic_type == CHIP_KAVERI)
3796 max_me = 5; 3727 return 5;
3797 3728 else
3798 if (adev->gfx.rlc.cp_table_ptr == NULL) 3729 return 4;
3799 return;
3800
3801 /* write the cp table buffer */
3802 dst_ptr = adev->gfx.rlc.cp_table_ptr;
3803 for (me = 0; me < max_me; me++) {
3804 if (me == 0) {
3805 const struct gfx_firmware_header_v1_0 *hdr =
3806 (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data;
3807 fw_data = (const __le32 *)
3808 (adev->gfx.ce_fw->data +
3809 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
3810 table_offset = le32_to_cpu(hdr->jt_offset);
3811 table_size = le32_to_cpu(hdr->jt_size);
3812 } else if (me == 1) {
3813 const struct gfx_firmware_header_v1_0 *hdr =
3814 (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data;
3815 fw_data = (const __le32 *)
3816 (adev->gfx.pfp_fw->data +
3817 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
3818 table_offset = le32_to_cpu(hdr->jt_offset);
3819 table_size = le32_to_cpu(hdr->jt_size);
3820 } else if (me == 2) {
3821 const struct gfx_firmware_header_v1_0 *hdr =
3822 (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
3823 fw_data = (const __le32 *)
3824 (adev->gfx.me_fw->data +
3825 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
3826 table_offset = le32_to_cpu(hdr->jt_offset);
3827 table_size = le32_to_cpu(hdr->jt_size);
3828 } else if (me == 3) {
3829 const struct gfx_firmware_header_v1_0 *hdr =
3830 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
3831 fw_data = (const __le32 *)
3832 (adev->gfx.mec_fw->data +
3833 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
3834 table_offset = le32_to_cpu(hdr->jt_offset);
3835 table_size = le32_to_cpu(hdr->jt_size);
3836 } else {
3837 const struct gfx_firmware_header_v1_0 *hdr =
3838 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data;
3839 fw_data = (const __le32 *)
3840 (adev->gfx.mec2_fw->data +
3841 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
3842 table_offset = le32_to_cpu(hdr->jt_offset);
3843 table_size = le32_to_cpu(hdr->jt_size);
3844 }
3845
3846 for (i = 0; i < table_size; i ++) {
3847 dst_ptr[bo_offset + i] =
3848 cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
3849 }
3850
3851 bo_offset += table_size;
3852 }
3853} 3730}
3854 3731
3855static void gfx_v7_0_enable_gfx_cgpg(struct amdgpu_device *adev, 3732static void gfx_v7_0_enable_gfx_cgpg(struct amdgpu_device *adev,
@@ -4288,8 +4165,17 @@ static const struct amdgpu_gfx_funcs gfx_v7_0_gfx_funcs = {
4288}; 4165};
4289 4166
4290static const struct amdgpu_rlc_funcs gfx_v7_0_rlc_funcs = { 4167static const struct amdgpu_rlc_funcs gfx_v7_0_rlc_funcs = {
4291 .enter_safe_mode = gfx_v7_0_enter_rlc_safe_mode, 4168 .is_rlc_enabled = gfx_v7_0_is_rlc_enabled,
4292 .exit_safe_mode = gfx_v7_0_exit_rlc_safe_mode 4169 .set_safe_mode = gfx_v7_0_set_safe_mode,
4170 .unset_safe_mode = gfx_v7_0_unset_safe_mode,
4171 .init = gfx_v7_0_rlc_init,
4172 .get_csb_size = gfx_v7_0_get_csb_size,
4173 .get_csb_buffer = gfx_v7_0_get_csb_buffer,
4174 .get_cp_table_num = gfx_v7_0_cp_pg_table_num,
4175 .resume = gfx_v7_0_rlc_resume,
4176 .stop = gfx_v7_0_rlc_stop,
4177 .reset = gfx_v7_0_rlc_reset,
4178 .start = gfx_v7_0_rlc_start
4293}; 4179};
4294 4180
4295static int gfx_v7_0_early_init(void *handle) 4181static int gfx_v7_0_early_init(void *handle)
@@ -4540,7 +4426,7 @@ static int gfx_v7_0_sw_init(void *handle)
4540 return r; 4426 return r;
4541 } 4427 }
4542 4428
4543 r = gfx_v7_0_rlc_init(adev); 4429 r = adev->gfx.rlc.funcs->init(adev);
4544 if (r) { 4430 if (r) {
4545 DRM_ERROR("Failed to init rlc BOs!\n"); 4431 DRM_ERROR("Failed to init rlc BOs!\n");
4546 return r; 4432 return r;
@@ -4604,7 +4490,7 @@ static int gfx_v7_0_sw_fini(void *handle)
4604 amdgpu_ring_fini(&adev->gfx.compute_ring[i]); 4490 amdgpu_ring_fini(&adev->gfx.compute_ring[i]);
4605 4491
4606 gfx_v7_0_cp_compute_fini(adev); 4492 gfx_v7_0_cp_compute_fini(adev);
4607 gfx_v7_0_rlc_fini(adev); 4493 amdgpu_gfx_rlc_fini(adev);
4608 gfx_v7_0_mec_fini(adev); 4494 gfx_v7_0_mec_fini(adev);
4609 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, 4495 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj,
4610 &adev->gfx.rlc.clear_state_gpu_addr, 4496 &adev->gfx.rlc.clear_state_gpu_addr,
@@ -4627,7 +4513,7 @@ static int gfx_v7_0_hw_init(void *handle)
4627 gfx_v7_0_constants_init(adev); 4513 gfx_v7_0_constants_init(adev);
4628 4514
4629 /* init rlc */ 4515 /* init rlc */
4630 r = gfx_v7_0_rlc_resume(adev); 4516 r = adev->gfx.rlc.funcs->resume(adev);
4631 if (r) 4517 if (r)
4632 return r; 4518 return r;
4633 4519
@@ -4645,7 +4531,7 @@ static int gfx_v7_0_hw_fini(void *handle)
4645 amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0); 4531 amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);
4646 amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0); 4532 amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);
4647 gfx_v7_0_cp_enable(adev, false); 4533 gfx_v7_0_cp_enable(adev, false);
4648 gfx_v7_0_rlc_stop(adev); 4534 adev->gfx.rlc.funcs->stop(adev);
4649 gfx_v7_0_fini_pg(adev); 4535 gfx_v7_0_fini_pg(adev);
4650 4536
4651 return 0; 4537 return 0;
@@ -4730,7 +4616,7 @@ static int gfx_v7_0_soft_reset(void *handle)
4730 gfx_v7_0_update_cg(adev, false); 4616 gfx_v7_0_update_cg(adev, false);
4731 4617
4732 /* stop the rlc */ 4618 /* stop the rlc */
4733 gfx_v7_0_rlc_stop(adev); 4619 adev->gfx.rlc.funcs->stop(adev);
4734 4620
4735 /* Disable GFX parsing/prefetching */ 4621 /* Disable GFX parsing/prefetching */
4736 WREG32(mmCP_ME_CNTL, CP_ME_CNTL__ME_HALT_MASK | CP_ME_CNTL__PFP_HALT_MASK | CP_ME_CNTL__CE_HALT_MASK); 4622 WREG32(mmCP_ME_CNTL, CP_ME_CNTL__ME_HALT_MASK | CP_ME_CNTL__PFP_HALT_MASK | CP_ME_CNTL__CE_HALT_MASK);
@@ -4959,12 +4845,36 @@ static int gfx_v7_0_eop_irq(struct amdgpu_device *adev,
4959 return 0; 4845 return 0;
4960} 4846}
4961 4847
4848static void gfx_v7_0_fault(struct amdgpu_device *adev,
4849 struct amdgpu_iv_entry *entry)
4850{
4851 struct amdgpu_ring *ring;
4852 u8 me_id, pipe_id;
4853 int i;
4854
4855 me_id = (entry->ring_id & 0x0c) >> 2;
4856 pipe_id = (entry->ring_id & 0x03) >> 0;
4857 switch (me_id) {
4858 case 0:
4859 drm_sched_fault(&adev->gfx.gfx_ring[0].sched);
4860 break;
4861 case 1:
4862 case 2:
4863 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
4864 ring = &adev->gfx.compute_ring[i];
4865 if ((ring->me == me_id) && (ring->pipe == pipe_id))
4866 drm_sched_fault(&ring->sched);
4867 }
4868 break;
4869 }
4870}
4871
4962static int gfx_v7_0_priv_reg_irq(struct amdgpu_device *adev, 4872static int gfx_v7_0_priv_reg_irq(struct amdgpu_device *adev,
4963 struct amdgpu_irq_src *source, 4873 struct amdgpu_irq_src *source,
4964 struct amdgpu_iv_entry *entry) 4874 struct amdgpu_iv_entry *entry)
4965{ 4875{
4966 DRM_ERROR("Illegal register access in command stream\n"); 4876 DRM_ERROR("Illegal register access in command stream\n");
4967 schedule_work(&adev->reset_work); 4877 gfx_v7_0_fault(adev, entry);
4968 return 0; 4878 return 0;
4969} 4879}
4970 4880
@@ -4974,7 +4884,7 @@ static int gfx_v7_0_priv_inst_irq(struct amdgpu_device *adev,
4974{ 4884{
4975 DRM_ERROR("Illegal instruction in command stream\n"); 4885 DRM_ERROR("Illegal instruction in command stream\n");
4976 // XXX soft reset the gfx block only 4886 // XXX soft reset the gfx block only
4977 schedule_work(&adev->reset_work); 4887 gfx_v7_0_fault(adev, entry);
4978 return 0; 4888 return 0;
4979} 4889}
4980 4890
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 617b0c8908a3..cb066a8dccd7 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -54,7 +54,7 @@
54#include "ivsrcid/ivsrcid_vislands30.h" 54#include "ivsrcid/ivsrcid_vislands30.h"
55 55
56#define GFX8_NUM_GFX_RINGS 1 56#define GFX8_NUM_GFX_RINGS 1
57#define GFX8_MEC_HPD_SIZE 2048 57#define GFX8_MEC_HPD_SIZE 4096
58 58
59#define TOPAZ_GB_ADDR_CONFIG_GOLDEN 0x22010001 59#define TOPAZ_GB_ADDR_CONFIG_GOLDEN 0x22010001
60#define CARRIZO_GB_ADDR_CONFIG_GOLDEN 0x22010001 60#define CARRIZO_GB_ADDR_CONFIG_GOLDEN 0x22010001
@@ -839,18 +839,14 @@ static int gfx_v8_0_ring_test_ring(struct amdgpu_ring *ring)
839 int r; 839 int r;
840 840
841 r = amdgpu_gfx_scratch_get(adev, &scratch); 841 r = amdgpu_gfx_scratch_get(adev, &scratch);
842 if (r) { 842 if (r)
843 DRM_ERROR("amdgpu: cp failed to get scratch reg (%d).\n", r);
844 return r; 843 return r;
845 } 844
846 WREG32(scratch, 0xCAFEDEAD); 845 WREG32(scratch, 0xCAFEDEAD);
847 r = amdgpu_ring_alloc(ring, 3); 846 r = amdgpu_ring_alloc(ring, 3);
848 if (r) { 847 if (r)
849 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n", 848 goto error_free_scratch;
850 ring->idx, r); 849
851 amdgpu_gfx_scratch_free(adev, scratch);
852 return r;
853 }
854 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1)); 850 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
855 amdgpu_ring_write(ring, (scratch - PACKET3_SET_UCONFIG_REG_START)); 851 amdgpu_ring_write(ring, (scratch - PACKET3_SET_UCONFIG_REG_START));
856 amdgpu_ring_write(ring, 0xDEADBEEF); 852 amdgpu_ring_write(ring, 0xDEADBEEF);
@@ -862,14 +858,11 @@ static int gfx_v8_0_ring_test_ring(struct amdgpu_ring *ring)
862 break; 858 break;
863 DRM_UDELAY(1); 859 DRM_UDELAY(1);
864 } 860 }
865 if (i < adev->usec_timeout) { 861
866 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", 862 if (i >= adev->usec_timeout)
867 ring->idx, i); 863 r = -ETIMEDOUT;
868 } else { 864
869 DRM_ERROR("amdgpu: ring %d test failed (scratch(0x%04X)=0x%08X)\n", 865error_free_scratch:
870 ring->idx, scratch, tmp);
871 r = -EINVAL;
872 }
873 amdgpu_gfx_scratch_free(adev, scratch); 866 amdgpu_gfx_scratch_free(adev, scratch);
874 return r; 867 return r;
875} 868}
@@ -886,19 +879,16 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
886 long r; 879 long r;
887 880
888 r = amdgpu_device_wb_get(adev, &index); 881 r = amdgpu_device_wb_get(adev, &index);
889 if (r) { 882 if (r)
890 dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
891 return r; 883 return r;
892 }
893 884
894 gpu_addr = adev->wb.gpu_addr + (index * 4); 885 gpu_addr = adev->wb.gpu_addr + (index * 4);
895 adev->wb.wb[index] = cpu_to_le32(0xCAFEDEAD); 886 adev->wb.wb[index] = cpu_to_le32(0xCAFEDEAD);
896 memset(&ib, 0, sizeof(ib)); 887 memset(&ib, 0, sizeof(ib));
897 r = amdgpu_ib_get(adev, NULL, 16, &ib); 888 r = amdgpu_ib_get(adev, NULL, 16, &ib);
898 if (r) { 889 if (r)
899 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
900 goto err1; 890 goto err1;
901 } 891
902 ib.ptr[0] = PACKET3(PACKET3_WRITE_DATA, 3); 892 ib.ptr[0] = PACKET3(PACKET3_WRITE_DATA, 3);
903 ib.ptr[1] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM; 893 ib.ptr[1] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM;
904 ib.ptr[2] = lower_32_bits(gpu_addr); 894 ib.ptr[2] = lower_32_bits(gpu_addr);
@@ -912,22 +902,17 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
912 902
913 r = dma_fence_wait_timeout(f, false, timeout); 903 r = dma_fence_wait_timeout(f, false, timeout);
914 if (r == 0) { 904 if (r == 0) {
915 DRM_ERROR("amdgpu: IB test timed out.\n");
916 r = -ETIMEDOUT; 905 r = -ETIMEDOUT;
917 goto err2; 906 goto err2;
918 } else if (r < 0) { 907 } else if (r < 0) {
919 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
920 goto err2; 908 goto err2;
921 } 909 }
922 910
923 tmp = adev->wb.wb[index]; 911 tmp = adev->wb.wb[index];
924 if (tmp == 0xDEADBEEF) { 912 if (tmp == 0xDEADBEEF)
925 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
926 r = 0; 913 r = 0;
927 } else { 914 else
928 DRM_ERROR("ib test on ring %d failed\n", ring->idx);
929 r = -EINVAL; 915 r = -EINVAL;
930 }
931 916
932err2: 917err2:
933 amdgpu_ib_free(adev, &ib, NULL); 918 amdgpu_ib_free(adev, &ib, NULL);
@@ -1298,81 +1283,16 @@ static void gfx_v8_0_get_csb_buffer(struct amdgpu_device *adev,
1298 buffer[count++] = cpu_to_le32(0); 1283 buffer[count++] = cpu_to_le32(0);
1299} 1284}
1300 1285
1301static void cz_init_cp_jump_table(struct amdgpu_device *adev) 1286static int gfx_v8_0_cp_jump_table_num(struct amdgpu_device *adev)
1302{ 1287{
1303 const __le32 *fw_data;
1304 volatile u32 *dst_ptr;
1305 int me, i, max_me = 4;
1306 u32 bo_offset = 0;
1307 u32 table_offset, table_size;
1308
1309 if (adev->asic_type == CHIP_CARRIZO) 1288 if (adev->asic_type == CHIP_CARRIZO)
1310 max_me = 5; 1289 return 5;
1311 1290 else
1312 /* write the cp table buffer */ 1291 return 4;
1313 dst_ptr = adev->gfx.rlc.cp_table_ptr;
1314 for (me = 0; me < max_me; me++) {
1315 if (me == 0) {
1316 const struct gfx_firmware_header_v1_0 *hdr =
1317 (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data;
1318 fw_data = (const __le32 *)
1319 (adev->gfx.ce_fw->data +
1320 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1321 table_offset = le32_to_cpu(hdr->jt_offset);
1322 table_size = le32_to_cpu(hdr->jt_size);
1323 } else if (me == 1) {
1324 const struct gfx_firmware_header_v1_0 *hdr =
1325 (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data;
1326 fw_data = (const __le32 *)
1327 (adev->gfx.pfp_fw->data +
1328 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1329 table_offset = le32_to_cpu(hdr->jt_offset);
1330 table_size = le32_to_cpu(hdr->jt_size);
1331 } else if (me == 2) {
1332 const struct gfx_firmware_header_v1_0 *hdr =
1333 (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
1334 fw_data = (const __le32 *)
1335 (adev->gfx.me_fw->data +
1336 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1337 table_offset = le32_to_cpu(hdr->jt_offset);
1338 table_size = le32_to_cpu(hdr->jt_size);
1339 } else if (me == 3) {
1340 const struct gfx_firmware_header_v1_0 *hdr =
1341 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
1342 fw_data = (const __le32 *)
1343 (adev->gfx.mec_fw->data +
1344 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1345 table_offset = le32_to_cpu(hdr->jt_offset);
1346 table_size = le32_to_cpu(hdr->jt_size);
1347 } else if (me == 4) {
1348 const struct gfx_firmware_header_v1_0 *hdr =
1349 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data;
1350 fw_data = (const __le32 *)
1351 (adev->gfx.mec2_fw->data +
1352 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1353 table_offset = le32_to_cpu(hdr->jt_offset);
1354 table_size = le32_to_cpu(hdr->jt_size);
1355 }
1356
1357 for (i = 0; i < table_size; i ++) {
1358 dst_ptr[bo_offset + i] =
1359 cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
1360 }
1361
1362 bo_offset += table_size;
1363 }
1364}
1365
1366static void gfx_v8_0_rlc_fini(struct amdgpu_device *adev)
1367{
1368 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, NULL, NULL);
1369 amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj, NULL, NULL);
1370} 1292}
1371 1293
1372static int gfx_v8_0_rlc_init(struct amdgpu_device *adev) 1294static int gfx_v8_0_rlc_init(struct amdgpu_device *adev)
1373{ 1295{
1374 volatile u32 *dst_ptr;
1375 u32 dws;
1376 const struct cs_section_def *cs_data; 1296 const struct cs_section_def *cs_data;
1377 int r; 1297 int r;
1378 1298
@@ -1381,44 +1301,18 @@ static int gfx_v8_0_rlc_init(struct amdgpu_device *adev)
1381 cs_data = adev->gfx.rlc.cs_data; 1301 cs_data = adev->gfx.rlc.cs_data;
1382 1302
1383 if (cs_data) { 1303 if (cs_data) {
1384 /* clear state block */ 1304 /* init clear state block */
1385 adev->gfx.rlc.clear_state_size = dws = gfx_v8_0_get_csb_size(adev); 1305 r = amdgpu_gfx_rlc_init_csb(adev);
1386 1306 if (r)
1387 r = amdgpu_bo_create_reserved(adev, dws * 4, PAGE_SIZE,
1388 AMDGPU_GEM_DOMAIN_VRAM,
1389 &adev->gfx.rlc.clear_state_obj,
1390 &adev->gfx.rlc.clear_state_gpu_addr,
1391 (void **)&adev->gfx.rlc.cs_ptr);
1392 if (r) {
1393 dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r);
1394 gfx_v8_0_rlc_fini(adev);
1395 return r; 1307 return r;
1396 }
1397
1398 /* set up the cs buffer */
1399 dst_ptr = adev->gfx.rlc.cs_ptr;
1400 gfx_v8_0_get_csb_buffer(adev, dst_ptr);
1401 amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj);
1402 amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
1403 } 1308 }
1404 1309
1405 if ((adev->asic_type == CHIP_CARRIZO) || 1310 if ((adev->asic_type == CHIP_CARRIZO) ||
1406 (adev->asic_type == CHIP_STONEY)) { 1311 (adev->asic_type == CHIP_STONEY)) {
1407 adev->gfx.rlc.cp_table_size = ALIGN(96 * 5 * 4, 2048) + (64 * 1024); /* JT + GDS */ 1312 adev->gfx.rlc.cp_table_size = ALIGN(96 * 5 * 4, 2048) + (64 * 1024); /* JT + GDS */
1408 r = amdgpu_bo_create_reserved(adev, adev->gfx.rlc.cp_table_size, 1313 r = amdgpu_gfx_rlc_init_cpt(adev);
1409 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM, 1314 if (r)
1410 &adev->gfx.rlc.cp_table_obj,
1411 &adev->gfx.rlc.cp_table_gpu_addr,
1412 (void **)&adev->gfx.rlc.cp_table_ptr);
1413 if (r) {
1414 dev_warn(adev->dev, "(%d) create RLC cp table bo failed\n", r);
1415 return r; 1315 return r;
1416 }
1417
1418 cz_init_cp_jump_table(adev);
1419
1420 amdgpu_bo_kunmap(adev->gfx.rlc.cp_table_obj);
1421 amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj);
1422 } 1316 }
1423 1317
1424 return 0; 1318 return 0;
@@ -1443,7 +1337,7 @@ static int gfx_v8_0_mec_init(struct amdgpu_device *adev)
1443 mec_hpd_size = adev->gfx.num_compute_rings * GFX8_MEC_HPD_SIZE; 1337 mec_hpd_size = adev->gfx.num_compute_rings * GFX8_MEC_HPD_SIZE;
1444 1338
1445 r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE, 1339 r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE,
1446 AMDGPU_GEM_DOMAIN_GTT, 1340 AMDGPU_GEM_DOMAIN_VRAM,
1447 &adev->gfx.mec.hpd_eop_obj, 1341 &adev->gfx.mec.hpd_eop_obj,
1448 &adev->gfx.mec.hpd_eop_gpu_addr, 1342 &adev->gfx.mec.hpd_eop_gpu_addr,
1449 (void **)&hpd); 1343 (void **)&hpd);
@@ -1629,7 +1523,7 @@ static int gfx_v8_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)
1629 return 0; 1523 return 0;
1630 1524
1631 /* bail if the compute ring is not ready */ 1525 /* bail if the compute ring is not ready */
1632 if (!ring->ready) 1526 if (!ring->sched.ready)
1633 return 0; 1527 return 0;
1634 1528
1635 tmp = RREG32(mmGB_EDC_MODE); 1529 tmp = RREG32(mmGB_EDC_MODE);
@@ -2088,7 +1982,7 @@ static int gfx_v8_0_sw_init(void *handle)
2088 return r; 1982 return r;
2089 } 1983 }
2090 1984
2091 r = gfx_v8_0_rlc_init(adev); 1985 r = adev->gfx.rlc.funcs->init(adev);
2092 if (r) { 1986 if (r) {
2093 DRM_ERROR("Failed to init rlc BOs!\n"); 1987 DRM_ERROR("Failed to init rlc BOs!\n");
2094 return r; 1988 return r;
@@ -2181,7 +2075,7 @@ static int gfx_v8_0_sw_fini(void *handle)
2181 amdgpu_gfx_kiq_fini(adev); 2075 amdgpu_gfx_kiq_fini(adev);
2182 2076
2183 gfx_v8_0_mec_fini(adev); 2077 gfx_v8_0_mec_fini(adev);
2184 gfx_v8_0_rlc_fini(adev); 2078 amdgpu_gfx_rlc_fini(adev);
2185 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj, 2079 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj,
2186 &adev->gfx.rlc.clear_state_gpu_addr, 2080 &adev->gfx.rlc.clear_state_gpu_addr,
2187 (void **)&adev->gfx.rlc.cs_ptr); 2081 (void **)&adev->gfx.rlc.cs_ptr);
@@ -4175,10 +4069,10 @@ static void gfx_v8_0_rlc_start(struct amdgpu_device *adev)
4175 4069
4176static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev) 4070static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev)
4177{ 4071{
4178 gfx_v8_0_rlc_stop(adev); 4072 adev->gfx.rlc.funcs->stop(adev);
4179 gfx_v8_0_rlc_reset(adev); 4073 adev->gfx.rlc.funcs->reset(adev);
4180 gfx_v8_0_init_pg(adev); 4074 gfx_v8_0_init_pg(adev);
4181 gfx_v8_0_rlc_start(adev); 4075 adev->gfx.rlc.funcs->start(adev);
4182 4076
4183 return 0; 4077 return 0;
4184} 4078}
@@ -4197,7 +4091,7 @@ static void gfx_v8_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)
4197 tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, 1); 4091 tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, 1);
4198 tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, 1); 4092 tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, 1);
4199 for (i = 0; i < adev->gfx.num_gfx_rings; i++) 4093 for (i = 0; i < adev->gfx.num_gfx_rings; i++)
4200 adev->gfx.gfx_ring[i].ready = false; 4094 adev->gfx.gfx_ring[i].sched.ready = false;
4201 } 4095 }
4202 WREG32(mmCP_ME_CNTL, tmp); 4096 WREG32(mmCP_ME_CNTL, tmp);
4203 udelay(50); 4097 udelay(50);
@@ -4379,10 +4273,8 @@ static int gfx_v8_0_cp_gfx_resume(struct amdgpu_device *adev)
4379 /* start the ring */ 4273 /* start the ring */
4380 amdgpu_ring_clear_ring(ring); 4274 amdgpu_ring_clear_ring(ring);
4381 gfx_v8_0_cp_gfx_start(adev); 4275 gfx_v8_0_cp_gfx_start(adev);
4382 ring->ready = true; 4276 ring->sched.ready = true;
4383 r = amdgpu_ring_test_ring(ring); 4277 r = amdgpu_ring_test_helper(ring);
4384 if (r)
4385 ring->ready = false;
4386 4278
4387 return r; 4279 return r;
4388} 4280}
@@ -4396,8 +4288,8 @@ static void gfx_v8_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)
4396 } else { 4288 } else {
4397 WREG32(mmCP_MEC_CNTL, (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); 4289 WREG32(mmCP_MEC_CNTL, (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK));
4398 for (i = 0; i < adev->gfx.num_compute_rings; i++) 4290 for (i = 0; i < adev->gfx.num_compute_rings; i++)
4399 adev->gfx.compute_ring[i].ready = false; 4291 adev->gfx.compute_ring[i].sched.ready = false;
4400 adev->gfx.kiq.ring.ready = false; 4292 adev->gfx.kiq.ring.sched.ready = false;
4401 } 4293 }
4402 udelay(50); 4294 udelay(50);
4403} 4295}
@@ -4473,11 +4365,9 @@ static int gfx_v8_0_kiq_kcq_enable(struct amdgpu_device *adev)
4473 amdgpu_ring_write(kiq_ring, upper_32_bits(wptr_addr)); 4365 amdgpu_ring_write(kiq_ring, upper_32_bits(wptr_addr));
4474 } 4366 }
4475 4367
4476 r = amdgpu_ring_test_ring(kiq_ring); 4368 r = amdgpu_ring_test_helper(kiq_ring);
4477 if (r) { 4369 if (r)
4478 DRM_ERROR("KCQ enable failed\n"); 4370 DRM_ERROR("KCQ enable failed\n");
4479 kiq_ring->ready = false;
4480 }
4481 return r; 4371 return r;
4482} 4372}
4483 4373
@@ -4781,7 +4671,7 @@ static int gfx_v8_0_kiq_resume(struct amdgpu_device *adev)
4781 amdgpu_bo_kunmap(ring->mqd_obj); 4671 amdgpu_bo_kunmap(ring->mqd_obj);
4782 ring->mqd_ptr = NULL; 4672 ring->mqd_ptr = NULL;
4783 amdgpu_bo_unreserve(ring->mqd_obj); 4673 amdgpu_bo_unreserve(ring->mqd_obj);
4784 ring->ready = true; 4674 ring->sched.ready = true;
4785 return 0; 4675 return 0;
4786} 4676}
4787 4677
@@ -4820,10 +4710,7 @@ static int gfx_v8_0_kcq_resume(struct amdgpu_device *adev)
4820 */ 4710 */
4821 for (i = adev->gfx.num_compute_rings - 1; i >= 0; i--) { 4711 for (i = adev->gfx.num_compute_rings - 1; i >= 0; i--) {
4822 ring = &adev->gfx.compute_ring[i]; 4712 ring = &adev->gfx.compute_ring[i];
4823 ring->ready = true; 4713 r = amdgpu_ring_test_helper(ring);
4824 r = amdgpu_ring_test_ring(ring);
4825 if (r)
4826 ring->ready = false;
4827 } 4714 }
4828 4715
4829done: 4716done:
@@ -4867,7 +4754,7 @@ static int gfx_v8_0_hw_init(void *handle)
4867 gfx_v8_0_init_golden_registers(adev); 4754 gfx_v8_0_init_golden_registers(adev);
4868 gfx_v8_0_constants_init(adev); 4755 gfx_v8_0_constants_init(adev);
4869 4756
4870 r = gfx_v8_0_rlc_resume(adev); 4757 r = adev->gfx.rlc.funcs->resume(adev);
4871 if (r) 4758 if (r)
4872 return r; 4759 return r;
4873 4760
@@ -4899,7 +4786,7 @@ static int gfx_v8_0_kcq_disable(struct amdgpu_device *adev)
4899 amdgpu_ring_write(kiq_ring, 0); 4786 amdgpu_ring_write(kiq_ring, 0);
4900 amdgpu_ring_write(kiq_ring, 0); 4787 amdgpu_ring_write(kiq_ring, 0);
4901 } 4788 }
4902 r = amdgpu_ring_test_ring(kiq_ring); 4789 r = amdgpu_ring_test_helper(kiq_ring);
4903 if (r) 4790 if (r)
4904 DRM_ERROR("KCQ disable failed\n"); 4791 DRM_ERROR("KCQ disable failed\n");
4905 4792
@@ -4973,16 +4860,16 @@ static int gfx_v8_0_hw_fini(void *handle)
4973 pr_debug("For SRIOV client, shouldn't do anything.\n"); 4860 pr_debug("For SRIOV client, shouldn't do anything.\n");
4974 return 0; 4861 return 0;
4975 } 4862 }
4976 adev->gfx.rlc.funcs->enter_safe_mode(adev); 4863 amdgpu_gfx_rlc_enter_safe_mode(adev);
4977 if (!gfx_v8_0_wait_for_idle(adev)) 4864 if (!gfx_v8_0_wait_for_idle(adev))
4978 gfx_v8_0_cp_enable(adev, false); 4865 gfx_v8_0_cp_enable(adev, false);
4979 else 4866 else
4980 pr_err("cp is busy, skip halt cp\n"); 4867 pr_err("cp is busy, skip halt cp\n");
4981 if (!gfx_v8_0_wait_for_rlc_idle(adev)) 4868 if (!gfx_v8_0_wait_for_rlc_idle(adev))
4982 gfx_v8_0_rlc_stop(adev); 4869 adev->gfx.rlc.funcs->stop(adev);
4983 else 4870 else
4984 pr_err("rlc is busy, skip halt rlc\n"); 4871 pr_err("rlc is busy, skip halt rlc\n");
4985 adev->gfx.rlc.funcs->exit_safe_mode(adev); 4872 amdgpu_gfx_rlc_exit_safe_mode(adev);
4986 return 0; 4873 return 0;
4987} 4874}
4988 4875
@@ -5071,7 +4958,7 @@ static int gfx_v8_0_pre_soft_reset(void *handle)
5071 srbm_soft_reset = adev->gfx.srbm_soft_reset; 4958 srbm_soft_reset = adev->gfx.srbm_soft_reset;
5072 4959
5073 /* stop the rlc */ 4960 /* stop the rlc */
5074 gfx_v8_0_rlc_stop(adev); 4961 adev->gfx.rlc.funcs->stop(adev);
5075 4962
5076 if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) || 4963 if (REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_CP) ||
5077 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX)) 4964 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX))
@@ -5197,7 +5084,7 @@ static int gfx_v8_0_post_soft_reset(void *handle)
5197 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX)) 5084 REG_GET_FIELD(grbm_soft_reset, GRBM_SOFT_RESET, SOFT_RESET_GFX))
5198 gfx_v8_0_cp_gfx_resume(adev); 5085 gfx_v8_0_cp_gfx_resume(adev);
5199 5086
5200 gfx_v8_0_rlc_start(adev); 5087 adev->gfx.rlc.funcs->start(adev);
5201 5088
5202 return 0; 5089 return 0;
5203} 5090}
@@ -5445,7 +5332,7 @@ static int gfx_v8_0_set_powergating_state(void *handle,
5445 AMD_PG_SUPPORT_RLC_SMU_HS | 5332 AMD_PG_SUPPORT_RLC_SMU_HS |
5446 AMD_PG_SUPPORT_CP | 5333 AMD_PG_SUPPORT_CP |
5447 AMD_PG_SUPPORT_GFX_DMG)) 5334 AMD_PG_SUPPORT_GFX_DMG))
5448 adev->gfx.rlc.funcs->enter_safe_mode(adev); 5335 amdgpu_gfx_rlc_enter_safe_mode(adev);
5449 switch (adev->asic_type) { 5336 switch (adev->asic_type) {
5450 case CHIP_CARRIZO: 5337 case CHIP_CARRIZO:
5451 case CHIP_STONEY: 5338 case CHIP_STONEY:
@@ -5499,7 +5386,7 @@ static int gfx_v8_0_set_powergating_state(void *handle,
5499 AMD_PG_SUPPORT_RLC_SMU_HS | 5386 AMD_PG_SUPPORT_RLC_SMU_HS |
5500 AMD_PG_SUPPORT_CP | 5387 AMD_PG_SUPPORT_CP |
5501 AMD_PG_SUPPORT_GFX_DMG)) 5388 AMD_PG_SUPPORT_GFX_DMG))
5502 adev->gfx.rlc.funcs->exit_safe_mode(adev); 5389 amdgpu_gfx_rlc_exit_safe_mode(adev);
5503 return 0; 5390 return 0;
5504} 5391}
5505 5392
@@ -5593,57 +5480,53 @@ static void gfx_v8_0_send_serdes_cmd(struct amdgpu_device *adev,
5593#define RLC_GPR_REG2__MESSAGE__SHIFT 0x00000001 5480#define RLC_GPR_REG2__MESSAGE__SHIFT 0x00000001
5594#define RLC_GPR_REG2__MESSAGE_MASK 0x0000001e 5481#define RLC_GPR_REG2__MESSAGE_MASK 0x0000001e
5595 5482
5596static void iceland_enter_rlc_safe_mode(struct amdgpu_device *adev) 5483static bool gfx_v8_0_is_rlc_enabled(struct amdgpu_device *adev)
5597{ 5484{
5598 u32 data; 5485 uint32_t rlc_setting;
5599 unsigned i;
5600 5486
5601 data = RREG32(mmRLC_CNTL); 5487 rlc_setting = RREG32(mmRLC_CNTL);
5602 if (!(data & RLC_CNTL__RLC_ENABLE_F32_MASK)) 5488 if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK))
5603 return; 5489 return false;
5604 5490
5605 if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG)) { 5491 return true;
5606 data |= RLC_SAFE_MODE__CMD_MASK; 5492}
5607 data &= ~RLC_SAFE_MODE__MESSAGE_MASK;
5608 data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT);
5609 WREG32(mmRLC_SAFE_MODE, data);
5610 5493
5611 for (i = 0; i < adev->usec_timeout; i++) { 5494static void gfx_v8_0_set_safe_mode(struct amdgpu_device *adev)
5612 if ((RREG32(mmRLC_GPM_STAT) & 5495{
5613 (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK | 5496 uint32_t data;
5614 RLC_GPM_STAT__GFX_POWER_STATUS_MASK)) == 5497 unsigned i;
5615 (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK | 5498 data = RREG32(mmRLC_CNTL);
5616 RLC_GPM_STAT__GFX_POWER_STATUS_MASK)) 5499 data |= RLC_SAFE_MODE__CMD_MASK;
5617 break; 5500 data &= ~RLC_SAFE_MODE__MESSAGE_MASK;
5618 udelay(1); 5501 data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT);
5619 } 5502 WREG32(mmRLC_SAFE_MODE, data);
5620 5503
5621 for (i = 0; i < adev->usec_timeout; i++) { 5504 /* wait for RLC_SAFE_MODE */
5622 if (!REG_GET_FIELD(RREG32(mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD)) 5505 for (i = 0; i < adev->usec_timeout; i++) {
5623 break; 5506 if ((RREG32(mmRLC_GPM_STAT) &
5624 udelay(1); 5507 (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK |
5625 } 5508 RLC_GPM_STAT__GFX_POWER_STATUS_MASK)) ==
5626 adev->gfx.rlc.in_safe_mode = true; 5509 (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK |
5510 RLC_GPM_STAT__GFX_POWER_STATUS_MASK))
5511 break;
5512 udelay(1);
5513 }
5514 for (i = 0; i < adev->usec_timeout; i++) {
5515 if (!REG_GET_FIELD(RREG32(mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD))
5516 break;
5517 udelay(1);
5627 } 5518 }
5628} 5519}
5629 5520
5630static void iceland_exit_rlc_safe_mode(struct amdgpu_device *adev) 5521static void gfx_v8_0_unset_safe_mode(struct amdgpu_device *adev)
5631{ 5522{
5632 u32 data = 0; 5523 uint32_t data;
5633 unsigned i; 5524 unsigned i;
5634 5525
5635 data = RREG32(mmRLC_CNTL); 5526 data = RREG32(mmRLC_CNTL);
5636 if (!(data & RLC_CNTL__RLC_ENABLE_F32_MASK)) 5527 data |= RLC_SAFE_MODE__CMD_MASK;
5637 return; 5528 data &= ~RLC_SAFE_MODE__MESSAGE_MASK;
5638 5529 WREG32(mmRLC_SAFE_MODE, data);
5639 if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG)) {
5640 if (adev->gfx.rlc.in_safe_mode) {
5641 data |= RLC_SAFE_MODE__CMD_MASK;
5642 data &= ~RLC_SAFE_MODE__MESSAGE_MASK;
5643 WREG32(mmRLC_SAFE_MODE, data);
5644 adev->gfx.rlc.in_safe_mode = false;
5645 }
5646 }
5647 5530
5648 for (i = 0; i < adev->usec_timeout; i++) { 5531 for (i = 0; i < adev->usec_timeout; i++) {
5649 if (!REG_GET_FIELD(RREG32(mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD)) 5532 if (!REG_GET_FIELD(RREG32(mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD))
@@ -5653,8 +5536,17 @@ static void iceland_exit_rlc_safe_mode(struct amdgpu_device *adev)
5653} 5536}
5654 5537
5655static const struct amdgpu_rlc_funcs iceland_rlc_funcs = { 5538static const struct amdgpu_rlc_funcs iceland_rlc_funcs = {
5656 .enter_safe_mode = iceland_enter_rlc_safe_mode, 5539 .is_rlc_enabled = gfx_v8_0_is_rlc_enabled,
5657 .exit_safe_mode = iceland_exit_rlc_safe_mode 5540 .set_safe_mode = gfx_v8_0_set_safe_mode,
5541 .unset_safe_mode = gfx_v8_0_unset_safe_mode,
5542 .init = gfx_v8_0_rlc_init,
5543 .get_csb_size = gfx_v8_0_get_csb_size,
5544 .get_csb_buffer = gfx_v8_0_get_csb_buffer,
5545 .get_cp_table_num = gfx_v8_0_cp_jump_table_num,
5546 .resume = gfx_v8_0_rlc_resume,
5547 .stop = gfx_v8_0_rlc_stop,
5548 .reset = gfx_v8_0_rlc_reset,
5549 .start = gfx_v8_0_rlc_start
5658}; 5550};
5659 5551
5660static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev, 5552static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
@@ -5662,7 +5554,7 @@ static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev
5662{ 5554{
5663 uint32_t temp, data; 5555 uint32_t temp, data;
5664 5556
5665 adev->gfx.rlc.funcs->enter_safe_mode(adev); 5557 amdgpu_gfx_rlc_enter_safe_mode(adev);
5666 5558
5667 /* It is disabled by HW by default */ 5559 /* It is disabled by HW by default */
5668 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) { 5560 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) {
@@ -5758,7 +5650,7 @@ static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev
5758 gfx_v8_0_wait_for_rlc_serdes(adev); 5650 gfx_v8_0_wait_for_rlc_serdes(adev);
5759 } 5651 }
5760 5652
5761 adev->gfx.rlc.funcs->exit_safe_mode(adev); 5653 amdgpu_gfx_rlc_exit_safe_mode(adev);
5762} 5654}
5763 5655
5764static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev, 5656static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev,
@@ -5768,7 +5660,7 @@ static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev
5768 5660
5769 temp = data = RREG32(mmRLC_CGCG_CGLS_CTRL); 5661 temp = data = RREG32(mmRLC_CGCG_CGLS_CTRL);
5770 5662
5771 adev->gfx.rlc.funcs->enter_safe_mode(adev); 5663 amdgpu_gfx_rlc_enter_safe_mode(adev);
5772 5664
5773 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) { 5665 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {
5774 temp1 = data1 = RREG32(mmRLC_CGTT_MGCG_OVERRIDE); 5666 temp1 = data1 = RREG32(mmRLC_CGTT_MGCG_OVERRIDE);
@@ -5851,7 +5743,7 @@ static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev
5851 5743
5852 gfx_v8_0_wait_for_rlc_serdes(adev); 5744 gfx_v8_0_wait_for_rlc_serdes(adev);
5853 5745
5854 adev->gfx.rlc.funcs->exit_safe_mode(adev); 5746 amdgpu_gfx_rlc_exit_safe_mode(adev);
5855} 5747}
5856static int gfx_v8_0_update_gfx_clock_gating(struct amdgpu_device *adev, 5748static int gfx_v8_0_update_gfx_clock_gating(struct amdgpu_device *adev,
5857 bool enable) 5749 bool enable)
@@ -6131,9 +6023,11 @@ static void gfx_v8_0_ring_emit_vgt_flush(struct amdgpu_ring *ring)
6131} 6023}
6132 6024
6133static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, 6025static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
6134 struct amdgpu_ib *ib, 6026 struct amdgpu_job *job,
6135 unsigned vmid, bool ctx_switch) 6027 struct amdgpu_ib *ib,
6028 bool ctx_switch)
6136{ 6029{
6030 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
6137 u32 header, control = 0; 6031 u32 header, control = 0;
6138 6032
6139 if (ib->flags & AMDGPU_IB_FLAG_CE) 6033 if (ib->flags & AMDGPU_IB_FLAG_CE)
@@ -6161,9 +6055,11 @@ static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
6161} 6055}
6162 6056
6163static void gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring *ring, 6057static void gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
6058 struct amdgpu_job *job,
6164 struct amdgpu_ib *ib, 6059 struct amdgpu_ib *ib,
6165 unsigned vmid, bool ctx_switch) 6060 bool ctx_switch)
6166{ 6061{
6062 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
6167 u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24); 6063 u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24);
6168 6064
6169 amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); 6065 amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
@@ -6738,12 +6634,39 @@ static int gfx_v8_0_eop_irq(struct amdgpu_device *adev,
6738 return 0; 6634 return 0;
6739} 6635}
6740 6636
6637static void gfx_v8_0_fault(struct amdgpu_device *adev,
6638 struct amdgpu_iv_entry *entry)
6639{
6640 u8 me_id, pipe_id, queue_id;
6641 struct amdgpu_ring *ring;
6642 int i;
6643
6644 me_id = (entry->ring_id & 0x0c) >> 2;
6645 pipe_id = (entry->ring_id & 0x03) >> 0;
6646 queue_id = (entry->ring_id & 0x70) >> 4;
6647
6648 switch (me_id) {
6649 case 0:
6650 drm_sched_fault(&adev->gfx.gfx_ring[0].sched);
6651 break;
6652 case 1:
6653 case 2:
6654 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
6655 ring = &adev->gfx.compute_ring[i];
6656 if (ring->me == me_id && ring->pipe == pipe_id &&
6657 ring->queue == queue_id)
6658 drm_sched_fault(&ring->sched);
6659 }
6660 break;
6661 }
6662}
6663
6741static int gfx_v8_0_priv_reg_irq(struct amdgpu_device *adev, 6664static int gfx_v8_0_priv_reg_irq(struct amdgpu_device *adev,
6742 struct amdgpu_irq_src *source, 6665 struct amdgpu_irq_src *source,
6743 struct amdgpu_iv_entry *entry) 6666 struct amdgpu_iv_entry *entry)
6744{ 6667{
6745 DRM_ERROR("Illegal register access in command stream\n"); 6668 DRM_ERROR("Illegal register access in command stream\n");
6746 schedule_work(&adev->reset_work); 6669 gfx_v8_0_fault(adev, entry);
6747 return 0; 6670 return 0;
6748} 6671}
6749 6672
@@ -6752,7 +6675,7 @@ static int gfx_v8_0_priv_inst_irq(struct amdgpu_device *adev,
6752 struct amdgpu_iv_entry *entry) 6675 struct amdgpu_iv_entry *entry)
6753{ 6676{
6754 DRM_ERROR("Illegal instruction in command stream\n"); 6677 DRM_ERROR("Illegal instruction in command stream\n");
6755 schedule_work(&adev->reset_work); 6678 gfx_v8_0_fault(adev, entry);
6756 return 0; 6679 return 0;
6757} 6680}
6758 6681
@@ -6976,10 +6899,8 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_kiq = {
6976 17 + /* gfx_v8_0_ring_emit_vm_flush */ 6899 17 + /* gfx_v8_0_ring_emit_vm_flush */
6977 7 + 7 + 7, /* gfx_v8_0_ring_emit_fence_kiq x3 for user fence, vm fence */ 6900 7 + 7 + 7, /* gfx_v8_0_ring_emit_fence_kiq x3 for user fence, vm fence */
6978 .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_compute */ 6901 .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_compute */
6979 .emit_ib = gfx_v8_0_ring_emit_ib_compute,
6980 .emit_fence = gfx_v8_0_ring_emit_fence_kiq, 6902 .emit_fence = gfx_v8_0_ring_emit_fence_kiq,
6981 .test_ring = gfx_v8_0_ring_test_ring, 6903 .test_ring = gfx_v8_0_ring_test_ring,
6982 .test_ib = gfx_v8_0_ring_test_ib,
6983 .insert_nop = amdgpu_ring_insert_nop, 6904 .insert_nop = amdgpu_ring_insert_nop,
6984 .pad_ib = amdgpu_ring_generic_pad_ib, 6905 .pad_ib = amdgpu_ring_generic_pad_ib,
6985 .emit_rreg = gfx_v8_0_ring_emit_rreg, 6906 .emit_rreg = gfx_v8_0_ring_emit_rreg,
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
index 6d7baf59d6e1..c27caa144c57 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
@@ -41,7 +41,7 @@
41#include "ivsrcid/gfx/irqsrcs_gfx_9_0.h" 41#include "ivsrcid/gfx/irqsrcs_gfx_9_0.h"
42 42
43#define GFX9_NUM_GFX_RINGS 1 43#define GFX9_NUM_GFX_RINGS 1
44#define GFX9_MEC_HPD_SIZE 2048 44#define GFX9_MEC_HPD_SIZE 4096
45#define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L 45#define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L
46#define RLC_SAVE_RESTORE_ADDR_STARTING_OFFSET 0x00000000L 46#define RLC_SAVE_RESTORE_ADDR_STARTING_OFFSET 0x00000000L
47 47
@@ -396,18 +396,14 @@ static int gfx_v9_0_ring_test_ring(struct amdgpu_ring *ring)
396 int r; 396 int r;
397 397
398 r = amdgpu_gfx_scratch_get(adev, &scratch); 398 r = amdgpu_gfx_scratch_get(adev, &scratch);
399 if (r) { 399 if (r)
400 DRM_ERROR("amdgpu: cp failed to get scratch reg (%d).\n", r);
401 return r; 400 return r;
402 } 401
403 WREG32(scratch, 0xCAFEDEAD); 402 WREG32(scratch, 0xCAFEDEAD);
404 r = amdgpu_ring_alloc(ring, 3); 403 r = amdgpu_ring_alloc(ring, 3);
405 if (r) { 404 if (r)
406 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n", 405 goto error_free_scratch;
407 ring->idx, r); 406
408 amdgpu_gfx_scratch_free(adev, scratch);
409 return r;
410 }
411 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1)); 407 amdgpu_ring_write(ring, PACKET3(PACKET3_SET_UCONFIG_REG, 1));
412 amdgpu_ring_write(ring, (scratch - PACKET3_SET_UCONFIG_REG_START)); 408 amdgpu_ring_write(ring, (scratch - PACKET3_SET_UCONFIG_REG_START));
413 amdgpu_ring_write(ring, 0xDEADBEEF); 409 amdgpu_ring_write(ring, 0xDEADBEEF);
@@ -419,14 +415,11 @@ static int gfx_v9_0_ring_test_ring(struct amdgpu_ring *ring)
419 break; 415 break;
420 DRM_UDELAY(1); 416 DRM_UDELAY(1);
421 } 417 }
422 if (i < adev->usec_timeout) { 418
423 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", 419 if (i >= adev->usec_timeout)
424 ring->idx, i); 420 r = -ETIMEDOUT;
425 } else { 421
426 DRM_ERROR("amdgpu: ring %d test failed (scratch(0x%04X)=0x%08X)\n", 422error_free_scratch:
427 ring->idx, scratch, tmp);
428 r = -EINVAL;
429 }
430 amdgpu_gfx_scratch_free(adev, scratch); 423 amdgpu_gfx_scratch_free(adev, scratch);
431 return r; 424 return r;
432} 425}
@@ -443,19 +436,16 @@ static int gfx_v9_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
443 long r; 436 long r;
444 437
445 r = amdgpu_device_wb_get(adev, &index); 438 r = amdgpu_device_wb_get(adev, &index);
446 if (r) { 439 if (r)
447 dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
448 return r; 440 return r;
449 }
450 441
451 gpu_addr = adev->wb.gpu_addr + (index * 4); 442 gpu_addr = adev->wb.gpu_addr + (index * 4);
452 adev->wb.wb[index] = cpu_to_le32(0xCAFEDEAD); 443 adev->wb.wb[index] = cpu_to_le32(0xCAFEDEAD);
453 memset(&ib, 0, sizeof(ib)); 444 memset(&ib, 0, sizeof(ib));
454 r = amdgpu_ib_get(adev, NULL, 16, &ib); 445 r = amdgpu_ib_get(adev, NULL, 16, &ib);
455 if (r) { 446 if (r)
456 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
457 goto err1; 447 goto err1;
458 } 448
459 ib.ptr[0] = PACKET3(PACKET3_WRITE_DATA, 3); 449 ib.ptr[0] = PACKET3(PACKET3_WRITE_DATA, 3);
460 ib.ptr[1] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM; 450 ib.ptr[1] = WRITE_DATA_DST_SEL(5) | WR_CONFIRM;
461 ib.ptr[2] = lower_32_bits(gpu_addr); 451 ib.ptr[2] = lower_32_bits(gpu_addr);
@@ -469,22 +459,17 @@ static int gfx_v9_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
469 459
470 r = dma_fence_wait_timeout(f, false, timeout); 460 r = dma_fence_wait_timeout(f, false, timeout);
471 if (r == 0) { 461 if (r == 0) {
472 DRM_ERROR("amdgpu: IB test timed out.\n"); 462 r = -ETIMEDOUT;
473 r = -ETIMEDOUT; 463 goto err2;
474 goto err2;
475 } else if (r < 0) { 464 } else if (r < 0) {
476 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r); 465 goto err2;
477 goto err2;
478 } 466 }
479 467
480 tmp = adev->wb.wb[index]; 468 tmp = adev->wb.wb[index];
481 if (tmp == 0xDEADBEEF) { 469 if (tmp == 0xDEADBEEF)
482 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx); 470 r = 0;
483 r = 0; 471 else
484 } else { 472 r = -EINVAL;
485 DRM_ERROR("ib test on ring %d failed\n", ring->idx);
486 r = -EINVAL;
487 }
488 473
489err2: 474err2:
490 amdgpu_ib_free(adev, &ib, NULL); 475 amdgpu_ib_free(adev, &ib, NULL);
@@ -1065,85 +1050,13 @@ static void gfx_v9_0_enable_lbpw(struct amdgpu_device *adev, bool enable)
1065 WREG32_FIELD15(GC, 0, RLC_LB_CNTL, LOAD_BALANCE_ENABLE, enable ? 1 : 0); 1050 WREG32_FIELD15(GC, 0, RLC_LB_CNTL, LOAD_BALANCE_ENABLE, enable ? 1 : 0);
1066} 1051}
1067 1052
1068static void rv_init_cp_jump_table(struct amdgpu_device *adev) 1053static int gfx_v9_0_cp_jump_table_num(struct amdgpu_device *adev)
1069{
1070 const __le32 *fw_data;
1071 volatile u32 *dst_ptr;
1072 int me, i, max_me = 5;
1073 u32 bo_offset = 0;
1074 u32 table_offset, table_size;
1075
1076 /* write the cp table buffer */
1077 dst_ptr = adev->gfx.rlc.cp_table_ptr;
1078 for (me = 0; me < max_me; me++) {
1079 if (me == 0) {
1080 const struct gfx_firmware_header_v1_0 *hdr =
1081 (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data;
1082 fw_data = (const __le32 *)
1083 (adev->gfx.ce_fw->data +
1084 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1085 table_offset = le32_to_cpu(hdr->jt_offset);
1086 table_size = le32_to_cpu(hdr->jt_size);
1087 } else if (me == 1) {
1088 const struct gfx_firmware_header_v1_0 *hdr =
1089 (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data;
1090 fw_data = (const __le32 *)
1091 (adev->gfx.pfp_fw->data +
1092 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1093 table_offset = le32_to_cpu(hdr->jt_offset);
1094 table_size = le32_to_cpu(hdr->jt_size);
1095 } else if (me == 2) {
1096 const struct gfx_firmware_header_v1_0 *hdr =
1097 (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
1098 fw_data = (const __le32 *)
1099 (adev->gfx.me_fw->data +
1100 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1101 table_offset = le32_to_cpu(hdr->jt_offset);
1102 table_size = le32_to_cpu(hdr->jt_size);
1103 } else if (me == 3) {
1104 const struct gfx_firmware_header_v1_0 *hdr =
1105 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
1106 fw_data = (const __le32 *)
1107 (adev->gfx.mec_fw->data +
1108 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1109 table_offset = le32_to_cpu(hdr->jt_offset);
1110 table_size = le32_to_cpu(hdr->jt_size);
1111 } else if (me == 4) {
1112 const struct gfx_firmware_header_v1_0 *hdr =
1113 (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data;
1114 fw_data = (const __le32 *)
1115 (adev->gfx.mec2_fw->data +
1116 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
1117 table_offset = le32_to_cpu(hdr->jt_offset);
1118 table_size = le32_to_cpu(hdr->jt_size);
1119 }
1120
1121 for (i = 0; i < table_size; i ++) {
1122 dst_ptr[bo_offset + i] =
1123 cpu_to_le32(le32_to_cpu(fw_data[table_offset + i]));
1124 }
1125
1126 bo_offset += table_size;
1127 }
1128}
1129
1130static void gfx_v9_0_rlc_fini(struct amdgpu_device *adev)
1131{ 1054{
1132 /* clear state block */ 1055 return 5;
1133 amdgpu_bo_free_kernel(&adev->gfx.rlc.clear_state_obj,
1134 &adev->gfx.rlc.clear_state_gpu_addr,
1135 (void **)&adev->gfx.rlc.cs_ptr);
1136
1137 /* jump table block */
1138 amdgpu_bo_free_kernel(&adev->gfx.rlc.cp_table_obj,
1139 &adev->gfx.rlc.cp_table_gpu_addr,
1140 (void **)&adev->gfx.rlc.cp_table_ptr);
1141} 1056}
1142 1057
1143static int gfx_v9_0_rlc_init(struct amdgpu_device *adev) 1058static int gfx_v9_0_rlc_init(struct amdgpu_device *adev)
1144{ 1059{
1145 volatile u32 *dst_ptr;
1146 u32 dws;
1147 const struct cs_section_def *cs_data; 1060 const struct cs_section_def *cs_data;
1148 int r; 1061 int r;
1149 1062
@@ -1152,45 +1065,18 @@ static int gfx_v9_0_rlc_init(struct amdgpu_device *adev)
1152 cs_data = adev->gfx.rlc.cs_data; 1065 cs_data = adev->gfx.rlc.cs_data;
1153 1066
1154 if (cs_data) { 1067 if (cs_data) {
1155 /* clear state block */ 1068 /* init clear state block */
1156 adev->gfx.rlc.clear_state_size = dws = gfx_v9_0_get_csb_size(adev); 1069 r = amdgpu_gfx_rlc_init_csb(adev);
1157 r = amdgpu_bo_create_reserved(adev, dws * 4, PAGE_SIZE, 1070 if (r)
1158 AMDGPU_GEM_DOMAIN_VRAM,
1159 &adev->gfx.rlc.clear_state_obj,
1160 &adev->gfx.rlc.clear_state_gpu_addr,
1161 (void **)&adev->gfx.rlc.cs_ptr);
1162 if (r) {
1163 dev_err(adev->dev, "(%d) failed to create rlc csb bo\n",
1164 r);
1165 gfx_v9_0_rlc_fini(adev);
1166 return r; 1071 return r;
1167 }
1168 /* set up the cs buffer */
1169 dst_ptr = adev->gfx.rlc.cs_ptr;
1170 gfx_v9_0_get_csb_buffer(adev, dst_ptr);
1171 amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj);
1172 amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
1173 amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
1174 } 1072 }
1175 1073
1176 if (adev->asic_type == CHIP_RAVEN) { 1074 if (adev->asic_type == CHIP_RAVEN) {
1177 /* TODO: double check the cp_table_size for RV */ 1075 /* TODO: double check the cp_table_size for RV */
1178 adev->gfx.rlc.cp_table_size = ALIGN(96 * 5 * 4, 2048) + (64 * 1024); /* JT + GDS */ 1076 adev->gfx.rlc.cp_table_size = ALIGN(96 * 5 * 4, 2048) + (64 * 1024); /* JT + GDS */
1179 r = amdgpu_bo_create_reserved(adev, adev->gfx.rlc.cp_table_size, 1077 r = amdgpu_gfx_rlc_init_cpt(adev);
1180 PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM, 1078 if (r)
1181 &adev->gfx.rlc.cp_table_obj,
1182 &adev->gfx.rlc.cp_table_gpu_addr,
1183 (void **)&adev->gfx.rlc.cp_table_ptr);
1184 if (r) {
1185 dev_err(adev->dev,
1186 "(%d) failed to create cp table bo\n", r);
1187 gfx_v9_0_rlc_fini(adev);
1188 return r; 1079 return r;
1189 }
1190
1191 rv_init_cp_jump_table(adev);
1192 amdgpu_bo_kunmap(adev->gfx.rlc.cp_table_obj);
1193 amdgpu_bo_unreserve(adev->gfx.rlc.cp_table_obj);
1194 } 1080 }
1195 1081
1196 switch (adev->asic_type) { 1082 switch (adev->asic_type) {
@@ -1264,7 +1150,7 @@ static int gfx_v9_0_mec_init(struct amdgpu_device *adev)
1264 mec_hpd_size = adev->gfx.num_compute_rings * GFX9_MEC_HPD_SIZE; 1150 mec_hpd_size = adev->gfx.num_compute_rings * GFX9_MEC_HPD_SIZE;
1265 1151
1266 r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE, 1152 r = amdgpu_bo_create_reserved(adev, mec_hpd_size, PAGE_SIZE,
1267 AMDGPU_GEM_DOMAIN_GTT, 1153 AMDGPU_GEM_DOMAIN_VRAM,
1268 &adev->gfx.mec.hpd_eop_obj, 1154 &adev->gfx.mec.hpd_eop_obj,
1269 &adev->gfx.mec.hpd_eop_gpu_addr, 1155 &adev->gfx.mec.hpd_eop_gpu_addr,
1270 (void **)&hpd); 1156 (void **)&hpd);
@@ -1635,8 +1521,8 @@ static int gfx_v9_0_ngg_en(struct amdgpu_device *adev)
1635 /* Clear GDS reserved memory */ 1521 /* Clear GDS reserved memory */
1636 r = amdgpu_ring_alloc(ring, 17); 1522 r = amdgpu_ring_alloc(ring, 17);
1637 if (r) { 1523 if (r) {
1638 DRM_ERROR("amdgpu: NGG failed to lock ring %d (%d).\n", 1524 DRM_ERROR("amdgpu: NGG failed to lock ring %s (%d).\n",
1639 ring->idx, r); 1525 ring->name, r);
1640 return r; 1526 return r;
1641 } 1527 }
1642 1528
@@ -1748,7 +1634,7 @@ static int gfx_v9_0_sw_init(void *handle)
1748 return r; 1634 return r;
1749 } 1635 }
1750 1636
1751 r = gfx_v9_0_rlc_init(adev); 1637 r = adev->gfx.rlc.funcs->init(adev);
1752 if (r) { 1638 if (r) {
1753 DRM_ERROR("Failed to init rlc BOs!\n"); 1639 DRM_ERROR("Failed to init rlc BOs!\n");
1754 return r; 1640 return r;
@@ -2498,12 +2384,12 @@ static int gfx_v9_0_rlc_resume(struct amdgpu_device *adev)
2498 return 0; 2384 return 0;
2499 } 2385 }
2500 2386
2501 gfx_v9_0_rlc_stop(adev); 2387 adev->gfx.rlc.funcs->stop(adev);
2502 2388
2503 /* disable CG */ 2389 /* disable CG */
2504 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, 0); 2390 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, 0);
2505 2391
2506 gfx_v9_0_rlc_reset(adev); 2392 adev->gfx.rlc.funcs->reset(adev);
2507 2393
2508 gfx_v9_0_init_pg(adev); 2394 gfx_v9_0_init_pg(adev);
2509 2395
@@ -2514,15 +2400,24 @@ static int gfx_v9_0_rlc_resume(struct amdgpu_device *adev)
2514 return r; 2400 return r;
2515 } 2401 }
2516 2402
2517 if (adev->asic_type == CHIP_RAVEN || 2403 switch (adev->asic_type) {
2518 adev->asic_type == CHIP_VEGA20) { 2404 case CHIP_RAVEN:
2519 if (amdgpu_lbpw != 0) 2405 if (amdgpu_lbpw == 0)
2406 gfx_v9_0_enable_lbpw(adev, false);
2407 else
2408 gfx_v9_0_enable_lbpw(adev, true);
2409 break;
2410 case CHIP_VEGA20:
2411 if (amdgpu_lbpw > 0)
2520 gfx_v9_0_enable_lbpw(adev, true); 2412 gfx_v9_0_enable_lbpw(adev, true);
2521 else 2413 else
2522 gfx_v9_0_enable_lbpw(adev, false); 2414 gfx_v9_0_enable_lbpw(adev, false);
2415 break;
2416 default:
2417 break;
2523 } 2418 }
2524 2419
2525 gfx_v9_0_rlc_start(adev); 2420 adev->gfx.rlc.funcs->start(adev);
2526 2421
2527 return 0; 2422 return 0;
2528} 2423}
@@ -2537,7 +2432,7 @@ static void gfx_v9_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)
2537 tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, enable ? 0 : 1); 2432 tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, enable ? 0 : 1);
2538 if (!enable) { 2433 if (!enable) {
2539 for (i = 0; i < adev->gfx.num_gfx_rings; i++) 2434 for (i = 0; i < adev->gfx.num_gfx_rings; i++)
2540 adev->gfx.gfx_ring[i].ready = false; 2435 adev->gfx.gfx_ring[i].sched.ready = false;
2541 } 2436 }
2542 WREG32_SOC15(GC, 0, mmCP_ME_CNTL, tmp); 2437 WREG32_SOC15(GC, 0, mmCP_ME_CNTL, tmp);
2543 udelay(50); 2438 udelay(50);
@@ -2727,7 +2622,7 @@ static int gfx_v9_0_cp_gfx_resume(struct amdgpu_device *adev)
2727 2622
2728 /* start the ring */ 2623 /* start the ring */
2729 gfx_v9_0_cp_gfx_start(adev); 2624 gfx_v9_0_cp_gfx_start(adev);
2730 ring->ready = true; 2625 ring->sched.ready = true;
2731 2626
2732 return 0; 2627 return 0;
2733} 2628}
@@ -2742,8 +2637,8 @@ static void gfx_v9_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)
2742 WREG32_SOC15(GC, 0, mmCP_MEC_CNTL, 2637 WREG32_SOC15(GC, 0, mmCP_MEC_CNTL,
2743 (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); 2638 (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK));
2744 for (i = 0; i < adev->gfx.num_compute_rings; i++) 2639 for (i = 0; i < adev->gfx.num_compute_rings; i++)
2745 adev->gfx.compute_ring[i].ready = false; 2640 adev->gfx.compute_ring[i].sched.ready = false;
2746 adev->gfx.kiq.ring.ready = false; 2641 adev->gfx.kiq.ring.sched.ready = false;
2747 } 2642 }
2748 udelay(50); 2643 udelay(50);
2749} 2644}
@@ -2866,11 +2761,9 @@ static int gfx_v9_0_kiq_kcq_enable(struct amdgpu_device *adev)
2866 amdgpu_ring_write(kiq_ring, upper_32_bits(wptr_addr)); 2761 amdgpu_ring_write(kiq_ring, upper_32_bits(wptr_addr));
2867 } 2762 }
2868 2763
2869 r = amdgpu_ring_test_ring(kiq_ring); 2764 r = amdgpu_ring_test_helper(kiq_ring);
2870 if (r) { 2765 if (r)
2871 DRM_ERROR("KCQ enable failed\n"); 2766 DRM_ERROR("KCQ enable failed\n");
2872 kiq_ring->ready = false;
2873 }
2874 2767
2875 return r; 2768 return r;
2876} 2769}
@@ -3249,7 +3142,7 @@ static int gfx_v9_0_kiq_resume(struct amdgpu_device *adev)
3249 amdgpu_bo_kunmap(ring->mqd_obj); 3142 amdgpu_bo_kunmap(ring->mqd_obj);
3250 ring->mqd_ptr = NULL; 3143 ring->mqd_ptr = NULL;
3251 amdgpu_bo_unreserve(ring->mqd_obj); 3144 amdgpu_bo_unreserve(ring->mqd_obj);
3252 ring->ready = true; 3145 ring->sched.ready = true;
3253 return 0; 3146 return 0;
3254} 3147}
3255 3148
@@ -3314,19 +3207,13 @@ static int gfx_v9_0_cp_resume(struct amdgpu_device *adev)
3314 return r; 3207 return r;
3315 3208
3316 ring = &adev->gfx.gfx_ring[0]; 3209 ring = &adev->gfx.gfx_ring[0];
3317 r = amdgpu_ring_test_ring(ring); 3210 r = amdgpu_ring_test_helper(ring);
3318 if (r) { 3211 if (r)
3319 ring->ready = false;
3320 return r; 3212 return r;
3321 }
3322 3213
3323 for (i = 0; i < adev->gfx.num_compute_rings; i++) { 3214 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
3324 ring = &adev->gfx.compute_ring[i]; 3215 ring = &adev->gfx.compute_ring[i];
3325 3216 amdgpu_ring_test_helper(ring);
3326 ring->ready = true;
3327 r = amdgpu_ring_test_ring(ring);
3328 if (r)
3329 ring->ready = false;
3330 } 3217 }
3331 3218
3332 gfx_v9_0_enable_gui_idle_interrupt(adev, true); 3219 gfx_v9_0_enable_gui_idle_interrupt(adev, true);
@@ -3353,7 +3240,7 @@ static int gfx_v9_0_hw_init(void *handle)
3353 if (r) 3240 if (r)
3354 return r; 3241 return r;
3355 3242
3356 r = gfx_v9_0_rlc_resume(adev); 3243 r = adev->gfx.rlc.funcs->resume(adev);
3357 if (r) 3244 if (r)
3358 return r; 3245 return r;
3359 3246
@@ -3391,7 +3278,7 @@ static int gfx_v9_0_kcq_disable(struct amdgpu_device *adev)
3391 amdgpu_ring_write(kiq_ring, 0); 3278 amdgpu_ring_write(kiq_ring, 0);
3392 amdgpu_ring_write(kiq_ring, 0); 3279 amdgpu_ring_write(kiq_ring, 0);
3393 } 3280 }
3394 r = amdgpu_ring_test_ring(kiq_ring); 3281 r = amdgpu_ring_test_helper(kiq_ring);
3395 if (r) 3282 if (r)
3396 DRM_ERROR("KCQ disable failed\n"); 3283 DRM_ERROR("KCQ disable failed\n");
3397 3284
@@ -3433,7 +3320,7 @@ static int gfx_v9_0_hw_fini(void *handle)
3433 } 3320 }
3434 3321
3435 gfx_v9_0_cp_enable(adev, false); 3322 gfx_v9_0_cp_enable(adev, false);
3436 gfx_v9_0_rlc_stop(adev); 3323 adev->gfx.rlc.funcs->stop(adev);
3437 3324
3438 gfx_v9_0_csb_vram_unpin(adev); 3325 gfx_v9_0_csb_vram_unpin(adev);
3439 3326
@@ -3508,7 +3395,7 @@ static int gfx_v9_0_soft_reset(void *handle)
3508 3395
3509 if (grbm_soft_reset) { 3396 if (grbm_soft_reset) {
3510 /* stop the rlc */ 3397 /* stop the rlc */
3511 gfx_v9_0_rlc_stop(adev); 3398 adev->gfx.rlc.funcs->stop(adev);
3512 3399
3513 /* Disable GFX parsing/prefetching */ 3400 /* Disable GFX parsing/prefetching */
3514 gfx_v9_0_cp_gfx_enable(adev, false); 3401 gfx_v9_0_cp_gfx_enable(adev, false);
@@ -3607,64 +3494,47 @@ static int gfx_v9_0_late_init(void *handle)
3607 return 0; 3494 return 0;
3608} 3495}
3609 3496
3610static void gfx_v9_0_enter_rlc_safe_mode(struct amdgpu_device *adev) 3497static bool gfx_v9_0_is_rlc_enabled(struct amdgpu_device *adev)
3611{ 3498{
3612 uint32_t rlc_setting, data; 3499 uint32_t rlc_setting;
3613 unsigned i;
3614
3615 if (adev->gfx.rlc.in_safe_mode)
3616 return;
3617 3500
3618 /* if RLC is not enabled, do nothing */ 3501 /* if RLC is not enabled, do nothing */
3619 rlc_setting = RREG32_SOC15(GC, 0, mmRLC_CNTL); 3502 rlc_setting = RREG32_SOC15(GC, 0, mmRLC_CNTL);
3620 if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK)) 3503 if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK))
3621 return; 3504 return false;
3622
3623 if (adev->cg_flags &
3624 (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG |
3625 AMD_CG_SUPPORT_GFX_3D_CGCG)) {
3626 data = RLC_SAFE_MODE__CMD_MASK;
3627 data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT);
3628 WREG32_SOC15(GC, 0, mmRLC_SAFE_MODE, data);
3629 3505
3630 /* wait for RLC_SAFE_MODE */ 3506 return true;
3631 for (i = 0; i < adev->usec_timeout; i++) {
3632 if (!REG_GET_FIELD(RREG32_SOC15(GC, 0, mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD))
3633 break;
3634 udelay(1);
3635 }
3636 adev->gfx.rlc.in_safe_mode = true;
3637 }
3638} 3507}
3639 3508
3640static void gfx_v9_0_exit_rlc_safe_mode(struct amdgpu_device *adev) 3509static void gfx_v9_0_set_safe_mode(struct amdgpu_device *adev)
3641{ 3510{
3642 uint32_t rlc_setting, data; 3511 uint32_t data;
3643 3512 unsigned i;
3644 if (!adev->gfx.rlc.in_safe_mode)
3645 return;
3646 3513
3647 /* if RLC is not enabled, do nothing */ 3514 data = RLC_SAFE_MODE__CMD_MASK;
3648 rlc_setting = RREG32_SOC15(GC, 0, mmRLC_CNTL); 3515 data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT);
3649 if (!(rlc_setting & RLC_CNTL__RLC_ENABLE_F32_MASK)) 3516 WREG32_SOC15(GC, 0, mmRLC_SAFE_MODE, data);
3650 return;
3651 3517
3652 if (adev->cg_flags & 3518 /* wait for RLC_SAFE_MODE */
3653 (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG)) { 3519 for (i = 0; i < adev->usec_timeout; i++) {
3654 /* 3520 if (!REG_GET_FIELD(RREG32_SOC15(GC, 0, mmRLC_SAFE_MODE), RLC_SAFE_MODE, CMD))
3655 * Try to exit safe mode only if it is already in safe 3521 break;
3656 * mode. 3522 udelay(1);
3657 */
3658 data = RLC_SAFE_MODE__CMD_MASK;
3659 WREG32_SOC15(GC, 0, mmRLC_SAFE_MODE, data);
3660 adev->gfx.rlc.in_safe_mode = false;
3661 } 3523 }
3662} 3524}
3663 3525
3526static void gfx_v9_0_unset_safe_mode(struct amdgpu_device *adev)
3527{
3528 uint32_t data;
3529
3530 data = RLC_SAFE_MODE__CMD_MASK;
3531 WREG32_SOC15(GC, 0, mmRLC_SAFE_MODE, data);
3532}
3533
3664static void gfx_v9_0_update_gfx_cg_power_gating(struct amdgpu_device *adev, 3534static void gfx_v9_0_update_gfx_cg_power_gating(struct amdgpu_device *adev,
3665 bool enable) 3535 bool enable)
3666{ 3536{
3667 gfx_v9_0_enter_rlc_safe_mode(adev); 3537 amdgpu_gfx_rlc_enter_safe_mode(adev);
3668 3538
3669 if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) && enable) { 3539 if ((adev->pg_flags & AMD_PG_SUPPORT_GFX_PG) && enable) {
3670 gfx_v9_0_enable_gfx_cg_power_gating(adev, true); 3540 gfx_v9_0_enable_gfx_cg_power_gating(adev, true);
@@ -3675,7 +3545,7 @@ static void gfx_v9_0_update_gfx_cg_power_gating(struct amdgpu_device *adev,
3675 gfx_v9_0_enable_gfx_pipeline_powergating(adev, false); 3545 gfx_v9_0_enable_gfx_pipeline_powergating(adev, false);
3676 } 3546 }
3677 3547
3678 gfx_v9_0_exit_rlc_safe_mode(adev); 3548 amdgpu_gfx_rlc_exit_safe_mode(adev);
3679} 3549}
3680 3550
3681static void gfx_v9_0_update_gfx_mg_power_gating(struct amdgpu_device *adev, 3551static void gfx_v9_0_update_gfx_mg_power_gating(struct amdgpu_device *adev,
@@ -3773,7 +3643,7 @@ static void gfx_v9_0_update_3d_clock_gating(struct amdgpu_device *adev,
3773{ 3643{
3774 uint32_t data, def; 3644 uint32_t data, def;
3775 3645
3776 adev->gfx.rlc.funcs->enter_safe_mode(adev); 3646 amdgpu_gfx_rlc_enter_safe_mode(adev);
3777 3647
3778 /* Enable 3D CGCG/CGLS */ 3648 /* Enable 3D CGCG/CGLS */
3779 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGCG)) { 3649 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_3D_CGCG)) {
@@ -3813,7 +3683,7 @@ static void gfx_v9_0_update_3d_clock_gating(struct amdgpu_device *adev,
3813 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D, data); 3683 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL_3D, data);
3814 } 3684 }
3815 3685
3816 adev->gfx.rlc.funcs->exit_safe_mode(adev); 3686 amdgpu_gfx_rlc_exit_safe_mode(adev);
3817} 3687}
3818 3688
3819static void gfx_v9_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev, 3689static void gfx_v9_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev,
@@ -3821,7 +3691,7 @@ static void gfx_v9_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev
3821{ 3691{
3822 uint32_t def, data; 3692 uint32_t def, data;
3823 3693
3824 adev->gfx.rlc.funcs->enter_safe_mode(adev); 3694 amdgpu_gfx_rlc_enter_safe_mode(adev);
3825 3695
3826 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) { 3696 if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {
3827 def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE); 3697 def = data = RREG32_SOC15(GC, 0, mmRLC_CGTT_MGCG_OVERRIDE);
@@ -3861,7 +3731,7 @@ static void gfx_v9_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev
3861 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, data); 3731 WREG32_SOC15(GC, 0, mmRLC_CGCG_CGLS_CTRL, data);
3862 } 3732 }
3863 3733
3864 adev->gfx.rlc.funcs->exit_safe_mode(adev); 3734 amdgpu_gfx_rlc_exit_safe_mode(adev);
3865} 3735}
3866 3736
3867static int gfx_v9_0_update_gfx_clock_gating(struct amdgpu_device *adev, 3737static int gfx_v9_0_update_gfx_clock_gating(struct amdgpu_device *adev,
@@ -3890,8 +3760,17 @@ static int gfx_v9_0_update_gfx_clock_gating(struct amdgpu_device *adev,
3890} 3760}
3891 3761
3892static const struct amdgpu_rlc_funcs gfx_v9_0_rlc_funcs = { 3762static const struct amdgpu_rlc_funcs gfx_v9_0_rlc_funcs = {
3893 .enter_safe_mode = gfx_v9_0_enter_rlc_safe_mode, 3763 .is_rlc_enabled = gfx_v9_0_is_rlc_enabled,
3894 .exit_safe_mode = gfx_v9_0_exit_rlc_safe_mode 3764 .set_safe_mode = gfx_v9_0_set_safe_mode,
3765 .unset_safe_mode = gfx_v9_0_unset_safe_mode,
3766 .init = gfx_v9_0_rlc_init,
3767 .get_csb_size = gfx_v9_0_get_csb_size,
3768 .get_csb_buffer = gfx_v9_0_get_csb_buffer,
3769 .get_cp_table_num = gfx_v9_0_cp_jump_table_num,
3770 .resume = gfx_v9_0_rlc_resume,
3771 .stop = gfx_v9_0_rlc_stop,
3772 .reset = gfx_v9_0_rlc_reset,
3773 .start = gfx_v9_0_rlc_start
3895}; 3774};
3896 3775
3897static int gfx_v9_0_set_powergating_state(void *handle, 3776static int gfx_v9_0_set_powergating_state(void *handle,
@@ -4072,9 +3951,11 @@ static void gfx_v9_0_ring_emit_hdp_flush(struct amdgpu_ring *ring)
4072} 3951}
4073 3952
4074static void gfx_v9_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, 3953static void gfx_v9_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
4075 struct amdgpu_ib *ib, 3954 struct amdgpu_job *job,
4076 unsigned vmid, bool ctx_switch) 3955 struct amdgpu_ib *ib,
3956 bool ctx_switch)
4077{ 3957{
3958 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
4078 u32 header, control = 0; 3959 u32 header, control = 0;
4079 3960
4080 if (ib->flags & AMDGPU_IB_FLAG_CE) 3961 if (ib->flags & AMDGPU_IB_FLAG_CE)
@@ -4103,20 +3984,22 @@ static void gfx_v9_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
4103} 3984}
4104 3985
4105static void gfx_v9_0_ring_emit_ib_compute(struct amdgpu_ring *ring, 3986static void gfx_v9_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
4106 struct amdgpu_ib *ib, 3987 struct amdgpu_job *job,
4107 unsigned vmid, bool ctx_switch) 3988 struct amdgpu_ib *ib,
3989 bool ctx_switch)
4108{ 3990{
4109 u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24); 3991 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
3992 u32 control = INDIRECT_BUFFER_VALID | ib->length_dw | (vmid << 24);
4110 3993
4111 amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2)); 3994 amdgpu_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
4112 BUG_ON(ib->gpu_addr & 0x3); /* Dword align */ 3995 BUG_ON(ib->gpu_addr & 0x3); /* Dword align */
4113 amdgpu_ring_write(ring, 3996 amdgpu_ring_write(ring,
4114#ifdef __BIG_ENDIAN 3997#ifdef __BIG_ENDIAN
4115 (2 << 0) | 3998 (2 << 0) |
4116#endif 3999#endif
4117 lower_32_bits(ib->gpu_addr)); 4000 lower_32_bits(ib->gpu_addr));
4118 amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr)); 4001 amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));
4119 amdgpu_ring_write(ring, control); 4002 amdgpu_ring_write(ring, control);
4120} 4003}
4121 4004
4122static void gfx_v9_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, 4005static void gfx_v9_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr,
@@ -4695,12 +4578,39 @@ static int gfx_v9_0_eop_irq(struct amdgpu_device *adev,
4695 return 0; 4578 return 0;
4696} 4579}
4697 4580
4581static void gfx_v9_0_fault(struct amdgpu_device *adev,
4582 struct amdgpu_iv_entry *entry)
4583{
4584 u8 me_id, pipe_id, queue_id;
4585 struct amdgpu_ring *ring;
4586 int i;
4587
4588 me_id = (entry->ring_id & 0x0c) >> 2;
4589 pipe_id = (entry->ring_id & 0x03) >> 0;
4590 queue_id = (entry->ring_id & 0x70) >> 4;
4591
4592 switch (me_id) {
4593 case 0:
4594 drm_sched_fault(&adev->gfx.gfx_ring[0].sched);
4595 break;
4596 case 1:
4597 case 2:
4598 for (i = 0; i < adev->gfx.num_compute_rings; i++) {
4599 ring = &adev->gfx.compute_ring[i];
4600 if (ring->me == me_id && ring->pipe == pipe_id &&
4601 ring->queue == queue_id)
4602 drm_sched_fault(&ring->sched);
4603 }
4604 break;
4605 }
4606}
4607
4698static int gfx_v9_0_priv_reg_irq(struct amdgpu_device *adev, 4608static int gfx_v9_0_priv_reg_irq(struct amdgpu_device *adev,
4699 struct amdgpu_irq_src *source, 4609 struct amdgpu_irq_src *source,
4700 struct amdgpu_iv_entry *entry) 4610 struct amdgpu_iv_entry *entry)
4701{ 4611{
4702 DRM_ERROR("Illegal register access in command stream\n"); 4612 DRM_ERROR("Illegal register access in command stream\n");
4703 schedule_work(&adev->reset_work); 4613 gfx_v9_0_fault(adev, entry);
4704 return 0; 4614 return 0;
4705} 4615}
4706 4616
@@ -4709,7 +4619,7 @@ static int gfx_v9_0_priv_inst_irq(struct amdgpu_device *adev,
4709 struct amdgpu_iv_entry *entry) 4619 struct amdgpu_iv_entry *entry)
4710{ 4620{
4711 DRM_ERROR("Illegal instruction in command stream\n"); 4621 DRM_ERROR("Illegal instruction in command stream\n");
4712 schedule_work(&adev->reset_work); 4622 gfx_v9_0_fault(adev, entry);
4713 return 0; 4623 return 0;
4714} 4624}
4715 4625
@@ -4836,10 +4746,8 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_kiq = {
4836 2 + /* gfx_v9_0_ring_emit_vm_flush */ 4746 2 + /* gfx_v9_0_ring_emit_vm_flush */
4837 8 + 8 + 8, /* gfx_v9_0_ring_emit_fence_kiq x3 for user fence, vm fence */ 4747 8 + 8 + 8, /* gfx_v9_0_ring_emit_fence_kiq x3 for user fence, vm fence */
4838 .emit_ib_size = 4, /* gfx_v9_0_ring_emit_ib_compute */ 4748 .emit_ib_size = 4, /* gfx_v9_0_ring_emit_ib_compute */
4839 .emit_ib = gfx_v9_0_ring_emit_ib_compute,
4840 .emit_fence = gfx_v9_0_ring_emit_fence_kiq, 4749 .emit_fence = gfx_v9_0_ring_emit_fence_kiq,
4841 .test_ring = gfx_v9_0_ring_test_ring, 4750 .test_ring = gfx_v9_0_ring_test_ring,
4842 .test_ib = gfx_v9_0_ring_test_ib,
4843 .insert_nop = amdgpu_ring_insert_nop, 4751 .insert_nop = amdgpu_ring_insert_nop,
4844 .pad_ib = amdgpu_ring_generic_pad_ib, 4752 .pad_ib = amdgpu_ring_generic_pad_ib,
4845 .emit_rreg = gfx_v9_0_ring_emit_rreg, 4753 .emit_rreg = gfx_v9_0_ring_emit_rreg,
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c
index ceb7847b504f..f5edddf3b29d 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c
@@ -35,20 +35,25 @@ u64 gfxhub_v1_0_get_mc_fb_offset(struct amdgpu_device *adev)
35 return (u64)RREG32_SOC15(GC, 0, mmMC_VM_FB_OFFSET) << 24; 35 return (u64)RREG32_SOC15(GC, 0, mmMC_VM_FB_OFFSET) << 24;
36} 36}
37 37
38static void gfxhub_v1_0_init_gart_pt_regs(struct amdgpu_device *adev) 38void gfxhub_v1_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,
39 uint64_t page_table_base)
39{ 40{
40 uint64_t value = amdgpu_gmc_pd_addr(adev->gart.bo); 41 /* two registers distance between mmVM_CONTEXT0_* to mmVM_CONTEXT1_* */
42 int offset = mmVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32
43 - mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32;
41 44
42 WREG32_SOC15(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, 45 WREG32_SOC15_OFFSET(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,
43 lower_32_bits(value)); 46 offset * vmid, lower_32_bits(page_table_base));
44 47
45 WREG32_SOC15(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, 48 WREG32_SOC15_OFFSET(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32,
46 upper_32_bits(value)); 49 offset * vmid, upper_32_bits(page_table_base));
47} 50}
48 51
49static void gfxhub_v1_0_init_gart_aperture_regs(struct amdgpu_device *adev) 52static void gfxhub_v1_0_init_gart_aperture_regs(struct amdgpu_device *adev)
50{ 53{
51 gfxhub_v1_0_init_gart_pt_regs(adev); 54 uint64_t pt_base = amdgpu_gmc_pd_addr(adev->gart.bo);
55
56 gfxhub_v1_0_setup_vm_pt_regs(adev, 0, pt_base);
52 57
53 WREG32_SOC15(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, 58 WREG32_SOC15(GC, 0, mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32,
54 (u32)(adev->gmc.gart_start >> 12)); 59 (u32)(adev->gmc.gart_start >> 12));
@@ -72,7 +77,7 @@ static void gfxhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)
72 77
73 /* Program the system aperture low logical page number. */ 78 /* Program the system aperture low logical page number. */
74 WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR, 79 WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR,
75 min(adev->gmc.vram_start, adev->gmc.agp_start) >> 18); 80 min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18);
76 81
77 if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8) 82 if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8)
78 /* 83 /*
@@ -82,11 +87,11 @@ static void gfxhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)
82 * to get rid of the VM fault and hardware hang. 87 * to get rid of the VM fault and hardware hang.
83 */ 88 */
84 WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 89 WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR,
85 max((adev->gmc.vram_end >> 18) + 0x1, 90 max((adev->gmc.fb_end >> 18) + 0x1,
86 adev->gmc.agp_end >> 18)); 91 adev->gmc.agp_end >> 18));
87 else 92 else
88 WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 93 WREG32_SOC15(GC, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR,
89 max(adev->gmc.vram_end, adev->gmc.agp_end) >> 18); 94 max(adev->gmc.fb_end, adev->gmc.agp_end) >> 18);
90 95
91 /* Set default page address. */ 96 /* Set default page address. */
92 value = adev->vram_scratch.gpu_addr - adev->gmc.vram_start 97 value = adev->vram_scratch.gpu_addr - adev->gmc.vram_start
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.h b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.h
index 206e29cad753..92d3a70cd9b1 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.h
+++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.h
@@ -30,5 +30,7 @@ void gfxhub_v1_0_set_fault_enable_default(struct amdgpu_device *adev,
30 bool value); 30 bool value);
31void gfxhub_v1_0_init(struct amdgpu_device *adev); 31void gfxhub_v1_0_init(struct amdgpu_device *adev);
32u64 gfxhub_v1_0_get_mc_fb_offset(struct amdgpu_device *adev); 32u64 gfxhub_v1_0_get_mc_fb_offset(struct amdgpu_device *adev);
33void gfxhub_v1_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,
34 uint64_t page_table_base);
33 35
34#endif 36#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
index e1c2b4e9c7b2..2821d1d846e4 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
@@ -358,7 +358,8 @@ static int gmc_v6_0_mc_init(struct amdgpu_device *adev)
358 return 0; 358 return 0;
359} 359}
360 360
361static void gmc_v6_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid) 361static void gmc_v6_0_flush_gpu_tlb(struct amdgpu_device *adev,
362 uint32_t vmid, uint32_t flush_type)
362{ 363{
363 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid); 364 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
364} 365}
@@ -580,7 +581,7 @@ static int gmc_v6_0_gart_enable(struct amdgpu_device *adev)
580 else 581 else
581 gmc_v6_0_set_fault_enable_default(adev, true); 582 gmc_v6_0_set_fault_enable_default(adev, true);
582 583
583 gmc_v6_0_flush_gpu_tlb(adev, 0); 584 gmc_v6_0_flush_gpu_tlb(adev, 0, 0);
584 dev_info(adev->dev, "PCIE GART of %uM enabled (table at 0x%016llX).\n", 585 dev_info(adev->dev, "PCIE GART of %uM enabled (table at 0x%016llX).\n",
585 (unsigned)(adev->gmc.gart_size >> 20), 586 (unsigned)(adev->gmc.gart_size >> 20),
586 (unsigned long long)table_addr); 587 (unsigned long long)table_addr);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index 910c4ce19cb3..761dcfb2fec0 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -430,7 +430,8 @@ static int gmc_v7_0_mc_init(struct amdgpu_device *adev)
430 * 430 *
431 * Flush the TLB for the requested page table (CIK). 431 * Flush the TLB for the requested page table (CIK).
432 */ 432 */
433static void gmc_v7_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid) 433static void gmc_v7_0_flush_gpu_tlb(struct amdgpu_device *adev,
434 uint32_t vmid, uint32_t flush_type)
434{ 435{
435 /* bits 0-15 are the VM contexts0-15 */ 436 /* bits 0-15 are the VM contexts0-15 */
436 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid); 437 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
@@ -698,7 +699,7 @@ static int gmc_v7_0_gart_enable(struct amdgpu_device *adev)
698 WREG32(mmCHUB_CONTROL, tmp); 699 WREG32(mmCHUB_CONTROL, tmp);
699 } 700 }
700 701
701 gmc_v7_0_flush_gpu_tlb(adev, 0); 702 gmc_v7_0_flush_gpu_tlb(adev, 0, 0);
702 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 703 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
703 (unsigned)(adev->gmc.gart_size >> 20), 704 (unsigned)(adev->gmc.gart_size >> 20),
704 (unsigned long long)table_addr); 705 (unsigned long long)table_addr);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 1d3265c97b70..531aaf377592 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -611,7 +611,7 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
611 * Flush the TLB for the requested page table (CIK). 611 * Flush the TLB for the requested page table (CIK).
612 */ 612 */
613static void gmc_v8_0_flush_gpu_tlb(struct amdgpu_device *adev, 613static void gmc_v8_0_flush_gpu_tlb(struct amdgpu_device *adev,
614 uint32_t vmid) 614 uint32_t vmid, uint32_t flush_type)
615{ 615{
616 /* bits 0-15 are the VM contexts0-15 */ 616 /* bits 0-15 are the VM contexts0-15 */
617 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid); 617 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
@@ -920,7 +920,7 @@ static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
920 else 920 else
921 gmc_v8_0_set_fault_enable_default(adev, true); 921 gmc_v8_0_set_fault_enable_default(adev, true);
922 922
923 gmc_v8_0_flush_gpu_tlb(adev, 0); 923 gmc_v8_0_flush_gpu_tlb(adev, 0, 0);
924 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 924 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
925 (unsigned)(adev->gmc.gart_size >> 20), 925 (unsigned)(adev->gmc.gart_size >> 20),
926 (unsigned long long)table_addr); 926 (unsigned long long)table_addr);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index f35d7a554ad5..811231e4ec53 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -293,14 +293,14 @@ static void gmc_v9_0_set_irq_funcs(struct amdgpu_device *adev)
293 adev->gmc.vm_fault.funcs = &gmc_v9_0_irq_funcs; 293 adev->gmc.vm_fault.funcs = &gmc_v9_0_irq_funcs;
294} 294}
295 295
296static uint32_t gmc_v9_0_get_invalidate_req(unsigned int vmid) 296static uint32_t gmc_v9_0_get_invalidate_req(unsigned int vmid,
297 uint32_t flush_type)
297{ 298{
298 u32 req = 0; 299 u32 req = 0;
299 300
300 /* invalidate using legacy mode on vmid*/
301 req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, 301 req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ,
302 PER_VMID_INVALIDATE_REQ, 1 << vmid); 302 PER_VMID_INVALIDATE_REQ, 1 << vmid);
303 req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, FLUSH_TYPE, 0); 303 req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, FLUSH_TYPE, flush_type);
304 req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PTES, 1); 304 req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PTES, 1);
305 req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE0, 1); 305 req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE0, 1);
306 req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE1, 1); 306 req = REG_SET_FIELD(req, VM_INVALIDATE_ENG0_REQ, INVALIDATE_L2_PDE1, 1);
@@ -312,48 +312,6 @@ static uint32_t gmc_v9_0_get_invalidate_req(unsigned int vmid)
312 return req; 312 return req;
313} 313}
314 314
315static signed long amdgpu_kiq_reg_write_reg_wait(struct amdgpu_device *adev,
316 uint32_t reg0, uint32_t reg1,
317 uint32_t ref, uint32_t mask)
318{
319 signed long r, cnt = 0;
320 unsigned long flags;
321 uint32_t seq;
322 struct amdgpu_kiq *kiq = &adev->gfx.kiq;
323 struct amdgpu_ring *ring = &kiq->ring;
324
325 spin_lock_irqsave(&kiq->ring_lock, flags);
326
327 amdgpu_ring_alloc(ring, 32);
328 amdgpu_ring_emit_reg_write_reg_wait(ring, reg0, reg1,
329 ref, mask);
330 amdgpu_fence_emit_polling(ring, &seq);
331 amdgpu_ring_commit(ring);
332 spin_unlock_irqrestore(&kiq->ring_lock, flags);
333
334 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
335
336 /* don't wait anymore for IRQ context */
337 if (r < 1 && in_interrupt())
338 goto failed_kiq;
339
340 might_sleep();
341
342 while (r < 1 && cnt++ < MAX_KIQ_REG_TRY) {
343 msleep(MAX_KIQ_REG_BAILOUT_INTERVAL);
344 r = amdgpu_fence_wait_polling(ring, seq, MAX_KIQ_REG_WAIT);
345 }
346
347 if (cnt > MAX_KIQ_REG_TRY)
348 goto failed_kiq;
349
350 return 0;
351
352failed_kiq:
353 pr_err("failed to invalidate tlb with kiq\n");
354 return r;
355}
356
357/* 315/*
358 * GART 316 * GART
359 * VMID 0 is the physical GPU addresses as used by the kernel. 317 * VMID 0 is the physical GPU addresses as used by the kernel.
@@ -362,64 +320,47 @@ failed_kiq:
362 */ 320 */
363 321
364/** 322/**
365 * gmc_v9_0_flush_gpu_tlb - gart tlb flush callback 323 * gmc_v9_0_flush_gpu_tlb - tlb flush with certain type
366 * 324 *
367 * @adev: amdgpu_device pointer 325 * @adev: amdgpu_device pointer
368 * @vmid: vm instance to flush 326 * @vmid: vm instance to flush
327 * @flush_type: the flush type
369 * 328 *
370 * Flush the TLB for the requested page table. 329 * Flush the TLB for the requested page table using certain type.
371 */ 330 */
372static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev, 331static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev,
373 uint32_t vmid) 332 uint32_t vmid, uint32_t flush_type)
374{ 333{
375 /* Use register 17 for GART */
376 const unsigned eng = 17; 334 const unsigned eng = 17;
377 unsigned i, j; 335 unsigned i, j;
378 int r;
379 336
380 for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { 337 for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) {
381 struct amdgpu_vmhub *hub = &adev->vmhub[i]; 338 struct amdgpu_vmhub *hub = &adev->vmhub[i];
382 u32 tmp = gmc_v9_0_get_invalidate_req(vmid); 339 u32 tmp = gmc_v9_0_get_invalidate_req(vmid, flush_type);
383
384 if (adev->gfx.kiq.ring.ready &&
385 (amdgpu_sriov_runtime(adev) || !amdgpu_sriov_vf(adev)) &&
386 !adev->in_gpu_reset) {
387 r = amdgpu_kiq_reg_write_reg_wait(adev, hub->vm_inv_eng0_req + eng,
388 hub->vm_inv_eng0_ack + eng, tmp, 1 << vmid);
389 if (!r)
390 continue;
391 }
392 340
393 spin_lock(&adev->gmc.invalidate_lock); 341 if (i == AMDGPU_GFXHUB && !adev->in_gpu_reset &&
342 adev->gfx.kiq.ring.sched.ready &&
343 (amdgpu_sriov_runtime(adev) || !amdgpu_sriov_vf(adev))) {
344 uint32_t req = hub->vm_inv_eng0_req + eng;
345 uint32_t ack = hub->vm_inv_eng0_ack + eng;
394 346
395 WREG32_NO_KIQ(hub->vm_inv_eng0_req + eng, tmp); 347 amdgpu_virt_kiq_reg_write_reg_wait(adev, req, ack, tmp,
396 348 1 << vmid);
397 /* Busy wait for ACK.*/
398 for (j = 0; j < 100; j++) {
399 tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_ack + eng);
400 tmp &= 1 << vmid;
401 if (tmp)
402 break;
403 cpu_relax();
404 }
405 if (j < 100) {
406 spin_unlock(&adev->gmc.invalidate_lock);
407 continue; 349 continue;
408 } 350 }
409 351
410 /* Wait for ACK with a delay.*/ 352 spin_lock(&adev->gmc.invalidate_lock);
353 WREG32_NO_KIQ(hub->vm_inv_eng0_req + eng, tmp);
411 for (j = 0; j < adev->usec_timeout; j++) { 354 for (j = 0; j < adev->usec_timeout; j++) {
412 tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_ack + eng); 355 tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_ack + eng);
413 tmp &= 1 << vmid; 356 if (tmp & (1 << vmid))
414 if (tmp)
415 break; 357 break;
416 udelay(1); 358 udelay(1);
417 } 359 }
418 if (j < adev->usec_timeout) {
419 spin_unlock(&adev->gmc.invalidate_lock);
420 continue;
421 }
422 spin_unlock(&adev->gmc.invalidate_lock); 360 spin_unlock(&adev->gmc.invalidate_lock);
361 if (j < adev->usec_timeout)
362 continue;
363
423 DRM_ERROR("Timeout waiting for VM flush ACK!\n"); 364 DRM_ERROR("Timeout waiting for VM flush ACK!\n");
424 } 365 }
425} 366}
@@ -429,7 +370,7 @@ static uint64_t gmc_v9_0_emit_flush_gpu_tlb(struct amdgpu_ring *ring,
429{ 370{
430 struct amdgpu_device *adev = ring->adev; 371 struct amdgpu_device *adev = ring->adev;
431 struct amdgpu_vmhub *hub = &adev->vmhub[ring->funcs->vmhub]; 372 struct amdgpu_vmhub *hub = &adev->vmhub[ring->funcs->vmhub];
432 uint32_t req = gmc_v9_0_get_invalidate_req(vmid); 373 uint32_t req = gmc_v9_0_get_invalidate_req(vmid, 0);
433 unsigned eng = ring->vm_inv_eng; 374 unsigned eng = ring->vm_inv_eng;
434 375
435 amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_lo32 + (2 * vmid), 376 amdgpu_ring_emit_wreg(ring, hub->ctx0_ptb_addr_lo32 + (2 * vmid),
@@ -739,9 +680,8 @@ static int gmc_v9_0_late_init(void *handle)
739 unsigned vmhub = ring->funcs->vmhub; 680 unsigned vmhub = ring->funcs->vmhub;
740 681
741 ring->vm_inv_eng = vm_inv_eng[vmhub]++; 682 ring->vm_inv_eng = vm_inv_eng[vmhub]++;
742 dev_info(adev->dev, "ring %u(%s) uses VM inv eng %u on hub %u\n", 683 dev_info(adev->dev, "ring %s uses VM inv eng %u on hub %u\n",
743 ring->idx, ring->name, ring->vm_inv_eng, 684 ring->name, ring->vm_inv_eng, ring->funcs->vmhub);
744 ring->funcs->vmhub);
745 } 685 }
746 686
747 /* Engine 16 is used for KFD and 17 for GART flushes */ 687 /* Engine 16 is used for KFD and 17 for GART flushes */
@@ -1122,7 +1062,7 @@ static int gmc_v9_0_gart_enable(struct amdgpu_device *adev)
1122 1062
1123 gfxhub_v1_0_set_fault_enable_default(adev, value); 1063 gfxhub_v1_0_set_fault_enable_default(adev, value);
1124 mmhub_v1_0_set_fault_enable_default(adev, value); 1064 mmhub_v1_0_set_fault_enable_default(adev, value);
1125 gmc_v9_0_flush_gpu_tlb(adev, 0); 1065 gmc_v9_0_flush_gpu_tlb(adev, 0, 0);
1126 1066
1127 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 1067 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
1128 (unsigned)(adev->gmc.gart_size >> 20), 1068 (unsigned)(adev->gmc.gart_size >> 20),
diff --git a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
index d0e478f43443..0c9a2c03504e 100644
--- a/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
+++ b/drivers/gpu/drm/amd/amdgpu/kv_dpm.c
@@ -508,19 +508,19 @@ static int kv_enable_didt(struct amdgpu_device *adev, bool enable)
508 pi->caps_db_ramping || 508 pi->caps_db_ramping ||
509 pi->caps_td_ramping || 509 pi->caps_td_ramping ||
510 pi->caps_tcp_ramping) { 510 pi->caps_tcp_ramping) {
511 adev->gfx.rlc.funcs->enter_safe_mode(adev); 511 amdgpu_gfx_rlc_enter_safe_mode(adev);
512 512
513 if (enable) { 513 if (enable) {
514 ret = kv_program_pt_config_registers(adev, didt_config_kv); 514 ret = kv_program_pt_config_registers(adev, didt_config_kv);
515 if (ret) { 515 if (ret) {
516 adev->gfx.rlc.funcs->exit_safe_mode(adev); 516 amdgpu_gfx_rlc_exit_safe_mode(adev);
517 return ret; 517 return ret;
518 } 518 }
519 } 519 }
520 520
521 kv_do_enable_didt(adev, enable); 521 kv_do_enable_didt(adev, enable);
522 522
523 adev->gfx.rlc.funcs->exit_safe_mode(adev); 523 amdgpu_gfx_rlc_exit_safe_mode(adev);
524 } 524 }
525 525
526 return 0; 526 return 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
index fd23ba1226a5..d0d966d6080a 100644
--- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
@@ -52,20 +52,25 @@ u64 mmhub_v1_0_get_fb_location(struct amdgpu_device *adev)
52 return base; 52 return base;
53} 53}
54 54
55static void mmhub_v1_0_init_gart_pt_regs(struct amdgpu_device *adev) 55void mmhub_v1_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,
56 uint64_t page_table_base)
56{ 57{
57 uint64_t value = amdgpu_gmc_pd_addr(adev->gart.bo); 58 /* two registers distance between mmVM_CONTEXT0_* to mmVM_CONTEXT1_* */
59 int offset = mmVM_CONTEXT1_PAGE_TABLE_BASE_ADDR_LO32
60 - mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32;
58 61
59 WREG32_SOC15(MMHUB, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, 62 WREG32_SOC15_OFFSET(MMHUB, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32,
60 lower_32_bits(value)); 63 offset * vmid, lower_32_bits(page_table_base));
61 64
62 WREG32_SOC15(MMHUB, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, 65 WREG32_SOC15_OFFSET(MMHUB, 0, mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32,
63 upper_32_bits(value)); 66 offset * vmid, upper_32_bits(page_table_base));
64} 67}
65 68
66static void mmhub_v1_0_init_gart_aperture_regs(struct amdgpu_device *adev) 69static void mmhub_v1_0_init_gart_aperture_regs(struct amdgpu_device *adev)
67{ 70{
68 mmhub_v1_0_init_gart_pt_regs(adev); 71 uint64_t pt_base = amdgpu_gmc_pd_addr(adev->gart.bo);
72
73 mmhub_v1_0_setup_vm_pt_regs(adev, 0, pt_base);
69 74
70 WREG32_SOC15(MMHUB, 0, mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, 75 WREG32_SOC15(MMHUB, 0, mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32,
71 (u32)(adev->gmc.gart_start >> 12)); 76 (u32)(adev->gmc.gart_start >> 12));
@@ -90,7 +95,7 @@ static void mmhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)
90 95
91 /* Program the system aperture low logical page number. */ 96 /* Program the system aperture low logical page number. */
92 WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR, 97 WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR,
93 min(adev->gmc.vram_start, adev->gmc.agp_start) >> 18); 98 min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18);
94 99
95 if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8) 100 if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8)
96 /* 101 /*
@@ -100,11 +105,11 @@ static void mmhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)
100 * to get rid of the VM fault and hardware hang. 105 * to get rid of the VM fault and hardware hang.
101 */ 106 */
102 WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 107 WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR,
103 max((adev->gmc.vram_end >> 18) + 0x1, 108 max((adev->gmc.fb_end >> 18) + 0x1,
104 adev->gmc.agp_end >> 18)); 109 adev->gmc.agp_end >> 18));
105 else 110 else
106 WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR, 111 WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR,
107 max(adev->gmc.vram_end, adev->gmc.agp_end) >> 18); 112 max(adev->gmc.fb_end, adev->gmc.agp_end) >> 18);
108 113
109 /* Set default page address. */ 114 /* Set default page address. */
110 value = adev->vram_scratch.gpu_addr - adev->gmc.vram_start + 115 value = adev->vram_scratch.gpu_addr - adev->gmc.vram_start +
diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.h b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.h
index bef3d0c0c117..0de0fdf98c00 100644
--- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.h
+++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.h
@@ -34,5 +34,7 @@ int mmhub_v1_0_set_clockgating(struct amdgpu_device *adev,
34void mmhub_v1_0_get_clockgating(struct amdgpu_device *adev, u32 *flags); 34void mmhub_v1_0_get_clockgating(struct amdgpu_device *adev, u32 *flags);
35void mmhub_v1_0_update_power_gating(struct amdgpu_device *adev, 35void mmhub_v1_0_update_power_gating(struct amdgpu_device *adev,
36 bool enable); 36 bool enable);
37void mmhub_v1_0_setup_vm_pt_regs(struct amdgpu_device *adev, uint32_t vmid,
38 uint64_t page_table_base);
37 39
38#endif 40#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
index 3f3fac2d50cd..e5dd052d9e06 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
@@ -34,6 +34,7 @@
34#include "nbio/nbio_7_4_offset.h" 34#include "nbio/nbio_7_4_offset.h"
35 35
36MODULE_FIRMWARE("amdgpu/vega20_sos.bin"); 36MODULE_FIRMWARE("amdgpu/vega20_sos.bin");
37MODULE_FIRMWARE("amdgpu/vega20_ta.bin");
37 38
38/* address block */ 39/* address block */
39#define smnMP1_FIRMWARE_FLAGS 0x3010024 40#define smnMP1_FIRMWARE_FLAGS 0x3010024
@@ -98,7 +99,8 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
98 const char *chip_name; 99 const char *chip_name;
99 char fw_name[30]; 100 char fw_name[30];
100 int err = 0; 101 int err = 0;
101 const struct psp_firmware_header_v1_0 *hdr; 102 const struct psp_firmware_header_v1_0 *sos_hdr;
103 const struct ta_firmware_header_v1_0 *ta_hdr;
102 104
103 DRM_DEBUG("\n"); 105 DRM_DEBUG("\n");
104 106
@@ -119,16 +121,32 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)
119 if (err) 121 if (err)
120 goto out; 122 goto out;
121 123
122 hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; 124 sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data;
123 adev->psp.sos_fw_version = le32_to_cpu(hdr->header.ucode_version); 125 adev->psp.sos_fw_version = le32_to_cpu(sos_hdr->header.ucode_version);
124 adev->psp.sos_feature_version = le32_to_cpu(hdr->ucode_feature_version); 126 adev->psp.sos_feature_version = le32_to_cpu(sos_hdr->ucode_feature_version);
125 adev->psp.sos_bin_size = le32_to_cpu(hdr->sos_size_bytes); 127 adev->psp.sos_bin_size = le32_to_cpu(sos_hdr->sos_size_bytes);
126 adev->psp.sys_bin_size = le32_to_cpu(hdr->header.ucode_size_bytes) - 128 adev->psp.sys_bin_size = le32_to_cpu(sos_hdr->header.ucode_size_bytes) -
127 le32_to_cpu(hdr->sos_size_bytes); 129 le32_to_cpu(sos_hdr->sos_size_bytes);
128 adev->psp.sys_start_addr = (uint8_t *)hdr + 130 adev->psp.sys_start_addr = (uint8_t *)sos_hdr +
129 le32_to_cpu(hdr->header.ucode_array_offset_bytes); 131 le32_to_cpu(sos_hdr->header.ucode_array_offset_bytes);
130 adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr + 132 adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr +
131 le32_to_cpu(hdr->sos_offset_bytes); 133 le32_to_cpu(sos_hdr->sos_offset_bytes);
134
135 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name);
136 err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev);
137 if (err)
138 goto out;
139
140 err = amdgpu_ucode_validate(adev->psp.ta_fw);
141 if (err)
142 goto out;
143
144 ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data;
145 adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version);
146 adev->psp.ta_xgmi_ucode_size = le32_to_cpu(ta_hdr->ta_xgmi_size_bytes);
147 adev->psp.ta_xgmi_start_addr = (uint8_t *)ta_hdr +
148 le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes);
149
132 return 0; 150 return 0;
133out: 151out:
134 if (err) { 152 if (err) {
@@ -167,7 +185,7 @@ static int psp_v11_0_bootloader_load_sysdrv(struct psp_context *psp)
167 /* Copy PSP System Driver binary to memory */ 185 /* Copy PSP System Driver binary to memory */
168 memcpy(psp->fw_pri_buf, psp->sys_start_addr, psp->sys_bin_size); 186 memcpy(psp->fw_pri_buf, psp->sys_start_addr, psp->sys_bin_size);
169 187
170 /* Provide the sys driver to bootrom */ 188 /* Provide the sys driver to bootloader */
171 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36, 189 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36,
172 (uint32_t)(psp->fw_pri_mc_addr >> 20)); 190 (uint32_t)(psp->fw_pri_mc_addr >> 20));
173 psp_gfxdrv_command_reg = 1 << 16; 191 psp_gfxdrv_command_reg = 1 << 16;
@@ -208,7 +226,7 @@ static int psp_v11_0_bootloader_load_sos(struct psp_context *psp)
208 /* Copy Secure OS binary to PSP memory */ 226 /* Copy Secure OS binary to PSP memory */
209 memcpy(psp->fw_pri_buf, psp->sos_start_addr, psp->sos_bin_size); 227 memcpy(psp->fw_pri_buf, psp->sos_start_addr, psp->sos_bin_size);
210 228
211 /* Provide the PSP secure OS to bootrom */ 229 /* Provide the PSP secure OS to bootloader */
212 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36, 230 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36,
213 (uint32_t)(psp->fw_pri_mc_addr >> 20)); 231 (uint32_t)(psp->fw_pri_mc_addr >> 20));
214 psp_gfxdrv_command_reg = 2 << 16; 232 psp_gfxdrv_command_reg = 2 << 16;
@@ -552,24 +570,110 @@ static int psp_v11_0_mode1_reset(struct psp_context *psp)
552static int psp_v11_0_xgmi_get_topology_info(struct psp_context *psp, 570static int psp_v11_0_xgmi_get_topology_info(struct psp_context *psp,
553 int number_devices, struct psp_xgmi_topology_info *topology) 571 int number_devices, struct psp_xgmi_topology_info *topology)
554{ 572{
573 struct ta_xgmi_shared_memory *xgmi_cmd;
574 struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
575 struct ta_xgmi_cmd_get_topology_info_output *topology_info_output;
576 int i;
577 int ret;
578
579 if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
580 return -EINVAL;
581
582 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
583 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
584
585 /* Fill in the shared memory with topology information as input */
586 topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
587 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO;
588 topology_info_input->num_nodes = number_devices;
589
590 for (i = 0; i < topology_info_input->num_nodes; i++) {
591 topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
592 topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
593 topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled;
594 topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
595 }
596
597 /* Invoke xgmi ta to get the topology information */
598 ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO);
599 if (ret)
600 return ret;
601
602 /* Read the output topology information from the shared memory */
603 topology_info_output = &xgmi_cmd->xgmi_out_message.get_topology_info;
604 topology->num_nodes = xgmi_cmd->xgmi_out_message.get_topology_info.num_nodes;
605 for (i = 0; i < topology->num_nodes; i++) {
606 topology->nodes[i].node_id = topology_info_output->nodes[i].node_id;
607 topology->nodes[i].num_hops = topology_info_output->nodes[i].num_hops;
608 topology->nodes[i].is_sharing_enabled = topology_info_output->nodes[i].is_sharing_enabled;
609 topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine;
610 }
611
555 return 0; 612 return 0;
556} 613}
557 614
558static int psp_v11_0_xgmi_set_topology_info(struct psp_context *psp, 615static int psp_v11_0_xgmi_set_topology_info(struct psp_context *psp,
559 int number_devices, struct psp_xgmi_topology_info *topology) 616 int number_devices, struct psp_xgmi_topology_info *topology)
560{ 617{
561 return 0; 618 struct ta_xgmi_shared_memory *xgmi_cmd;
619 struct ta_xgmi_cmd_get_topology_info_input *topology_info_input;
620 int i;
621
622 if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES)
623 return -EINVAL;
624
625 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
626 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
627
628 topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info;
629 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__SET_TOPOLOGY_INFO;
630 topology_info_input->num_nodes = number_devices;
631
632 for (i = 0; i < topology_info_input->num_nodes; i++) {
633 topology_info_input->nodes[i].node_id = topology->nodes[i].node_id;
634 topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops;
635 topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled;
636 topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine;
637 }
638
639 /* Invoke xgmi ta to set topology information */
640 return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO);
562} 641}
563 642
564static u64 psp_v11_0_xgmi_get_hive_id(struct psp_context *psp) 643static u64 psp_v11_0_xgmi_get_hive_id(struct psp_context *psp)
565{ 644{
566 u64 hive_id = 0; 645 struct ta_xgmi_shared_memory *xgmi_cmd;
646 int ret;
647
648 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
649 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
650
651 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_HIVE_ID;
652
653 /* Invoke xgmi ta to get hive id */
654 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
655 if (ret)
656 return 0;
657 else
658 return xgmi_cmd->xgmi_out_message.get_hive_id.hive_id;
659}
660
661static u64 psp_v11_0_xgmi_get_node_id(struct psp_context *psp)
662{
663 struct ta_xgmi_shared_memory *xgmi_cmd;
664 int ret;
665
666 xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf;
667 memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory));
567 668
568 /* Remove me when we can get correct hive_id through PSP */ 669 xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_NODE_ID;
569 if (psp->adev->gmc.xgmi.num_physical_nodes)
570 hive_id = 0x123456789abcdef;
571 670
572 return hive_id; 671 /* Invoke xgmi ta to get the node id */
672 ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id);
673 if (ret)
674 return 0;
675 else
676 return xgmi_cmd->xgmi_out_message.get_node_id.node_id;
573} 677}
574 678
575static const struct psp_funcs psp_v11_0_funcs = { 679static const struct psp_funcs psp_v11_0_funcs = {
@@ -587,6 +691,7 @@ static const struct psp_funcs psp_v11_0_funcs = {
587 .xgmi_get_topology_info = psp_v11_0_xgmi_get_topology_info, 691 .xgmi_get_topology_info = psp_v11_0_xgmi_get_topology_info,
588 .xgmi_set_topology_info = psp_v11_0_xgmi_set_topology_info, 692 .xgmi_set_topology_info = psp_v11_0_xgmi_set_topology_info,
589 .xgmi_get_hive_id = psp_v11_0_xgmi_get_hive_id, 693 .xgmi_get_hive_id = psp_v11_0_xgmi_get_hive_id,
694 .xgmi_get_node_id = psp_v11_0_xgmi_get_node_id,
590}; 695};
591 696
592void psp_v11_0_set_psp_funcs(struct psp_context *psp) 697void psp_v11_0_set_psp_funcs(struct psp_context *psp)
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
index e1ebf770c303..9cea0bbe4525 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
@@ -194,7 +194,7 @@ static int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp)
194 /* Copy PSP System Driver binary to memory */ 194 /* Copy PSP System Driver binary to memory */
195 memcpy(psp->fw_pri_buf, psp->sys_start_addr, psp->sys_bin_size); 195 memcpy(psp->fw_pri_buf, psp->sys_start_addr, psp->sys_bin_size);
196 196
197 /* Provide the sys driver to bootrom */ 197 /* Provide the sys driver to bootloader */
198 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36, 198 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36,
199 (uint32_t)(psp->fw_pri_mc_addr >> 20)); 199 (uint32_t)(psp->fw_pri_mc_addr >> 20));
200 psp_gfxdrv_command_reg = 1 << 16; 200 psp_gfxdrv_command_reg = 1 << 16;
@@ -254,7 +254,7 @@ static int psp_v3_1_bootloader_load_sos(struct psp_context *psp)
254 /* Copy Secure OS binary to PSP memory */ 254 /* Copy Secure OS binary to PSP memory */
255 memcpy(psp->fw_pri_buf, psp->sos_start_addr, psp->sos_bin_size); 255 memcpy(psp->fw_pri_buf, psp->sos_start_addr, psp->sos_bin_size);
256 256
257 /* Provide the PSP secure OS to bootrom */ 257 /* Provide the PSP secure OS to bootloader */
258 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36, 258 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_36,
259 (uint32_t)(psp->fw_pri_mc_addr >> 20)); 259 (uint32_t)(psp->fw_pri_mc_addr >> 20));
260 psp_gfxdrv_command_reg = 2 << 16; 260 psp_gfxdrv_command_reg = 2 << 16;
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
index 2d4770e173dd..9f3cb2aec7c2 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
@@ -225,7 +225,7 @@ static void sdma_v2_4_ring_set_wptr(struct amdgpu_ring *ring)
225 225
226static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) 226static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
227{ 227{
228 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring); 228 struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
229 int i; 229 int i;
230 230
231 for (i = 0; i < count; i++) 231 for (i = 0; i < count; i++)
@@ -245,9 +245,12 @@ static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
245 * Schedule an IB in the DMA ring (VI). 245 * Schedule an IB in the DMA ring (VI).
246 */ 246 */
247static void sdma_v2_4_ring_emit_ib(struct amdgpu_ring *ring, 247static void sdma_v2_4_ring_emit_ib(struct amdgpu_ring *ring,
248 struct amdgpu_job *job,
248 struct amdgpu_ib *ib, 249 struct amdgpu_ib *ib,
249 unsigned vmid, bool ctx_switch) 250 bool ctx_switch)
250{ 251{
252 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
253
251 /* IB packet must end on a 8 DW boundary */ 254 /* IB packet must end on a 8 DW boundary */
252 sdma_v2_4_ring_insert_nop(ring, (10 - (lower_32_bits(ring->wptr) & 7)) % 8); 255 sdma_v2_4_ring_insert_nop(ring, (10 - (lower_32_bits(ring->wptr) & 7)) % 8);
253 256
@@ -349,8 +352,8 @@ static void sdma_v2_4_gfx_stop(struct amdgpu_device *adev)
349 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0); 352 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0);
350 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl); 353 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl);
351 } 354 }
352 sdma0->ready = false; 355 sdma0->sched.ready = false;
353 sdma1->ready = false; 356 sdma1->sched.ready = false;
354} 357}
355 358
356/** 359/**
@@ -471,17 +474,15 @@ static int sdma_v2_4_gfx_resume(struct amdgpu_device *adev)
471 /* enable DMA IBs */ 474 /* enable DMA IBs */
472 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl); 475 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl);
473 476
474 ring->ready = true; 477 ring->sched.ready = true;
475 } 478 }
476 479
477 sdma_v2_4_enable(adev, true); 480 sdma_v2_4_enable(adev, true);
478 for (i = 0; i < adev->sdma.num_instances; i++) { 481 for (i = 0; i < adev->sdma.num_instances; i++) {
479 ring = &adev->sdma.instance[i].ring; 482 ring = &adev->sdma.instance[i].ring;
480 r = amdgpu_ring_test_ring(ring); 483 r = amdgpu_ring_test_helper(ring);
481 if (r) { 484 if (r)
482 ring->ready = false;
483 return r; 485 return r;
484 }
485 486
486 if (adev->mman.buffer_funcs_ring == ring) 487 if (adev->mman.buffer_funcs_ring == ring)
487 amdgpu_ttm_set_buffer_funcs_status(adev, true); 488 amdgpu_ttm_set_buffer_funcs_status(adev, true);
@@ -550,21 +551,16 @@ static int sdma_v2_4_ring_test_ring(struct amdgpu_ring *ring)
550 u64 gpu_addr; 551 u64 gpu_addr;
551 552
552 r = amdgpu_device_wb_get(adev, &index); 553 r = amdgpu_device_wb_get(adev, &index);
553 if (r) { 554 if (r)
554 dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
555 return r; 555 return r;
556 }
557 556
558 gpu_addr = adev->wb.gpu_addr + (index * 4); 557 gpu_addr = adev->wb.gpu_addr + (index * 4);
559 tmp = 0xCAFEDEAD; 558 tmp = 0xCAFEDEAD;
560 adev->wb.wb[index] = cpu_to_le32(tmp); 559 adev->wb.wb[index] = cpu_to_le32(tmp);
561 560
562 r = amdgpu_ring_alloc(ring, 5); 561 r = amdgpu_ring_alloc(ring, 5);
563 if (r) { 562 if (r)
564 DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r); 563 goto error_free_wb;
565 amdgpu_device_wb_free(adev, index);
566 return r;
567 }
568 564
569 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) | 565 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) |
570 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR)); 566 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR));
@@ -581,15 +577,11 @@ static int sdma_v2_4_ring_test_ring(struct amdgpu_ring *ring)
581 DRM_UDELAY(1); 577 DRM_UDELAY(1);
582 } 578 }
583 579
584 if (i < adev->usec_timeout) { 580 if (i >= adev->usec_timeout)
585 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", ring->idx, i); 581 r = -ETIMEDOUT;
586 } else {
587 DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
588 ring->idx, tmp);
589 r = -EINVAL;
590 }
591 amdgpu_device_wb_free(adev, index);
592 582
583error_free_wb:
584 amdgpu_device_wb_free(adev, index);
593 return r; 585 return r;
594} 586}
595 587
@@ -612,20 +604,16 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
612 long r; 604 long r;
613 605
614 r = amdgpu_device_wb_get(adev, &index); 606 r = amdgpu_device_wb_get(adev, &index);
615 if (r) { 607 if (r)
616 dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
617 return r; 608 return r;
618 }
619 609
620 gpu_addr = adev->wb.gpu_addr + (index * 4); 610 gpu_addr = adev->wb.gpu_addr + (index * 4);
621 tmp = 0xCAFEDEAD; 611 tmp = 0xCAFEDEAD;
622 adev->wb.wb[index] = cpu_to_le32(tmp); 612 adev->wb.wb[index] = cpu_to_le32(tmp);
623 memset(&ib, 0, sizeof(ib)); 613 memset(&ib, 0, sizeof(ib));
624 r = amdgpu_ib_get(adev, NULL, 256, &ib); 614 r = amdgpu_ib_get(adev, NULL, 256, &ib);
625 if (r) { 615 if (r)
626 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
627 goto err0; 616 goto err0;
628 }
629 617
630 ib.ptr[0] = SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) | 618 ib.ptr[0] = SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) |
631 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR); 619 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR);
@@ -644,21 +632,16 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
644 632
645 r = dma_fence_wait_timeout(f, false, timeout); 633 r = dma_fence_wait_timeout(f, false, timeout);
646 if (r == 0) { 634 if (r == 0) {
647 DRM_ERROR("amdgpu: IB test timed out\n");
648 r = -ETIMEDOUT; 635 r = -ETIMEDOUT;
649 goto err1; 636 goto err1;
650 } else if (r < 0) { 637 } else if (r < 0) {
651 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
652 goto err1; 638 goto err1;
653 } 639 }
654 tmp = le32_to_cpu(adev->wb.wb[index]); 640 tmp = le32_to_cpu(adev->wb.wb[index]);
655 if (tmp == 0xDEADBEEF) { 641 if (tmp == 0xDEADBEEF)
656 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
657 r = 0; 642 r = 0;
658 } else { 643 else
659 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
660 r = -EINVAL; 644 r = -EINVAL;
661 }
662 645
663err1: 646err1:
664 amdgpu_ib_free(adev, &ib, NULL); 647 amdgpu_ib_free(adev, &ib, NULL);
@@ -760,7 +743,7 @@ static void sdma_v2_4_vm_set_pte_pde(struct amdgpu_ib *ib, uint64_t pe,
760 */ 743 */
761static void sdma_v2_4_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib) 744static void sdma_v2_4_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
762{ 745{
763 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring); 746 struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
764 u32 pad_count; 747 u32 pad_count;
765 int i; 748 int i;
766 749
@@ -1105,8 +1088,14 @@ static int sdma_v2_4_process_illegal_inst_irq(struct amdgpu_device *adev,
1105 struct amdgpu_irq_src *source, 1088 struct amdgpu_irq_src *source,
1106 struct amdgpu_iv_entry *entry) 1089 struct amdgpu_iv_entry *entry)
1107{ 1090{
1091 u8 instance_id, queue_id;
1092
1108 DRM_ERROR("Illegal instruction in SDMA command stream\n"); 1093 DRM_ERROR("Illegal instruction in SDMA command stream\n");
1109 schedule_work(&adev->reset_work); 1094 instance_id = (entry->ring_id & 0x3) >> 0;
1095 queue_id = (entry->ring_id & 0xc) >> 2;
1096
1097 if (instance_id <= 1 && queue_id == 0)
1098 drm_sched_fault(&adev->sdma.instance[instance_id].ring.sched);
1110 return 0; 1099 return 0;
1111} 1100}
1112 1101
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index 6fb3edaba0ec..b6a25f92d566 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -399,7 +399,7 @@ static void sdma_v3_0_ring_set_wptr(struct amdgpu_ring *ring)
399 399
400static void sdma_v3_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) 400static void sdma_v3_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
401{ 401{
402 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring); 402 struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
403 int i; 403 int i;
404 404
405 for (i = 0; i < count; i++) 405 for (i = 0; i < count; i++)
@@ -419,9 +419,12 @@ static void sdma_v3_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
419 * Schedule an IB in the DMA ring (VI). 419 * Schedule an IB in the DMA ring (VI).
420 */ 420 */
421static void sdma_v3_0_ring_emit_ib(struct amdgpu_ring *ring, 421static void sdma_v3_0_ring_emit_ib(struct amdgpu_ring *ring,
422 struct amdgpu_job *job,
422 struct amdgpu_ib *ib, 423 struct amdgpu_ib *ib,
423 unsigned vmid, bool ctx_switch) 424 bool ctx_switch)
424{ 425{
426 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
427
425 /* IB packet must end on a 8 DW boundary */ 428 /* IB packet must end on a 8 DW boundary */
426 sdma_v3_0_ring_insert_nop(ring, (10 - (lower_32_bits(ring->wptr) & 7)) % 8); 429 sdma_v3_0_ring_insert_nop(ring, (10 - (lower_32_bits(ring->wptr) & 7)) % 8);
427 430
@@ -523,8 +526,8 @@ static void sdma_v3_0_gfx_stop(struct amdgpu_device *adev)
523 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0); 526 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0);
524 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl); 527 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl);
525 } 528 }
526 sdma0->ready = false; 529 sdma0->sched.ready = false;
527 sdma1->ready = false; 530 sdma1->sched.ready = false;
528} 531}
529 532
530/** 533/**
@@ -739,7 +742,7 @@ static int sdma_v3_0_gfx_resume(struct amdgpu_device *adev)
739 /* enable DMA IBs */ 742 /* enable DMA IBs */
740 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl); 743 WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl);
741 744
742 ring->ready = true; 745 ring->sched.ready = true;
743 } 746 }
744 747
745 /* unhalt the MEs */ 748 /* unhalt the MEs */
@@ -749,11 +752,9 @@ static int sdma_v3_0_gfx_resume(struct amdgpu_device *adev)
749 752
750 for (i = 0; i < adev->sdma.num_instances; i++) { 753 for (i = 0; i < adev->sdma.num_instances; i++) {
751 ring = &adev->sdma.instance[i].ring; 754 ring = &adev->sdma.instance[i].ring;
752 r = amdgpu_ring_test_ring(ring); 755 r = amdgpu_ring_test_helper(ring);
753 if (r) { 756 if (r)
754 ring->ready = false;
755 return r; 757 return r;
756 }
757 758
758 if (adev->mman.buffer_funcs_ring == ring) 759 if (adev->mman.buffer_funcs_ring == ring)
759 amdgpu_ttm_set_buffer_funcs_status(adev, true); 760 amdgpu_ttm_set_buffer_funcs_status(adev, true);
@@ -822,21 +823,16 @@ static int sdma_v3_0_ring_test_ring(struct amdgpu_ring *ring)
822 u64 gpu_addr; 823 u64 gpu_addr;
823 824
824 r = amdgpu_device_wb_get(adev, &index); 825 r = amdgpu_device_wb_get(adev, &index);
825 if (r) { 826 if (r)
826 dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
827 return r; 827 return r;
828 }
829 828
830 gpu_addr = adev->wb.gpu_addr + (index * 4); 829 gpu_addr = adev->wb.gpu_addr + (index * 4);
831 tmp = 0xCAFEDEAD; 830 tmp = 0xCAFEDEAD;
832 adev->wb.wb[index] = cpu_to_le32(tmp); 831 adev->wb.wb[index] = cpu_to_le32(tmp);
833 832
834 r = amdgpu_ring_alloc(ring, 5); 833 r = amdgpu_ring_alloc(ring, 5);
835 if (r) { 834 if (r)
836 DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r); 835 goto error_free_wb;
837 amdgpu_device_wb_free(adev, index);
838 return r;
839 }
840 836
841 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) | 837 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) |
842 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR)); 838 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR));
@@ -853,15 +849,11 @@ static int sdma_v3_0_ring_test_ring(struct amdgpu_ring *ring)
853 DRM_UDELAY(1); 849 DRM_UDELAY(1);
854 } 850 }
855 851
856 if (i < adev->usec_timeout) { 852 if (i >= adev->usec_timeout)
857 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", ring->idx, i); 853 r = -ETIMEDOUT;
858 } else {
859 DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
860 ring->idx, tmp);
861 r = -EINVAL;
862 }
863 amdgpu_device_wb_free(adev, index);
864 854
855error_free_wb:
856 amdgpu_device_wb_free(adev, index);
865 return r; 857 return r;
866} 858}
867 859
@@ -884,20 +876,16 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
884 long r; 876 long r;
885 877
886 r = amdgpu_device_wb_get(adev, &index); 878 r = amdgpu_device_wb_get(adev, &index);
887 if (r) { 879 if (r)
888 dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
889 return r; 880 return r;
890 }
891 881
892 gpu_addr = adev->wb.gpu_addr + (index * 4); 882 gpu_addr = adev->wb.gpu_addr + (index * 4);
893 tmp = 0xCAFEDEAD; 883 tmp = 0xCAFEDEAD;
894 adev->wb.wb[index] = cpu_to_le32(tmp); 884 adev->wb.wb[index] = cpu_to_le32(tmp);
895 memset(&ib, 0, sizeof(ib)); 885 memset(&ib, 0, sizeof(ib));
896 r = amdgpu_ib_get(adev, NULL, 256, &ib); 886 r = amdgpu_ib_get(adev, NULL, 256, &ib);
897 if (r) { 887 if (r)
898 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
899 goto err0; 888 goto err0;
900 }
901 889
902 ib.ptr[0] = SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) | 890 ib.ptr[0] = SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) |
903 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR); 891 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR);
@@ -916,21 +904,16 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
916 904
917 r = dma_fence_wait_timeout(f, false, timeout); 905 r = dma_fence_wait_timeout(f, false, timeout);
918 if (r == 0) { 906 if (r == 0) {
919 DRM_ERROR("amdgpu: IB test timed out\n");
920 r = -ETIMEDOUT; 907 r = -ETIMEDOUT;
921 goto err1; 908 goto err1;
922 } else if (r < 0) { 909 } else if (r < 0) {
923 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
924 goto err1; 910 goto err1;
925 } 911 }
926 tmp = le32_to_cpu(adev->wb.wb[index]); 912 tmp = le32_to_cpu(adev->wb.wb[index]);
927 if (tmp == 0xDEADBEEF) { 913 if (tmp == 0xDEADBEEF)
928 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
929 r = 0; 914 r = 0;
930 } else { 915 else
931 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
932 r = -EINVAL; 916 r = -EINVAL;
933 }
934err1: 917err1:
935 amdgpu_ib_free(adev, &ib, NULL); 918 amdgpu_ib_free(adev, &ib, NULL);
936 dma_fence_put(f); 919 dma_fence_put(f);
@@ -1031,7 +1014,7 @@ static void sdma_v3_0_vm_set_pte_pde(struct amdgpu_ib *ib, uint64_t pe,
1031 */ 1014 */
1032static void sdma_v3_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib) 1015static void sdma_v3_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
1033{ 1016{
1034 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring); 1017 struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
1035 u32 pad_count; 1018 u32 pad_count;
1036 int i; 1019 int i;
1037 1020
@@ -1440,8 +1423,14 @@ static int sdma_v3_0_process_illegal_inst_irq(struct amdgpu_device *adev,
1440 struct amdgpu_irq_src *source, 1423 struct amdgpu_irq_src *source,
1441 struct amdgpu_iv_entry *entry) 1424 struct amdgpu_iv_entry *entry)
1442{ 1425{
1426 u8 instance_id, queue_id;
1427
1443 DRM_ERROR("Illegal instruction in SDMA command stream\n"); 1428 DRM_ERROR("Illegal instruction in SDMA command stream\n");
1444 schedule_work(&adev->reset_work); 1429 instance_id = (entry->ring_id & 0x3) >> 0;
1430 queue_id = (entry->ring_id & 0xc) >> 2;
1431
1432 if (instance_id <= 1 && queue_id == 0)
1433 drm_sched_fault(&adev->sdma.instance[instance_id].ring.sched);
1445 return 0; 1434 return 0;
1446} 1435}
1447 1436
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
index 7a8c9172d30a..f4490cdd9804 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
@@ -54,6 +54,11 @@ MODULE_FIRMWARE("amdgpu/raven2_sdma.bin");
54#define SDMA0_POWER_CNTL__ON_OFF_CONDITION_HOLD_TIME_MASK 0x000000F8L 54#define SDMA0_POWER_CNTL__ON_OFF_CONDITION_HOLD_TIME_MASK 0x000000F8L
55#define SDMA0_POWER_CNTL__ON_OFF_STATUS_DURATION_TIME_MASK 0xFC000000L 55#define SDMA0_POWER_CNTL__ON_OFF_STATUS_DURATION_TIME_MASK 0xFC000000L
56 56
57#define WREG32_SDMA(instance, offset, value) \
58 WREG32(sdma_v4_0_get_reg_offset(adev, (instance), (offset)), value)
59#define RREG32_SDMA(instance, offset) \
60 RREG32(sdma_v4_0_get_reg_offset(adev, (instance), (offset)))
61
57static void sdma_v4_0_set_ring_funcs(struct amdgpu_device *adev); 62static void sdma_v4_0_set_ring_funcs(struct amdgpu_device *adev);
58static void sdma_v4_0_set_buffer_funcs(struct amdgpu_device *adev); 63static void sdma_v4_0_set_buffer_funcs(struct amdgpu_device *adev);
59static void sdma_v4_0_set_vm_pte_funcs(struct amdgpu_device *adev); 64static void sdma_v4_0_set_vm_pte_funcs(struct amdgpu_device *adev);
@@ -367,16 +372,11 @@ static uint64_t sdma_v4_0_ring_get_wptr(struct amdgpu_ring *ring)
367 wptr = READ_ONCE(*((u64 *)&adev->wb.wb[ring->wptr_offs])); 372 wptr = READ_ONCE(*((u64 *)&adev->wb.wb[ring->wptr_offs]));
368 DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", wptr); 373 DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", wptr);
369 } else { 374 } else {
370 u32 lowbit, highbit; 375 wptr = RREG32_SDMA(ring->me, mmSDMA0_GFX_RB_WPTR_HI);
371
372 lowbit = RREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR)) >> 2;
373 highbit = RREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2;
374
375 DRM_DEBUG("wptr [%i]high== 0x%08x low==0x%08x\n",
376 ring->me, highbit, lowbit);
377 wptr = highbit;
378 wptr = wptr << 32; 376 wptr = wptr << 32;
379 wptr |= lowbit; 377 wptr |= RREG32_SDMA(ring->me, mmSDMA0_GFX_RB_WPTR);
378 DRM_DEBUG("wptr before shift [%i] wptr == 0x%016llx\n",
379 ring->me, wptr);
380 } 380 }
381 381
382 return wptr >> 2; 382 return wptr >> 2;
@@ -417,14 +417,67 @@ static void sdma_v4_0_ring_set_wptr(struct amdgpu_ring *ring)
417 lower_32_bits(ring->wptr << 2), 417 lower_32_bits(ring->wptr << 2),
418 ring->me, 418 ring->me,
419 upper_32_bits(ring->wptr << 2)); 419 upper_32_bits(ring->wptr << 2));
420 WREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr << 2)); 420 WREG32_SDMA(ring->me, mmSDMA0_GFX_RB_WPTR,
421 WREG32(sdma_v4_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr << 2)); 421 lower_32_bits(ring->wptr << 2));
422 WREG32_SDMA(ring->me, mmSDMA0_GFX_RB_WPTR_HI,
423 upper_32_bits(ring->wptr << 2));
424 }
425}
426
427/**
428 * sdma_v4_0_page_ring_get_wptr - get the current write pointer
429 *
430 * @ring: amdgpu ring pointer
431 *
432 * Get the current wptr from the hardware (VEGA10+).
433 */
434static uint64_t sdma_v4_0_page_ring_get_wptr(struct amdgpu_ring *ring)
435{
436 struct amdgpu_device *adev = ring->adev;
437 u64 wptr;
438
439 if (ring->use_doorbell) {
440 /* XXX check if swapping is necessary on BE */
441 wptr = READ_ONCE(*((u64 *)&adev->wb.wb[ring->wptr_offs]));
442 } else {
443 wptr = RREG32_SDMA(ring->me, mmSDMA0_PAGE_RB_WPTR_HI);
444 wptr = wptr << 32;
445 wptr |= RREG32_SDMA(ring->me, mmSDMA0_PAGE_RB_WPTR);
446 }
447
448 return wptr >> 2;
449}
450
451/**
452 * sdma_v4_0_ring_set_wptr - commit the write pointer
453 *
454 * @ring: amdgpu ring pointer
455 *
456 * Write the wptr back to the hardware (VEGA10+).
457 */
458static void sdma_v4_0_page_ring_set_wptr(struct amdgpu_ring *ring)
459{
460 struct amdgpu_device *adev = ring->adev;
461
462 if (ring->use_doorbell) {
463 u64 *wb = (u64 *)&adev->wb.wb[ring->wptr_offs];
464
465 /* XXX check if swapping is necessary on BE */
466 WRITE_ONCE(*wb, (ring->wptr << 2));
467 WDOORBELL64(ring->doorbell_index, ring->wptr << 2);
468 } else {
469 uint64_t wptr = ring->wptr << 2;
470
471 WREG32_SDMA(ring->me, mmSDMA0_PAGE_RB_WPTR,
472 lower_32_bits(wptr));
473 WREG32_SDMA(ring->me, mmSDMA0_PAGE_RB_WPTR_HI,
474 upper_32_bits(wptr));
422 } 475 }
423} 476}
424 477
425static void sdma_v4_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) 478static void sdma_v4_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
426{ 479{
427 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring); 480 struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
428 int i; 481 int i;
429 482
430 for (i = 0; i < count; i++) 483 for (i = 0; i < count; i++)
@@ -444,9 +497,12 @@ static void sdma_v4_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
444 * Schedule an IB in the DMA ring (VEGA10). 497 * Schedule an IB in the DMA ring (VEGA10).
445 */ 498 */
446static void sdma_v4_0_ring_emit_ib(struct amdgpu_ring *ring, 499static void sdma_v4_0_ring_emit_ib(struct amdgpu_ring *ring,
447 struct amdgpu_ib *ib, 500 struct amdgpu_job *job,
448 unsigned vmid, bool ctx_switch) 501 struct amdgpu_ib *ib,
502 bool ctx_switch)
449{ 503{
504 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
505
450 /* IB packet must end on a 8 DW boundary */ 506 /* IB packet must end on a 8 DW boundary */
451 sdma_v4_0_ring_insert_nop(ring, (10 - (lower_32_bits(ring->wptr) & 7)) % 8); 507 sdma_v4_0_ring_insert_nop(ring, (10 - (lower_32_bits(ring->wptr) & 7)) % 8);
452 508
@@ -568,16 +624,16 @@ static void sdma_v4_0_gfx_stop(struct amdgpu_device *adev)
568 amdgpu_ttm_set_buffer_funcs_status(adev, false); 624 amdgpu_ttm_set_buffer_funcs_status(adev, false);
569 625
570 for (i = 0; i < adev->sdma.num_instances; i++) { 626 for (i = 0; i < adev->sdma.num_instances; i++) {
571 rb_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL)); 627 rb_cntl = RREG32_SDMA(i, mmSDMA0_GFX_RB_CNTL);
572 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 0); 628 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 0);
573 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl); 629 WREG32_SDMA(i, mmSDMA0_GFX_RB_CNTL, rb_cntl);
574 ib_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL)); 630 ib_cntl = RREG32_SDMA(i, mmSDMA0_GFX_IB_CNTL);
575 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0); 631 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0);
576 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl); 632 WREG32_SDMA(i, mmSDMA0_GFX_IB_CNTL, ib_cntl);
577 } 633 }
578 634
579 sdma0->ready = false; 635 sdma0->sched.ready = false;
580 sdma1->ready = false; 636 sdma1->sched.ready = false;
581} 637}
582 638
583/** 639/**
@@ -593,6 +649,39 @@ static void sdma_v4_0_rlc_stop(struct amdgpu_device *adev)
593} 649}
594 650
595/** 651/**
652 * sdma_v4_0_page_stop - stop the page async dma engines
653 *
654 * @adev: amdgpu_device pointer
655 *
656 * Stop the page async dma ring buffers (VEGA10).
657 */
658static void sdma_v4_0_page_stop(struct amdgpu_device *adev)
659{
660 struct amdgpu_ring *sdma0 = &adev->sdma.instance[0].page;
661 struct amdgpu_ring *sdma1 = &adev->sdma.instance[1].page;
662 u32 rb_cntl, ib_cntl;
663 int i;
664
665 if ((adev->mman.buffer_funcs_ring == sdma0) ||
666 (adev->mman.buffer_funcs_ring == sdma1))
667 amdgpu_ttm_set_buffer_funcs_status(adev, false);
668
669 for (i = 0; i < adev->sdma.num_instances; i++) {
670 rb_cntl = RREG32_SDMA(i, mmSDMA0_PAGE_RB_CNTL);
671 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_PAGE_RB_CNTL,
672 RB_ENABLE, 0);
673 WREG32_SDMA(i, mmSDMA0_PAGE_RB_CNTL, rb_cntl);
674 ib_cntl = RREG32_SDMA(i, mmSDMA0_PAGE_IB_CNTL);
675 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_PAGE_IB_CNTL,
676 IB_ENABLE, 0);
677 WREG32_SDMA(i, mmSDMA0_PAGE_IB_CNTL, ib_cntl);
678 }
679
680 sdma0->sched.ready = false;
681 sdma1->sched.ready = false;
682}
683
684/**
596 * sdma_v_0_ctx_switch_enable - stop the async dma engines context switch 685 * sdma_v_0_ctx_switch_enable - stop the async dma engines context switch
597 * 686 *
598 * @adev: amdgpu_device pointer 687 * @adev: amdgpu_device pointer
@@ -630,18 +719,15 @@ static void sdma_v4_0_ctx_switch_enable(struct amdgpu_device *adev, bool enable)
630 } 719 }
631 720
632 for (i = 0; i < adev->sdma.num_instances; i++) { 721 for (i = 0; i < adev->sdma.num_instances; i++) {
633 f32_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_CNTL)); 722 f32_cntl = RREG32_SDMA(i, mmSDMA0_CNTL);
634 f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_CNTL, 723 f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_CNTL,
635 AUTO_CTXSW_ENABLE, enable ? 1 : 0); 724 AUTO_CTXSW_ENABLE, enable ? 1 : 0);
636 if (enable && amdgpu_sdma_phase_quantum) { 725 if (enable && amdgpu_sdma_phase_quantum) {
637 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_PHASE0_QUANTUM), 726 WREG32_SDMA(i, mmSDMA0_PHASE0_QUANTUM, phase_quantum);
638 phase_quantum); 727 WREG32_SDMA(i, mmSDMA0_PHASE1_QUANTUM, phase_quantum);
639 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_PHASE1_QUANTUM), 728 WREG32_SDMA(i, mmSDMA0_PHASE2_QUANTUM, phase_quantum);
640 phase_quantum);
641 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_PHASE2_QUANTUM),
642 phase_quantum);
643 } 729 }
644 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_CNTL), f32_cntl); 730 WREG32_SDMA(i, mmSDMA0_CNTL, f32_cntl);
645 } 731 }
646 732
647} 733}
@@ -662,156 +748,217 @@ static void sdma_v4_0_enable(struct amdgpu_device *adev, bool enable)
662 if (enable == false) { 748 if (enable == false) {
663 sdma_v4_0_gfx_stop(adev); 749 sdma_v4_0_gfx_stop(adev);
664 sdma_v4_0_rlc_stop(adev); 750 sdma_v4_0_rlc_stop(adev);
751 if (adev->sdma.has_page_queue)
752 sdma_v4_0_page_stop(adev);
665 } 753 }
666 754
667 for (i = 0; i < adev->sdma.num_instances; i++) { 755 for (i = 0; i < adev->sdma.num_instances; i++) {
668 f32_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_F32_CNTL)); 756 f32_cntl = RREG32_SDMA(i, mmSDMA0_F32_CNTL);
669 f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, enable ? 0 : 1); 757 f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, enable ? 0 : 1);
670 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_F32_CNTL), f32_cntl); 758 WREG32_SDMA(i, mmSDMA0_F32_CNTL, f32_cntl);
671 } 759 }
672} 760}
673 761
674/** 762/**
763 * sdma_v4_0_rb_cntl - get parameters for rb_cntl
764 */
765static uint32_t sdma_v4_0_rb_cntl(struct amdgpu_ring *ring, uint32_t rb_cntl)
766{
767 /* Set ring buffer size in dwords */
768 uint32_t rb_bufsz = order_base_2(ring->ring_size / 4);
769
770 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_SIZE, rb_bufsz);
771#ifdef __BIG_ENDIAN
772 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_SWAP_ENABLE, 1);
773 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL,
774 RPTR_WRITEBACK_SWAP_ENABLE, 1);
775#endif
776 return rb_cntl;
777}
778
779/**
675 * sdma_v4_0_gfx_resume - setup and start the async dma engines 780 * sdma_v4_0_gfx_resume - setup and start the async dma engines
676 * 781 *
677 * @adev: amdgpu_device pointer 782 * @adev: amdgpu_device pointer
783 * @i: instance to resume
678 * 784 *
679 * Set up the gfx DMA ring buffers and enable them (VEGA10). 785 * Set up the gfx DMA ring buffers and enable them (VEGA10).
680 * Returns 0 for success, error for failure. 786 * Returns 0 for success, error for failure.
681 */ 787 */
682static int sdma_v4_0_gfx_resume(struct amdgpu_device *adev) 788static void sdma_v4_0_gfx_resume(struct amdgpu_device *adev, unsigned int i)
683{ 789{
684 struct amdgpu_ring *ring; 790 struct amdgpu_ring *ring = &adev->sdma.instance[i].ring;
685 u32 rb_cntl, ib_cntl, wptr_poll_cntl; 791 u32 rb_cntl, ib_cntl, wptr_poll_cntl;
686 u32 rb_bufsz;
687 u32 wb_offset; 792 u32 wb_offset;
688 u32 doorbell; 793 u32 doorbell;
689 u32 doorbell_offset; 794 u32 doorbell_offset;
690 u32 temp;
691 u64 wptr_gpu_addr; 795 u64 wptr_gpu_addr;
692 int i, r;
693
694 for (i = 0; i < adev->sdma.num_instances; i++) {
695 ring = &adev->sdma.instance[i].ring;
696 wb_offset = (ring->rptr_offs * 4);
697 796
698 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_SEM_WAIT_FAIL_TIMER_CNTL), 0); 797 wb_offset = (ring->rptr_offs * 4);
699 798
700 /* Set ring buffer size in dwords */ 799 rb_cntl = RREG32_SDMA(i, mmSDMA0_GFX_RB_CNTL);
701 rb_bufsz = order_base_2(ring->ring_size / 4); 800 rb_cntl = sdma_v4_0_rb_cntl(ring, rb_cntl);
702 rb_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL)); 801 WREG32_SDMA(i, mmSDMA0_GFX_RB_CNTL, rb_cntl);
703 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_SIZE, rb_bufsz);
704#ifdef __BIG_ENDIAN
705 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_SWAP_ENABLE, 1);
706 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL,
707 RPTR_WRITEBACK_SWAP_ENABLE, 1);
708#endif
709 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl);
710 802
711 /* Initialize the ring buffer's read and write pointers */ 803 /* Initialize the ring buffer's read and write pointers */
712 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR), 0); 804 WREG32_SDMA(i, mmSDMA0_GFX_RB_RPTR, 0);
713 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_HI), 0); 805 WREG32_SDMA(i, mmSDMA0_GFX_RB_RPTR_HI, 0);
714 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR), 0); 806 WREG32_SDMA(i, mmSDMA0_GFX_RB_WPTR, 0);
715 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_HI), 0); 807 WREG32_SDMA(i, mmSDMA0_GFX_RB_WPTR_HI, 0);
716 808
717 /* set the wb address whether it's enabled or not */ 809 /* set the wb address whether it's enabled or not */
718 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_ADDR_HI), 810 WREG32_SDMA(i, mmSDMA0_GFX_RB_RPTR_ADDR_HI,
719 upper_32_bits(adev->wb.gpu_addr + wb_offset) & 0xFFFFFFFF); 811 upper_32_bits(adev->wb.gpu_addr + wb_offset) & 0xFFFFFFFF);
720 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_ADDR_LO), 812 WREG32_SDMA(i, mmSDMA0_GFX_RB_RPTR_ADDR_LO,
721 lower_32_bits(adev->wb.gpu_addr + wb_offset) & 0xFFFFFFFC); 813 lower_32_bits(adev->wb.gpu_addr + wb_offset) & 0xFFFFFFFC);
722 814
723 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RPTR_WRITEBACK_ENABLE, 1); 815 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL,
816 RPTR_WRITEBACK_ENABLE, 1);
724 817
725 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_BASE), ring->gpu_addr >> 8); 818 WREG32_SDMA(i, mmSDMA0_GFX_RB_BASE, ring->gpu_addr >> 8);
726 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_BASE_HI), ring->gpu_addr >> 40); 819 WREG32_SDMA(i, mmSDMA0_GFX_RB_BASE_HI, ring->gpu_addr >> 40);
727 820
728 ring->wptr = 0; 821 ring->wptr = 0;
729 822
730 /* before programing wptr to a less value, need set minor_ptr_update first */ 823 /* before programing wptr to a less value, need set minor_ptr_update first */
731 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 1); 824 WREG32_SDMA(i, mmSDMA0_GFX_MINOR_PTR_UPDATE, 1);
732 825
733 if (!amdgpu_sriov_vf(adev)) { /* only bare-metal use register write for wptr */ 826 doorbell = RREG32_SDMA(i, mmSDMA0_GFX_DOORBELL);
734 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr) << 2); 827 doorbell_offset = RREG32_SDMA(i, mmSDMA0_GFX_DOORBELL_OFFSET);
735 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr) << 2);
736 }
737 828
738 doorbell = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL)); 829 doorbell = REG_SET_FIELD(doorbell, SDMA0_GFX_DOORBELL, ENABLE,
739 doorbell_offset = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL_OFFSET)); 830 ring->use_doorbell);
740 831 doorbell_offset = REG_SET_FIELD(doorbell_offset,
741 if (ring->use_doorbell) { 832 SDMA0_GFX_DOORBELL_OFFSET,
742 doorbell = REG_SET_FIELD(doorbell, SDMA0_GFX_DOORBELL, ENABLE, 1);
743 doorbell_offset = REG_SET_FIELD(doorbell_offset, SDMA0_GFX_DOORBELL_OFFSET,
744 OFFSET, ring->doorbell_index); 833 OFFSET, ring->doorbell_index);
745 } else { 834 WREG32_SDMA(i, mmSDMA0_GFX_DOORBELL, doorbell);
746 doorbell = REG_SET_FIELD(doorbell, SDMA0_GFX_DOORBELL, ENABLE, 0); 835 WREG32_SDMA(i, mmSDMA0_GFX_DOORBELL_OFFSET, doorbell_offset);
747 } 836 adev->nbio_funcs->sdma_doorbell_range(adev, i, ring->use_doorbell,
748 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL), doorbell); 837 ring->doorbell_index);
749 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL_OFFSET), doorbell_offset); 838
750 adev->nbio_funcs->sdma_doorbell_range(adev, i, ring->use_doorbell, 839 sdma_v4_0_ring_set_wptr(ring);
751 ring->doorbell_index); 840
841 /* set minor_ptr_update to 0 after wptr programed */
842 WREG32_SDMA(i, mmSDMA0_GFX_MINOR_PTR_UPDATE, 0);
843
844 /* setup the wptr shadow polling */
845 wptr_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);
846 WREG32_SDMA(i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_LO,
847 lower_32_bits(wptr_gpu_addr));
848 WREG32_SDMA(i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_HI,
849 upper_32_bits(wptr_gpu_addr));
850 wptr_poll_cntl = RREG32_SDMA(i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL);
851 wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl,
852 SDMA0_GFX_RB_WPTR_POLL_CNTL,
853 F32_POLL_ENABLE, amdgpu_sriov_vf(adev));
854 WREG32_SDMA(i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL, wptr_poll_cntl);
855
856 /* enable DMA RB */
857 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 1);
858 WREG32_SDMA(i, mmSDMA0_GFX_RB_CNTL, rb_cntl);
859
860 ib_cntl = RREG32_SDMA(i, mmSDMA0_GFX_IB_CNTL);
861 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 1);
862#ifdef __BIG_ENDIAN
863 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_SWAP_ENABLE, 1);
864#endif
865 /* enable DMA IBs */
866 WREG32_SDMA(i, mmSDMA0_GFX_IB_CNTL, ib_cntl);
752 867
753 if (amdgpu_sriov_vf(adev)) 868 ring->sched.ready = true;
754 sdma_v4_0_ring_set_wptr(ring); 869}
755 870
756 /* set minor_ptr_update to 0 after wptr programed */ 871/**
757 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 0); 872 * sdma_v4_0_page_resume - setup and start the async dma engines
873 *
874 * @adev: amdgpu_device pointer
875 * @i: instance to resume
876 *
877 * Set up the page DMA ring buffers and enable them (VEGA10).
878 * Returns 0 for success, error for failure.
879 */
880static void sdma_v4_0_page_resume(struct amdgpu_device *adev, unsigned int i)
881{
882 struct amdgpu_ring *ring = &adev->sdma.instance[i].page;
883 u32 rb_cntl, ib_cntl, wptr_poll_cntl;
884 u32 wb_offset;
885 u32 doorbell;
886 u32 doorbell_offset;
887 u64 wptr_gpu_addr;
758 888
759 /* set utc l1 enable flag always to 1 */ 889 wb_offset = (ring->rptr_offs * 4);
760 temp = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_CNTL));
761 temp = REG_SET_FIELD(temp, SDMA0_CNTL, UTC_L1_ENABLE, 1);
762 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_CNTL), temp);
763 890
764 if (!amdgpu_sriov_vf(adev)) { 891 rb_cntl = RREG32_SDMA(i, mmSDMA0_PAGE_RB_CNTL);
765 /* unhalt engine */ 892 rb_cntl = sdma_v4_0_rb_cntl(ring, rb_cntl);
766 temp = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_F32_CNTL)); 893 WREG32_SDMA(i, mmSDMA0_PAGE_RB_CNTL, rb_cntl);
767 temp = REG_SET_FIELD(temp, SDMA0_F32_CNTL, HALT, 0);
768 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_F32_CNTL), temp);
769 }
770 894
771 /* setup the wptr shadow polling */ 895 /* Initialize the ring buffer's read and write pointers */
772 wptr_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4); 896 WREG32_SDMA(i, mmSDMA0_PAGE_RB_RPTR, 0);
773 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_LO), 897 WREG32_SDMA(i, mmSDMA0_PAGE_RB_RPTR_HI, 0);
774 lower_32_bits(wptr_gpu_addr)); 898 WREG32_SDMA(i, mmSDMA0_PAGE_RB_WPTR, 0);
775 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_HI), 899 WREG32_SDMA(i, mmSDMA0_PAGE_RB_WPTR_HI, 0);
776 upper_32_bits(wptr_gpu_addr));
777 wptr_poll_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL));
778 if (amdgpu_sriov_vf(adev))
779 wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl, SDMA0_GFX_RB_WPTR_POLL_CNTL, F32_POLL_ENABLE, 1);
780 else
781 wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl, SDMA0_GFX_RB_WPTR_POLL_CNTL, F32_POLL_ENABLE, 0);
782 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL), wptr_poll_cntl);
783 900
784 /* enable DMA RB */ 901 /* set the wb address whether it's enabled or not */
785 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 1); 902 WREG32_SDMA(i, mmSDMA0_PAGE_RB_RPTR_ADDR_HI,
786 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl); 903 upper_32_bits(adev->wb.gpu_addr + wb_offset) & 0xFFFFFFFF);
904 WREG32_SDMA(i, mmSDMA0_PAGE_RB_RPTR_ADDR_LO,
905 lower_32_bits(adev->wb.gpu_addr + wb_offset) & 0xFFFFFFFC);
787 906
788 ib_cntl = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL)); 907 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_PAGE_RB_CNTL,
789 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 1); 908 RPTR_WRITEBACK_ENABLE, 1);
790#ifdef __BIG_ENDIAN
791 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_SWAP_ENABLE, 1);
792#endif
793 /* enable DMA IBs */
794 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl);
795 909
796 ring->ready = true; 910 WREG32_SDMA(i, mmSDMA0_PAGE_RB_BASE, ring->gpu_addr >> 8);
911 WREG32_SDMA(i, mmSDMA0_PAGE_RB_BASE_HI, ring->gpu_addr >> 40);
797 912
798 if (amdgpu_sriov_vf(adev)) { /* bare-metal sequence doesn't need below to lines */ 913 ring->wptr = 0;
799 sdma_v4_0_ctx_switch_enable(adev, true);
800 sdma_v4_0_enable(adev, true);
801 }
802 914
803 r = amdgpu_ring_test_ring(ring); 915 /* before programing wptr to a less value, need set minor_ptr_update first */
804 if (r) { 916 WREG32_SDMA(i, mmSDMA0_PAGE_MINOR_PTR_UPDATE, 1);
805 ring->ready = false;
806 return r;
807 }
808 917
809 if (adev->mman.buffer_funcs_ring == ring) 918 doorbell = RREG32_SDMA(i, mmSDMA0_PAGE_DOORBELL);
810 amdgpu_ttm_set_buffer_funcs_status(adev, true); 919 doorbell_offset = RREG32_SDMA(i, mmSDMA0_PAGE_DOORBELL_OFFSET);
811 920
812 } 921 doorbell = REG_SET_FIELD(doorbell, SDMA0_PAGE_DOORBELL, ENABLE,
922 ring->use_doorbell);
923 doorbell_offset = REG_SET_FIELD(doorbell_offset,
924 SDMA0_PAGE_DOORBELL_OFFSET,
925 OFFSET, ring->doorbell_index);
926 WREG32_SDMA(i, mmSDMA0_PAGE_DOORBELL, doorbell);
927 WREG32_SDMA(i, mmSDMA0_PAGE_DOORBELL_OFFSET, doorbell_offset);
928 /* TODO: enable doorbell support */
929 /*adev->nbio_funcs->sdma_doorbell_range(adev, i, ring->use_doorbell,
930 ring->doorbell_index);*/
931
932 sdma_v4_0_ring_set_wptr(ring);
933
934 /* set minor_ptr_update to 0 after wptr programed */
935 WREG32_SDMA(i, mmSDMA0_PAGE_MINOR_PTR_UPDATE, 0);
936
937 /* setup the wptr shadow polling */
938 wptr_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4);
939 WREG32_SDMA(i, mmSDMA0_PAGE_RB_WPTR_POLL_ADDR_LO,
940 lower_32_bits(wptr_gpu_addr));
941 WREG32_SDMA(i, mmSDMA0_PAGE_RB_WPTR_POLL_ADDR_HI,
942 upper_32_bits(wptr_gpu_addr));
943 wptr_poll_cntl = RREG32_SDMA(i, mmSDMA0_PAGE_RB_WPTR_POLL_CNTL);
944 wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl,
945 SDMA0_PAGE_RB_WPTR_POLL_CNTL,
946 F32_POLL_ENABLE, amdgpu_sriov_vf(adev));
947 WREG32_SDMA(i, mmSDMA0_PAGE_RB_WPTR_POLL_CNTL, wptr_poll_cntl);
948
949 /* enable DMA RB */
950 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_PAGE_RB_CNTL, RB_ENABLE, 1);
951 WREG32_SDMA(i, mmSDMA0_PAGE_RB_CNTL, rb_cntl);
952
953 ib_cntl = RREG32_SDMA(i, mmSDMA0_PAGE_IB_CNTL);
954 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_PAGE_IB_CNTL, IB_ENABLE, 1);
955#ifdef __BIG_ENDIAN
956 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_PAGE_IB_CNTL, IB_SWAP_ENABLE, 1);
957#endif
958 /* enable DMA IBs */
959 WREG32_SDMA(i, mmSDMA0_PAGE_IB_CNTL, ib_cntl);
813 960
814 return 0; 961 ring->sched.ready = true;
815} 962}
816 963
817static void 964static void
@@ -922,12 +1069,14 @@ static int sdma_v4_0_load_microcode(struct amdgpu_device *adev)
922 (adev->sdma.instance[i].fw->data + 1069 (adev->sdma.instance[i].fw->data +
923 le32_to_cpu(hdr->header.ucode_array_offset_bytes)); 1070 le32_to_cpu(hdr->header.ucode_array_offset_bytes));
924 1071
925 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_UCODE_ADDR), 0); 1072 WREG32_SDMA(i, mmSDMA0_UCODE_ADDR, 0);
926 1073
927 for (j = 0; j < fw_size; j++) 1074 for (j = 0; j < fw_size; j++)
928 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_UCODE_DATA), le32_to_cpup(fw_data++)); 1075 WREG32_SDMA(i, mmSDMA0_UCODE_DATA,
1076 le32_to_cpup(fw_data++));
929 1077
930 WREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_UCODE_ADDR), adev->sdma.instance[i].fw_version); 1078 WREG32_SDMA(i, mmSDMA0_UCODE_ADDR,
1079 adev->sdma.instance[i].fw_version);
931 } 1080 }
932 1081
933 return 0; 1082 return 0;
@@ -943,33 +1092,78 @@ static int sdma_v4_0_load_microcode(struct amdgpu_device *adev)
943 */ 1092 */
944static int sdma_v4_0_start(struct amdgpu_device *adev) 1093static int sdma_v4_0_start(struct amdgpu_device *adev)
945{ 1094{
946 int r = 0; 1095 struct amdgpu_ring *ring;
1096 int i, r;
947 1097
948 if (amdgpu_sriov_vf(adev)) { 1098 if (amdgpu_sriov_vf(adev)) {
949 sdma_v4_0_ctx_switch_enable(adev, false); 1099 sdma_v4_0_ctx_switch_enable(adev, false);
950 sdma_v4_0_enable(adev, false); 1100 sdma_v4_0_enable(adev, false);
1101 } else {
951 1102
952 /* set RB registers */ 1103 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) {
953 r = sdma_v4_0_gfx_resume(adev); 1104 r = sdma_v4_0_load_microcode(adev);
954 return r; 1105 if (r)
1106 return r;
1107 }
1108
1109 /* unhalt the MEs */
1110 sdma_v4_0_enable(adev, true);
1111 /* enable sdma ring preemption */
1112 sdma_v4_0_ctx_switch_enable(adev, true);
1113 }
1114
1115 /* start the gfx rings and rlc compute queues */
1116 for (i = 0; i < adev->sdma.num_instances; i++) {
1117 uint32_t temp;
1118
1119 WREG32_SDMA(i, mmSDMA0_SEM_WAIT_FAIL_TIMER_CNTL, 0);
1120 sdma_v4_0_gfx_resume(adev, i);
1121 if (adev->sdma.has_page_queue)
1122 sdma_v4_0_page_resume(adev, i);
1123
1124 /* set utc l1 enable flag always to 1 */
1125 temp = RREG32_SDMA(i, mmSDMA0_CNTL);
1126 temp = REG_SET_FIELD(temp, SDMA0_CNTL, UTC_L1_ENABLE, 1);
1127 WREG32_SDMA(i, mmSDMA0_CNTL, temp);
1128
1129 if (!amdgpu_sriov_vf(adev)) {
1130 /* unhalt engine */
1131 temp = RREG32_SDMA(i, mmSDMA0_F32_CNTL);
1132 temp = REG_SET_FIELD(temp, SDMA0_F32_CNTL, HALT, 0);
1133 WREG32_SDMA(i, mmSDMA0_F32_CNTL, temp);
1134 }
955 } 1135 }
956 1136
957 if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) { 1137 if (amdgpu_sriov_vf(adev)) {
958 r = sdma_v4_0_load_microcode(adev); 1138 sdma_v4_0_ctx_switch_enable(adev, true);
1139 sdma_v4_0_enable(adev, true);
1140 } else {
1141 r = sdma_v4_0_rlc_resume(adev);
959 if (r) 1142 if (r)
960 return r; 1143 return r;
961 } 1144 }
962 1145
963 /* unhalt the MEs */ 1146 for (i = 0; i < adev->sdma.num_instances; i++) {
964 sdma_v4_0_enable(adev, true); 1147 ring = &adev->sdma.instance[i].ring;
965 /* enable sdma ring preemption */
966 sdma_v4_0_ctx_switch_enable(adev, true);
967 1148
968 /* start the gfx rings and rlc compute queues */ 1149 r = amdgpu_ring_test_helper(ring);
969 r = sdma_v4_0_gfx_resume(adev); 1150 if (r)
970 if (r) 1151 return r;
971 return r; 1152
972 r = sdma_v4_0_rlc_resume(adev); 1153 if (adev->sdma.has_page_queue) {
1154 struct amdgpu_ring *page = &adev->sdma.instance[i].page;
1155
1156 r = amdgpu_ring_test_helper(page);
1157 if (r)
1158 return r;
1159
1160 if (adev->mman.buffer_funcs_ring == page)
1161 amdgpu_ttm_set_buffer_funcs_status(adev, true);
1162 }
1163
1164 if (adev->mman.buffer_funcs_ring == ring)
1165 amdgpu_ttm_set_buffer_funcs_status(adev, true);
1166 }
973 1167
974 return r; 1168 return r;
975} 1169}
@@ -993,21 +1187,16 @@ static int sdma_v4_0_ring_test_ring(struct amdgpu_ring *ring)
993 u64 gpu_addr; 1187 u64 gpu_addr;
994 1188
995 r = amdgpu_device_wb_get(adev, &index); 1189 r = amdgpu_device_wb_get(adev, &index);
996 if (r) { 1190 if (r)
997 dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
998 return r; 1191 return r;
999 }
1000 1192
1001 gpu_addr = adev->wb.gpu_addr + (index * 4); 1193 gpu_addr = adev->wb.gpu_addr + (index * 4);
1002 tmp = 0xCAFEDEAD; 1194 tmp = 0xCAFEDEAD;
1003 adev->wb.wb[index] = cpu_to_le32(tmp); 1195 adev->wb.wb[index] = cpu_to_le32(tmp);
1004 1196
1005 r = amdgpu_ring_alloc(ring, 5); 1197 r = amdgpu_ring_alloc(ring, 5);
1006 if (r) { 1198 if (r)
1007 DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r); 1199 goto error_free_wb;
1008 amdgpu_device_wb_free(adev, index);
1009 return r;
1010 }
1011 1200
1012 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) | 1201 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) |
1013 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR)); 1202 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR));
@@ -1024,15 +1213,11 @@ static int sdma_v4_0_ring_test_ring(struct amdgpu_ring *ring)
1024 DRM_UDELAY(1); 1213 DRM_UDELAY(1);
1025 } 1214 }
1026 1215
1027 if (i < adev->usec_timeout) { 1216 if (i >= adev->usec_timeout)
1028 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", ring->idx, i); 1217 r = -ETIMEDOUT;
1029 } else {
1030 DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
1031 ring->idx, tmp);
1032 r = -EINVAL;
1033 }
1034 amdgpu_device_wb_free(adev, index);
1035 1218
1219error_free_wb:
1220 amdgpu_device_wb_free(adev, index);
1036 return r; 1221 return r;
1037} 1222}
1038 1223
@@ -1055,20 +1240,16 @@ static int sdma_v4_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
1055 u64 gpu_addr; 1240 u64 gpu_addr;
1056 1241
1057 r = amdgpu_device_wb_get(adev, &index); 1242 r = amdgpu_device_wb_get(adev, &index);
1058 if (r) { 1243 if (r)
1059 dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
1060 return r; 1244 return r;
1061 }
1062 1245
1063 gpu_addr = adev->wb.gpu_addr + (index * 4); 1246 gpu_addr = adev->wb.gpu_addr + (index * 4);
1064 tmp = 0xCAFEDEAD; 1247 tmp = 0xCAFEDEAD;
1065 adev->wb.wb[index] = cpu_to_le32(tmp); 1248 adev->wb.wb[index] = cpu_to_le32(tmp);
1066 memset(&ib, 0, sizeof(ib)); 1249 memset(&ib, 0, sizeof(ib));
1067 r = amdgpu_ib_get(adev, NULL, 256, &ib); 1250 r = amdgpu_ib_get(adev, NULL, 256, &ib);
1068 if (r) { 1251 if (r)
1069 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
1070 goto err0; 1252 goto err0;
1071 }
1072 1253
1073 ib.ptr[0] = SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) | 1254 ib.ptr[0] = SDMA_PKT_HEADER_OP(SDMA_OP_WRITE) |
1074 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR); 1255 SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_WRITE_LINEAR);
@@ -1087,21 +1268,17 @@ static int sdma_v4_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
1087 1268
1088 r = dma_fence_wait_timeout(f, false, timeout); 1269 r = dma_fence_wait_timeout(f, false, timeout);
1089 if (r == 0) { 1270 if (r == 0) {
1090 DRM_ERROR("amdgpu: IB test timed out\n");
1091 r = -ETIMEDOUT; 1271 r = -ETIMEDOUT;
1092 goto err1; 1272 goto err1;
1093 } else if (r < 0) { 1273 } else if (r < 0) {
1094 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
1095 goto err1; 1274 goto err1;
1096 } 1275 }
1097 tmp = le32_to_cpu(adev->wb.wb[index]); 1276 tmp = le32_to_cpu(adev->wb.wb[index]);
1098 if (tmp == 0xDEADBEEF) { 1277 if (tmp == 0xDEADBEEF)
1099 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
1100 r = 0; 1278 r = 0;
1101 } else { 1279 else
1102 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
1103 r = -EINVAL; 1280 r = -EINVAL;
1104 } 1281
1105err1: 1282err1:
1106 amdgpu_ib_free(adev, &ib, NULL); 1283 amdgpu_ib_free(adev, &ib, NULL);
1107 dma_fence_put(f); 1284 dma_fence_put(f);
@@ -1206,7 +1383,7 @@ static void sdma_v4_0_vm_set_pte_pde(struct amdgpu_ib *ib,
1206 */ 1383 */
1207static void sdma_v4_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib) 1384static void sdma_v4_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
1208{ 1385{
1209 struct amdgpu_sdma_instance *sdma = amdgpu_get_sdma_instance(ring); 1386 struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
1210 u32 pad_count; 1387 u32 pad_count;
1211 int i; 1388 int i;
1212 1389
@@ -1276,10 +1453,18 @@ static int sdma_v4_0_early_init(void *handle)
1276{ 1453{
1277 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1454 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1278 1455
1279 if (adev->asic_type == CHIP_RAVEN) 1456 if (adev->asic_type == CHIP_RAVEN) {
1280 adev->sdma.num_instances = 1; 1457 adev->sdma.num_instances = 1;
1281 else 1458 adev->sdma.has_page_queue = false;
1459 } else {
1282 adev->sdma.num_instances = 2; 1460 adev->sdma.num_instances = 2;
1461 /* TODO: Page queue breaks driver reload under SRIOV */
1462 if ((adev->asic_type == CHIP_VEGA10) && amdgpu_sriov_vf((adev)))
1463 adev->sdma.has_page_queue = false;
1464 else if (adev->asic_type != CHIP_VEGA20 &&
1465 adev->asic_type != CHIP_VEGA12)
1466 adev->sdma.has_page_queue = true;
1467 }
1283 1468
1284 sdma_v4_0_set_ring_funcs(adev); 1469 sdma_v4_0_set_ring_funcs(adev);
1285 sdma_v4_0_set_buffer_funcs(adev); 1470 sdma_v4_0_set_buffer_funcs(adev);
@@ -1340,6 +1525,21 @@ static int sdma_v4_0_sw_init(void *handle)
1340 AMDGPU_SDMA_IRQ_TRAP1); 1525 AMDGPU_SDMA_IRQ_TRAP1);
1341 if (r) 1526 if (r)
1342 return r; 1527 return r;
1528
1529 if (adev->sdma.has_page_queue) {
1530 ring = &adev->sdma.instance[i].page;
1531 ring->ring_obj = NULL;
1532 ring->use_doorbell = false;
1533
1534 sprintf(ring->name, "page%d", i);
1535 r = amdgpu_ring_init(adev, ring, 1024,
1536 &adev->sdma.trap_irq,
1537 (i == 0) ?
1538 AMDGPU_SDMA_IRQ_TRAP0 :
1539 AMDGPU_SDMA_IRQ_TRAP1);
1540 if (r)
1541 return r;
1542 }
1343 } 1543 }
1344 1544
1345 return r; 1545 return r;
@@ -1350,8 +1550,11 @@ static int sdma_v4_0_sw_fini(void *handle)
1350 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1550 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1351 int i; 1551 int i;
1352 1552
1353 for (i = 0; i < adev->sdma.num_instances; i++) 1553 for (i = 0; i < adev->sdma.num_instances; i++) {
1354 amdgpu_ring_fini(&adev->sdma.instance[i].ring); 1554 amdgpu_ring_fini(&adev->sdma.instance[i].ring);
1555 if (adev->sdma.has_page_queue)
1556 amdgpu_ring_fini(&adev->sdma.instance[i].page);
1557 }
1355 1558
1356 for (i = 0; i < adev->sdma.num_instances; i++) { 1559 for (i = 0; i < adev->sdma.num_instances; i++) {
1357 release_firmware(adev->sdma.instance[i].fw); 1560 release_firmware(adev->sdma.instance[i].fw);
@@ -1414,7 +1617,7 @@ static bool sdma_v4_0_is_idle(void *handle)
1414 u32 i; 1617 u32 i;
1415 1618
1416 for (i = 0; i < adev->sdma.num_instances; i++) { 1619 for (i = 0; i < adev->sdma.num_instances; i++) {
1417 u32 tmp = RREG32(sdma_v4_0_get_reg_offset(adev, i, mmSDMA0_STATUS_REG)); 1620 u32 tmp = RREG32_SDMA(i, mmSDMA0_STATUS_REG);
1418 1621
1419 if (!(tmp & SDMA0_STATUS_REG__IDLE_MASK)) 1622 if (!(tmp & SDMA0_STATUS_REG__IDLE_MASK))
1420 return false; 1623 return false;
@@ -1430,8 +1633,8 @@ static int sdma_v4_0_wait_for_idle(void *handle)
1430 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1633 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
1431 1634
1432 for (i = 0; i < adev->usec_timeout; i++) { 1635 for (i = 0; i < adev->usec_timeout; i++) {
1433 sdma0 = RREG32(sdma_v4_0_get_reg_offset(adev, 0, mmSDMA0_STATUS_REG)); 1636 sdma0 = RREG32_SDMA(0, mmSDMA0_STATUS_REG);
1434 sdma1 = RREG32(sdma_v4_0_get_reg_offset(adev, 1, mmSDMA0_STATUS_REG)); 1637 sdma1 = RREG32_SDMA(1, mmSDMA0_STATUS_REG);
1435 1638
1436 if (sdma0 & sdma1 & SDMA0_STATUS_REG__IDLE_MASK) 1639 if (sdma0 & sdma1 & SDMA0_STATUS_REG__IDLE_MASK)
1437 return 0; 1640 return 0;
@@ -1452,16 +1655,13 @@ static int sdma_v4_0_set_trap_irq_state(struct amdgpu_device *adev,
1452 unsigned type, 1655 unsigned type,
1453 enum amdgpu_interrupt_state state) 1656 enum amdgpu_interrupt_state state)
1454{ 1657{
1658 unsigned int instance = (type == AMDGPU_SDMA_IRQ_TRAP0) ? 0 : 1;
1455 u32 sdma_cntl; 1659 u32 sdma_cntl;
1456 1660
1457 u32 reg_offset = (type == AMDGPU_SDMA_IRQ_TRAP0) ? 1661 sdma_cntl = RREG32_SDMA(instance, mmSDMA0_CNTL);
1458 sdma_v4_0_get_reg_offset(adev, 0, mmSDMA0_CNTL) :
1459 sdma_v4_0_get_reg_offset(adev, 1, mmSDMA0_CNTL);
1460
1461 sdma_cntl = RREG32(reg_offset);
1462 sdma_cntl = REG_SET_FIELD(sdma_cntl, SDMA0_CNTL, TRAP_ENABLE, 1662 sdma_cntl = REG_SET_FIELD(sdma_cntl, SDMA0_CNTL, TRAP_ENABLE,
1463 state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0); 1663 state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0);
1464 WREG32(reg_offset, sdma_cntl); 1664 WREG32_SDMA(instance, mmSDMA0_CNTL, sdma_cntl);
1465 1665
1466 return 0; 1666 return 0;
1467} 1667}
@@ -1470,39 +1670,32 @@ static int sdma_v4_0_process_trap_irq(struct amdgpu_device *adev,
1470 struct amdgpu_irq_src *source, 1670 struct amdgpu_irq_src *source,
1471 struct amdgpu_iv_entry *entry) 1671 struct amdgpu_iv_entry *entry)
1472{ 1672{
1673 uint32_t instance;
1674
1473 DRM_DEBUG("IH: SDMA trap\n"); 1675 DRM_DEBUG("IH: SDMA trap\n");
1474 switch (entry->client_id) { 1676 switch (entry->client_id) {
1475 case SOC15_IH_CLIENTID_SDMA0: 1677 case SOC15_IH_CLIENTID_SDMA0:
1476 switch (entry->ring_id) { 1678 instance = 0;
1477 case 0:
1478 amdgpu_fence_process(&adev->sdma.instance[0].ring);
1479 break;
1480 case 1:
1481 /* XXX compute */
1482 break;
1483 case 2:
1484 /* XXX compute */
1485 break;
1486 case 3:
1487 /* XXX page queue*/
1488 break;
1489 }
1490 break; 1679 break;
1491 case SOC15_IH_CLIENTID_SDMA1: 1680 case SOC15_IH_CLIENTID_SDMA1:
1492 switch (entry->ring_id) { 1681 instance = 1;
1493 case 0: 1682 break;
1494 amdgpu_fence_process(&adev->sdma.instance[1].ring); 1683 default:
1495 break; 1684 return 0;
1496 case 1: 1685 }
1497 /* XXX compute */ 1686
1498 break; 1687 switch (entry->ring_id) {
1499 case 2: 1688 case 0:
1500 /* XXX compute */ 1689 amdgpu_fence_process(&adev->sdma.instance[instance].ring);
1501 break; 1690 break;
1502 case 3: 1691 case 1:
1503 /* XXX page queue*/ 1692 /* XXX compute */
1504 break; 1693 break;
1505 } 1694 case 2:
1695 /* XXX compute */
1696 break;
1697 case 3:
1698 amdgpu_fence_process(&adev->sdma.instance[instance].page);
1506 break; 1699 break;
1507 } 1700 }
1508 return 0; 1701 return 0;
@@ -1512,12 +1705,29 @@ static int sdma_v4_0_process_illegal_inst_irq(struct amdgpu_device *adev,
1512 struct amdgpu_irq_src *source, 1705 struct amdgpu_irq_src *source,
1513 struct amdgpu_iv_entry *entry) 1706 struct amdgpu_iv_entry *entry)
1514{ 1707{
1708 int instance;
1709
1515 DRM_ERROR("Illegal instruction in SDMA command stream\n"); 1710 DRM_ERROR("Illegal instruction in SDMA command stream\n");
1516 schedule_work(&adev->reset_work); 1711
1712 switch (entry->client_id) {
1713 case SOC15_IH_CLIENTID_SDMA0:
1714 instance = 0;
1715 break;
1716 case SOC15_IH_CLIENTID_SDMA1:
1717 instance = 1;
1718 break;
1719 default:
1720 return 0;
1721 }
1722
1723 switch (entry->ring_id) {
1724 case 0:
1725 drm_sched_fault(&adev->sdma.instance[instance].ring.sched);
1726 break;
1727 }
1517 return 0; 1728 return 0;
1518} 1729}
1519 1730
1520
1521static void sdma_v4_0_update_medium_grain_clock_gating( 1731static void sdma_v4_0_update_medium_grain_clock_gating(
1522 struct amdgpu_device *adev, 1732 struct amdgpu_device *adev,
1523 bool enable) 1733 bool enable)
@@ -1730,6 +1940,38 @@ static const struct amdgpu_ring_funcs sdma_v4_0_ring_funcs = {
1730 .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper, 1940 .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper,
1731}; 1941};
1732 1942
1943static const struct amdgpu_ring_funcs sdma_v4_0_page_ring_funcs = {
1944 .type = AMDGPU_RING_TYPE_SDMA,
1945 .align_mask = 0xf,
1946 .nop = SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP),
1947 .support_64bit_ptrs = true,
1948 .vmhub = AMDGPU_MMHUB,
1949 .get_rptr = sdma_v4_0_ring_get_rptr,
1950 .get_wptr = sdma_v4_0_page_ring_get_wptr,
1951 .set_wptr = sdma_v4_0_page_ring_set_wptr,
1952 .emit_frame_size =
1953 6 + /* sdma_v4_0_ring_emit_hdp_flush */
1954 3 + /* hdp invalidate */
1955 6 + /* sdma_v4_0_ring_emit_pipeline_sync */
1956 /* sdma_v4_0_ring_emit_vm_flush */
1957 SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 +
1958 SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 6 +
1959 10 + 10 + 10, /* sdma_v4_0_ring_emit_fence x3 for user fence, vm fence */
1960 .emit_ib_size = 7 + 6, /* sdma_v4_0_ring_emit_ib */
1961 .emit_ib = sdma_v4_0_ring_emit_ib,
1962 .emit_fence = sdma_v4_0_ring_emit_fence,
1963 .emit_pipeline_sync = sdma_v4_0_ring_emit_pipeline_sync,
1964 .emit_vm_flush = sdma_v4_0_ring_emit_vm_flush,
1965 .emit_hdp_flush = sdma_v4_0_ring_emit_hdp_flush,
1966 .test_ring = sdma_v4_0_ring_test_ring,
1967 .test_ib = sdma_v4_0_ring_test_ib,
1968 .insert_nop = sdma_v4_0_ring_insert_nop,
1969 .pad_ib = sdma_v4_0_ring_pad_ib,
1970 .emit_wreg = sdma_v4_0_ring_emit_wreg,
1971 .emit_reg_wait = sdma_v4_0_ring_emit_reg_wait,
1972 .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper,
1973};
1974
1733static void sdma_v4_0_set_ring_funcs(struct amdgpu_device *adev) 1975static void sdma_v4_0_set_ring_funcs(struct amdgpu_device *adev)
1734{ 1976{
1735 int i; 1977 int i;
@@ -1737,6 +1979,10 @@ static void sdma_v4_0_set_ring_funcs(struct amdgpu_device *adev)
1737 for (i = 0; i < adev->sdma.num_instances; i++) { 1979 for (i = 0; i < adev->sdma.num_instances; i++) {
1738 adev->sdma.instance[i].ring.funcs = &sdma_v4_0_ring_funcs; 1980 adev->sdma.instance[i].ring.funcs = &sdma_v4_0_ring_funcs;
1739 adev->sdma.instance[i].ring.me = i; 1981 adev->sdma.instance[i].ring.me = i;
1982 if (adev->sdma.has_page_queue) {
1983 adev->sdma.instance[i].page.funcs = &sdma_v4_0_page_ring_funcs;
1984 adev->sdma.instance[i].page.me = i;
1985 }
1740 } 1986 }
1741} 1987}
1742 1988
@@ -1818,7 +2064,10 @@ static const struct amdgpu_buffer_funcs sdma_v4_0_buffer_funcs = {
1818static void sdma_v4_0_set_buffer_funcs(struct amdgpu_device *adev) 2064static void sdma_v4_0_set_buffer_funcs(struct amdgpu_device *adev)
1819{ 2065{
1820 adev->mman.buffer_funcs = &sdma_v4_0_buffer_funcs; 2066 adev->mman.buffer_funcs = &sdma_v4_0_buffer_funcs;
1821 adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring; 2067 if (adev->sdma.has_page_queue)
2068 adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].page;
2069 else
2070 adev->mman.buffer_funcs_ring = &adev->sdma.instance[0].ring;
1822} 2071}
1823 2072
1824static const struct amdgpu_vm_pte_funcs sdma_v4_0_vm_pte_funcs = { 2073static const struct amdgpu_vm_pte_funcs sdma_v4_0_vm_pte_funcs = {
@@ -1836,7 +2085,10 @@ static void sdma_v4_0_set_vm_pte_funcs(struct amdgpu_device *adev)
1836 2085
1837 adev->vm_manager.vm_pte_funcs = &sdma_v4_0_vm_pte_funcs; 2086 adev->vm_manager.vm_pte_funcs = &sdma_v4_0_vm_pte_funcs;
1838 for (i = 0; i < adev->sdma.num_instances; i++) { 2087 for (i = 0; i < adev->sdma.num_instances; i++) {
1839 sched = &adev->sdma.instance[i].ring.sched; 2088 if (adev->sdma.has_page_queue)
2089 sched = &adev->sdma.instance[i].page.sched;
2090 else
2091 sched = &adev->sdma.instance[i].ring.sched;
1840 adev->vm_manager.vm_pte_rqs[i] = 2092 adev->vm_manager.vm_pte_rqs[i] =
1841 &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL]; 2093 &sched->sched_rq[DRM_SCHED_PRIORITY_KERNEL];
1842 } 2094 }
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dma.c b/drivers/gpu/drm/amd/amdgpu/si_dma.c
index adbaea6da0d7..b6e473134e19 100644
--- a/drivers/gpu/drm/amd/amdgpu/si_dma.c
+++ b/drivers/gpu/drm/amd/amdgpu/si_dma.c
@@ -61,9 +61,11 @@ static void si_dma_ring_set_wptr(struct amdgpu_ring *ring)
61} 61}
62 62
63static void si_dma_ring_emit_ib(struct amdgpu_ring *ring, 63static void si_dma_ring_emit_ib(struct amdgpu_ring *ring,
64 struct amdgpu_job *job,
64 struct amdgpu_ib *ib, 65 struct amdgpu_ib *ib,
65 unsigned vmid, bool ctx_switch) 66 bool ctx_switch)
66{ 67{
68 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
67 /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring. 69 /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring.
68 * Pad as necessary with NOPs. 70 * Pad as necessary with NOPs.
69 */ 71 */
@@ -122,7 +124,7 @@ static void si_dma_stop(struct amdgpu_device *adev)
122 124
123 if (adev->mman.buffer_funcs_ring == ring) 125 if (adev->mman.buffer_funcs_ring == ring)
124 amdgpu_ttm_set_buffer_funcs_status(adev, false); 126 amdgpu_ttm_set_buffer_funcs_status(adev, false);
125 ring->ready = false; 127 ring->sched.ready = false;
126 } 128 }
127} 129}
128 130
@@ -175,13 +177,11 @@ static int si_dma_start(struct amdgpu_device *adev)
175 WREG32(DMA_RB_WPTR + sdma_offsets[i], lower_32_bits(ring->wptr) << 2); 177 WREG32(DMA_RB_WPTR + sdma_offsets[i], lower_32_bits(ring->wptr) << 2);
176 WREG32(DMA_RB_CNTL + sdma_offsets[i], rb_cntl | DMA_RB_ENABLE); 178 WREG32(DMA_RB_CNTL + sdma_offsets[i], rb_cntl | DMA_RB_ENABLE);
177 179
178 ring->ready = true; 180 ring->sched.ready = true;
179 181
180 r = amdgpu_ring_test_ring(ring); 182 r = amdgpu_ring_test_helper(ring);
181 if (r) { 183 if (r)
182 ring->ready = false;
183 return r; 184 return r;
184 }
185 185
186 if (adev->mman.buffer_funcs_ring == ring) 186 if (adev->mman.buffer_funcs_ring == ring)
187 amdgpu_ttm_set_buffer_funcs_status(adev, true); 187 amdgpu_ttm_set_buffer_funcs_status(adev, true);
@@ -209,21 +209,16 @@ static int si_dma_ring_test_ring(struct amdgpu_ring *ring)
209 u64 gpu_addr; 209 u64 gpu_addr;
210 210
211 r = amdgpu_device_wb_get(adev, &index); 211 r = amdgpu_device_wb_get(adev, &index);
212 if (r) { 212 if (r)
213 dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
214 return r; 213 return r;
215 }
216 214
217 gpu_addr = adev->wb.gpu_addr + (index * 4); 215 gpu_addr = adev->wb.gpu_addr + (index * 4);
218 tmp = 0xCAFEDEAD; 216 tmp = 0xCAFEDEAD;
219 adev->wb.wb[index] = cpu_to_le32(tmp); 217 adev->wb.wb[index] = cpu_to_le32(tmp);
220 218
221 r = amdgpu_ring_alloc(ring, 4); 219 r = amdgpu_ring_alloc(ring, 4);
222 if (r) { 220 if (r)
223 DRM_ERROR("amdgpu: dma failed to lock ring %d (%d).\n", ring->idx, r); 221 goto error_free_wb;
224 amdgpu_device_wb_free(adev, index);
225 return r;
226 }
227 222
228 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, 1)); 223 amdgpu_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, 1));
229 amdgpu_ring_write(ring, lower_32_bits(gpu_addr)); 224 amdgpu_ring_write(ring, lower_32_bits(gpu_addr));
@@ -238,15 +233,11 @@ static int si_dma_ring_test_ring(struct amdgpu_ring *ring)
238 DRM_UDELAY(1); 233 DRM_UDELAY(1);
239 } 234 }
240 235
241 if (i < adev->usec_timeout) { 236 if (i >= adev->usec_timeout)
242 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", ring->idx, i); 237 r = -ETIMEDOUT;
243 } else {
244 DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
245 ring->idx, tmp);
246 r = -EINVAL;
247 }
248 amdgpu_device_wb_free(adev, index);
249 238
239error_free_wb:
240 amdgpu_device_wb_free(adev, index);
250 return r; 241 return r;
251} 242}
252 243
@@ -269,20 +260,16 @@ static int si_dma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
269 long r; 260 long r;
270 261
271 r = amdgpu_device_wb_get(adev, &index); 262 r = amdgpu_device_wb_get(adev, &index);
272 if (r) { 263 if (r)
273 dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
274 return r; 264 return r;
275 }
276 265
277 gpu_addr = adev->wb.gpu_addr + (index * 4); 266 gpu_addr = adev->wb.gpu_addr + (index * 4);
278 tmp = 0xCAFEDEAD; 267 tmp = 0xCAFEDEAD;
279 adev->wb.wb[index] = cpu_to_le32(tmp); 268 adev->wb.wb[index] = cpu_to_le32(tmp);
280 memset(&ib, 0, sizeof(ib)); 269 memset(&ib, 0, sizeof(ib));
281 r = amdgpu_ib_get(adev, NULL, 256, &ib); 270 r = amdgpu_ib_get(adev, NULL, 256, &ib);
282 if (r) { 271 if (r)
283 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
284 goto err0; 272 goto err0;
285 }
286 273
287 ib.ptr[0] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, 1); 274 ib.ptr[0] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, 1);
288 ib.ptr[1] = lower_32_bits(gpu_addr); 275 ib.ptr[1] = lower_32_bits(gpu_addr);
@@ -295,21 +282,16 @@ static int si_dma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
295 282
296 r = dma_fence_wait_timeout(f, false, timeout); 283 r = dma_fence_wait_timeout(f, false, timeout);
297 if (r == 0) { 284 if (r == 0) {
298 DRM_ERROR("amdgpu: IB test timed out\n");
299 r = -ETIMEDOUT; 285 r = -ETIMEDOUT;
300 goto err1; 286 goto err1;
301 } else if (r < 0) { 287 } else if (r < 0) {
302 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
303 goto err1; 288 goto err1;
304 } 289 }
305 tmp = le32_to_cpu(adev->wb.wb[index]); 290 tmp = le32_to_cpu(adev->wb.wb[index]);
306 if (tmp == 0xDEADBEEF) { 291 if (tmp == 0xDEADBEEF)
307 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
308 r = 0; 292 r = 0;
309 } else { 293 else
310 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
311 r = -EINVAL; 294 r = -EINVAL;
312 }
313 295
314err1: 296err1:
315 amdgpu_ib_free(adev, &ib, NULL); 297 amdgpu_ib_free(adev, &ib, NULL);
@@ -658,15 +640,6 @@ static int si_dma_process_trap_irq(struct amdgpu_device *adev,
658 return 0; 640 return 0;
659} 641}
660 642
661static int si_dma_process_illegal_inst_irq(struct amdgpu_device *adev,
662 struct amdgpu_irq_src *source,
663 struct amdgpu_iv_entry *entry)
664{
665 DRM_ERROR("Illegal instruction in SDMA command stream\n");
666 schedule_work(&adev->reset_work);
667 return 0;
668}
669
670static int si_dma_set_clockgating_state(void *handle, 643static int si_dma_set_clockgating_state(void *handle,
671 enum amd_clockgating_state state) 644 enum amd_clockgating_state state)
672{ 645{
@@ -781,15 +754,10 @@ static const struct amdgpu_irq_src_funcs si_dma_trap_irq_funcs = {
781 .process = si_dma_process_trap_irq, 754 .process = si_dma_process_trap_irq,
782}; 755};
783 756
784static const struct amdgpu_irq_src_funcs si_dma_illegal_inst_irq_funcs = {
785 .process = si_dma_process_illegal_inst_irq,
786};
787
788static void si_dma_set_irq_funcs(struct amdgpu_device *adev) 757static void si_dma_set_irq_funcs(struct amdgpu_device *adev)
789{ 758{
790 adev->sdma.trap_irq.num_types = AMDGPU_SDMA_IRQ_LAST; 759 adev->sdma.trap_irq.num_types = AMDGPU_SDMA_IRQ_LAST;
791 adev->sdma.trap_irq.funcs = &si_dma_trap_irq_funcs; 760 adev->sdma.trap_irq.funcs = &si_dma_trap_irq_funcs;
792 adev->sdma.illegal_inst_irq.funcs = &si_dma_illegal_inst_irq_funcs;
793} 761}
794 762
795/** 763/**
diff --git a/drivers/gpu/drm/amd/amdgpu/ta_xgmi_if.h b/drivers/gpu/drm/amd/amdgpu/ta_xgmi_if.h
new file mode 100644
index 000000000000..ac2c27b7630c
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/ta_xgmi_if.h
@@ -0,0 +1,130 @@
1/*
2 * Copyright 2018 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 */
23
24#ifndef _TA_XGMI_IF_H
25#define _TA_XGMI_IF_H
26
27/* Responses have bit 31 set */
28#define RSP_ID_MASK (1U << 31)
29#define RSP_ID(cmdId) (((uint32_t)(cmdId)) | RSP_ID_MASK)
30
31enum ta_command_xgmi {
32 TA_COMMAND_XGMI__INITIALIZE = 0x00,
33 TA_COMMAND_XGMI__GET_NODE_ID = 0x01,
34 TA_COMMAND_XGMI__GET_HIVE_ID = 0x02,
35 TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO = 0x03,
36 TA_COMMAND_XGMI__SET_TOPOLOGY_INFO = 0x04
37};
38
39/* XGMI related enumerations */
40/**********************************************************/;
41enum ta_xgmi_connected_nodes {
42 TA_XGMI__MAX_CONNECTED_NODES = 64
43};
44
45enum ta_xgmi_status {
46 TA_XGMI_STATUS__SUCCESS = 0x00,
47 TA_XGMI_STATUS__GENERIC_FAILURE = 0x01,
48 TA_XGMI_STATUS__NULL_POINTER = 0x02,
49 TA_XGMI_STATUS__INVALID_PARAMETER = 0x03,
50 TA_XGMI_STATUS__NOT_INITIALIZED = 0x04,
51 TA_XGMI_STATUS__INVALID_NODE_NUM = 0x05,
52 TA_XGMI_STATUS__INVALID_NODE_ID = 0x06,
53 TA_XGMI_STATUS__INVALID_TOPOLOGY = 0x07,
54 TA_XGMI_STATUS__FAILED_ID_GEN = 0x08,
55 TA_XGMI_STATUS__FAILED_TOPOLOGY_INIT = 0x09,
56 TA_XGMI_STATUS__SET_SHARING_ERROR = 0x0A
57};
58
59enum ta_xgmi_assigned_sdma_engine {
60 TA_XGMI_ASSIGNED_SDMA_ENGINE__NOT_ASSIGNED = -1,
61 TA_XGMI_ASSIGNED_SDMA_ENGINE__SDMA0 = 0,
62 TA_XGMI_ASSIGNED_SDMA_ENGINE__SDMA1 = 1,
63 TA_XGMI_ASSIGNED_SDMA_ENGINE__SDMA2 = 2,
64 TA_XGMI_ASSIGNED_SDMA_ENGINE__SDMA3 = 3,
65 TA_XGMI_ASSIGNED_SDMA_ENGINE__SDMA4 = 4,
66 TA_XGMI_ASSIGNED_SDMA_ENGINE__SDMA5 = 5
67};
68
69/* input/output structures for XGMI commands */
70/**********************************************************/
71struct ta_xgmi_node_info {
72 uint64_t node_id;
73 uint8_t num_hops;
74 uint8_t is_sharing_enabled;
75 enum ta_xgmi_assigned_sdma_engine sdma_engine;
76};
77
78struct ta_xgmi_cmd_initialize_output {
79 uint32_t status;
80};
81
82struct ta_xgmi_cmd_get_node_id_output {
83 uint64_t node_id;
84};
85
86struct ta_xgmi_cmd_get_hive_id_output {
87 uint64_t hive_id;
88};
89
90struct ta_xgmi_cmd_get_topology_info_input {
91 uint32_t num_nodes;
92 struct ta_xgmi_node_info nodes[TA_XGMI__MAX_CONNECTED_NODES];
93};
94
95struct ta_xgmi_cmd_get_topology_info_output {
96 uint32_t num_nodes;
97 struct ta_xgmi_node_info nodes[TA_XGMI__MAX_CONNECTED_NODES];
98};
99
100struct ta_xgmi_cmd_set_topology_info_input {
101 uint32_t num_nodes;
102 struct ta_xgmi_node_info nodes[TA_XGMI__MAX_CONNECTED_NODES];
103};
104
105/**********************************************************/
106/* Common input structure for XGMI callbacks */
107union ta_xgmi_cmd_input {
108 struct ta_xgmi_cmd_get_topology_info_input get_topology_info;
109 struct ta_xgmi_cmd_set_topology_info_input set_topology_info;
110};
111
112/* Common output structure for XGMI callbacks */
113union ta_xgmi_cmd_output {
114 struct ta_xgmi_cmd_initialize_output initialize;
115 struct ta_xgmi_cmd_get_node_id_output get_node_id;
116 struct ta_xgmi_cmd_get_hive_id_output get_hive_id;
117 struct ta_xgmi_cmd_get_topology_info_output get_topology_info;
118};
119/**********************************************************/
120
121struct ta_xgmi_shared_memory {
122 uint32_t cmd_id;
123 uint32_t resp_id;
124 enum ta_xgmi_status xgmi_status;
125 uint32_t reserved;
126 union ta_xgmi_cmd_input xgmi_in_message;
127 union ta_xgmi_cmd_output xgmi_out_message;
128};
129
130#endif //_TA_XGMI_IF_H
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
index 1fc17bf39fed..90bbcee00f28 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
@@ -162,12 +162,9 @@ static int uvd_v4_2_hw_init(void *handle)
162 uvd_v4_2_enable_mgcg(adev, true); 162 uvd_v4_2_enable_mgcg(adev, true);
163 amdgpu_asic_set_uvd_clocks(adev, 10000, 10000); 163 amdgpu_asic_set_uvd_clocks(adev, 10000, 10000);
164 164
165 ring->ready = true; 165 r = amdgpu_ring_test_helper(ring);
166 r = amdgpu_ring_test_ring(ring); 166 if (r)
167 if (r) {
168 ring->ready = false;
169 goto done; 167 goto done;
170 }
171 168
172 r = amdgpu_ring_alloc(ring, 10); 169 r = amdgpu_ring_alloc(ring, 10);
173 if (r) { 170 if (r) {
@@ -218,7 +215,7 @@ static int uvd_v4_2_hw_fini(void *handle)
218 if (RREG32(mmUVD_STATUS) != 0) 215 if (RREG32(mmUVD_STATUS) != 0)
219 uvd_v4_2_stop(adev); 216 uvd_v4_2_stop(adev);
220 217
221 ring->ready = false; 218 ring->sched.ready = false;
222 219
223 return 0; 220 return 0;
224} 221}
@@ -484,11 +481,9 @@ static int uvd_v4_2_ring_test_ring(struct amdgpu_ring *ring)
484 481
485 WREG32(mmUVD_CONTEXT_ID, 0xCAFEDEAD); 482 WREG32(mmUVD_CONTEXT_ID, 0xCAFEDEAD);
486 r = amdgpu_ring_alloc(ring, 3); 483 r = amdgpu_ring_alloc(ring, 3);
487 if (r) { 484 if (r)
488 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n",
489 ring->idx, r);
490 return r; 485 return r;
491 } 486
492 amdgpu_ring_write(ring, PACKET0(mmUVD_CONTEXT_ID, 0)); 487 amdgpu_ring_write(ring, PACKET0(mmUVD_CONTEXT_ID, 0));
493 amdgpu_ring_write(ring, 0xDEADBEEF); 488 amdgpu_ring_write(ring, 0xDEADBEEF);
494 amdgpu_ring_commit(ring); 489 amdgpu_ring_commit(ring);
@@ -499,14 +494,9 @@ static int uvd_v4_2_ring_test_ring(struct amdgpu_ring *ring)
499 DRM_UDELAY(1); 494 DRM_UDELAY(1);
500 } 495 }
501 496
502 if (i < adev->usec_timeout) { 497 if (i >= adev->usec_timeout)
503 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", 498 r = -ETIMEDOUT;
504 ring->idx, i); 499
505 } else {
506 DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
507 ring->idx, tmp);
508 r = -EINVAL;
509 }
510 return r; 500 return r;
511} 501}
512 502
@@ -519,8 +509,9 @@ static int uvd_v4_2_ring_test_ring(struct amdgpu_ring *ring)
519 * Write ring commands to execute the indirect buffer 509 * Write ring commands to execute the indirect buffer
520 */ 510 */
521static void uvd_v4_2_ring_emit_ib(struct amdgpu_ring *ring, 511static void uvd_v4_2_ring_emit_ib(struct amdgpu_ring *ring,
512 struct amdgpu_job *job,
522 struct amdgpu_ib *ib, 513 struct amdgpu_ib *ib,
523 unsigned vmid, bool ctx_switch) 514 bool ctx_switch)
524{ 515{
525 amdgpu_ring_write(ring, PACKET0(mmUVD_RBC_IB_BASE, 0)); 516 amdgpu_ring_write(ring, PACKET0(mmUVD_RBC_IB_BASE, 0));
526 amdgpu_ring_write(ring, ib->gpu_addr); 517 amdgpu_ring_write(ring, ib->gpu_addr);
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
index fde6ad5ac9ab..1c5e12703103 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
@@ -158,12 +158,9 @@ static int uvd_v5_0_hw_init(void *handle)
158 uvd_v5_0_set_clockgating_state(adev, AMD_CG_STATE_UNGATE); 158 uvd_v5_0_set_clockgating_state(adev, AMD_CG_STATE_UNGATE);
159 uvd_v5_0_enable_mgcg(adev, true); 159 uvd_v5_0_enable_mgcg(adev, true);
160 160
161 ring->ready = true; 161 r = amdgpu_ring_test_helper(ring);
162 r = amdgpu_ring_test_ring(ring); 162 if (r)
163 if (r) {
164 ring->ready = false;
165 goto done; 163 goto done;
166 }
167 164
168 r = amdgpu_ring_alloc(ring, 10); 165 r = amdgpu_ring_alloc(ring, 10);
169 if (r) { 166 if (r) {
@@ -215,7 +212,7 @@ static int uvd_v5_0_hw_fini(void *handle)
215 if (RREG32(mmUVD_STATUS) != 0) 212 if (RREG32(mmUVD_STATUS) != 0)
216 uvd_v5_0_stop(adev); 213 uvd_v5_0_stop(adev);
217 214
218 ring->ready = false; 215 ring->sched.ready = false;
219 216
220 return 0; 217 return 0;
221} 218}
@@ -500,11 +497,8 @@ static int uvd_v5_0_ring_test_ring(struct amdgpu_ring *ring)
500 497
501 WREG32(mmUVD_CONTEXT_ID, 0xCAFEDEAD); 498 WREG32(mmUVD_CONTEXT_ID, 0xCAFEDEAD);
502 r = amdgpu_ring_alloc(ring, 3); 499 r = amdgpu_ring_alloc(ring, 3);
503 if (r) { 500 if (r)
504 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n",
505 ring->idx, r);
506 return r; 501 return r;
507 }
508 amdgpu_ring_write(ring, PACKET0(mmUVD_CONTEXT_ID, 0)); 502 amdgpu_ring_write(ring, PACKET0(mmUVD_CONTEXT_ID, 0));
509 amdgpu_ring_write(ring, 0xDEADBEEF); 503 amdgpu_ring_write(ring, 0xDEADBEEF);
510 amdgpu_ring_commit(ring); 504 amdgpu_ring_commit(ring);
@@ -515,14 +509,9 @@ static int uvd_v5_0_ring_test_ring(struct amdgpu_ring *ring)
515 DRM_UDELAY(1); 509 DRM_UDELAY(1);
516 } 510 }
517 511
518 if (i < adev->usec_timeout) { 512 if (i >= adev->usec_timeout)
519 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", 513 r = -ETIMEDOUT;
520 ring->idx, i); 514
521 } else {
522 DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
523 ring->idx, tmp);
524 r = -EINVAL;
525 }
526 return r; 515 return r;
527} 516}
528 517
@@ -535,8 +524,9 @@ static int uvd_v5_0_ring_test_ring(struct amdgpu_ring *ring)
535 * Write ring commands to execute the indirect buffer 524 * Write ring commands to execute the indirect buffer
536 */ 525 */
537static void uvd_v5_0_ring_emit_ib(struct amdgpu_ring *ring, 526static void uvd_v5_0_ring_emit_ib(struct amdgpu_ring *ring,
527 struct amdgpu_job *job,
538 struct amdgpu_ib *ib, 528 struct amdgpu_ib *ib,
539 unsigned vmid, bool ctx_switch) 529 bool ctx_switch)
540{ 530{
541 amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_64BIT_BAR_LOW, 0)); 531 amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_64BIT_BAR_LOW, 0));
542 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); 532 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
index 7a5b40275e8e..f184842ef2a2 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
@@ -175,11 +175,8 @@ static int uvd_v6_0_enc_ring_test_ring(struct amdgpu_ring *ring)
175 int r; 175 int r;
176 176
177 r = amdgpu_ring_alloc(ring, 16); 177 r = amdgpu_ring_alloc(ring, 16);
178 if (r) { 178 if (r)
179 DRM_ERROR("amdgpu: uvd enc failed to lock ring %d (%d).\n",
180 ring->idx, r);
181 return r; 179 return r;
182 }
183 amdgpu_ring_write(ring, HEVC_ENC_CMD_END); 180 amdgpu_ring_write(ring, HEVC_ENC_CMD_END);
184 amdgpu_ring_commit(ring); 181 amdgpu_ring_commit(ring);
185 182
@@ -189,14 +186,8 @@ static int uvd_v6_0_enc_ring_test_ring(struct amdgpu_ring *ring)
189 DRM_UDELAY(1); 186 DRM_UDELAY(1);
190 } 187 }
191 188
192 if (i < adev->usec_timeout) { 189 if (i >= adev->usec_timeout)
193 DRM_DEBUG("ring test on %d succeeded in %d usecs\n",
194 ring->idx, i);
195 } else {
196 DRM_ERROR("amdgpu: ring %d test failed\n",
197 ring->idx);
198 r = -ETIMEDOUT; 190 r = -ETIMEDOUT;
199 }
200 191
201 return r; 192 return r;
202} 193}
@@ -336,31 +327,24 @@ static int uvd_v6_0_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout)
336 long r; 327 long r;
337 328
338 r = uvd_v6_0_enc_get_create_msg(ring, 1, NULL); 329 r = uvd_v6_0_enc_get_create_msg(ring, 1, NULL);
339 if (r) { 330 if (r)
340 DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
341 goto error; 331 goto error;
342 }
343 332
344 r = uvd_v6_0_enc_get_destroy_msg(ring, 1, &fence); 333 r = uvd_v6_0_enc_get_destroy_msg(ring, 1, &fence);
345 if (r) { 334 if (r)
346 DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
347 goto error; 335 goto error;
348 }
349 336
350 r = dma_fence_wait_timeout(fence, false, timeout); 337 r = dma_fence_wait_timeout(fence, false, timeout);
351 if (r == 0) { 338 if (r == 0)
352 DRM_ERROR("amdgpu: IB test timed out.\n");
353 r = -ETIMEDOUT; 339 r = -ETIMEDOUT;
354 } else if (r < 0) { 340 else if (r > 0)
355 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
356 } else {
357 DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx);
358 r = 0; 341 r = 0;
359 } 342
360error: 343error:
361 dma_fence_put(fence); 344 dma_fence_put(fence);
362 return r; 345 return r;
363} 346}
347
364static int uvd_v6_0_early_init(void *handle) 348static int uvd_v6_0_early_init(void *handle)
365{ 349{
366 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 350 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -476,12 +460,9 @@ static int uvd_v6_0_hw_init(void *handle)
476 uvd_v6_0_set_clockgating_state(adev, AMD_CG_STATE_UNGATE); 460 uvd_v6_0_set_clockgating_state(adev, AMD_CG_STATE_UNGATE);
477 uvd_v6_0_enable_mgcg(adev, true); 461 uvd_v6_0_enable_mgcg(adev, true);
478 462
479 ring->ready = true; 463 r = amdgpu_ring_test_helper(ring);
480 r = amdgpu_ring_test_ring(ring); 464 if (r)
481 if (r) {
482 ring->ready = false;
483 goto done; 465 goto done;
484 }
485 466
486 r = amdgpu_ring_alloc(ring, 10); 467 r = amdgpu_ring_alloc(ring, 10);
487 if (r) { 468 if (r) {
@@ -513,12 +494,9 @@ static int uvd_v6_0_hw_init(void *handle)
513 if (uvd_v6_0_enc_support(adev)) { 494 if (uvd_v6_0_enc_support(adev)) {
514 for (i = 0; i < adev->uvd.num_enc_rings; ++i) { 495 for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
515 ring = &adev->uvd.inst->ring_enc[i]; 496 ring = &adev->uvd.inst->ring_enc[i];
516 ring->ready = true; 497 r = amdgpu_ring_test_helper(ring);
517 r = amdgpu_ring_test_ring(ring); 498 if (r)
518 if (r) {
519 ring->ready = false;
520 goto done; 499 goto done;
521 }
522 } 500 }
523 } 501 }
524 502
@@ -548,7 +526,7 @@ static int uvd_v6_0_hw_fini(void *handle)
548 if (RREG32(mmUVD_STATUS) != 0) 526 if (RREG32(mmUVD_STATUS) != 0)
549 uvd_v6_0_stop(adev); 527 uvd_v6_0_stop(adev);
550 528
551 ring->ready = false; 529 ring->sched.ready = false;
552 530
553 return 0; 531 return 0;
554} 532}
@@ -969,11 +947,9 @@ static int uvd_v6_0_ring_test_ring(struct amdgpu_ring *ring)
969 947
970 WREG32(mmUVD_CONTEXT_ID, 0xCAFEDEAD); 948 WREG32(mmUVD_CONTEXT_ID, 0xCAFEDEAD);
971 r = amdgpu_ring_alloc(ring, 3); 949 r = amdgpu_ring_alloc(ring, 3);
972 if (r) { 950 if (r)
973 DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n",
974 ring->idx, r);
975 return r; 951 return r;
976 } 952
977 amdgpu_ring_write(ring, PACKET0(mmUVD_CONTEXT_ID, 0)); 953 amdgpu_ring_write(ring, PACKET0(mmUVD_CONTEXT_ID, 0));
978 amdgpu_ring_write(ring, 0xDEADBEEF); 954 amdgpu_ring_write(ring, 0xDEADBEEF);
979 amdgpu_ring_commit(ring); 955 amdgpu_ring_commit(ring);
@@ -984,14 +960,9 @@ static int uvd_v6_0_ring_test_ring(struct amdgpu_ring *ring)
984 DRM_UDELAY(1); 960 DRM_UDELAY(1);
985 } 961 }
986 962
987 if (i < adev->usec_timeout) { 963 if (i >= adev->usec_timeout)
988 DRM_DEBUG("ring test on %d succeeded in %d usecs\n", 964 r = -ETIMEDOUT;
989 ring->idx, i); 965
990 } else {
991 DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n",
992 ring->idx, tmp);
993 r = -EINVAL;
994 }
995 return r; 966 return r;
996} 967}
997 968
@@ -1004,9 +975,12 @@ static int uvd_v6_0_ring_test_ring(struct amdgpu_ring *ring)
1004 * Write ring commands to execute the indirect buffer 975 * Write ring commands to execute the indirect buffer
1005 */ 976 */
1006static void uvd_v6_0_ring_emit_ib(struct amdgpu_ring *ring, 977static void uvd_v6_0_ring_emit_ib(struct amdgpu_ring *ring,
978 struct amdgpu_job *job,
1007 struct amdgpu_ib *ib, 979 struct amdgpu_ib *ib,
1008 unsigned vmid, bool ctx_switch) 980 bool ctx_switch)
1009{ 981{
982 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
983
1010 amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_VMID, 0)); 984 amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_VMID, 0));
1011 amdgpu_ring_write(ring, vmid); 985 amdgpu_ring_write(ring, vmid);
1012 986
@@ -1027,8 +1001,12 @@ static void uvd_v6_0_ring_emit_ib(struct amdgpu_ring *ring,
1027 * Write enc ring commands to execute the indirect buffer 1001 * Write enc ring commands to execute the indirect buffer
1028 */ 1002 */
1029static void uvd_v6_0_enc_ring_emit_ib(struct amdgpu_ring *ring, 1003static void uvd_v6_0_enc_ring_emit_ib(struct amdgpu_ring *ring,
1030 struct amdgpu_ib *ib, unsigned int vmid, bool ctx_switch) 1004 struct amdgpu_job *job,
1005 struct amdgpu_ib *ib,
1006 bool ctx_switch)
1031{ 1007{
1008 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
1009
1032 amdgpu_ring_write(ring, HEVC_ENC_CMD_IB_VM); 1010 amdgpu_ring_write(ring, HEVC_ENC_CMD_IB_VM);
1033 amdgpu_ring_write(ring, vmid); 1011 amdgpu_ring_write(ring, vmid);
1034 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); 1012 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
index 58b39afcfb86..8a4595968d98 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
@@ -183,11 +183,8 @@ static int uvd_v7_0_enc_ring_test_ring(struct amdgpu_ring *ring)
183 return 0; 183 return 0;
184 184
185 r = amdgpu_ring_alloc(ring, 16); 185 r = amdgpu_ring_alloc(ring, 16);
186 if (r) { 186 if (r)
187 DRM_ERROR("amdgpu: uvd enc failed to lock (%d)ring %d (%d).\n",
188 ring->me, ring->idx, r);
189 return r; 187 return r;
190 }
191 amdgpu_ring_write(ring, HEVC_ENC_CMD_END); 188 amdgpu_ring_write(ring, HEVC_ENC_CMD_END);
192 amdgpu_ring_commit(ring); 189 amdgpu_ring_commit(ring);
193 190
@@ -197,14 +194,8 @@ static int uvd_v7_0_enc_ring_test_ring(struct amdgpu_ring *ring)
197 DRM_UDELAY(1); 194 DRM_UDELAY(1);
198 } 195 }
199 196
200 if (i < adev->usec_timeout) { 197 if (i >= adev->usec_timeout)
201 DRM_DEBUG("(%d)ring test on %d succeeded in %d usecs\n",
202 ring->me, ring->idx, i);
203 } else {
204 DRM_ERROR("amdgpu: (%d)ring %d test failed\n",
205 ring->me, ring->idx);
206 r = -ETIMEDOUT; 198 r = -ETIMEDOUT;
207 }
208 199
209 return r; 200 return r;
210} 201}
@@ -343,27 +334,19 @@ static int uvd_v7_0_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout)
343 long r; 334 long r;
344 335
345 r = uvd_v7_0_enc_get_create_msg(ring, 1, NULL); 336 r = uvd_v7_0_enc_get_create_msg(ring, 1, NULL);
346 if (r) { 337 if (r)
347 DRM_ERROR("amdgpu: (%d)failed to get create msg (%ld).\n", ring->me, r);
348 goto error; 338 goto error;
349 }
350 339
351 r = uvd_v7_0_enc_get_destroy_msg(ring, 1, &fence); 340 r = uvd_v7_0_enc_get_destroy_msg(ring, 1, &fence);
352 if (r) { 341 if (r)
353 DRM_ERROR("amdgpu: (%d)failed to get destroy ib (%ld).\n", ring->me, r);
354 goto error; 342 goto error;
355 }
356 343
357 r = dma_fence_wait_timeout(fence, false, timeout); 344 r = dma_fence_wait_timeout(fence, false, timeout);
358 if (r == 0) { 345 if (r == 0)
359 DRM_ERROR("amdgpu: (%d)IB test timed out.\n", ring->me);
360 r = -ETIMEDOUT; 346 r = -ETIMEDOUT;
361 } else if (r < 0) { 347 else if (r > 0)
362 DRM_ERROR("amdgpu: (%d)fence wait failed (%ld).\n", ring->me, r);
363 } else {
364 DRM_DEBUG("ib test on (%d)ring %d succeeded\n", ring->me, ring->idx);
365 r = 0; 348 r = 0;
366 } 349
367error: 350error:
368 dma_fence_put(fence); 351 dma_fence_put(fence);
369 return r; 352 return r;
@@ -540,12 +523,9 @@ static int uvd_v7_0_hw_init(void *handle)
540 ring = &adev->uvd.inst[j].ring; 523 ring = &adev->uvd.inst[j].ring;
541 524
542 if (!amdgpu_sriov_vf(adev)) { 525 if (!amdgpu_sriov_vf(adev)) {
543 ring->ready = true; 526 r = amdgpu_ring_test_helper(ring);
544 r = amdgpu_ring_test_ring(ring); 527 if (r)
545 if (r) {
546 ring->ready = false;
547 goto done; 528 goto done;
548 }
549 529
550 r = amdgpu_ring_alloc(ring, 10); 530 r = amdgpu_ring_alloc(ring, 10);
551 if (r) { 531 if (r) {
@@ -582,12 +562,9 @@ static int uvd_v7_0_hw_init(void *handle)
582 562
583 for (i = 0; i < adev->uvd.num_enc_rings; ++i) { 563 for (i = 0; i < adev->uvd.num_enc_rings; ++i) {
584 ring = &adev->uvd.inst[j].ring_enc[i]; 564 ring = &adev->uvd.inst[j].ring_enc[i];
585 ring->ready = true; 565 r = amdgpu_ring_test_helper(ring);
586 r = amdgpu_ring_test_ring(ring); 566 if (r)
587 if (r) {
588 ring->ready = false;
589 goto done; 567 goto done;
590 }
591 } 568 }
592 } 569 }
593done: 570done:
@@ -619,7 +596,7 @@ static int uvd_v7_0_hw_fini(void *handle)
619 for (i = 0; i < adev->uvd.num_uvd_inst; ++i) { 596 for (i = 0; i < adev->uvd.num_uvd_inst; ++i) {
620 if (adev->uvd.harvest_config & (1 << i)) 597 if (adev->uvd.harvest_config & (1 << i))
621 continue; 598 continue;
622 adev->uvd.inst[i].ring.ready = false; 599 adev->uvd.inst[i].ring.sched.ready = false;
623 } 600 }
624 601
625 return 0; 602 return 0;
@@ -1235,11 +1212,9 @@ static int uvd_v7_0_ring_test_ring(struct amdgpu_ring *ring)
1235 1212
1236 WREG32_SOC15(UVD, ring->me, mmUVD_CONTEXT_ID, 0xCAFEDEAD); 1213 WREG32_SOC15(UVD, ring->me, mmUVD_CONTEXT_ID, 0xCAFEDEAD);
1237 r = amdgpu_ring_alloc(ring, 3); 1214 r = amdgpu_ring_alloc(ring, 3);
1238 if (r) { 1215 if (r)
1239 DRM_ERROR("amdgpu: (%d)cp failed to lock ring %d (%d).\n",
1240 ring->me, ring->idx, r);
1241 return r; 1216 return r;
1242 } 1217
1243 amdgpu_ring_write(ring, 1218 amdgpu_ring_write(ring,
1244 PACKET0(SOC15_REG_OFFSET(UVD, ring->me, mmUVD_CONTEXT_ID), 0)); 1219 PACKET0(SOC15_REG_OFFSET(UVD, ring->me, mmUVD_CONTEXT_ID), 0));
1245 amdgpu_ring_write(ring, 0xDEADBEEF); 1220 amdgpu_ring_write(ring, 0xDEADBEEF);
@@ -1251,14 +1226,9 @@ static int uvd_v7_0_ring_test_ring(struct amdgpu_ring *ring)
1251 DRM_UDELAY(1); 1226 DRM_UDELAY(1);
1252 } 1227 }
1253 1228
1254 if (i < adev->usec_timeout) { 1229 if (i >= adev->usec_timeout)
1255 DRM_DEBUG("(%d)ring test on %d succeeded in %d usecs\n", 1230 r = -ETIMEDOUT;
1256 ring->me, ring->idx, i); 1231
1257 } else {
1258 DRM_ERROR("(%d)amdgpu: ring %d test failed (0x%08X)\n",
1259 ring->me, ring->idx, tmp);
1260 r = -EINVAL;
1261 }
1262 return r; 1232 return r;
1263} 1233}
1264 1234
@@ -1300,10 +1270,12 @@ static int uvd_v7_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p,
1300 * Write ring commands to execute the indirect buffer 1270 * Write ring commands to execute the indirect buffer
1301 */ 1271 */
1302static void uvd_v7_0_ring_emit_ib(struct amdgpu_ring *ring, 1272static void uvd_v7_0_ring_emit_ib(struct amdgpu_ring *ring,
1273 struct amdgpu_job *job,
1303 struct amdgpu_ib *ib, 1274 struct amdgpu_ib *ib,
1304 unsigned vmid, bool ctx_switch) 1275 bool ctx_switch)
1305{ 1276{
1306 struct amdgpu_device *adev = ring->adev; 1277 struct amdgpu_device *adev = ring->adev;
1278 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
1307 1279
1308 amdgpu_ring_write(ring, 1280 amdgpu_ring_write(ring,
1309 PACKET0(SOC15_REG_OFFSET(UVD, ring->me, mmUVD_LMI_RBC_IB_VMID), 0)); 1281 PACKET0(SOC15_REG_OFFSET(UVD, ring->me, mmUVD_LMI_RBC_IB_VMID), 0));
@@ -1329,8 +1301,12 @@ static void uvd_v7_0_ring_emit_ib(struct amdgpu_ring *ring,
1329 * Write enc ring commands to execute the indirect buffer 1301 * Write enc ring commands to execute the indirect buffer
1330 */ 1302 */
1331static void uvd_v7_0_enc_ring_emit_ib(struct amdgpu_ring *ring, 1303static void uvd_v7_0_enc_ring_emit_ib(struct amdgpu_ring *ring,
1332 struct amdgpu_ib *ib, unsigned int vmid, bool ctx_switch) 1304 struct amdgpu_job *job,
1305 struct amdgpu_ib *ib,
1306 bool ctx_switch)
1333{ 1307{
1308 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
1309
1334 amdgpu_ring_write(ring, HEVC_ENC_CMD_IB_VM); 1310 amdgpu_ring_write(ring, HEVC_ENC_CMD_IB_VM);
1335 amdgpu_ring_write(ring, vmid); 1311 amdgpu_ring_write(ring, vmid);
1336 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); 1312 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
index ea28828360d3..bed78a778e3f 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
@@ -463,15 +463,11 @@ static int vce_v2_0_hw_init(void *handle)
463 463
464 amdgpu_asic_set_vce_clocks(adev, 10000, 10000); 464 amdgpu_asic_set_vce_clocks(adev, 10000, 10000);
465 vce_v2_0_enable_mgcg(adev, true, false); 465 vce_v2_0_enable_mgcg(adev, true, false);
466 for (i = 0; i < adev->vce.num_rings; i++)
467 adev->vce.ring[i].ready = false;
468 466
469 for (i = 0; i < adev->vce.num_rings; i++) { 467 for (i = 0; i < adev->vce.num_rings; i++) {
470 r = amdgpu_ring_test_ring(&adev->vce.ring[i]); 468 r = amdgpu_ring_test_helper(&adev->vce.ring[i]);
471 if (r) 469 if (r)
472 return r; 470 return r;
473 else
474 adev->vce.ring[i].ready = true;
475 } 471 }
476 472
477 DRM_INFO("VCE initialized successfully.\n"); 473 DRM_INFO("VCE initialized successfully.\n");
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
index 6dbd39730070..3e84840859a7 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
@@ -474,15 +474,10 @@ static int vce_v3_0_hw_init(void *handle)
474 474
475 amdgpu_asic_set_vce_clocks(adev, 10000, 10000); 475 amdgpu_asic_set_vce_clocks(adev, 10000, 10000);
476 476
477 for (i = 0; i < adev->vce.num_rings; i++)
478 adev->vce.ring[i].ready = false;
479
480 for (i = 0; i < adev->vce.num_rings; i++) { 477 for (i = 0; i < adev->vce.num_rings; i++) {
481 r = amdgpu_ring_test_ring(&adev->vce.ring[i]); 478 r = amdgpu_ring_test_helper(&adev->vce.ring[i]);
482 if (r) 479 if (r)
483 return r; 480 return r;
484 else
485 adev->vce.ring[i].ready = true;
486 } 481 }
487 482
488 DRM_INFO("VCE initialized successfully.\n"); 483 DRM_INFO("VCE initialized successfully.\n");
@@ -838,8 +833,12 @@ out:
838} 833}
839 834
840static void vce_v3_0_ring_emit_ib(struct amdgpu_ring *ring, 835static void vce_v3_0_ring_emit_ib(struct amdgpu_ring *ring,
841 struct amdgpu_ib *ib, unsigned int vmid, bool ctx_switch) 836 struct amdgpu_job *job,
837 struct amdgpu_ib *ib,
838 bool ctx_switch)
842{ 839{
840 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
841
843 amdgpu_ring_write(ring, VCE_CMD_IB_VM); 842 amdgpu_ring_write(ring, VCE_CMD_IB_VM);
844 amdgpu_ring_write(ring, vmid); 843 amdgpu_ring_write(ring, vmid);
845 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); 844 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
index 1c9471890bf7..0054ba1b9a68 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c
@@ -519,15 +519,10 @@ static int vce_v4_0_hw_init(void *handle)
519 if (r) 519 if (r)
520 return r; 520 return r;
521 521
522 for (i = 0; i < adev->vce.num_rings; i++)
523 adev->vce.ring[i].ready = false;
524
525 for (i = 0; i < adev->vce.num_rings; i++) { 522 for (i = 0; i < adev->vce.num_rings; i++) {
526 r = amdgpu_ring_test_ring(&adev->vce.ring[i]); 523 r = amdgpu_ring_test_helper(&adev->vce.ring[i]);
527 if (r) 524 if (r)
528 return r; 525 return r;
529 else
530 adev->vce.ring[i].ready = true;
531 } 526 }
532 527
533 DRM_INFO("VCE initialized successfully.\n"); 528 DRM_INFO("VCE initialized successfully.\n");
@@ -549,7 +544,7 @@ static int vce_v4_0_hw_fini(void *handle)
549 } 544 }
550 545
551 for (i = 0; i < adev->vce.num_rings; i++) 546 for (i = 0; i < adev->vce.num_rings; i++)
552 adev->vce.ring[i].ready = false; 547 adev->vce.ring[i].sched.ready = false;
553 548
554 return 0; 549 return 0;
555} 550}
@@ -951,9 +946,11 @@ static int vce_v4_0_set_powergating_state(void *handle,
951} 946}
952#endif 947#endif
953 948
954static void vce_v4_0_ring_emit_ib(struct amdgpu_ring *ring, 949static void vce_v4_0_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_job *job,
955 struct amdgpu_ib *ib, unsigned int vmid, bool ctx_switch) 950 struct amdgpu_ib *ib, bool ctx_switch)
956{ 951{
952 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
953
957 amdgpu_ring_write(ring, VCE_CMD_IB_VM); 954 amdgpu_ring_write(ring, VCE_CMD_IB_VM);
958 amdgpu_ring_write(ring, vmid); 955 amdgpu_ring_write(ring, vmid);
959 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); 956 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
index eae90922fdbe..c1a03505f956 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
@@ -176,30 +176,22 @@ static int vcn_v1_0_hw_init(void *handle)
176 struct amdgpu_ring *ring = &adev->vcn.ring_dec; 176 struct amdgpu_ring *ring = &adev->vcn.ring_dec;
177 int i, r; 177 int i, r;
178 178
179 ring->ready = true; 179 r = amdgpu_ring_test_helper(ring);
180 r = amdgpu_ring_test_ring(ring); 180 if (r)
181 if (r) {
182 ring->ready = false;
183 goto done; 181 goto done;
184 }
185 182
186 for (i = 0; i < adev->vcn.num_enc_rings; ++i) { 183 for (i = 0; i < adev->vcn.num_enc_rings; ++i) {
187 ring = &adev->vcn.ring_enc[i]; 184 ring = &adev->vcn.ring_enc[i];
188 ring->ready = true; 185 ring->sched.ready = true;
189 r = amdgpu_ring_test_ring(ring); 186 r = amdgpu_ring_test_helper(ring);
190 if (r) { 187 if (r)
191 ring->ready = false;
192 goto done; 188 goto done;
193 }
194 } 189 }
195 190
196 ring = &adev->vcn.ring_jpeg; 191 ring = &adev->vcn.ring_jpeg;
197 ring->ready = true; 192 r = amdgpu_ring_test_helper(ring);
198 r = amdgpu_ring_test_ring(ring); 193 if (r)
199 if (r) {
200 ring->ready = false;
201 goto done; 194 goto done;
202 }
203 195
204done: 196done:
205 if (!r) 197 if (!r)
@@ -224,7 +216,7 @@ static int vcn_v1_0_hw_fini(void *handle)
224 if (RREG32_SOC15(VCN, 0, mmUVD_STATUS)) 216 if (RREG32_SOC15(VCN, 0, mmUVD_STATUS))
225 vcn_v1_0_stop(adev); 217 vcn_v1_0_stop(adev);
226 218
227 ring->ready = false; 219 ring->sched.ready = false;
228 220
229 return 0; 221 return 0;
230} 222}
@@ -1366,10 +1358,12 @@ static void vcn_v1_0_dec_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64
1366 * Write ring commands to execute the indirect buffer 1358 * Write ring commands to execute the indirect buffer
1367 */ 1359 */
1368static void vcn_v1_0_dec_ring_emit_ib(struct amdgpu_ring *ring, 1360static void vcn_v1_0_dec_ring_emit_ib(struct amdgpu_ring *ring,
1369 struct amdgpu_ib *ib, 1361 struct amdgpu_job *job,
1370 unsigned vmid, bool ctx_switch) 1362 struct amdgpu_ib *ib,
1363 bool ctx_switch)
1371{ 1364{
1372 struct amdgpu_device *adev = ring->adev; 1365 struct amdgpu_device *adev = ring->adev;
1366 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
1373 1367
1374 amdgpu_ring_write(ring, 1368 amdgpu_ring_write(ring,
1375 PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_RBC_IB_VMID), 0)); 1369 PACKET0(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_RBC_IB_VMID), 0));
@@ -1524,8 +1518,12 @@ static void vcn_v1_0_enc_ring_insert_end(struct amdgpu_ring *ring)
1524 * Write enc ring commands to execute the indirect buffer 1518 * Write enc ring commands to execute the indirect buffer
1525 */ 1519 */
1526static void vcn_v1_0_enc_ring_emit_ib(struct amdgpu_ring *ring, 1520static void vcn_v1_0_enc_ring_emit_ib(struct amdgpu_ring *ring,
1527 struct amdgpu_ib *ib, unsigned int vmid, bool ctx_switch) 1521 struct amdgpu_job *job,
1522 struct amdgpu_ib *ib,
1523 bool ctx_switch)
1528{ 1524{
1525 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
1526
1529 amdgpu_ring_write(ring, VCN_ENC_CMD_IB); 1527 amdgpu_ring_write(ring, VCN_ENC_CMD_IB);
1530 amdgpu_ring_write(ring, vmid); 1528 amdgpu_ring_write(ring, vmid);
1531 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); 1529 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
@@ -1725,10 +1723,12 @@ static void vcn_v1_0_jpeg_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u6
1725 * Write ring commands to execute the indirect buffer. 1723 * Write ring commands to execute the indirect buffer.
1726 */ 1724 */
1727static void vcn_v1_0_jpeg_ring_emit_ib(struct amdgpu_ring *ring, 1725static void vcn_v1_0_jpeg_ring_emit_ib(struct amdgpu_ring *ring,
1728 struct amdgpu_ib *ib, 1726 struct amdgpu_job *job,
1729 unsigned vmid, bool ctx_switch) 1727 struct amdgpu_ib *ib,
1728 bool ctx_switch)
1730{ 1729{
1731 struct amdgpu_device *adev = ring->adev; 1730 struct amdgpu_device *adev = ring->adev;
1731 unsigned vmid = AMDGPU_JOB_GET_VMID(job);
1732 1732
1733 amdgpu_ring_write(ring, 1733 amdgpu_ring_write(ring,
1734 PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_IB_VMID), 0, 0, PACKETJ_TYPE0)); 1734 PACKETJ(SOC15_REG_OFFSET(UVD, 0, mmUVD_LMI_JRBC_IB_VMID), 0, 0, PACKETJ_TYPE0));
diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
index a99f71797aa3..a0fda6f9252a 100644
--- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
+++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
@@ -129,7 +129,7 @@ static int vega10_ih_irq_init(struct amdgpu_device *adev)
129 else 129 else
130 wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs * 4); 130 wptr_off = adev->wb.gpu_addr + (adev->irq.ih.wptr_offs * 4);
131 WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_LO, lower_32_bits(wptr_off)); 131 WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_LO, lower_32_bits(wptr_off));
132 WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) & 0xFF); 132 WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_HI, upper_32_bits(wptr_off) & 0xFFFF);
133 133
134 /* set rptr, wptr to 0 */ 134 /* set rptr, wptr to 0 */
135 WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0); 135 WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0);
diff --git a/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c b/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c
index 2d4473557b0d..d13fc4fcb517 100644
--- a/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c
+++ b/drivers/gpu/drm/amd/amdgpu/vega20_reg_init.c
@@ -49,6 +49,7 @@ int vega20_reg_base_init(struct amdgpu_device *adev)
49 adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i])); 49 adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i]));
50 adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i])); 50 adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i]));
51 adev->reg_offset[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i])); 51 adev->reg_offset[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i]));
52 adev->reg_offset[CLK_HWIP][i] = (uint32_t *)(&(CLK_BASE.instance[i]));
52 } 53 }
53 return 0; 54 return 0;
54} 55}
diff --git a/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c b/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c
index 5d2475d5392c..177d1e5329a5 100644
--- a/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c
+++ b/drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c
@@ -23,6 +23,7 @@
23#include "kfd_priv.h" 23#include "kfd_priv.h"
24#include "kfd_events.h" 24#include "kfd_events.h"
25#include "cik_int.h" 25#include "cik_int.h"
26#include "amdgpu_amdkfd.h"
26 27
27static bool cik_event_interrupt_isr(struct kfd_dev *dev, 28static bool cik_event_interrupt_isr(struct kfd_dev *dev,
28 const uint32_t *ih_ring_entry, 29 const uint32_t *ih_ring_entry,
@@ -107,7 +108,7 @@ static void cik_event_interrupt_wq(struct kfd_dev *dev,
107 kfd_process_vm_fault(dev->dqm, pasid); 108 kfd_process_vm_fault(dev->dqm, pasid);
108 109
109 memset(&info, 0, sizeof(info)); 110 memset(&info, 0, sizeof(info));
110 dev->kfd2kgd->get_vm_fault_info(dev->kgd, &info); 111 amdgpu_amdkfd_gpuvm_get_vm_fault_info(dev->kgd, &info);
111 if (!info.page_addr && !info.status) 112 if (!info.page_addr && !info.status)
112 return; 113 return;
113 114
diff --git a/drivers/gpu/drm/amd/amdkfd/cik_regs.h b/drivers/gpu/drm/amd/amdkfd/cik_regs.h
index 37ce6dd65391..8e2a1663c4db 100644
--- a/drivers/gpu/drm/amd/amdkfd/cik_regs.h
+++ b/drivers/gpu/drm/amd/amdkfd/cik_regs.h
@@ -68,6 +68,4 @@
68 68
69#define GRBM_GFX_INDEX 0x30800 69#define GRBM_GFX_INDEX 0x30800
70 70
71#define ATC_VMID_PASID_MAPPING_VALID (1U << 31)
72
73#endif 71#endif
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
index 14d5b5fa822d..5f4062b41add 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
@@ -37,6 +37,7 @@
37#include "kfd_priv.h" 37#include "kfd_priv.h"
38#include "kfd_device_queue_manager.h" 38#include "kfd_device_queue_manager.h"
39#include "kfd_dbgmgr.h" 39#include "kfd_dbgmgr.h"
40#include "amdgpu_amdkfd.h"
40 41
41static long kfd_ioctl(struct file *, unsigned int, unsigned long); 42static long kfd_ioctl(struct file *, unsigned int, unsigned long);
42static int kfd_open(struct inode *, struct file *); 43static int kfd_open(struct inode *, struct file *);
@@ -834,8 +835,7 @@ static int kfd_ioctl_get_clock_counters(struct file *filep,
834 dev = kfd_device_by_id(args->gpu_id); 835 dev = kfd_device_by_id(args->gpu_id);
835 if (dev) 836 if (dev)
836 /* Reading GPU clock counter from KGD */ 837 /* Reading GPU clock counter from KGD */
837 args->gpu_clock_counter = 838 args->gpu_clock_counter = amdgpu_amdkfd_get_gpu_clock_counter(dev->kgd);
838 dev->kfd2kgd->get_gpu_clock_counter(dev->kgd);
839 else 839 else
840 /* Node without GPU resource */ 840 /* Node without GPU resource */
841 args->gpu_clock_counter = 0; 841 args->gpu_clock_counter = 0;
@@ -1042,7 +1042,7 @@ static int kfd_ioctl_create_event(struct file *filp, struct kfd_process *p,
1042 } 1042 }
1043 mutex_unlock(&p->mutex); 1043 mutex_unlock(&p->mutex);
1044 1044
1045 err = kfd->kfd2kgd->map_gtt_bo_to_kernel(kfd->kgd, 1045 err = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(kfd->kgd,
1046 mem, &kern_addr, &size); 1046 mem, &kern_addr, &size);
1047 if (err) { 1047 if (err) {
1048 pr_err("Failed to map event page to kernel\n"); 1048 pr_err("Failed to map event page to kernel\n");
@@ -1240,7 +1240,7 @@ bool kfd_dev_is_large_bar(struct kfd_dev *dev)
1240 if (dev->device_info->needs_iommu_device) 1240 if (dev->device_info->needs_iommu_device)
1241 return false; 1241 return false;
1242 1242
1243 dev->kfd2kgd->get_local_mem_info(dev->kgd, &mem_info); 1243 amdgpu_amdkfd_get_local_mem_info(dev->kgd, &mem_info);
1244 if (mem_info.local_mem_size_private == 0 && 1244 if (mem_info.local_mem_size_private == 0 &&
1245 mem_info.local_mem_size_public > 0) 1245 mem_info.local_mem_size_public > 0)
1246 return true; 1246 return true;
@@ -1281,7 +1281,7 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,
1281 goto err_unlock; 1281 goto err_unlock;
1282 } 1282 }
1283 1283
1284 err = dev->kfd2kgd->alloc_memory_of_gpu( 1284 err = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
1285 dev->kgd, args->va_addr, args->size, 1285 dev->kgd, args->va_addr, args->size,
1286 pdd->vm, (struct kgd_mem **) &mem, &offset, 1286 pdd->vm, (struct kgd_mem **) &mem, &offset,
1287 flags); 1287 flags);
@@ -1303,7 +1303,7 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file *filep,
1303 return 0; 1303 return 0;
1304 1304
1305err_free: 1305err_free:
1306 dev->kfd2kgd->free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem); 1306 amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem);
1307err_unlock: 1307err_unlock:
1308 mutex_unlock(&p->mutex); 1308 mutex_unlock(&p->mutex);
1309 return err; 1309 return err;
@@ -1338,7 +1338,8 @@ static int kfd_ioctl_free_memory_of_gpu(struct file *filep,
1338 goto err_unlock; 1338 goto err_unlock;
1339 } 1339 }
1340 1340
1341 ret = dev->kfd2kgd->free_memory_of_gpu(dev->kgd, (struct kgd_mem *)mem); 1341 ret = amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd,
1342 (struct kgd_mem *)mem);
1342 1343
1343 /* If freeing the buffer failed, leave the handle in place for 1344 /* If freeing the buffer failed, leave the handle in place for
1344 * clean-up during process tear-down. 1345 * clean-up during process tear-down.
@@ -1418,7 +1419,7 @@ static int kfd_ioctl_map_memory_to_gpu(struct file *filep,
1418 err = PTR_ERR(peer_pdd); 1419 err = PTR_ERR(peer_pdd);
1419 goto get_mem_obj_from_handle_failed; 1420 goto get_mem_obj_from_handle_failed;
1420 } 1421 }
1421 err = peer->kfd2kgd->map_memory_to_gpu( 1422 err = amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
1422 peer->kgd, (struct kgd_mem *)mem, peer_pdd->vm); 1423 peer->kgd, (struct kgd_mem *)mem, peer_pdd->vm);
1423 if (err) { 1424 if (err) {
1424 pr_err("Failed to map to gpu %d/%d\n", 1425 pr_err("Failed to map to gpu %d/%d\n",
@@ -1430,7 +1431,7 @@ static int kfd_ioctl_map_memory_to_gpu(struct file *filep,
1430 1431
1431 mutex_unlock(&p->mutex); 1432 mutex_unlock(&p->mutex);
1432 1433
1433 err = dev->kfd2kgd->sync_memory(dev->kgd, (struct kgd_mem *) mem, true); 1434 err = amdgpu_amdkfd_gpuvm_sync_memory(dev->kgd, (struct kgd_mem *) mem, true);
1434 if (err) { 1435 if (err) {
1435 pr_debug("Sync memory failed, wait interrupted by user signal\n"); 1436 pr_debug("Sync memory failed, wait interrupted by user signal\n");
1436 goto sync_memory_failed; 1437 goto sync_memory_failed;
@@ -1525,7 +1526,7 @@ static int kfd_ioctl_unmap_memory_from_gpu(struct file *filep,
1525 err = -ENODEV; 1526 err = -ENODEV;
1526 goto get_mem_obj_from_handle_failed; 1527 goto get_mem_obj_from_handle_failed;
1527 } 1528 }
1528 err = dev->kfd2kgd->unmap_memory_to_gpu( 1529 err = amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
1529 peer->kgd, (struct kgd_mem *)mem, peer_pdd->vm); 1530 peer->kgd, (struct kgd_mem *)mem, peer_pdd->vm);
1530 if (err) { 1531 if (err) {
1531 pr_err("Failed to unmap from gpu %d/%d\n", 1532 pr_err("Failed to unmap from gpu %d/%d\n",
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
index 56412b0e7e1c..3783d122f283 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
@@ -26,6 +26,7 @@
26#include "kfd_priv.h" 26#include "kfd_priv.h"
27#include "kfd_topology.h" 27#include "kfd_topology.h"
28#include "kfd_iommu.h" 28#include "kfd_iommu.h"
29#include "amdgpu_amdkfd.h"
29 30
30/* GPU Processor ID base for dGPUs for which VCRAT needs to be created. 31/* GPU Processor ID base for dGPUs for which VCRAT needs to be created.
31 * GPU processor ID are expressed with Bit[31]=1. 32 * GPU processor ID are expressed with Bit[31]=1.
@@ -753,12 +754,10 @@ int kfd_create_crat_image_acpi(void **crat_image, size_t *size)
753 return -ENODATA; 754 return -ENODATA;
754 } 755 }
755 756
756 pcrat_image = kmalloc(crat_table->length, GFP_KERNEL); 757 pcrat_image = kmemdup(crat_table, crat_table->length, GFP_KERNEL);
757 if (!pcrat_image) 758 if (!pcrat_image)
758 return -ENOMEM; 759 return -ENOMEM;
759 760
760 memcpy(pcrat_image, crat_table, crat_table->length);
761
762 *crat_image = pcrat_image; 761 *crat_image = pcrat_image;
763 *size = crat_table->length; 762 *size = crat_table->length;
764 763
@@ -1161,7 +1160,7 @@ static int kfd_create_vcrat_image_gpu(void *pcrat_image,
1161 cu->flags |= CRAT_CU_FLAGS_GPU_PRESENT; 1160 cu->flags |= CRAT_CU_FLAGS_GPU_PRESENT;
1162 cu->proximity_domain = proximity_domain; 1161 cu->proximity_domain = proximity_domain;
1163 1162
1164 kdev->kfd2kgd->get_cu_info(kdev->kgd, &cu_info); 1163 amdgpu_amdkfd_get_cu_info(kdev->kgd, &cu_info);
1165 cu->num_simd_per_cu = cu_info.simd_per_cu; 1164 cu->num_simd_per_cu = cu_info.simd_per_cu;
1166 cu->num_simd_cores = cu_info.simd_per_cu * cu_info.cu_active_number; 1165 cu->num_simd_cores = cu_info.simd_per_cu * cu_info.cu_active_number;
1167 cu->max_waves_simd = cu_info.max_waves_per_simd; 1166 cu->max_waves_simd = cu_info.max_waves_per_simd;
@@ -1192,7 +1191,7 @@ static int kfd_create_vcrat_image_gpu(void *pcrat_image,
1192 * report the total FB size (public+private) as a single 1191 * report the total FB size (public+private) as a single
1193 * private heap. 1192 * private heap.
1194 */ 1193 */
1195 kdev->kfd2kgd->get_local_mem_info(kdev->kgd, &local_mem_info); 1194 amdgpu_amdkfd_get_local_mem_info(kdev->kgd, &local_mem_info);
1196 sub_type_hdr = (typeof(sub_type_hdr))((char *)sub_type_hdr + 1195 sub_type_hdr = (typeof(sub_type_hdr))((char *)sub_type_hdr +
1197 sub_type_hdr->length); 1196 sub_type_hdr->length);
1198 1197
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index a9f18ea7e354..c004647c8cb4 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -28,6 +28,7 @@
28#include "kfd_pm4_headers_vi.h" 28#include "kfd_pm4_headers_vi.h"
29#include "cwsr_trap_handler.h" 29#include "cwsr_trap_handler.h"
30#include "kfd_iommu.h" 30#include "kfd_iommu.h"
31#include "amdgpu_amdkfd.h"
31 32
32#define MQD_SIZE_ALIGNED 768 33#define MQD_SIZE_ALIGNED 768
33 34
@@ -478,7 +479,7 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
478 /* add another 512KB for all other allocations on gart (HPD, fences) */ 479 /* add another 512KB for all other allocations on gart (HPD, fences) */
479 size += 512 * 1024; 480 size += 512 * 1024;
480 481
481 if (kfd->kfd2kgd->init_gtt_mem_allocation( 482 if (amdgpu_amdkfd_alloc_gtt_mem(
482 kfd->kgd, size, &kfd->gtt_mem, 483 kfd->kgd, size, &kfd->gtt_mem,
483 &kfd->gtt_start_gpu_addr, &kfd->gtt_start_cpu_ptr, 484 &kfd->gtt_start_gpu_addr, &kfd->gtt_start_cpu_ptr,
484 false)) { 485 false)) {
@@ -552,7 +553,7 @@ kfd_topology_add_device_error:
552kfd_doorbell_error: 553kfd_doorbell_error:
553 kfd_gtt_sa_fini(kfd); 554 kfd_gtt_sa_fini(kfd);
554kfd_gtt_sa_init_error: 555kfd_gtt_sa_init_error:
555 kfd->kfd2kgd->free_gtt_mem(kfd->kgd, kfd->gtt_mem); 556 amdgpu_amdkfd_free_gtt_mem(kfd->kgd, kfd->gtt_mem);
556 dev_err(kfd_device, 557 dev_err(kfd_device,
557 "device %x:%x NOT added due to errors\n", 558 "device %x:%x NOT added due to errors\n",
558 kfd->pdev->vendor, kfd->pdev->device); 559 kfd->pdev->vendor, kfd->pdev->device);
@@ -569,7 +570,7 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
569 kfd_topology_remove_device(kfd); 570 kfd_topology_remove_device(kfd);
570 kfd_doorbell_fini(kfd); 571 kfd_doorbell_fini(kfd);
571 kfd_gtt_sa_fini(kfd); 572 kfd_gtt_sa_fini(kfd);
572 kfd->kfd2kgd->free_gtt_mem(kfd->kgd, kfd->gtt_mem); 573 amdgpu_amdkfd_free_gtt_mem(kfd->kgd, kfd->gtt_mem);
573 } 574 }
574 575
575 kfree(kfd); 576 kfree(kfd);
@@ -681,6 +682,7 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
681{ 682{
682 uint32_t patched_ihre[KFD_MAX_RING_ENTRY_SIZE]; 683 uint32_t patched_ihre[KFD_MAX_RING_ENTRY_SIZE];
683 bool is_patched = false; 684 bool is_patched = false;
685 unsigned long flags;
684 686
685 if (!kfd->init_complete) 687 if (!kfd->init_complete)
686 return; 688 return;
@@ -690,7 +692,7 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
690 return; 692 return;
691 } 693 }
692 694
693 spin_lock(&kfd->interrupt_lock); 695 spin_lock_irqsave(&kfd->interrupt_lock, flags);
694 696
695 if (kfd->interrupts_active 697 if (kfd->interrupts_active
696 && interrupt_is_wanted(kfd, ih_ring_entry, 698 && interrupt_is_wanted(kfd, ih_ring_entry,
@@ -699,7 +701,7 @@ void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
699 is_patched ? patched_ihre : ih_ring_entry)) 701 is_patched ? patched_ihre : ih_ring_entry))
700 queue_work(kfd->ih_wq, &kfd->interrupt_work); 702 queue_work(kfd->ih_wq, &kfd->interrupt_work);
701 703
702 spin_unlock(&kfd->interrupt_lock); 704 spin_unlock_irqrestore(&kfd->interrupt_lock, flags);
703} 705}
704 706
705int kgd2kfd_quiesce_mm(struct mm_struct *mm) 707int kgd2kfd_quiesce_mm(struct mm_struct *mm)
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index a3b933967171..fb9d66ea13b7 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -33,6 +33,7 @@
33#include "kfd_mqd_manager.h" 33#include "kfd_mqd_manager.h"
34#include "cik_regs.h" 34#include "cik_regs.h"
35#include "kfd_kernel_queue.h" 35#include "kfd_kernel_queue.h"
36#include "amdgpu_amdkfd.h"
36 37
37/* Size of the per-pipe EOP queue */ 38/* Size of the per-pipe EOP queue */
38#define CIK_HPD_EOP_BYTES_LOG2 11 39#define CIK_HPD_EOP_BYTES_LOG2 11
@@ -219,7 +220,7 @@ static int flush_texture_cache_nocpsch(struct kfd_dev *kdev,
219 if (ret) 220 if (ret)
220 return ret; 221 return ret;
221 222
222 return kdev->kfd2kgd->submit_ib(kdev->kgd, KGD_ENGINE_MEC1, qpd->vmid, 223 return amdgpu_amdkfd_submit_ib(kdev->kgd, KGD_ENGINE_MEC1, qpd->vmid,
223 qpd->ib_base, (uint32_t *)qpd->ib_kaddr, 224 qpd->ib_base, (uint32_t *)qpd->ib_kaddr,
224 pmf->release_mem_size / sizeof(uint32_t)); 225 pmf->release_mem_size / sizeof(uint32_t));
225} 226}
@@ -672,7 +673,7 @@ static int restore_process_queues_nocpsch(struct device_queue_manager *dqm,
672 673
673 pdd = qpd_to_pdd(qpd); 674 pdd = qpd_to_pdd(qpd);
674 /* Retrieve PD base */ 675 /* Retrieve PD base */
675 pd_base = dqm->dev->kfd2kgd->get_process_page_dir(pdd->vm); 676 pd_base = amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd->vm);
676 677
677 dqm_lock(dqm); 678 dqm_lock(dqm);
678 if (WARN_ON_ONCE(!qpd->evicted)) /* already restored, do nothing */ 679 if (WARN_ON_ONCE(!qpd->evicted)) /* already restored, do nothing */
@@ -743,7 +744,7 @@ static int restore_process_queues_cpsch(struct device_queue_manager *dqm,
743 744
744 pdd = qpd_to_pdd(qpd); 745 pdd = qpd_to_pdd(qpd);
745 /* Retrieve PD base */ 746 /* Retrieve PD base */
746 pd_base = dqm->dev->kfd2kgd->get_process_page_dir(pdd->vm); 747 pd_base = amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd->vm);
747 748
748 dqm_lock(dqm); 749 dqm_lock(dqm);
749 if (WARN_ON_ONCE(!qpd->evicted)) /* already restored, do nothing */ 750 if (WARN_ON_ONCE(!qpd->evicted)) /* already restored, do nothing */
@@ -793,7 +794,7 @@ static int register_process(struct device_queue_manager *dqm,
793 794
794 pdd = qpd_to_pdd(qpd); 795 pdd = qpd_to_pdd(qpd);
795 /* Retrieve PD base */ 796 /* Retrieve PD base */
796 pd_base = dqm->dev->kfd2kgd->get_process_page_dir(pdd->vm); 797 pd_base = amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd->vm);
797 798
798 dqm_lock(dqm); 799 dqm_lock(dqm);
799 list_add(&n->list, &dqm->queues); 800 list_add(&n->list, &dqm->queues);
@@ -805,7 +806,7 @@ static int register_process(struct device_queue_manager *dqm,
805 retval = dqm->asic_ops.update_qpd(dqm, qpd); 806 retval = dqm->asic_ops.update_qpd(dqm, qpd);
806 807
807 if (dqm->processes_count++ == 0) 808 if (dqm->processes_count++ == 0)
808 dqm->dev->kfd2kgd->set_compute_idle(dqm->dev->kgd, false); 809 amdgpu_amdkfd_set_compute_idle(dqm->dev->kgd, false);
809 810
810 dqm_unlock(dqm); 811 dqm_unlock(dqm);
811 812
@@ -829,7 +830,7 @@ static int unregister_process(struct device_queue_manager *dqm,
829 list_del(&cur->list); 830 list_del(&cur->list);
830 kfree(cur); 831 kfree(cur);
831 if (--dqm->processes_count == 0) 832 if (--dqm->processes_count == 0)
832 dqm->dev->kfd2kgd->set_compute_idle( 833 amdgpu_amdkfd_set_compute_idle(
833 dqm->dev->kgd, true); 834 dqm->dev->kgd, true);
834 goto out; 835 goto out;
835 } 836 }
@@ -845,15 +846,8 @@ static int
845set_pasid_vmid_mapping(struct device_queue_manager *dqm, unsigned int pasid, 846set_pasid_vmid_mapping(struct device_queue_manager *dqm, unsigned int pasid,
846 unsigned int vmid) 847 unsigned int vmid)
847{ 848{
848 uint32_t pasid_mapping;
849
850 pasid_mapping = (pasid == 0) ? 0 :
851 (uint32_t)pasid |
852 ATC_VMID_PASID_MAPPING_VALID;
853
854 return dqm->dev->kfd2kgd->set_pasid_vmid_mapping( 849 return dqm->dev->kfd2kgd->set_pasid_vmid_mapping(
855 dqm->dev->kgd, pasid_mapping, 850 dqm->dev->kgd, pasid, vmid);
856 vmid);
857} 851}
858 852
859static void init_interrupts(struct device_queue_manager *dqm) 853static void init_interrupts(struct device_queue_manager *dqm)
@@ -1796,7 +1790,7 @@ static void kfd_process_hw_exception(struct work_struct *work)
1796{ 1790{
1797 struct device_queue_manager *dqm = container_of(work, 1791 struct device_queue_manager *dqm = container_of(work,
1798 struct device_queue_manager, hw_exception_work); 1792 struct device_queue_manager, hw_exception_work);
1799 dqm->dev->kfd2kgd->gpu_recover(dqm->dev->kgd); 1793 amdgpu_amdkfd_gpu_reset(dqm->dev->kgd);
1800} 1794}
1801 1795
1802#if defined(CONFIG_DEBUG_FS) 1796#if defined(CONFIG_DEBUG_FS)
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
index e33019a7a883..6910028010d6 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
@@ -22,6 +22,7 @@
22 */ 22 */
23 23
24#include "kfd_mqd_manager.h" 24#include "kfd_mqd_manager.h"
25#include "amdgpu_amdkfd.h"
25 26
26struct mqd_manager *mqd_manager_init(enum KFD_MQD_TYPE type, 27struct mqd_manager *mqd_manager_init(enum KFD_MQD_TYPE type,
27 struct kfd_dev *dev) 28 struct kfd_dev *dev)
@@ -58,7 +59,7 @@ void mqd_symmetrically_map_cu_mask(struct mqd_manager *mm,
58 uint32_t cu_per_sh[4] = {0}; 59 uint32_t cu_per_sh[4] = {0};
59 int i, se, cu = 0; 60 int i, se, cu = 0;
60 61
61 mm->dev->kfd2kgd->get_cu_info(mm->dev->kgd, &cu_info); 62 amdgpu_amdkfd_get_cu_info(mm->dev->kgd, &cu_info);
62 63
63 if (cu_mask_count > cu_info.cu_active_number) 64 if (cu_mask_count > cu_info.cu_active_number)
64 cu_mask_count = cu_info.cu_active_number; 65 cu_mask_count = cu_info.cu_active_number;
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
index f381c1cb27bd..9dbba609450e 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
@@ -30,6 +30,7 @@
30#include "gc/gc_9_0_offset.h" 30#include "gc/gc_9_0_offset.h"
31#include "gc/gc_9_0_sh_mask.h" 31#include "gc/gc_9_0_sh_mask.h"
32#include "sdma0/sdma0_4_0_sh_mask.h" 32#include "sdma0/sdma0_4_0_sh_mask.h"
33#include "amdgpu_amdkfd.h"
33 34
34static inline struct v9_mqd *get_mqd(void *mqd) 35static inline struct v9_mqd *get_mqd(void *mqd)
35{ 36{
@@ -83,7 +84,7 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
83 *mqd_mem_obj = kzalloc(sizeof(struct kfd_mem_obj), GFP_KERNEL); 84 *mqd_mem_obj = kzalloc(sizeof(struct kfd_mem_obj), GFP_KERNEL);
84 if (!*mqd_mem_obj) 85 if (!*mqd_mem_obj)
85 return -ENOMEM; 86 return -ENOMEM;
86 retval = kfd->kfd2kgd->init_gtt_mem_allocation(kfd->kgd, 87 retval = amdgpu_amdkfd_alloc_gtt_mem(kfd->kgd,
87 ALIGN(q->ctl_stack_size, PAGE_SIZE) + 88 ALIGN(q->ctl_stack_size, PAGE_SIZE) +
88 ALIGN(sizeof(struct v9_mqd), PAGE_SIZE), 89 ALIGN(sizeof(struct v9_mqd), PAGE_SIZE),
89 &((*mqd_mem_obj)->gtt_mem), 90 &((*mqd_mem_obj)->gtt_mem),
@@ -250,7 +251,7 @@ static void uninit_mqd(struct mqd_manager *mm, void *mqd,
250 struct kfd_dev *kfd = mm->dev; 251 struct kfd_dev *kfd = mm->dev;
251 252
252 if (mqd_mem_obj->gtt_mem) { 253 if (mqd_mem_obj->gtt_mem) {
253 kfd->kfd2kgd->free_gtt_mem(kfd->kgd, mqd_mem_obj->gtt_mem); 254 amdgpu_amdkfd_free_gtt_mem(kfd->kgd, mqd_mem_obj->gtt_mem);
254 kfree(mqd_mem_obj); 255 kfree(mqd_mem_obj);
255 } else { 256 } else {
256 kfd_gtt_sa_free(mm->dev, mqd_mem_obj); 257 kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c b/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c
index 15fff4420e53..33b08ff00b50 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_pasid.c
@@ -22,6 +22,7 @@
22 22
23#include <linux/types.h> 23#include <linux/types.h>
24#include "kfd_priv.h" 24#include "kfd_priv.h"
25#include "amdgpu_ids.h"
25 26
26static unsigned int pasid_bits = 16; 27static unsigned int pasid_bits = 16;
27static const struct kfd2kgd_calls *kfd2kgd; 28static const struct kfd2kgd_calls *kfd2kgd;
@@ -71,7 +72,7 @@ unsigned int kfd_pasid_alloc(void)
71 return false; 72 return false;
72 } 73 }
73 74
74 r = kfd2kgd->alloc_pasid(pasid_bits); 75 r = amdgpu_pasid_alloc(pasid_bits);
75 76
76 return r > 0 ? r : 0; 77 return r > 0 ? r : 0;
77} 78}
@@ -79,5 +80,5 @@ unsigned int kfd_pasid_alloc(void)
79void kfd_pasid_free(unsigned int pasid) 80void kfd_pasid_free(unsigned int pasid)
80{ 81{
81 if (kfd2kgd) 82 if (kfd2kgd)
82 kfd2kgd->free_pasid(pasid); 83 amdgpu_pasid_free(pasid);
83} 84}
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index 53ff86d45d91..dec8e64f36bd 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -507,6 +507,7 @@ struct qcm_process_device {
507 * All the memory management data should be here too 507 * All the memory management data should be here too
508 */ 508 */
509 uint64_t gds_context_area; 509 uint64_t gds_context_area;
510 /* Contains page table flags such as AMDGPU_PTE_VALID since gfx9 */
510 uint64_t page_table_base; 511 uint64_t page_table_base;
511 uint32_t sh_mem_config; 512 uint32_t sh_mem_config;
512 uint32_t sh_mem_bases; 513 uint32_t sh_mem_bases;
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index 0039e451d9af..80b36e860a0a 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -31,6 +31,7 @@
31#include <linux/compat.h> 31#include <linux/compat.h>
32#include <linux/mman.h> 32#include <linux/mman.h>
33#include <linux/file.h> 33#include <linux/file.h>
34#include "amdgpu_amdkfd.h"
34 35
35struct mm_struct; 36struct mm_struct;
36 37
@@ -100,8 +101,8 @@ static void kfd_process_free_gpuvm(struct kgd_mem *mem,
100{ 101{
101 struct kfd_dev *dev = pdd->dev; 102 struct kfd_dev *dev = pdd->dev;
102 103
103 dev->kfd2kgd->unmap_memory_to_gpu(dev->kgd, mem, pdd->vm); 104 amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(dev->kgd, mem, pdd->vm);
104 dev->kfd2kgd->free_memory_of_gpu(dev->kgd, mem); 105 amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd, mem);
105} 106}
106 107
107/* kfd_process_alloc_gpuvm - Allocate GPU VM for the KFD process 108/* kfd_process_alloc_gpuvm - Allocate GPU VM for the KFD process
@@ -119,16 +120,16 @@ static int kfd_process_alloc_gpuvm(struct kfd_process_device *pdd,
119 int handle; 120 int handle;
120 int err; 121 int err;
121 122
122 err = kdev->kfd2kgd->alloc_memory_of_gpu(kdev->kgd, gpu_va, size, 123 err = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(kdev->kgd, gpu_va, size,
123 pdd->vm, &mem, NULL, flags); 124 pdd->vm, &mem, NULL, flags);
124 if (err) 125 if (err)
125 goto err_alloc_mem; 126 goto err_alloc_mem;
126 127
127 err = kdev->kfd2kgd->map_memory_to_gpu(kdev->kgd, mem, pdd->vm); 128 err = amdgpu_amdkfd_gpuvm_map_memory_to_gpu(kdev->kgd, mem, pdd->vm);
128 if (err) 129 if (err)
129 goto err_map_mem; 130 goto err_map_mem;
130 131
131 err = kdev->kfd2kgd->sync_memory(kdev->kgd, mem, true); 132 err = amdgpu_amdkfd_gpuvm_sync_memory(kdev->kgd, mem, true);
132 if (err) { 133 if (err) {
133 pr_debug("Sync memory failed, wait interrupted by user signal\n"); 134 pr_debug("Sync memory failed, wait interrupted by user signal\n");
134 goto sync_memory_failed; 135 goto sync_memory_failed;
@@ -147,7 +148,7 @@ static int kfd_process_alloc_gpuvm(struct kfd_process_device *pdd,
147 } 148 }
148 149
149 if (kptr) { 150 if (kptr) {
150 err = kdev->kfd2kgd->map_gtt_bo_to_kernel(kdev->kgd, 151 err = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(kdev->kgd,
151 (struct kgd_mem *)mem, kptr, NULL); 152 (struct kgd_mem *)mem, kptr, NULL);
152 if (err) { 153 if (err) {
153 pr_debug("Map GTT BO to kernel failed\n"); 154 pr_debug("Map GTT BO to kernel failed\n");
@@ -165,7 +166,7 @@ sync_memory_failed:
165 return err; 166 return err;
166 167
167err_map_mem: 168err_map_mem:
168 kdev->kfd2kgd->free_memory_of_gpu(kdev->kgd, mem); 169 amdgpu_amdkfd_gpuvm_free_memory_of_gpu(kdev->kgd, mem);
169err_alloc_mem: 170err_alloc_mem:
170 *kptr = NULL; 171 *kptr = NULL;
171 return err; 172 return err;
@@ -296,11 +297,11 @@ static void kfd_process_device_free_bos(struct kfd_process_device *pdd)
296 per_device_list) { 297 per_device_list) {
297 if (!peer_pdd->vm) 298 if (!peer_pdd->vm)
298 continue; 299 continue;
299 peer_pdd->dev->kfd2kgd->unmap_memory_to_gpu( 300 amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
300 peer_pdd->dev->kgd, mem, peer_pdd->vm); 301 peer_pdd->dev->kgd, mem, peer_pdd->vm);
301 } 302 }
302 303
303 pdd->dev->kfd2kgd->free_memory_of_gpu(pdd->dev->kgd, mem); 304 amdgpu_amdkfd_gpuvm_free_memory_of_gpu(pdd->dev->kgd, mem);
304 kfd_process_device_remove_obj_handle(pdd, id); 305 kfd_process_device_remove_obj_handle(pdd, id);
305 } 306 }
306} 307}
@@ -323,11 +324,12 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)
323 pdd->dev->id, p->pasid); 324 pdd->dev->id, p->pasid);
324 325
325 if (pdd->drm_file) { 326 if (pdd->drm_file) {
326 pdd->dev->kfd2kgd->release_process_vm(pdd->dev->kgd, pdd->vm); 327 amdgpu_amdkfd_gpuvm_release_process_vm(
328 pdd->dev->kgd, pdd->vm);
327 fput(pdd->drm_file); 329 fput(pdd->drm_file);
328 } 330 }
329 else if (pdd->vm) 331 else if (pdd->vm)
330 pdd->dev->kfd2kgd->destroy_process_vm( 332 amdgpu_amdkfd_gpuvm_destroy_process_vm(
331 pdd->dev->kgd, pdd->vm); 333 pdd->dev->kgd, pdd->vm);
332 334
333 list_del(&pdd->per_device_list); 335 list_del(&pdd->per_device_list);
@@ -688,12 +690,12 @@ int kfd_process_device_init_vm(struct kfd_process_device *pdd,
688 dev = pdd->dev; 690 dev = pdd->dev;
689 691
690 if (drm_file) 692 if (drm_file)
691 ret = dev->kfd2kgd->acquire_process_vm( 693 ret = amdgpu_amdkfd_gpuvm_acquire_process_vm(
692 dev->kgd, drm_file, p->pasid, 694 dev->kgd, drm_file, p->pasid,
693 &pdd->vm, &p->kgd_process_info, &p->ef); 695 &pdd->vm, &p->kgd_process_info, &p->ef);
694 else 696 else
695 ret = dev->kfd2kgd->create_process_vm( 697 ret = amdgpu_amdkfd_gpuvm_create_process_vm(dev->kgd, p->pasid,
696 dev->kgd, p->pasid, &pdd->vm, &p->kgd_process_info, &p->ef); 698 &pdd->vm, &p->kgd_process_info, &p->ef);
697 if (ret) { 699 if (ret) {
698 pr_err("Failed to create process VM object\n"); 700 pr_err("Failed to create process VM object\n");
699 return ret; 701 return ret;
@@ -714,7 +716,7 @@ err_init_cwsr:
714err_reserve_ib_mem: 716err_reserve_ib_mem:
715 kfd_process_device_free_bos(pdd); 717 kfd_process_device_free_bos(pdd);
716 if (!drm_file) 718 if (!drm_file)
717 dev->kfd2kgd->destroy_process_vm(dev->kgd, pdd->vm); 719 amdgpu_amdkfd_gpuvm_destroy_process_vm(dev->kgd, pdd->vm);
718 pdd->vm = NULL; 720 pdd->vm = NULL;
719 721
720 return ret; 722 return ret;
@@ -972,7 +974,7 @@ static void restore_process_worker(struct work_struct *work)
972 */ 974 */
973 975
974 p->last_restore_timestamp = get_jiffies_64(); 976 p->last_restore_timestamp = get_jiffies_64();
975 ret = pdd->dev->kfd2kgd->restore_process_bos(p->kgd_process_info, 977 ret = amdgpu_amdkfd_gpuvm_restore_process_bos(p->kgd_process_info,
976 &p->ef); 978 &p->ef);
977 if (ret) { 979 if (ret) {
978 pr_debug("Failed to restore BOs of pasid %d, retry after %d ms\n", 980 pr_debug("Failed to restore BOs of pasid %d, retry after %d ms\n",
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
index e3843c5929ed..c73b4ff61f99 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
@@ -36,6 +36,7 @@
36#include "kfd_topology.h" 36#include "kfd_topology.h"
37#include "kfd_device_queue_manager.h" 37#include "kfd_device_queue_manager.h"
38#include "kfd_iommu.h" 38#include "kfd_iommu.h"
39#include "amdgpu_amdkfd.h"
39 40
40/* topology_device_list - Master list of all topology devices */ 41/* topology_device_list - Master list of all topology devices */
41static struct list_head topology_device_list; 42static struct list_head topology_device_list;
@@ -1052,7 +1053,7 @@ static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)
1052 if (!gpu) 1053 if (!gpu)
1053 return 0; 1054 return 0;
1054 1055
1055 gpu->kfd2kgd->get_local_mem_info(gpu->kgd, &local_mem_info); 1056 amdgpu_amdkfd_get_local_mem_info(gpu->kgd, &local_mem_info);
1056 1057
1057 local_mem_size = local_mem_info.local_mem_size_private + 1058 local_mem_size = local_mem_info.local_mem_size_private +
1058 local_mem_info.local_mem_size_public; 1059 local_mem_info.local_mem_size_public;
@@ -1118,8 +1119,7 @@ static void kfd_fill_mem_clk_max_info(struct kfd_topology_device *dev)
1118 * for APUs - If CRAT from ACPI reports more than one bank, then 1119 * for APUs - If CRAT from ACPI reports more than one bank, then
1119 * all the banks will report the same mem_clk_max information 1120 * all the banks will report the same mem_clk_max information
1120 */ 1121 */
1121 dev->gpu->kfd2kgd->get_local_mem_info(dev->gpu->kgd, 1122 amdgpu_amdkfd_get_local_mem_info(dev->gpu->kgd, &local_mem_info);
1122 &local_mem_info);
1123 1123
1124 list_for_each_entry(mem, &dev->mem_props, list) 1124 list_for_each_entry(mem, &dev->mem_props, list)
1125 mem->mem_clk_max = local_mem_info.mem_clk_max; 1125 mem->mem_clk_max = local_mem_info.mem_clk_max;
@@ -1240,7 +1240,7 @@ int kfd_topology_add_device(struct kfd_dev *gpu)
1240 * needed for the topology 1240 * needed for the topology
1241 */ 1241 */
1242 1242
1243 dev->gpu->kfd2kgd->get_cu_info(dev->gpu->kgd, &cu_info); 1243 amdgpu_amdkfd_get_cu_info(dev->gpu->kgd, &cu_info);
1244 dev->node_props.simd_arrays_per_engine = 1244 dev->node_props.simd_arrays_per_engine =
1245 cu_info.num_shader_arrays_per_engine; 1245 cu_info.num_shader_arrays_per_engine;
1246 1246
@@ -1249,7 +1249,7 @@ int kfd_topology_add_device(struct kfd_dev *gpu)
1249 dev->node_props.location_id = PCI_DEVID(gpu->pdev->bus->number, 1249 dev->node_props.location_id = PCI_DEVID(gpu->pdev->bus->number,
1250 gpu->pdev->devfn); 1250 gpu->pdev->devfn);
1251 dev->node_props.max_engine_clk_fcompute = 1251 dev->node_props.max_engine_clk_fcompute =
1252 dev->gpu->kfd2kgd->get_max_engine_clock_in_mhz(dev->gpu->kgd); 1252 amdgpu_amdkfd_get_max_engine_clock_in_mhz(dev->gpu->kgd);
1253 dev->node_props.max_engine_clk_ccompute = 1253 dev->node_props.max_engine_clk_ccompute =
1254 cpufreq_quick_get_max(0) / 1000; 1254 cpufreq_quick_get_max(0) / 1000;
1255 dev->node_props.drm_render_minor = 1255 dev->node_props.drm_render_minor =
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index dd688cfed6aa..aa43bb253ea2 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -76,6 +76,16 @@
76#define FIRMWARE_RAVEN_DMCU "amdgpu/raven_dmcu.bin" 76#define FIRMWARE_RAVEN_DMCU "amdgpu/raven_dmcu.bin"
77MODULE_FIRMWARE(FIRMWARE_RAVEN_DMCU); 77MODULE_FIRMWARE(FIRMWARE_RAVEN_DMCU);
78 78
79/**
80 * DOC: overview
81 *
82 * The AMDgpu display manager, **amdgpu_dm** (or even simpler,
83 * **dm**) sits between DRM and DC. It acts as a liason, converting DRM
84 * requests into DC requests, and DC responses into DRM responses.
85 *
86 * The root control structure is &struct amdgpu_display_manager.
87 */
88
79/* basic init/fini API */ 89/* basic init/fini API */
80static int amdgpu_dm_init(struct amdgpu_device *adev); 90static int amdgpu_dm_init(struct amdgpu_device *adev);
81static void amdgpu_dm_fini(struct amdgpu_device *adev); 91static void amdgpu_dm_fini(struct amdgpu_device *adev);
@@ -95,7 +105,7 @@ static void
95amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector); 105amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector);
96 106
97static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm, 107static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm,
98 struct amdgpu_plane *aplane, 108 struct drm_plane *plane,
99 unsigned long possible_crtcs); 109 unsigned long possible_crtcs);
100static int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm, 110static int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
101 struct drm_plane *plane, 111 struct drm_plane *plane,
@@ -379,11 +389,6 @@ static void amdgpu_dm_fbc_init(struct drm_connector *connector)
379 389
380} 390}
381 391
382/*
383 * Init display KMS
384 *
385 * Returns 0 on success
386 */
387static int amdgpu_dm_init(struct amdgpu_device *adev) 392static int amdgpu_dm_init(struct amdgpu_device *adev)
388{ 393{
389 struct dc_init_data init_data; 394 struct dc_init_data init_data;
@@ -429,6 +434,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
429 adev->asic_type < CHIP_RAVEN) 434 adev->asic_type < CHIP_RAVEN)
430 init_data.flags.gpu_vm_support = true; 435 init_data.flags.gpu_vm_support = true;
431 436
437 if (amdgpu_dc_feature_mask & DC_FBC_MASK)
438 init_data.flags.fbc_support = true;
439
432 /* Display Core create. */ 440 /* Display Core create. */
433 adev->dm.dc = dc_create(&init_data); 441 adev->dm.dc = dc_create(&init_data);
434 442
@@ -660,6 +668,26 @@ static void s3_handle_mst(struct drm_device *dev, bool suspend)
660 drm_modeset_unlock(&dev->mode_config.connection_mutex); 668 drm_modeset_unlock(&dev->mode_config.connection_mutex);
661} 669}
662 670
671/**
672 * dm_hw_init() - Initialize DC device
673 * @handle: The base driver device containing the amdpgu_dm device.
674 *
675 * Initialize the &struct amdgpu_display_manager device. This involves calling
676 * the initializers of each DM component, then populating the struct with them.
677 *
678 * Although the function implies hardware initialization, both hardware and
679 * software are initialized here. Splitting them out to their relevant init
680 * hooks is a future TODO item.
681 *
682 * Some notable things that are initialized here:
683 *
684 * - Display Core, both software and hardware
685 * - DC modules that we need (freesync and color management)
686 * - DRM software states
687 * - Interrupt sources and handlers
688 * - Vblank support
689 * - Debug FS entries, if enabled
690 */
663static int dm_hw_init(void *handle) 691static int dm_hw_init(void *handle)
664{ 692{
665 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 693 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -670,6 +698,14 @@ static int dm_hw_init(void *handle)
670 return 0; 698 return 0;
671} 699}
672 700
701/**
702 * dm_hw_fini() - Teardown DC device
703 * @handle: The base driver device containing the amdpgu_dm device.
704 *
705 * Teardown components within &struct amdgpu_display_manager that require
706 * cleanup. This involves cleaning up the DRM device, DC, and any modules that
707 * were loaded. Also flush IRQ workqueues and disable them.
708 */
673static int dm_hw_fini(void *handle) 709static int dm_hw_fini(void *handle)
674{ 710{
675 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 711 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -895,6 +931,16 @@ static int dm_resume(void *handle)
895 return ret; 931 return ret;
896} 932}
897 933
934/**
935 * DOC: DM Lifecycle
936 *
937 * DM (and consequently DC) is registered in the amdgpu base driver as a IP
938 * block. When CONFIG_DRM_AMD_DC is enabled, the DM device IP block is added to
939 * the base driver's device list to be initialized and torn down accordingly.
940 *
941 * The functions to do so are provided as hooks in &struct amd_ip_funcs.
942 */
943
898static const struct amd_ip_funcs amdgpu_dm_funcs = { 944static const struct amd_ip_funcs amdgpu_dm_funcs = {
899 .name = "dm", 945 .name = "dm",
900 .early_init = dm_early_init, 946 .early_init = dm_early_init,
@@ -962,6 +1008,12 @@ dm_atomic_state_alloc_free(struct drm_atomic_state *state)
962 kfree(dm_state); 1008 kfree(dm_state);
963} 1009}
964 1010
1011/**
1012 * DOC: atomic
1013 *
1014 * *WIP*
1015 */
1016
965static const struct drm_mode_config_funcs amdgpu_dm_mode_funcs = { 1017static const struct drm_mode_config_funcs amdgpu_dm_mode_funcs = {
966 .fb_create = amdgpu_display_user_framebuffer_create, 1018 .fb_create = amdgpu_display_user_framebuffer_create,
967 .output_poll_changed = drm_fb_helper_output_poll_changed, 1019 .output_poll_changed = drm_fb_helper_output_poll_changed,
@@ -1524,15 +1576,23 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
1524{ 1576{
1525 struct amdgpu_display_manager *dm = bl_get_data(bd); 1577 struct amdgpu_display_manager *dm = bl_get_data(bd);
1526 1578
1579 /* backlight_pwm_u16_16 parameter is in unsigned 32 bit, 16 bit integer
1580 * and 16 bit fractional, where 1.0 is max backlight value.
1581 * bd->props.brightness is 8 bit format and needs to be converted by
1582 * scaling via copy lower byte to upper byte of 16 bit value.
1583 */
1584 uint32_t brightness = bd->props.brightness * 0x101;
1585
1527 /* 1586 /*
1528 * PWM interperts 0 as 100% rather than 0% because of HW 1587 * PWM interperts 0 as 100% rather than 0% because of HW
1529 * limitation for level 0.So limiting minimum brightness level 1588 * limitation for level 0. So limiting minimum brightness level
1530 * to 1. 1589 * to 1.
1531 */ 1590 */
1532 if (bd->props.brightness < 1) 1591 if (bd->props.brightness < 1)
1533 return 1; 1592 brightness = 0x101;
1593
1534 if (dc_link_set_backlight_level(dm->backlight_link, 1594 if (dc_link_set_backlight_level(dm->backlight_link,
1535 bd->props.brightness, 0, 0)) 1595 brightness, 0, 0))
1536 return 0; 1596 return 0;
1537 else 1597 else
1538 return 1; 1598 return 1;
@@ -1584,18 +1644,18 @@ static int initialize_plane(struct amdgpu_display_manager *dm,
1584 struct amdgpu_mode_info *mode_info, 1644 struct amdgpu_mode_info *mode_info,
1585 int plane_id) 1645 int plane_id)
1586{ 1646{
1587 struct amdgpu_plane *plane; 1647 struct drm_plane *plane;
1588 unsigned long possible_crtcs; 1648 unsigned long possible_crtcs;
1589 int ret = 0; 1649 int ret = 0;
1590 1650
1591 plane = kzalloc(sizeof(struct amdgpu_plane), GFP_KERNEL); 1651 plane = kzalloc(sizeof(struct drm_plane), GFP_KERNEL);
1592 mode_info->planes[plane_id] = plane; 1652 mode_info->planes[plane_id] = plane;
1593 1653
1594 if (!plane) { 1654 if (!plane) {
1595 DRM_ERROR("KMS: Failed to allocate plane\n"); 1655 DRM_ERROR("KMS: Failed to allocate plane\n");
1596 return -ENOMEM; 1656 return -ENOMEM;
1597 } 1657 }
1598 plane->base.type = mode_info->plane_type[plane_id]; 1658 plane->type = mode_info->plane_type[plane_id];
1599 1659
1600 /* 1660 /*
1601 * HACK: IGT tests expect that each plane can only have 1661 * HACK: IGT tests expect that each plane can only have
@@ -1686,7 +1746,7 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
1686 } 1746 }
1687 1747
1688 for (i = 0; i < dm->dc->caps.max_streams; i++) 1748 for (i = 0; i < dm->dc->caps.max_streams; i++)
1689 if (amdgpu_dm_crtc_init(dm, &mode_info->planes[i]->base, i)) { 1749 if (amdgpu_dm_crtc_init(dm, mode_info->planes[i], i)) {
1690 DRM_ERROR("KMS: Failed to initialize crtc\n"); 1750 DRM_ERROR("KMS: Failed to initialize crtc\n");
1691 goto fail; 1751 goto fail;
1692 } 1752 }
@@ -2707,18 +2767,11 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
2707 drm_connector = &aconnector->base; 2767 drm_connector = &aconnector->base;
2708 2768
2709 if (!aconnector->dc_sink) { 2769 if (!aconnector->dc_sink) {
2710 /* 2770 if (!aconnector->mst_port) {
2711 * Create dc_sink when necessary to MST 2771 sink = create_fake_sink(aconnector);
2712 * Don't apply fake_sink to MST 2772 if (!sink)
2713 */ 2773 return stream;
2714 if (aconnector->mst_port) {
2715 dm_dp_mst_dc_sink_create(drm_connector);
2716 return stream;
2717 } 2774 }
2718
2719 sink = create_fake_sink(aconnector);
2720 if (!sink)
2721 return stream;
2722 } else { 2775 } else {
2723 sink = aconnector->dc_sink; 2776 sink = aconnector->dc_sink;
2724 } 2777 }
@@ -3307,7 +3360,7 @@ void dm_drm_plane_destroy_state(struct drm_plane *plane,
3307static const struct drm_plane_funcs dm_plane_funcs = { 3360static const struct drm_plane_funcs dm_plane_funcs = {
3308 .update_plane = drm_atomic_helper_update_plane, 3361 .update_plane = drm_atomic_helper_update_plane,
3309 .disable_plane = drm_atomic_helper_disable_plane, 3362 .disable_plane = drm_atomic_helper_disable_plane,
3310 .destroy = drm_plane_cleanup, 3363 .destroy = drm_primary_helper_destroy,
3311 .reset = dm_drm_plane_reset, 3364 .reset = dm_drm_plane_reset,
3312 .atomic_duplicate_state = dm_drm_plane_duplicate_state, 3365 .atomic_duplicate_state = dm_drm_plane_duplicate_state,
3313 .atomic_destroy_state = dm_drm_plane_destroy_state, 3366 .atomic_destroy_state = dm_drm_plane_destroy_state,
@@ -3468,49 +3521,49 @@ static const u32 cursor_formats[] = {
3468}; 3521};
3469 3522
3470static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm, 3523static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm,
3471 struct amdgpu_plane *aplane, 3524 struct drm_plane *plane,
3472 unsigned long possible_crtcs) 3525 unsigned long possible_crtcs)
3473{ 3526{
3474 int res = -EPERM; 3527 int res = -EPERM;
3475 3528
3476 switch (aplane->base.type) { 3529 switch (plane->type) {
3477 case DRM_PLANE_TYPE_PRIMARY: 3530 case DRM_PLANE_TYPE_PRIMARY:
3478 res = drm_universal_plane_init( 3531 res = drm_universal_plane_init(
3479 dm->adev->ddev, 3532 dm->adev->ddev,
3480 &aplane->base, 3533 plane,
3481 possible_crtcs, 3534 possible_crtcs,
3482 &dm_plane_funcs, 3535 &dm_plane_funcs,
3483 rgb_formats, 3536 rgb_formats,
3484 ARRAY_SIZE(rgb_formats), 3537 ARRAY_SIZE(rgb_formats),
3485 NULL, aplane->base.type, NULL); 3538 NULL, plane->type, NULL);
3486 break; 3539 break;
3487 case DRM_PLANE_TYPE_OVERLAY: 3540 case DRM_PLANE_TYPE_OVERLAY:
3488 res = drm_universal_plane_init( 3541 res = drm_universal_plane_init(
3489 dm->adev->ddev, 3542 dm->adev->ddev,
3490 &aplane->base, 3543 plane,
3491 possible_crtcs, 3544 possible_crtcs,
3492 &dm_plane_funcs, 3545 &dm_plane_funcs,
3493 yuv_formats, 3546 yuv_formats,
3494 ARRAY_SIZE(yuv_formats), 3547 ARRAY_SIZE(yuv_formats),
3495 NULL, aplane->base.type, NULL); 3548 NULL, plane->type, NULL);
3496 break; 3549 break;
3497 case DRM_PLANE_TYPE_CURSOR: 3550 case DRM_PLANE_TYPE_CURSOR:
3498 res = drm_universal_plane_init( 3551 res = drm_universal_plane_init(
3499 dm->adev->ddev, 3552 dm->adev->ddev,
3500 &aplane->base, 3553 plane,
3501 possible_crtcs, 3554 possible_crtcs,
3502 &dm_plane_funcs, 3555 &dm_plane_funcs,
3503 cursor_formats, 3556 cursor_formats,
3504 ARRAY_SIZE(cursor_formats), 3557 ARRAY_SIZE(cursor_formats),
3505 NULL, aplane->base.type, NULL); 3558 NULL, plane->type, NULL);
3506 break; 3559 break;
3507 } 3560 }
3508 3561
3509 drm_plane_helper_add(&aplane->base, &dm_plane_helper_funcs); 3562 drm_plane_helper_add(plane, &dm_plane_helper_funcs);
3510 3563
3511 /* Create (reset) the plane state */ 3564 /* Create (reset) the plane state */
3512 if (aplane->base.funcs->reset) 3565 if (plane->funcs->reset)
3513 aplane->base.funcs->reset(&aplane->base); 3566 plane->funcs->reset(plane);
3514 3567
3515 3568
3516 return res; 3569 return res;
@@ -3521,7 +3574,7 @@ static int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
3521 uint32_t crtc_index) 3574 uint32_t crtc_index)
3522{ 3575{
3523 struct amdgpu_crtc *acrtc = NULL; 3576 struct amdgpu_crtc *acrtc = NULL;
3524 struct amdgpu_plane *cursor_plane; 3577 struct drm_plane *cursor_plane;
3525 3578
3526 int res = -ENOMEM; 3579 int res = -ENOMEM;
3527 3580
@@ -3529,7 +3582,7 @@ static int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
3529 if (!cursor_plane) 3582 if (!cursor_plane)
3530 goto fail; 3583 goto fail;
3531 3584
3532 cursor_plane->base.type = DRM_PLANE_TYPE_CURSOR; 3585 cursor_plane->type = DRM_PLANE_TYPE_CURSOR;
3533 res = amdgpu_dm_plane_init(dm, cursor_plane, 0); 3586 res = amdgpu_dm_plane_init(dm, cursor_plane, 0);
3534 3587
3535 acrtc = kzalloc(sizeof(struct amdgpu_crtc), GFP_KERNEL); 3588 acrtc = kzalloc(sizeof(struct amdgpu_crtc), GFP_KERNEL);
@@ -3540,7 +3593,7 @@ static int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
3540 dm->ddev, 3593 dm->ddev,
3541 &acrtc->base, 3594 &acrtc->base,
3542 plane, 3595 plane,
3543 &cursor_plane->base, 3596 cursor_plane,
3544 &amdgpu_dm_crtc_funcs, NULL); 3597 &amdgpu_dm_crtc_funcs, NULL);
3545 3598
3546 if (res) 3599 if (res)
@@ -3779,12 +3832,12 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
3779 case DRM_MODE_CONNECTOR_HDMIA: 3832 case DRM_MODE_CONNECTOR_HDMIA:
3780 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD; 3833 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD;
3781 aconnector->base.ycbcr_420_allowed = 3834 aconnector->base.ycbcr_420_allowed =
3782 link->link_enc->features.ycbcr420_supported ? true : false; 3835 link->link_enc->features.hdmi_ycbcr420_supported ? true : false;
3783 break; 3836 break;
3784 case DRM_MODE_CONNECTOR_DisplayPort: 3837 case DRM_MODE_CONNECTOR_DisplayPort:
3785 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD; 3838 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD;
3786 aconnector->base.ycbcr_420_allowed = 3839 aconnector->base.ycbcr_420_allowed =
3787 link->link_enc->features.ycbcr420_supported ? true : false; 3840 link->link_enc->features.dp_ycbcr420_supported ? true : false;
3788 break; 3841 break;
3789 case DRM_MODE_CONNECTOR_DVID: 3842 case DRM_MODE_CONNECTOR_DVID:
3790 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD; 3843 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD;
@@ -4542,6 +4595,14 @@ static int amdgpu_dm_atomic_commit(struct drm_device *dev,
4542 /*TODO Handle EINTR, reenable IRQ*/ 4595 /*TODO Handle EINTR, reenable IRQ*/
4543} 4596}
4544 4597
4598/**
4599 * amdgpu_dm_atomic_commit_tail() - AMDgpu DM's commit tail implementation.
4600 * @state: The atomic state to commit
4601 *
4602 * This will tell DC to commit the constructed DC state from atomic_check,
4603 * programming the hardware. Any failures here implies a hardware failure, since
4604 * atomic check should have filtered anything non-kosher.
4605 */
4545static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) 4606static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
4546{ 4607{
4547 struct drm_device *dev = state->dev; 4608 struct drm_device *dev = state->dev;
@@ -5313,6 +5374,12 @@ enum surface_update_type dm_determine_update_type_for_commit(struct dc *dc, stru
5313 struct dc_stream_update stream_update; 5374 struct dc_stream_update stream_update;
5314 enum surface_update_type update_type = UPDATE_TYPE_FAST; 5375 enum surface_update_type update_type = UPDATE_TYPE_FAST;
5315 5376
5377 if (!updates || !surface) {
5378 DRM_ERROR("Plane or surface update failed to allocate");
5379 /* Set type to FULL to avoid crashing in DC*/
5380 update_type = UPDATE_TYPE_FULL;
5381 goto ret;
5382 }
5316 5383
5317 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { 5384 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
5318 new_dm_crtc_state = to_dm_crtc_state(new_crtc_state); 5385 new_dm_crtc_state = to_dm_crtc_state(new_crtc_state);
@@ -5388,6 +5455,31 @@ ret:
5388 return update_type; 5455 return update_type;
5389} 5456}
5390 5457
5458/**
5459 * amdgpu_dm_atomic_check() - Atomic check implementation for AMDgpu DM.
5460 * @dev: The DRM device
5461 * @state: The atomic state to commit
5462 *
5463 * Validate that the given atomic state is programmable by DC into hardware.
5464 * This involves constructing a &struct dc_state reflecting the new hardware
5465 * state we wish to commit, then querying DC to see if it is programmable. It's
5466 * important not to modify the existing DC state. Otherwise, atomic_check
5467 * may unexpectedly commit hardware changes.
5468 *
5469 * When validating the DC state, it's important that the right locks are
5470 * acquired. For full updates case which removes/adds/updates streams on one
5471 * CRTC while flipping on another CRTC, acquiring global lock will guarantee
5472 * that any such full update commit will wait for completion of any outstanding
5473 * flip using DRMs synchronization events. See
5474 * dm_determine_update_type_for_commit()
5475 *
5476 * Note that DM adds the affected connectors for all CRTCs in state, when that
5477 * might not seem necessary. This is because DC stream creation requires the
5478 * DC sink, which is tied to the DRM connector state. Cleaning this up should
5479 * be possible but non-trivial - a possible TODO item.
5480 *
5481 * Return: -Error code if validation failed.
5482 */
5391static int amdgpu_dm_atomic_check(struct drm_device *dev, 5483static int amdgpu_dm_atomic_check(struct drm_device *dev,
5392 struct drm_atomic_state *state) 5484 struct drm_atomic_state *state)
5393{ 5485{
@@ -5490,15 +5582,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
5490 lock_and_validation_needed = true; 5582 lock_and_validation_needed = true;
5491 } 5583 }
5492 5584
5493 /*
5494 * For full updates case when
5495 * removing/adding/updating streams on one CRTC while flipping
5496 * on another CRTC,
5497 * acquiring global lock will guarantee that any such full
5498 * update commit
5499 * will wait for completion of any outstanding flip using DRMs
5500 * synchronization events.
5501 */
5502 update_type = dm_determine_update_type_for_commit(dc, state); 5585 update_type = dm_determine_update_type_for_commit(dc, state);
5503 5586
5504 if (overall_update_type < update_type) 5587 if (overall_update_type < update_type)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index 978b34a5011c..d6960644d714 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -59,49 +59,100 @@ struct common_irq_params {
59 enum dc_irq_source irq_src; 59 enum dc_irq_source irq_src;
60}; 60};
61 61
62/**
63 * struct irq_list_head - Linked-list for low context IRQ handlers.
64 *
65 * @head: The list_head within &struct handler_data
66 * @work: A work_struct containing the deferred handler work
67 */
62struct irq_list_head { 68struct irq_list_head {
63 struct list_head head; 69 struct list_head head;
64 /* In case this interrupt needs post-processing, 'work' will be queued*/ 70 /* In case this interrupt needs post-processing, 'work' will be queued*/
65 struct work_struct work; 71 struct work_struct work;
66}; 72};
67 73
74/**
75 * struct dm_compressor_info - Buffer info used by frame buffer compression
76 * @cpu_addr: MMIO cpu addr
77 * @bo_ptr: Pointer to the buffer object
78 * @gpu_addr: MMIO gpu addr
79 */
68struct dm_comressor_info { 80struct dm_comressor_info {
69 void *cpu_addr; 81 void *cpu_addr;
70 struct amdgpu_bo *bo_ptr; 82 struct amdgpu_bo *bo_ptr;
71 uint64_t gpu_addr; 83 uint64_t gpu_addr;
72}; 84};
73 85
86/**
87 * struct amdgpu_display_manager - Central amdgpu display manager device
88 *
89 * @dc: Display Core control structure
90 * @adev: AMDGPU base driver structure
91 * @ddev: DRM base driver structure
92 * @display_indexes_num: Max number of display streams supported
93 * @irq_handler_list_table_lock: Synchronizes access to IRQ tables
94 * @backlight_dev: Backlight control device
95 * @cached_state: Caches device atomic state for suspend/resume
96 * @compressor: Frame buffer compression buffer. See &struct dm_comressor_info
97 */
74struct amdgpu_display_manager { 98struct amdgpu_display_manager {
99
75 struct dc *dc; 100 struct dc *dc;
101
102 /**
103 * @cgs_device:
104 *
105 * The Common Graphics Services device. It provides an interface for
106 * accessing registers.
107 */
76 struct cgs_device *cgs_device; 108 struct cgs_device *cgs_device;
77 109
78 struct amdgpu_device *adev; /*AMD base driver*/ 110 struct amdgpu_device *adev;
79 struct drm_device *ddev; /*DRM base driver*/ 111 struct drm_device *ddev;
80 u16 display_indexes_num; 112 u16 display_indexes_num;
81 113
82 /* 114 /**
83 * 'irq_source_handler_table' holds a list of handlers 115 * @irq_handler_list_low_tab:
84 * per (DAL) IRQ source. 116 *
117 * Low priority IRQ handler table.
85 * 118 *
86 * Each IRQ source may need to be handled at different contexts. 119 * It is a n*m table consisting of n IRQ sources, and m handlers per IRQ
87 * By 'context' we mean, for example: 120 * source. Low priority IRQ handlers are deferred to a workqueue to be
88 * - The ISR context, which is the direct interrupt handler. 121 * processed. Hence, they can sleep.
89 * - The 'deferred' context - this is the post-processing of the
90 * interrupt, but at a lower priority.
91 * 122 *
92 * Note that handlers are called in the same order as they were 123 * Note that handlers are called in the same order as they were
93 * registered (FIFO). 124 * registered (FIFO).
94 */ 125 */
95 struct irq_list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER]; 126 struct irq_list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
127
128 /**
129 * @irq_handler_list_high_tab:
130 *
131 * High priority IRQ handler table.
132 *
133 * It is a n*m table, same as &irq_handler_list_low_tab. However,
134 * handlers in this table are not deferred and are called immediately.
135 */
96 struct list_head irq_handler_list_high_tab[DAL_IRQ_SOURCES_NUMBER]; 136 struct list_head irq_handler_list_high_tab[DAL_IRQ_SOURCES_NUMBER];
97 137
138 /**
139 * @pflip_params:
140 *
141 * Page flip IRQ parameters, passed to registered handlers when
142 * triggered.
143 */
98 struct common_irq_params 144 struct common_irq_params
99 pflip_params[DC_IRQ_SOURCE_PFLIP_LAST - DC_IRQ_SOURCE_PFLIP_FIRST + 1]; 145 pflip_params[DC_IRQ_SOURCE_PFLIP_LAST - DC_IRQ_SOURCE_PFLIP_FIRST + 1];
100 146
147 /**
148 * @vblank_params:
149 *
150 * Vertical blanking IRQ parameters, passed to registered handlers when
151 * triggered.
152 */
101 struct common_irq_params 153 struct common_irq_params
102 vblank_params[DC_IRQ_SOURCE_VBLANK6 - DC_IRQ_SOURCE_VBLANK1 + 1]; 154 vblank_params[DC_IRQ_SOURCE_VBLANK6 - DC_IRQ_SOURCE_VBLANK1 + 1];
103 155
104 /* this spin lock synchronizes access to 'irq_handler_list_table' */
105 spinlock_t irq_handler_list_table_lock; 156 spinlock_t irq_handler_list_table_lock;
106 157
107 struct backlight_device *backlight_dev; 158 struct backlight_device *backlight_dev;
@@ -110,9 +161,6 @@ struct amdgpu_display_manager {
110 161
111 struct mod_freesync *freesync_module; 162 struct mod_freesync *freesync_module;
112 163
113 /**
114 * Caches device atomic state for suspend/resume
115 */
116 struct drm_atomic_state *cached_state; 164 struct drm_atomic_state *cached_state;
117 165
118 struct dm_comressor_info compressor; 166 struct dm_comressor_info compressor;
@@ -160,8 +208,6 @@ struct amdgpu_dm_connector {
160 struct mutex hpd_lock; 208 struct mutex hpd_lock;
161 209
162 bool fake_enable; 210 bool fake_enable;
163
164 bool mst_connected;
165}; 211};
166 212
167#define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base) 213#define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
index be19e6861189..216e48cec716 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
@@ -164,7 +164,7 @@ int amdgpu_dm_set_regamma_lut(struct dm_crtc_state *crtc)
164 */ 164 */
165 stream->out_transfer_func->type = TF_TYPE_DISTRIBUTED_POINTS; 165 stream->out_transfer_func->type = TF_TYPE_DISTRIBUTED_POINTS;
166 ret = mod_color_calculate_regamma_params(stream->out_transfer_func, 166 ret = mod_color_calculate_regamma_params(stream->out_transfer_func,
167 gamma, true, adev->asic_type <= CHIP_RAVEN); 167 gamma, true, adev->asic_type <= CHIP_RAVEN, NULL);
168 dc_gamma_release(&gamma); 168 dc_gamma_release(&gamma);
169 if (!ret) { 169 if (!ret) {
170 stream->out_transfer_func->type = old_type; 170 stream->out_transfer_func->type = old_type;
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
index 01fc5717b657..f088ac585978 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
@@ -75,6 +75,11 @@ int amdgpu_dm_crtc_set_crc_source(struct drm_crtc *crtc, const char *src_name)
75 return -EINVAL; 75 return -EINVAL;
76 } 76 }
77 77
78 if (!stream_state) {
79 DRM_ERROR("No stream state for CRTC%d\n", crtc->index);
80 return -EINVAL;
81 }
82
78 /* When enabling CRC, we should also disable dithering. */ 83 /* When enabling CRC, we should also disable dithering. */
79 if (source == AMDGPU_DM_PIPE_CRC_SOURCE_AUTO) { 84 if (source == AMDGPU_DM_PIPE_CRC_SOURCE_AUTO) {
80 if (dc_stream_configure_crc(stream_state->ctx->dc, 85 if (dc_stream_configure_crc(stream_state->ctx->dc,
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
index a212178f2edc..cd10f77cdeb0 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_irq.c
@@ -32,16 +32,55 @@
32#include "amdgpu_dm.h" 32#include "amdgpu_dm.h"
33#include "amdgpu_dm_irq.h" 33#include "amdgpu_dm_irq.h"
34 34
35/**
36 * DOC: overview
37 *
38 * DM provides another layer of IRQ management on top of what the base driver
39 * already provides. This is something that could be cleaned up, and is a
40 * future TODO item.
41 *
42 * The base driver provides IRQ source registration with DRM, handler
43 * registration into the base driver's IRQ table, and a handler callback
44 * amdgpu_irq_handler(), with which DRM calls on interrupts. This generic
45 * handler looks up the IRQ table, and calls the respective
46 * &amdgpu_irq_src_funcs.process hookups.
47 *
48 * What DM provides on top are two IRQ tables specifically for top-half and
49 * bottom-half IRQ handling, with the bottom-half implementing workqueues:
50 *
51 * - &amdgpu_display_manager.irq_handler_list_high_tab
52 * - &amdgpu_display_manager.irq_handler_list_low_tab
53 *
54 * They override the base driver's IRQ table, and the effect can be seen
55 * in the hooks that DM provides for &amdgpu_irq_src_funcs.process. They
56 * are all set to the DM generic handler amdgpu_dm_irq_handler(), which looks up
57 * DM's IRQ tables. However, in order for base driver to recognize this hook, DM
58 * still needs to register the IRQ with the base driver. See
59 * dce110_register_irq_handlers() and dcn10_register_irq_handlers().
60 *
61 * To expose DC's hardware interrupt toggle to the base driver, DM implements
62 * &amdgpu_irq_src_funcs.set hooks. Base driver calls it through
63 * amdgpu_irq_update() to enable or disable the interrupt.
64 */
65
35/****************************************************************************** 66/******************************************************************************
36 * Private declarations. 67 * Private declarations.
37 *****************************************************************************/ 68 *****************************************************************************/
38 69
70/**
71 * struct amdgpu_dm_irq_handler_data - Data for DM interrupt handlers.
72 *
73 * @list: Linked list entry referencing the next/previous handler
74 * @handler: Handler function
75 * @handler_arg: Argument passed to the handler when triggered
76 * @dm: DM which this handler belongs to
77 * @irq_source: DC interrupt source that this handler is registered for
78 */
39struct amdgpu_dm_irq_handler_data { 79struct amdgpu_dm_irq_handler_data {
40 struct list_head list; 80 struct list_head list;
41 interrupt_handler handler; 81 interrupt_handler handler;
42 void *handler_arg; 82 void *handler_arg;
43 83
44 /* DM which this handler belongs to */
45 struct amdgpu_display_manager *dm; 84 struct amdgpu_display_manager *dm;
46 /* DAL irq source which registered for this interrupt. */ 85 /* DAL irq source which registered for this interrupt. */
47 enum dc_irq_source irq_source; 86 enum dc_irq_source irq_source;
@@ -68,7 +107,7 @@ static void init_handler_common_data(struct amdgpu_dm_irq_handler_data *hcd,
68} 107}
69 108
70/** 109/**
71 * dm_irq_work_func - Handle an IRQ outside of the interrupt handler proper. 110 * dm_irq_work_func() - Handle an IRQ outside of the interrupt handler proper.
72 * 111 *
73 * @work: work struct 112 * @work: work struct
74 */ 113 */
@@ -99,8 +138,8 @@ static void dm_irq_work_func(struct work_struct *work)
99 * (The most common use is HPD interrupt) */ 138 * (The most common use is HPD interrupt) */
100} 139}
101 140
102/** 141/*
103 * Remove a handler and return a pointer to hander list from which the 142 * Remove a handler and return a pointer to handler list from which the
104 * handler was removed. 143 * handler was removed.
105 */ 144 */
106static struct list_head *remove_irq_handler(struct amdgpu_device *adev, 145static struct list_head *remove_irq_handler(struct amdgpu_device *adev,
@@ -203,6 +242,24 @@ static bool validate_irq_unregistration_params(enum dc_irq_source irq_source,
203 * Note: caller is responsible for input validation. 242 * Note: caller is responsible for input validation.
204 *****************************************************************************/ 243 *****************************************************************************/
205 244
245/**
246 * amdgpu_dm_irq_register_interrupt() - Register a handler within DM.
247 * @adev: The base driver device containing the DM device.
248 * @int_params: Interrupt parameters containing the source, and handler context
249 * @ih: Function pointer to the interrupt handler to register
250 * @handler_args: Arguments passed to the handler when the interrupt occurs
251 *
252 * Register an interrupt handler for the given IRQ source, under the given
253 * context. The context can either be high or low. High context handlers are
254 * executed directly within ISR context, while low context is executed within a
255 * workqueue, thereby allowing operations that sleep.
256 *
257 * Registered handlers are called in a FIFO manner, i.e. the most recently
258 * registered handler will be called first.
259 *
260 * Return: Handler data &struct amdgpu_dm_irq_handler_data containing the IRQ
261 * source, handler function, and args
262 */
206void *amdgpu_dm_irq_register_interrupt(struct amdgpu_device *adev, 263void *amdgpu_dm_irq_register_interrupt(struct amdgpu_device *adev,
207 struct dc_interrupt_params *int_params, 264 struct dc_interrupt_params *int_params,
208 void (*ih)(void *), 265 void (*ih)(void *),
@@ -261,6 +318,15 @@ void *amdgpu_dm_irq_register_interrupt(struct amdgpu_device *adev,
261 return handler_data; 318 return handler_data;
262} 319}
263 320
321/**
322 * amdgpu_dm_irq_unregister_interrupt() - Remove a handler from the DM IRQ table
323 * @adev: The base driver device containing the DM device
324 * @irq_source: IRQ source to remove the given handler from
325 * @ih: Function pointer to the interrupt handler to unregister
326 *
327 * Go through both low and high context IRQ tables, and find the given handler
328 * for the given irq source. If found, remove it. Otherwise, do nothing.
329 */
264void amdgpu_dm_irq_unregister_interrupt(struct amdgpu_device *adev, 330void amdgpu_dm_irq_unregister_interrupt(struct amdgpu_device *adev,
265 enum dc_irq_source irq_source, 331 enum dc_irq_source irq_source,
266 void *ih) 332 void *ih)
@@ -295,6 +361,20 @@ void amdgpu_dm_irq_unregister_interrupt(struct amdgpu_device *adev,
295 } 361 }
296} 362}
297 363
364/**
365 * amdgpu_dm_irq_init() - Initialize DM IRQ management
366 * @adev: The base driver device containing the DM device
367 *
368 * Initialize DM's high and low context IRQ tables.
369 *
370 * The N by M table contains N IRQ sources, with M
371 * &struct amdgpu_dm_irq_handler_data hooked together in a linked list. The
372 * list_heads are initialized here. When an interrupt n is triggered, all m
373 * handlers are called in sequence, FIFO according to registration order.
374 *
375 * The low context table requires special steps to initialize, since handlers
376 * will be deferred to a workqueue. See &struct irq_list_head.
377 */
298int amdgpu_dm_irq_init(struct amdgpu_device *adev) 378int amdgpu_dm_irq_init(struct amdgpu_device *adev)
299{ 379{
300 int src; 380 int src;
@@ -317,7 +397,12 @@ int amdgpu_dm_irq_init(struct amdgpu_device *adev)
317 return 0; 397 return 0;
318} 398}
319 399
320/* DM IRQ and timer resource release */ 400/**
401 * amdgpu_dm_irq_fini() - Tear down DM IRQ management
402 * @adev: The base driver device containing the DM device
403 *
404 * Flush all work within the low context IRQ table.
405 */
321void amdgpu_dm_irq_fini(struct amdgpu_device *adev) 406void amdgpu_dm_irq_fini(struct amdgpu_device *adev)
322{ 407{
323 int src; 408 int src;
@@ -414,7 +499,7 @@ int amdgpu_dm_irq_resume_late(struct amdgpu_device *adev)
414 return 0; 499 return 0;
415} 500}
416 501
417/** 502/*
418 * amdgpu_dm_irq_schedule_work - schedule all work items registered for the 503 * amdgpu_dm_irq_schedule_work - schedule all work items registered for the
419 * "irq_source". 504 * "irq_source".
420 */ 505 */
@@ -439,8 +524,9 @@ static void amdgpu_dm_irq_schedule_work(struct amdgpu_device *adev,
439 524
440} 525}
441 526
442/** amdgpu_dm_irq_immediate_work 527/*
443 * Callback high irq work immediately, don't send to work queue 528 * amdgpu_dm_irq_immediate_work
529 * Callback high irq work immediately, don't send to work queue
444 */ 530 */
445static void amdgpu_dm_irq_immediate_work(struct amdgpu_device *adev, 531static void amdgpu_dm_irq_immediate_work(struct amdgpu_device *adev,
446 enum dc_irq_source irq_source) 532 enum dc_irq_source irq_source)
@@ -467,11 +553,14 @@ static void amdgpu_dm_irq_immediate_work(struct amdgpu_device *adev,
467 DM_IRQ_TABLE_UNLOCK(adev, irq_table_flags); 553 DM_IRQ_TABLE_UNLOCK(adev, irq_table_flags);
468} 554}
469 555
470/* 556/**
471 * amdgpu_dm_irq_handler 557 * amdgpu_dm_irq_handler - Generic DM IRQ handler
558 * @adev: amdgpu base driver device containing the DM device
559 * @source: Unused
560 * @entry: Data about the triggered interrupt
472 * 561 *
473 * Generic IRQ handler, calls all registered high irq work immediately, and 562 * Calls all registered high irq work immediately, and schedules work for low
474 * schedules work for low irq 563 * irq. The DM IRQ table is used to find the corresponding handlers.
475 */ 564 */
476static int amdgpu_dm_irq_handler(struct amdgpu_device *adev, 565static int amdgpu_dm_irq_handler(struct amdgpu_device *adev,
477 struct amdgpu_irq_src *source, 566 struct amdgpu_irq_src *source,
@@ -613,7 +702,7 @@ void amdgpu_dm_set_irq_funcs(struct amdgpu_device *adev)
613 adev->hpd_irq.funcs = &dm_hpd_irq_funcs; 702 adev->hpd_irq.funcs = &dm_hpd_irq_funcs;
614} 703}
615 704
616/* 705/**
617 * amdgpu_dm_hpd_init - hpd setup callback. 706 * amdgpu_dm_hpd_init - hpd setup callback.
618 * 707 *
619 * @adev: amdgpu_device pointer 708 * @adev: amdgpu_device pointer
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 03601d717fed..d02c32a1039c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -205,40 +205,6 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = {
205 .atomic_get_property = amdgpu_dm_connector_atomic_get_property 205 .atomic_get_property = amdgpu_dm_connector_atomic_get_property
206}; 206};
207 207
208void dm_dp_mst_dc_sink_create(struct drm_connector *connector)
209{
210 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
211 struct dc_sink *dc_sink;
212 struct dc_sink_init_data init_params = {
213 .link = aconnector->dc_link,
214 .sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST };
215
216 /* FIXME none of this is safe. we shouldn't touch aconnector here in
217 * atomic_check
218 */
219
220 /*
221 * TODO: Need to further figure out why ddc.algo is NULL while MST port exists
222 */
223 if (!aconnector->port || !aconnector->port->aux.ddc.algo)
224 return;
225
226 ASSERT(aconnector->edid);
227
228 dc_sink = dc_link_add_remote_sink(
229 aconnector->dc_link,
230 (uint8_t *)aconnector->edid,
231 (aconnector->edid->extensions + 1) * EDID_LENGTH,
232 &init_params);
233
234 dc_sink->priv = aconnector;
235 aconnector->dc_sink = dc_sink;
236
237 if (aconnector->dc_sink)
238 amdgpu_dm_update_freesync_caps(
239 connector, aconnector->edid);
240}
241
242static int dm_dp_mst_get_modes(struct drm_connector *connector) 208static int dm_dp_mst_get_modes(struct drm_connector *connector)
243{ 209{
244 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); 210 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
@@ -319,12 +285,7 @@ dm_dp_create_fake_mst_encoder(struct amdgpu_dm_connector *connector)
319 struct amdgpu_device *adev = dev->dev_private; 285 struct amdgpu_device *adev = dev->dev_private;
320 struct amdgpu_encoder *amdgpu_encoder; 286 struct amdgpu_encoder *amdgpu_encoder;
321 struct drm_encoder *encoder; 287 struct drm_encoder *encoder;
322 const struct drm_connector_helper_funcs *connector_funcs =
323 connector->base.helper_private;
324 struct drm_encoder *enc_master =
325 connector_funcs->best_encoder(&connector->base);
326 288
327 DRM_DEBUG_KMS("enc master is %p\n", enc_master);
328 amdgpu_encoder = kzalloc(sizeof(*amdgpu_encoder), GFP_KERNEL); 289 amdgpu_encoder = kzalloc(sizeof(*amdgpu_encoder), GFP_KERNEL);
329 if (!amdgpu_encoder) 290 if (!amdgpu_encoder)
330 return NULL; 291 return NULL;
@@ -354,25 +315,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
354 struct amdgpu_device *adev = dev->dev_private; 315 struct amdgpu_device *adev = dev->dev_private;
355 struct amdgpu_dm_connector *aconnector; 316 struct amdgpu_dm_connector *aconnector;
356 struct drm_connector *connector; 317 struct drm_connector *connector;
357 struct drm_connector_list_iter conn_iter;
358
359 drm_connector_list_iter_begin(dev, &conn_iter);
360 drm_for_each_connector_iter(connector, &conn_iter) {
361 aconnector = to_amdgpu_dm_connector(connector);
362 if (aconnector->mst_port == master
363 && !aconnector->port) {
364 DRM_INFO("DM_MST: reusing connector: %p [id: %d] [master: %p]\n",
365 aconnector, connector->base.id, aconnector->mst_port);
366
367 aconnector->port = port;
368 drm_connector_set_path_property(connector, pathprop);
369
370 drm_connector_list_iter_end(&conn_iter);
371 aconnector->mst_connected = true;
372 return &aconnector->base;
373 }
374 }
375 drm_connector_list_iter_end(&conn_iter);
376 318
377 aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL); 319 aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL);
378 if (!aconnector) 320 if (!aconnector)
@@ -421,8 +363,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
421 */ 363 */
422 amdgpu_dm_connector_funcs_reset(connector); 364 amdgpu_dm_connector_funcs_reset(connector);
423 365
424 aconnector->mst_connected = true;
425
426 DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n", 366 DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n",
427 aconnector, connector->base.id, aconnector->mst_port); 367 aconnector, connector->base.id, aconnector->mst_port);
428 368
@@ -434,6 +374,9 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
434static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, 374static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
435 struct drm_connector *connector) 375 struct drm_connector *connector)
436{ 376{
377 struct amdgpu_dm_connector *master = container_of(mgr, struct amdgpu_dm_connector, mst_mgr);
378 struct drm_device *dev = master->base.dev;
379 struct amdgpu_device *adev = dev->dev_private;
437 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); 380 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
438 381
439 DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n", 382 DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n",
@@ -447,7 +390,10 @@ static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
447 aconnector->dc_sink = NULL; 390 aconnector->dc_sink = NULL;
448 } 391 }
449 392
450 aconnector->mst_connected = false; 393 drm_connector_unregister(connector);
394 if (adev->mode_info.rfbdev)
395 drm_fb_helper_remove_one_connector(&adev->mode_info.rfbdev->helper, connector);
396 drm_connector_put(connector);
451} 397}
452 398
453static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr) 399static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
@@ -458,18 +404,10 @@ static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
458 drm_kms_helper_hotplug_event(dev); 404 drm_kms_helper_hotplug_event(dev);
459} 405}
460 406
461static void dm_dp_mst_link_status_reset(struct drm_connector *connector)
462{
463 mutex_lock(&connector->dev->mode_config.mutex);
464 drm_connector_set_link_status_property(connector, DRM_MODE_LINK_STATUS_BAD);
465 mutex_unlock(&connector->dev->mode_config.mutex);
466}
467
468static void dm_dp_mst_register_connector(struct drm_connector *connector) 407static void dm_dp_mst_register_connector(struct drm_connector *connector)
469{ 408{
470 struct drm_device *dev = connector->dev; 409 struct drm_device *dev = connector->dev;
471 struct amdgpu_device *adev = dev->dev_private; 410 struct amdgpu_device *adev = dev->dev_private;
472 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
473 411
474 if (adev->mode_info.rfbdev) 412 if (adev->mode_info.rfbdev)
475 drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector); 413 drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector);
@@ -477,9 +415,6 @@ static void dm_dp_mst_register_connector(struct drm_connector *connector)
477 DRM_ERROR("adev->mode_info.rfbdev is NULL\n"); 415 DRM_ERROR("adev->mode_info.rfbdev is NULL\n");
478 416
479 drm_connector_register(connector); 417 drm_connector_register(connector);
480
481 if (aconnector->mst_connected)
482 dm_dp_mst_link_status_reset(connector);
483} 418}
484 419
485static const struct drm_dp_mst_topology_cbs dm_mst_cbs = { 420static const struct drm_dp_mst_topology_cbs dm_mst_cbs = {
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h
index 8cf51da26657..2da851b40042 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h
@@ -31,6 +31,5 @@ struct amdgpu_dm_connector;
31 31
32void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, 32void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
33 struct amdgpu_dm_connector *aconnector); 33 struct amdgpu_dm_connector *aconnector);
34void dm_dp_mst_dc_sink_create(struct drm_connector *connector);
35 34
36#endif 35#endif
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
index 12001a006b2d..9d2d6986b983 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_pp_smu.c
@@ -485,11 +485,11 @@ void pp_rv_set_display_requirement(struct pp_smu *pp,
485 return; 485 return;
486 486
487 clock.clock_type = amd_pp_dcf_clock; 487 clock.clock_type = amd_pp_dcf_clock;
488 clock.clock_freq_in_khz = req->hard_min_dcefclk_khz; 488 clock.clock_freq_in_khz = req->hard_min_dcefclk_mhz * 1000;
489 pp_funcs->display_clock_voltage_request(pp_handle, &clock); 489 pp_funcs->display_clock_voltage_request(pp_handle, &clock);
490 490
491 clock.clock_type = amd_pp_f_clock; 491 clock.clock_type = amd_pp_f_clock;
492 clock.clock_freq_in_khz = req->hard_min_fclk_khz; 492 clock.clock_freq_in_khz = req->hard_min_fclk_mhz * 1000;
493 pp_funcs->display_clock_voltage_request(pp_handle, &clock); 493 pp_funcs->display_clock_voltage_request(pp_handle, &clock);
494} 494}
495 495
@@ -518,13 +518,13 @@ void pp_rv_set_wm_ranges(struct pp_smu *pp,
518 wm_dce_clocks[i].wm_set_id = 518 wm_dce_clocks[i].wm_set_id =
519 ranges->reader_wm_sets[i].wm_inst; 519 ranges->reader_wm_sets[i].wm_inst;
520 wm_dce_clocks[i].wm_max_dcfclk_clk_in_khz = 520 wm_dce_clocks[i].wm_max_dcfclk_clk_in_khz =
521 ranges->reader_wm_sets[i].max_drain_clk_khz; 521 ranges->reader_wm_sets[i].max_drain_clk_mhz * 1000;
522 wm_dce_clocks[i].wm_min_dcfclk_clk_in_khz = 522 wm_dce_clocks[i].wm_min_dcfclk_clk_in_khz =
523 ranges->reader_wm_sets[i].min_drain_clk_khz; 523 ranges->reader_wm_sets[i].min_drain_clk_mhz * 1000;
524 wm_dce_clocks[i].wm_max_mem_clk_in_khz = 524 wm_dce_clocks[i].wm_max_mem_clk_in_khz =
525 ranges->reader_wm_sets[i].max_fill_clk_khz; 525 ranges->reader_wm_sets[i].max_fill_clk_mhz * 1000;
526 wm_dce_clocks[i].wm_min_mem_clk_in_khz = 526 wm_dce_clocks[i].wm_min_mem_clk_in_khz =
527 ranges->reader_wm_sets[i].min_fill_clk_khz; 527 ranges->reader_wm_sets[i].min_fill_clk_mhz * 1000;
528 } 528 }
529 529
530 for (i = 0; i < wm_with_clock_ranges.num_wm_mcif_sets; i++) { 530 for (i = 0; i < wm_with_clock_ranges.num_wm_mcif_sets; i++) {
@@ -534,13 +534,13 @@ void pp_rv_set_wm_ranges(struct pp_smu *pp,
534 wm_soc_clocks[i].wm_set_id = 534 wm_soc_clocks[i].wm_set_id =
535 ranges->writer_wm_sets[i].wm_inst; 535 ranges->writer_wm_sets[i].wm_inst;
536 wm_soc_clocks[i].wm_max_socclk_clk_in_khz = 536 wm_soc_clocks[i].wm_max_socclk_clk_in_khz =
537 ranges->writer_wm_sets[i].max_fill_clk_khz; 537 ranges->writer_wm_sets[i].max_fill_clk_mhz * 1000;
538 wm_soc_clocks[i].wm_min_socclk_clk_in_khz = 538 wm_soc_clocks[i].wm_min_socclk_clk_in_khz =
539 ranges->writer_wm_sets[i].min_fill_clk_khz; 539 ranges->writer_wm_sets[i].min_fill_clk_mhz * 1000;
540 wm_soc_clocks[i].wm_max_mem_clk_in_khz = 540 wm_soc_clocks[i].wm_max_mem_clk_in_khz =
541 ranges->writer_wm_sets[i].max_drain_clk_khz; 541 ranges->writer_wm_sets[i].max_drain_clk_mhz * 1000;
542 wm_soc_clocks[i].wm_min_mem_clk_in_khz = 542 wm_soc_clocks[i].wm_min_mem_clk_in_khz =
543 ranges->writer_wm_sets[i].min_drain_clk_khz; 543 ranges->writer_wm_sets[i].min_drain_clk_mhz * 1000;
544 } 544 }
545 545
546 pp_funcs->set_watermarks_for_clocks_ranges(pp_handle, &wm_with_clock_ranges); 546 pp_funcs->set_watermarks_for_clocks_ranges(pp_handle, &wm_with_clock_ranges);
diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
index 0e1dc1b1a48d..c2ab026aee91 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
@@ -2030,7 +2030,7 @@ static uint32_t get_src_obj_list(struct bios_parser *bp, ATOM_OBJECT *object,
2030static struct device_id device_type_from_device_id(uint16_t device_id) 2030static struct device_id device_type_from_device_id(uint16_t device_id)
2031{ 2031{
2032 2032
2033 struct device_id result_device_id; 2033 struct device_id result_device_id = {0};
2034 2034
2035 switch (device_id) { 2035 switch (device_id) {
2036 case ATOM_DEVICE_LCD1_SUPPORT: 2036 case ATOM_DEVICE_LCD1_SUPPORT:
diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
index ff764da21b6f..751bb614fc0e 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
@@ -1884,6 +1884,8 @@ static const struct dc_vbios_funcs vbios_funcs = {
1884 1884
1885 .is_accelerated_mode = bios_parser_is_accelerated_mode, 1885 .is_accelerated_mode = bios_parser_is_accelerated_mode,
1886 1886
1887 .is_active_display = bios_is_active_display,
1888
1887 .set_scratch_critical_state = bios_parser_set_scratch_critical_state, 1889 .set_scratch_critical_state = bios_parser_set_scratch_critical_state,
1888 1890
1889 1891
diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.c
index d4589470985c..fdda8aa8e303 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.c
@@ -88,3 +88,96 @@ uint32_t bios_get_vga_enabled_displays(
88 return active_disp; 88 return active_disp;
89} 89}
90 90
91bool bios_is_active_display(
92 struct dc_bios *bios,
93 enum signal_type signal,
94 const struct connector_device_tag_info *device_tag)
95{
96 uint32_t active = 0;
97 uint32_t connected = 0;
98 uint32_t bios_scratch_0 = 0;
99 uint32_t bios_scratch_3 = 0;
100
101 switch (signal) {
102 case SIGNAL_TYPE_DVI_SINGLE_LINK:
103 case SIGNAL_TYPE_DVI_DUAL_LINK:
104 case SIGNAL_TYPE_HDMI_TYPE_A:
105 case SIGNAL_TYPE_DISPLAY_PORT:
106 case SIGNAL_TYPE_DISPLAY_PORT_MST:
107 {
108 if (device_tag->dev_id.device_type == DEVICE_TYPE_DFP) {
109 switch (device_tag->dev_id.enum_id) {
110 case 1:
111 {
112 active = ATOM_S3_DFP1_ACTIVE;
113 connected = 0x0008; //ATOM_DISPLAY_DFP1_CONNECT
114 }
115 break;
116
117 case 2:
118 {
119 active = ATOM_S3_DFP2_ACTIVE;
120 connected = 0x0080; //ATOM_DISPLAY_DFP2_CONNECT
121 }
122 break;
123
124 case 3:
125 {
126 active = ATOM_S3_DFP3_ACTIVE;
127 connected = 0x0200; //ATOM_DISPLAY_DFP3_CONNECT
128 }
129 break;
130
131 case 4:
132 {
133 active = ATOM_S3_DFP4_ACTIVE;
134 connected = 0x0400; //ATOM_DISPLAY_DFP4_CONNECT
135 }
136 break;
137
138 case 5:
139 {
140 active = ATOM_S3_DFP5_ACTIVE;
141 connected = 0x0800; //ATOM_DISPLAY_DFP5_CONNECT
142 }
143 break;
144
145 case 6:
146 {
147 active = ATOM_S3_DFP6_ACTIVE;
148 connected = 0x0040; //ATOM_DISPLAY_DFP6_CONNECT
149 }
150 break;
151
152 default:
153 break;
154 }
155 }
156 }
157 break;
158
159 case SIGNAL_TYPE_LVDS:
160 case SIGNAL_TYPE_EDP:
161 {
162 active = ATOM_S3_LCD1_ACTIVE;
163 connected = 0x0002; //ATOM_DISPLAY_LCD1_CONNECT
164 }
165 break;
166
167 default:
168 break;
169 }
170
171
172 if (bios->regs->BIOS_SCRATCH_0) /*follow up with other asic, todo*/
173 bios_scratch_0 = REG_READ(BIOS_SCRATCH_0);
174 if (bios->regs->BIOS_SCRATCH_3) /*follow up with other asic, todo*/
175 bios_scratch_3 = REG_READ(BIOS_SCRATCH_3);
176
177 bios_scratch_3 &= ATOM_S3_DEVICE_ACTIVE_MASK;
178 if ((active & bios_scratch_3) && (connected & bios_scratch_0))
179 return true;
180
181 return false;
182}
183
diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.h b/drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.h
index 75a29e68fb27..f33cac2147e3 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.h
+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser_helper.h
@@ -35,6 +35,10 @@ bool bios_is_accelerated_mode(struct dc_bios *bios);
35void bios_set_scratch_acc_mode_change(struct dc_bios *bios); 35void bios_set_scratch_acc_mode_change(struct dc_bios *bios);
36void bios_set_scratch_critical_state(struct dc_bios *bios, bool state); 36void bios_set_scratch_critical_state(struct dc_bios *bios, bool state);
37uint32_t bios_get_vga_enabled_displays(struct dc_bios *bios); 37uint32_t bios_get_vga_enabled_displays(struct dc_bios *bios);
38bool bios_is_active_display(
39 struct dc_bios *bios,
40 enum signal_type signal,
41 const struct connector_device_tag_info *device_tag);
38 42
39#define GET_IMAGE(type, offset) ((type *) bios_get_image(&bp->base, offset, sizeof(type))) 43#define GET_IMAGE(type, offset) ((type *) bios_get_image(&bp->base, offset, sizeof(type)))
40 44
diff --git a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
index 3208188b7ed4..43e4a2be0fa6 100644
--- a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
+++ b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
@@ -1423,27 +1423,27 @@ void dcn_bw_notify_pplib_of_wm_ranges(struct dc *dc)
1423 ranges.num_reader_wm_sets = WM_SET_COUNT; 1423 ranges.num_reader_wm_sets = WM_SET_COUNT;
1424 ranges.num_writer_wm_sets = WM_SET_COUNT; 1424 ranges.num_writer_wm_sets = WM_SET_COUNT;
1425 ranges.reader_wm_sets[0].wm_inst = WM_A; 1425 ranges.reader_wm_sets[0].wm_inst = WM_A;
1426 ranges.reader_wm_sets[0].min_drain_clk_khz = min_dcfclk_khz; 1426 ranges.reader_wm_sets[0].min_drain_clk_mhz = min_dcfclk_khz / 1000;
1427 ranges.reader_wm_sets[0].max_drain_clk_khz = overdrive; 1427 ranges.reader_wm_sets[0].max_drain_clk_mhz = overdrive / 1000;
1428 ranges.reader_wm_sets[0].min_fill_clk_khz = min_fclk_khz; 1428 ranges.reader_wm_sets[0].min_fill_clk_mhz = min_fclk_khz / 1000;
1429 ranges.reader_wm_sets[0].max_fill_clk_khz = overdrive; 1429 ranges.reader_wm_sets[0].max_fill_clk_mhz = overdrive / 1000;
1430 ranges.writer_wm_sets[0].wm_inst = WM_A; 1430 ranges.writer_wm_sets[0].wm_inst = WM_A;
1431 ranges.writer_wm_sets[0].min_fill_clk_khz = socclk_khz; 1431 ranges.writer_wm_sets[0].min_fill_clk_mhz = socclk_khz / 1000;
1432 ranges.writer_wm_sets[0].max_fill_clk_khz = overdrive; 1432 ranges.writer_wm_sets[0].max_fill_clk_mhz = overdrive / 1000;
1433 ranges.writer_wm_sets[0].min_drain_clk_khz = min_fclk_khz; 1433 ranges.writer_wm_sets[0].min_drain_clk_mhz = min_fclk_khz / 1000;
1434 ranges.writer_wm_sets[0].max_drain_clk_khz = overdrive; 1434 ranges.writer_wm_sets[0].max_drain_clk_mhz = overdrive / 1000;
1435 1435
1436 if (dc->debug.pplib_wm_report_mode == WM_REPORT_OVERRIDE) { 1436 if (dc->debug.pplib_wm_report_mode == WM_REPORT_OVERRIDE) {
1437 ranges.reader_wm_sets[0].wm_inst = WM_A; 1437 ranges.reader_wm_sets[0].wm_inst = WM_A;
1438 ranges.reader_wm_sets[0].min_drain_clk_khz = 300000; 1438 ranges.reader_wm_sets[0].min_drain_clk_mhz = 300;
1439 ranges.reader_wm_sets[0].max_drain_clk_khz = 5000000; 1439 ranges.reader_wm_sets[0].max_drain_clk_mhz = 5000;
1440 ranges.reader_wm_sets[0].min_fill_clk_khz = 800000; 1440 ranges.reader_wm_sets[0].min_fill_clk_mhz = 800;
1441 ranges.reader_wm_sets[0].max_fill_clk_khz = 5000000; 1441 ranges.reader_wm_sets[0].max_fill_clk_mhz = 5000;
1442 ranges.writer_wm_sets[0].wm_inst = WM_A; 1442 ranges.writer_wm_sets[0].wm_inst = WM_A;
1443 ranges.writer_wm_sets[0].min_fill_clk_khz = 200000; 1443 ranges.writer_wm_sets[0].min_fill_clk_mhz = 200;
1444 ranges.writer_wm_sets[0].max_fill_clk_khz = 5000000; 1444 ranges.writer_wm_sets[0].max_fill_clk_mhz = 5000;
1445 ranges.writer_wm_sets[0].min_drain_clk_khz = 800000; 1445 ranges.writer_wm_sets[0].min_drain_clk_mhz = 800;
1446 ranges.writer_wm_sets[0].max_drain_clk_khz = 5000000; 1446 ranges.writer_wm_sets[0].max_drain_clk_mhz = 5000;
1447 } 1447 }
1448 1448
1449 ranges.reader_wm_sets[1] = ranges.writer_wm_sets[0]; 1449 ranges.reader_wm_sets[1] = ranges.writer_wm_sets[0];
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 7c491c91465f..3279e26c3440 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -391,9 +391,11 @@ bool dc_stream_program_csc_matrix(struct dc *dc, struct dc_stream_state *stream)
391 == stream) { 391 == stream) {
392 392
393 pipes = &dc->current_state->res_ctx.pipe_ctx[i]; 393 pipes = &dc->current_state->res_ctx.pipe_ctx[i];
394 dc->hwss.program_csc_matrix(pipes, 394 dc->hwss.program_output_csc(dc,
395 stream->output_color_space, 395 pipes,
396 stream->csc_color_matrix.matrix); 396 stream->output_color_space,
397 stream->csc_color_matrix.matrix,
398 pipes->plane_res.hubp->opp_id);
397 ret = true; 399 ret = true;
398 } 400 }
399 } 401 }
@@ -941,7 +943,7 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
941 if (!dcb->funcs->is_accelerated_mode(dcb)) 943 if (!dcb->funcs->is_accelerated_mode(dcb))
942 dc->hwss.enable_accelerated_mode(dc, context); 944 dc->hwss.enable_accelerated_mode(dc, context);
943 945
944 dc->hwss.set_bandwidth(dc, context, false); 946 dc->hwss.prepare_bandwidth(dc, context);
945 947
946 /* re-program planes for existing stream, in case we need to 948 /* re-program planes for existing stream, in case we need to
947 * free up plane resource for later use 949 * free up plane resource for later use
@@ -957,8 +959,6 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
957 } 959 }
958 960
959 /* Program hardware */ 961 /* Program hardware */
960 dc->hwss.ready_shared_resources(dc, context);
961
962 for (i = 0; i < dc->res_pool->pipe_count; i++) { 962 for (i = 0; i < dc->res_pool->pipe_count; i++) {
963 pipe = &context->res_ctx.pipe_ctx[i]; 963 pipe = &context->res_ctx.pipe_ctx[i];
964 dc->hwss.wait_for_mpcc_disconnect(dc, dc->res_pool, pipe); 964 dc->hwss.wait_for_mpcc_disconnect(dc, dc->res_pool, pipe);
@@ -1012,7 +1012,7 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
1012 dc_enable_stereo(dc, context, dc_streams, context->stream_count); 1012 dc_enable_stereo(dc, context, dc_streams, context->stream_count);
1013 1013
1014 /* pplib is notified if disp_num changed */ 1014 /* pplib is notified if disp_num changed */
1015 dc->hwss.set_bandwidth(dc, context, true); 1015 dc->hwss.optimize_bandwidth(dc, context);
1016 1016
1017 dc_release_state(dc->current_state); 1017 dc_release_state(dc->current_state);
1018 1018
@@ -1020,8 +1020,6 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
1020 1020
1021 dc_retain_state(dc->current_state); 1021 dc_retain_state(dc->current_state);
1022 1022
1023 dc->hwss.optimize_shared_resources(dc);
1024
1025 return result; 1023 return result;
1026} 1024}
1027 1025
@@ -1063,7 +1061,7 @@ bool dc_post_update_surfaces_to_stream(struct dc *dc)
1063 1061
1064 dc->optimized_required = false; 1062 dc->optimized_required = false;
1065 1063
1066 dc->hwss.set_bandwidth(dc, context, true); 1064 dc->hwss.optimize_bandwidth(dc, context);
1067 return true; 1065 return true;
1068} 1066}
1069 1067
@@ -1369,35 +1367,6 @@ static struct dc_stream_status *stream_get_status(
1369 1367
1370static const enum surface_update_type update_surface_trace_level = UPDATE_TYPE_FULL; 1368static const enum surface_update_type update_surface_trace_level = UPDATE_TYPE_FULL;
1371 1369
1372static void notify_display_count_to_smu(
1373 struct dc *dc,
1374 struct dc_state *context)
1375{
1376 int i, display_count;
1377 struct pp_smu_funcs_rv *pp_smu = dc->res_pool->pp_smu;
1378
1379 /*
1380 * if function pointer not set up, this message is
1381 * sent as part of pplib_apply_display_requirements.
1382 * So just return.
1383 */
1384 if (!pp_smu || !pp_smu->set_display_count)
1385 return;
1386
1387 display_count = 0;
1388 for (i = 0; i < context->stream_count; i++) {
1389 const struct dc_stream_state *stream = context->streams[i];
1390
1391 /* only notify active stream */
1392 if (stream->dpms_off)
1393 continue;
1394
1395 display_count++;
1396 }
1397
1398 pp_smu->set_display_count(&pp_smu->pp_smu, display_count);
1399}
1400
1401static void commit_planes_do_stream_update(struct dc *dc, 1370static void commit_planes_do_stream_update(struct dc *dc,
1402 struct dc_stream_state *stream, 1371 struct dc_stream_state *stream,
1403 struct dc_stream_update *stream_update, 1372 struct dc_stream_update *stream_update,
@@ -1422,7 +1391,6 @@ static void commit_planes_do_stream_update(struct dc *dc,
1422 stream_update->adjust->v_total_max); 1391 stream_update->adjust->v_total_max);
1423 1392
1424 if (stream_update->periodic_fn_vsync_delta && 1393 if (stream_update->periodic_fn_vsync_delta &&
1425 pipe_ctx->stream_res.tg &&
1426 pipe_ctx->stream_res.tg->funcs->program_vline_interrupt) 1394 pipe_ctx->stream_res.tg->funcs->program_vline_interrupt)
1427 pipe_ctx->stream_res.tg->funcs->program_vline_interrupt( 1395 pipe_ctx->stream_res.tg->funcs->program_vline_interrupt(
1428 pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing, 1396 pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing,
@@ -1448,19 +1416,13 @@ static void commit_planes_do_stream_update(struct dc *dc,
1448 if (stream_update->dpms_off) { 1416 if (stream_update->dpms_off) {
1449 if (*stream_update->dpms_off) { 1417 if (*stream_update->dpms_off) {
1450 core_link_disable_stream(pipe_ctx, KEEP_ACQUIRED_RESOURCE); 1418 core_link_disable_stream(pipe_ctx, KEEP_ACQUIRED_RESOURCE);
1451 dc->hwss.pplib_apply_display_requirements( 1419 dc->hwss.optimize_bandwidth(dc, dc->current_state);
1452 dc, dc->current_state);
1453 notify_display_count_to_smu(dc, dc->current_state);
1454 } else { 1420 } else {
1455 dc->hwss.pplib_apply_display_requirements( 1421 dc->hwss.prepare_bandwidth(dc, dc->current_state);
1456 dc, dc->current_state);
1457 notify_display_count_to_smu(dc, dc->current_state);
1458 core_link_enable_stream(dc->current_state, pipe_ctx); 1422 core_link_enable_stream(dc->current_state, pipe_ctx);
1459 } 1423 }
1460 } 1424 }
1461 1425
1462
1463
1464 if (stream_update->abm_level && pipe_ctx->stream_res.abm) { 1426 if (stream_update->abm_level && pipe_ctx->stream_res.abm) {
1465 if (pipe_ctx->stream_res.tg->funcs->is_blanked) { 1427 if (pipe_ctx->stream_res.tg->funcs->is_blanked) {
1466 // if otg funcs defined check if blanked before programming 1428 // if otg funcs defined check if blanked before programming
@@ -1487,7 +1449,7 @@ static void commit_planes_for_stream(struct dc *dc,
1487 struct pipe_ctx *top_pipe_to_program = NULL; 1449 struct pipe_ctx *top_pipe_to_program = NULL;
1488 1450
1489 if (update_type == UPDATE_TYPE_FULL) { 1451 if (update_type == UPDATE_TYPE_FULL) {
1490 dc->hwss.set_bandwidth(dc, context, false); 1452 dc->hwss.prepare_bandwidth(dc, context);
1491 context_clock_trace(dc, context); 1453 context_clock_trace(dc, context);
1492 } 1454 }
1493 1455
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_debug.c b/drivers/gpu/drm/amd/display/dc/core/dc_debug.c
index e1ebdf7b5eaf..73d049506618 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_debug.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_debug.c
@@ -311,7 +311,7 @@ void context_timing_trace(
311{ 311{
312 int i; 312 int i;
313 struct dc *core_dc = dc; 313 struct dc *core_dc = dc;
314 int h_pos[MAX_PIPES], v_pos[MAX_PIPES]; 314 int h_pos[MAX_PIPES] = {0}, v_pos[MAX_PIPES] = {0};
315 struct crtc_position position; 315 struct crtc_position position;
316 unsigned int underlay_idx = core_dc->res_pool->underlay_pipe_index; 316 unsigned int underlay_idx = core_dc->res_pool->underlay_pipe_index;
317 DC_LOGGER_INIT(dc->ctx->logger); 317 DC_LOGGER_INIT(dc->ctx->logger);
@@ -322,8 +322,7 @@ void context_timing_trace(
322 /* get_position() returns CRTC vertical/horizontal counter 322 /* get_position() returns CRTC vertical/horizontal counter
323 * hence not applicable for underlay pipe 323 * hence not applicable for underlay pipe
324 */ 324 */
325 if (pipe_ctx->stream == NULL 325 if (pipe_ctx->stream == NULL || pipe_ctx->pipe_idx == underlay_idx)
326 || pipe_ctx->pipe_idx == underlay_idx)
327 continue; 326 continue;
328 327
329 pipe_ctx->stream_res.tg->funcs->get_position(pipe_ctx->stream_res.tg, &position); 328 pipe_ctx->stream_res.tg->funcs->get_position(pipe_ctx->stream_res.tg, &position);
@@ -333,7 +332,7 @@ void context_timing_trace(
333 for (i = 0; i < core_dc->res_pool->pipe_count; i++) { 332 for (i = 0; i < core_dc->res_pool->pipe_count; i++) {
334 struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i]; 333 struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i];
335 334
336 if (pipe_ctx->stream == NULL) 335 if (pipe_ctx->stream == NULL || pipe_ctx->pipe_idx == underlay_idx)
337 continue; 336 continue;
338 337
339 TIMING_TRACE("OTG_%d H_tot:%d V_tot:%d H_pos:%d V_pos:%d\n", 338 TIMING_TRACE("OTG_%d H_tot:%d V_tot:%d H_pos:%d V_pos:%d\n",
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index fb04a4ad141f..7ee9c033acbd 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -1357,28 +1357,13 @@ static enum dc_status enable_link_dp(
1357 struct dc_link *link = stream->sink->link; 1357 struct dc_link *link = stream->sink->link;
1358 struct dc_link_settings link_settings = {0}; 1358 struct dc_link_settings link_settings = {0};
1359 enum dp_panel_mode panel_mode; 1359 enum dp_panel_mode panel_mode;
1360 enum dc_link_rate max_link_rate = LINK_RATE_HIGH2;
1361 1360
1362 /* get link settings for video mode timing */ 1361 /* get link settings for video mode timing */
1363 decide_link_settings(stream, &link_settings); 1362 decide_link_settings(stream, &link_settings);
1364 1363
1365 /* raise clock state for HBR3 if required. Confirmed with HW DCE/DPCS 1364 pipe_ctx->stream_res.pix_clk_params.requested_sym_clk =
1366 * logic for HBR3 still needs Nominal (0.8V) on VDDC rail 1365 link_settings.link_rate * LINK_RATE_REF_FREQ_IN_KHZ;
1367 */ 1366 state->dccg->funcs->update_clocks(state->dccg, state, false);
1368 if (link->link_enc->features.flags.bits.IS_HBR3_CAPABLE)
1369 max_link_rate = LINK_RATE_HIGH3;
1370
1371 if (link_settings.link_rate == max_link_rate) {
1372 struct dc_clocks clocks = state->bw.dcn.clk;
1373
1374 /* dce/dcn compat, do not update dispclk */
1375 clocks.dispclk_khz = 0;
1376 /* 27mhz = 27000000hz= 27000khz */
1377 clocks.phyclk_khz = link_settings.link_rate * 27000;
1378
1379 state->dis_clk->funcs->update_clocks(
1380 state->dis_clk, &clocks, false);
1381 }
1382 1367
1383 dp_enable_link_phy( 1368 dp_enable_link_phy(
1384 link, 1369 link,
@@ -1722,7 +1707,7 @@ static void write_i2c_retimer_setting(
1722 i2c_success = i2c_write(pipe_ctx, slave_address, 1707 i2c_success = i2c_write(pipe_ctx, slave_address,
1723 buffer, sizeof(buffer)); 1708 buffer, sizeof(buffer));
1724 RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\ 1709 RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\
1725 offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n", 1710 offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n",
1726 slave_address, buffer[0], buffer[1], i2c_success?1:0); 1711 slave_address, buffer[0], buffer[1], i2c_success?1:0);
1727 if (!i2c_success) 1712 if (!i2c_success)
1728 /* Write failure */ 1713 /* Write failure */
@@ -1734,7 +1719,7 @@ static void write_i2c_retimer_setting(
1734 i2c_success = i2c_write(pipe_ctx, slave_address, 1719 i2c_success = i2c_write(pipe_ctx, slave_address,
1735 buffer, sizeof(buffer)); 1720 buffer, sizeof(buffer));
1736 RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\ 1721 RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\
1737 offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n", 1722 offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n",
1738 slave_address, buffer[0], buffer[1], i2c_success?1:0); 1723 slave_address, buffer[0], buffer[1], i2c_success?1:0);
1739 if (!i2c_success) 1724 if (!i2c_success)
1740 /* Write failure */ 1725 /* Write failure */
@@ -2156,14 +2141,16 @@ int dc_link_get_backlight_level(const struct dc_link *link)
2156{ 2141{
2157 struct abm *abm = link->ctx->dc->res_pool->abm; 2142 struct abm *abm = link->ctx->dc->res_pool->abm;
2158 2143
2159 if (abm == NULL || abm->funcs->get_current_backlight_8_bit == NULL) 2144 if (abm == NULL || abm->funcs->get_current_backlight == NULL)
2160 return DC_ERROR_UNEXPECTED; 2145 return DC_ERROR_UNEXPECTED;
2161 2146
2162 return (int) abm->funcs->get_current_backlight_8_bit(abm); 2147 return (int) abm->funcs->get_current_backlight(abm);
2163} 2148}
2164 2149
2165bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level, 2150bool dc_link_set_backlight_level(const struct dc_link *link,
2166 uint32_t frame_ramp, const struct dc_stream_state *stream) 2151 uint32_t backlight_pwm_u16_16,
2152 uint32_t frame_ramp,
2153 const struct dc_stream_state *stream)
2167{ 2154{
2168 struct dc *core_dc = link->ctx->dc; 2155 struct dc *core_dc = link->ctx->dc;
2169 struct abm *abm = core_dc->res_pool->abm; 2156 struct abm *abm = core_dc->res_pool->abm;
@@ -2175,19 +2162,17 @@ bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level,
2175 2162
2176 if ((dmcu == NULL) || 2163 if ((dmcu == NULL) ||
2177 (abm == NULL) || 2164 (abm == NULL) ||
2178 (abm->funcs->set_backlight_level == NULL)) 2165 (abm->funcs->set_backlight_level_pwm == NULL))
2179 return false; 2166 return false;
2180 2167
2181 if (stream) { 2168 if (stream)
2182 if (stream->bl_pwm_level == EDP_BACKLIGHT_RAMP_DISABLE_LEVEL) 2169 ((struct dc_stream_state *)stream)->bl_pwm_level =
2183 frame_ramp = 0; 2170 backlight_pwm_u16_16;
2184
2185 ((struct dc_stream_state *)stream)->bl_pwm_level = level;
2186 }
2187 2171
2188 use_smooth_brightness = dmcu->funcs->is_dmcu_initialized(dmcu); 2172 use_smooth_brightness = dmcu->funcs->is_dmcu_initialized(dmcu);
2189 2173
2190 DC_LOG_BACKLIGHT("New Backlight level: %d (0x%X)\n", level, level); 2174 DC_LOG_BACKLIGHT("New Backlight level: %d (0x%X)\n",
2175 backlight_pwm_u16_16, backlight_pwm_u16_16);
2191 2176
2192 if (dc_is_embedded_signal(link->connector_signal)) { 2177 if (dc_is_embedded_signal(link->connector_signal)) {
2193 if (stream != NULL) { 2178 if (stream != NULL) {
@@ -2204,9 +2189,9 @@ bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level,
2204 1; 2189 1;
2205 } 2190 }
2206 } 2191 }
2207 abm->funcs->set_backlight_level( 2192 abm->funcs->set_backlight_level_pwm(
2208 abm, 2193 abm,
2209 level, 2194 backlight_pwm_u16_16,
2210 frame_ramp, 2195 frame_ramp,
2211 controller_id, 2196 controller_id,
2212 use_smooth_brightness); 2197 use_smooth_brightness);
@@ -2220,7 +2205,7 @@ bool dc_link_set_abm_disable(const struct dc_link *link)
2220 struct dc *core_dc = link->ctx->dc; 2205 struct dc *core_dc = link->ctx->dc;
2221 struct abm *abm = core_dc->res_pool->abm; 2206 struct abm *abm = core_dc->res_pool->abm;
2222 2207
2223 if ((abm == NULL) || (abm->funcs->set_backlight_level == NULL)) 2208 if ((abm == NULL) || (abm->funcs->set_backlight_level_pwm == NULL))
2224 return false; 2209 return false;
2225 2210
2226 abm->funcs->set_abm_immediate_disable(abm); 2211 abm->funcs->set_abm_immediate_disable(abm);
@@ -2609,6 +2594,10 @@ void core_link_enable_stream(
2609 core_dc->hwss.unblank_stream(pipe_ctx, 2594 core_dc->hwss.unblank_stream(pipe_ctx,
2610 &pipe_ctx->stream->sink->link->cur_link_settings); 2595 &pipe_ctx->stream->sink->link->cur_link_settings);
2611 2596
2597 dc_link_set_backlight_level(pipe_ctx->stream->sink->link,
2598 pipe_ctx->stream->bl_pwm_level,
2599 0,
2600 pipe_ctx->stream);
2612 } 2601 }
2613 2602
2614} 2603}
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index b6fe29b9fb65..fc65b0055167 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -499,8 +499,13 @@ static void calculate_viewport(struct pipe_ctx *pipe_ctx)
499 pipe_ctx->top_pipe->plane_state == pipe_ctx->plane_state; 499 pipe_ctx->top_pipe->plane_state == pipe_ctx->plane_state;
500 bool flip_vert_scan_dir = false, flip_horz_scan_dir = false; 500 bool flip_vert_scan_dir = false, flip_horz_scan_dir = false;
501 501
502
502 /* 503 /*
503 * Need to calculate the scan direction for viewport to properly determine offset 504 * We need take horizontal mirror into account. On an unrotated surface this means
505 * that the viewport offset is actually the offset from the other side of source
506 * image so we have to subtract the right edge of the viewport from the right edge of
507 * the source window. Similar to mirror we need to take into account how offset is
508 * affected for 270/180 rotations
504 */ 509 */
505 if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_180) { 510 if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_180) {
506 flip_vert_scan_dir = true; 511 flip_vert_scan_dir = true;
@@ -510,6 +515,9 @@ static void calculate_viewport(struct pipe_ctx *pipe_ctx)
510 else if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270) 515 else if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270)
511 flip_horz_scan_dir = true; 516 flip_horz_scan_dir = true;
512 517
518 if (pipe_ctx->plane_state->horizontal_mirror)
519 flip_horz_scan_dir = !flip_horz_scan_dir;
520
513 if (stream->view_format == VIEW_3D_FORMAT_SIDE_BY_SIDE || 521 if (stream->view_format == VIEW_3D_FORMAT_SIDE_BY_SIDE ||
514 stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM) { 522 stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM) {
515 pri_split = false; 523 pri_split = false;
@@ -540,45 +548,27 @@ static void calculate_viewport(struct pipe_ctx *pipe_ctx)
540 plane_state->clip_rect.y + plane_state->clip_rect.height - clip.y ; 548 plane_state->clip_rect.y + plane_state->clip_rect.height - clip.y ;
541 549
542 /* offset = surf_src.ofs + (clip.ofs - surface->dst_rect.ofs) * scl_ratio 550 /* offset = surf_src.ofs + (clip.ofs - surface->dst_rect.ofs) * scl_ratio
551 * note: surf_src.ofs should be added after rotation/mirror offset direction
552 * adjustment since it is already in viewport space
543 * num_pixels = clip.num_pix * scl_ratio 553 * num_pixels = clip.num_pix * scl_ratio
544 */ 554 */
545 data->viewport.x = surf_src.x + (clip.x - plane_state->dst_rect.x) * 555 data->viewport.x = (clip.x - plane_state->dst_rect.x) *
546 surf_src.width / plane_state->dst_rect.width; 556 surf_src.width / plane_state->dst_rect.width;
547 data->viewport.width = clip.width * 557 data->viewport.width = clip.width *
548 surf_src.width / plane_state->dst_rect.width; 558 surf_src.width / plane_state->dst_rect.width;
549 559
550 data->viewport.y = surf_src.y + (clip.y - plane_state->dst_rect.y) * 560 data->viewport.y = (clip.y - plane_state->dst_rect.y) *
551 surf_src.height / plane_state->dst_rect.height; 561 surf_src.height / plane_state->dst_rect.height;
552 data->viewport.height = clip.height * 562 data->viewport.height = clip.height *
553 surf_src.height / plane_state->dst_rect.height; 563 surf_src.height / plane_state->dst_rect.height;
554 564
555 /* To transfer the x, y to correct coordinate on mirror image (camera). 565 if (flip_vert_scan_dir)
556 * deg 0 : transfer x, 566 data->viewport.y = surf_src.height - data->viewport.y - data->viewport.height;
557 * deg 90 : don't need to transfer, 567 if (flip_horz_scan_dir)
558 * deg180 : transfer y, 568 data->viewport.x = surf_src.width - data->viewport.x - data->viewport.width;
559 * deg270 : transfer x and y. 569
560 * To transfer the x, y to correct coordinate on non-mirror image (video). 570 data->viewport.x += surf_src.x;
561 * deg 0 : don't need to transfer, 571 data->viewport.y += surf_src.y;
562 * deg 90 : transfer y,
563 * deg180 : transfer x and y,
564 * deg270 : transfer x.
565 */
566 if (pipe_ctx->plane_state->horizontal_mirror) {
567 if (flip_horz_scan_dir && !flip_vert_scan_dir) {
568 data->viewport.y = surf_src.height - data->viewport.y - data->viewport.height;
569 data->viewport.x = surf_src.width - data->viewport.x - data->viewport.width;
570 } else if (flip_horz_scan_dir && flip_vert_scan_dir)
571 data->viewport.y = surf_src.height - data->viewport.y - data->viewport.height;
572 else {
573 if (!flip_horz_scan_dir && !flip_vert_scan_dir)
574 data->viewport.x = surf_src.width - data->viewport.x - data->viewport.width;
575 }
576 } else {
577 if (flip_horz_scan_dir)
578 data->viewport.x = surf_src.width - data->viewport.x - data->viewport.width;
579 if (flip_vert_scan_dir)
580 data->viewport.y = surf_src.height - data->viewport.y - data->viewport.height;
581 }
582 572
583 /* Round down, compensate in init */ 573 /* Round down, compensate in init */
584 data->viewport_c.x = data->viewport.x / vpc_div; 574 data->viewport_c.x = data->viewport.x / vpc_div;
@@ -773,22 +763,15 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx, struct rect *r
773 else if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270) 763 else if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270)
774 flip_horz_scan_dir = true; 764 flip_horz_scan_dir = true;
775 765
766 if (pipe_ctx->plane_state->horizontal_mirror)
767 flip_horz_scan_dir = !flip_horz_scan_dir;
768
776 if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90 || 769 if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90 ||
777 pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270) { 770 pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270) {
778 rect_swap_helper(&src); 771 rect_swap_helper(&src);
779 rect_swap_helper(&data->viewport_c); 772 rect_swap_helper(&data->viewport_c);
780 rect_swap_helper(&data->viewport); 773 rect_swap_helper(&data->viewport);
781 774 }
782 if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270 &&
783 pipe_ctx->plane_state->horizontal_mirror) {
784 flip_vert_scan_dir = true;
785 }
786 if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90 &&
787 pipe_ctx->plane_state->horizontal_mirror) {
788 flip_vert_scan_dir = false;
789 }
790 } else if (pipe_ctx->plane_state->horizontal_mirror)
791 flip_horz_scan_dir = !flip_horz_scan_dir;
792 775
793 /* 776 /*
794 * Init calculated according to formula: 777 * Init calculated according to formula:
@@ -1115,9 +1098,6 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx)
1115 pipe_ctx->plane_res.scl_data.format = convert_pixel_format_to_dalsurface( 1098 pipe_ctx->plane_res.scl_data.format = convert_pixel_format_to_dalsurface(
1116 pipe_ctx->plane_state->format); 1099 pipe_ctx->plane_state->format);
1117 1100
1118 if (pipe_ctx->stream->timing.flags.INTERLACE)
1119 pipe_ctx->stream->dst.height *= 2;
1120
1121 calculate_scaling_ratios(pipe_ctx); 1101 calculate_scaling_ratios(pipe_ctx);
1122 1102
1123 calculate_viewport(pipe_ctx); 1103 calculate_viewport(pipe_ctx);
@@ -1138,9 +1118,6 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx)
1138 1118
1139 pipe_ctx->plane_res.scl_data.h_active = timing->h_addressable + timing->h_border_left + timing->h_border_right; 1119 pipe_ctx->plane_res.scl_data.h_active = timing->h_addressable + timing->h_border_left + timing->h_border_right;
1140 pipe_ctx->plane_res.scl_data.v_active = timing->v_addressable + timing->v_border_top + timing->v_border_bottom; 1120 pipe_ctx->plane_res.scl_data.v_active = timing->v_addressable + timing->v_border_top + timing->v_border_bottom;
1141 if (pipe_ctx->stream->timing.flags.INTERLACE)
1142 pipe_ctx->plane_res.scl_data.v_active *= 2;
1143
1144 1121
1145 /* Taps calculations */ 1122 /* Taps calculations */
1146 if (pipe_ctx->plane_res.xfm != NULL) 1123 if (pipe_ctx->plane_res.xfm != NULL)
@@ -1185,9 +1162,6 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx)
1185 plane_state->dst_rect.x, 1162 plane_state->dst_rect.x,
1186 plane_state->dst_rect.y); 1163 plane_state->dst_rect.y);
1187 1164
1188 if (pipe_ctx->stream->timing.flags.INTERLACE)
1189 pipe_ctx->stream->dst.height /= 2;
1190
1191 return res; 1165 return res;
1192} 1166}
1193 1167
@@ -2071,7 +2045,7 @@ void dc_resource_state_construct(
2071 const struct dc *dc, 2045 const struct dc *dc,
2072 struct dc_state *dst_ctx) 2046 struct dc_state *dst_ctx)
2073{ 2047{
2074 dst_ctx->dis_clk = dc->res_pool->dccg; 2048 dst_ctx->dccg = dc->res_pool->clk_mgr;
2075} 2049}
2076 2050
2077enum dc_status dc_validate_global_state( 2051enum dc_status dc_validate_global_state(
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
index 2ac848a106ba..e113439aaa86 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
@@ -106,6 +106,7 @@ static void construct(struct dc_stream_state *stream,
106 106
107 stream->out_transfer_func = dc_create_transfer_func(); 107 stream->out_transfer_func = dc_create_transfer_func();
108 stream->out_transfer_func->type = TF_TYPE_BYPASS; 108 stream->out_transfer_func->type = TF_TYPE_BYPASS;
109 stream->out_transfer_func->ctx = stream->ctx;
109} 110}
110 111
111static void destruct(struct dc_stream_state *stream) 112static void destruct(struct dc_stream_state *stream)
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_surface.c b/drivers/gpu/drm/amd/display/dc/core/dc_surface.c
index 8fb3aefd195c..c60c9b4c3075 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_surface.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_surface.c
@@ -44,6 +44,7 @@ static void construct(struct dc_context *ctx, struct dc_plane_state *plane_state
44 44
45 plane_state->in_transfer_func = dc_create_transfer_func(); 45 plane_state->in_transfer_func = dc_create_transfer_func();
46 plane_state->in_transfer_func->type = TF_TYPE_BYPASS; 46 plane_state->in_transfer_func->type = TF_TYPE_BYPASS;
47 plane_state->in_transfer_func->ctx = ctx;
47} 48}
48 49
49static void destruct(struct dc_plane_state *plane_state) 50static void destruct(struct dc_plane_state *plane_state)
diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
index 199527171100..d16a20c84792 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -38,7 +38,7 @@
38#include "inc/compressor.h" 38#include "inc/compressor.h"
39#include "dml/display_mode_lib.h" 39#include "dml/display_mode_lib.h"
40 40
41#define DC_VER "3.1.68" 41#define DC_VER "3.2.04"
42 42
43#define MAX_SURFACES 3 43#define MAX_SURFACES 3
44#define MAX_STREAMS 6 44#define MAX_STREAMS 6
@@ -169,6 +169,7 @@ struct link_training_settings;
169struct dc_config { 169struct dc_config {
170 bool gpu_vm_support; 170 bool gpu_vm_support;
171 bool disable_disp_pll_sharing; 171 bool disable_disp_pll_sharing;
172 bool fbc_support;
172}; 173};
173 174
174enum visual_confirm { 175enum visual_confirm {
@@ -249,8 +250,6 @@ struct dc_debug_options {
249 bool disable_dmcu; 250 bool disable_dmcu;
250 bool disable_psr; 251 bool disable_psr;
251 bool force_abm_enable; 252 bool force_abm_enable;
252 bool disable_hbup_pg;
253 bool disable_dpp_pg;
254 bool disable_stereo_support; 253 bool disable_stereo_support;
255 bool vsr_support; 254 bool vsr_support;
256 bool performance_trace; 255 bool performance_trace;
@@ -304,11 +303,6 @@ struct dc {
304 struct hw_sequencer_funcs hwss; 303 struct hw_sequencer_funcs hwss;
305 struct dce_hwseq *hwseq; 304 struct dce_hwseq *hwseq;
306 305
307 /* temp store of dm_pp_display_configuration
308 * to compare to see if display config changed
309 */
310 struct dm_pp_display_configuration prev_display_config;
311
312 bool optimized_required; 306 bool optimized_required;
313 307
314 /* FBC compressor */ 308 /* FBC compressor */
diff --git a/drivers/gpu/drm/amd/display/dc/dc_bios_types.h b/drivers/gpu/drm/amd/display/dc/dc_bios_types.h
index 8130b95ccc53..a8b3cedf9431 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_bios_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_bios_types.h
@@ -86,6 +86,10 @@ struct dc_vbios_funcs {
86 86
87 bool (*is_accelerated_mode)( 87 bool (*is_accelerated_mode)(
88 struct dc_bios *bios); 88 struct dc_bios *bios);
89 bool (*is_active_display)(
90 struct dc_bios *bios,
91 enum signal_type signal,
92 const struct connector_device_tag_info *device_tag);
89 void (*set_scratch_critical_state)( 93 void (*set_scratch_critical_state)(
90 struct dc_bios *bios, 94 struct dc_bios *bios,
91 bool state); 95 bool state);
@@ -141,6 +145,7 @@ struct dc_vbios_funcs {
141}; 145};
142 146
143struct bios_registers { 147struct bios_registers {
148 uint32_t BIOS_SCRATCH_0;
144 uint32_t BIOS_SCRATCH_3; 149 uint32_t BIOS_SCRATCH_3;
145 uint32_t BIOS_SCRATCH_6; 150 uint32_t BIOS_SCRATCH_6;
146}; 151};
diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h
index 3bfdccceb524..8738f27a8708 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
@@ -138,9 +138,14 @@ static inline struct dc_link *dc_get_link_at_index(struct dc *dc, uint32_t link_
138 return dc->links[link_index]; 138 return dc->links[link_index];
139} 139}
140 140
141/* Set backlight level of an embedded panel (eDP, LVDS). */ 141/* Set backlight level of an embedded panel (eDP, LVDS).
142bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level, 142 * backlight_pwm_u16_16 is unsigned 32 bit with 16 bit integer
143 uint32_t frame_ramp, const struct dc_stream_state *stream); 143 * and 16 bit fractional, where 1.0 is max backlight value.
144 */
145bool dc_link_set_backlight_level(const struct dc_link *dc_link,
146 uint32_t backlight_pwm_u16_16,
147 uint32_t frame_ramp,
148 const struct dc_stream_state *stream);
144 149
145int dc_link_get_backlight_level(const struct dc_link *dc_link); 150int dc_link_get_backlight_level(const struct dc_link *dc_link);
146 151
diff --git a/drivers/gpu/drm/amd/display/dc/dce/Makefile b/drivers/gpu/drm/amd/display/dc/dce/Makefile
index 8f7f0e8b341f..6d7b64a743ca 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/Makefile
+++ b/drivers/gpu/drm/amd/display/dc/dce/Makefile
@@ -28,7 +28,7 @@
28 28
29DCE = dce_audio.o dce_stream_encoder.o dce_link_encoder.o dce_hwseq.o \ 29DCE = dce_audio.o dce_stream_encoder.o dce_link_encoder.o dce_hwseq.o \
30dce_mem_input.o dce_clock_source.o dce_scl_filters.o dce_transform.o \ 30dce_mem_input.o dce_clock_source.o dce_scl_filters.o dce_transform.o \
31dce_clocks.o dce_opp.o dce_dmcu.o dce_abm.o dce_ipp.o dce_aux.o \ 31dce_clk_mgr.o dce_opp.o dce_dmcu.o dce_abm.o dce_ipp.o dce_aux.o \
32dce_i2c.o dce_i2c_hw.o dce_i2c_sw.o 32dce_i2c.o dce_i2c_hw.o dce_i2c_sw.o
33 33
34AMD_DAL_DCE = $(addprefix $(AMDDALPATH)/dc/dce/,$(DCE)) 34AMD_DAL_DCE = $(addprefix $(AMDDALPATH)/dc/dce/,$(DCE))
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c
index 29294db1a96b..2a342eae80fd 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c
@@ -54,7 +54,7 @@
54#define MCP_DISABLE_ABM_IMMEDIATELY 255 54#define MCP_DISABLE_ABM_IMMEDIATELY 255
55 55
56 56
57static unsigned int get_current_backlight_16_bit(struct dce_abm *abm_dce) 57static unsigned int calculate_16_bit_backlight_from_pwm(struct dce_abm *abm_dce)
58{ 58{
59 uint64_t current_backlight; 59 uint64_t current_backlight;
60 uint32_t round_result; 60 uint32_t round_result;
@@ -103,45 +103,21 @@ static unsigned int get_current_backlight_16_bit(struct dce_abm *abm_dce)
103 return (uint32_t)(current_backlight); 103 return (uint32_t)(current_backlight);
104} 104}
105 105
106static void driver_set_backlight_level(struct dce_abm *abm_dce, uint32_t level) 106static void driver_set_backlight_level(struct dce_abm *abm_dce,
107 uint32_t backlight_pwm_u16_16)
107{ 108{
108 uint32_t backlight_24bit;
109 uint32_t backlight_17bit;
110 uint32_t backlight_16bit; 109 uint32_t backlight_16bit;
111 uint32_t masked_pwm_period; 110 uint32_t masked_pwm_period;
112 uint8_t rounding_bit;
113 uint8_t bit_count; 111 uint8_t bit_count;
114 uint64_t active_duty_cycle; 112 uint64_t active_duty_cycle;
115 uint32_t pwm_period_bitcnt; 113 uint32_t pwm_period_bitcnt;
116 114
117 /* 115 /*
118 * 1. Convert 8-bit value to 17 bit U1.16 format 116 * 1. Find 16 bit backlight active duty cycle, where 0 <= backlight
119 * (1 integer, 16 fractional bits)
120 */
121
122 /* 1.1 multiply 8 bit value by 0x10101 to get a 24 bit value,
123 * effectively multiplying value by 256/255
124 * eg. for a level of 0xEF, backlight_24bit = 0xEF * 0x10101 = 0xEFEFEF
125 */
126 backlight_24bit = level * 0x10101;
127
128 /* 1.2 The upper 16 bits of the 24 bit value is the fraction, lower 8
129 * used for rounding, take most significant bit of fraction for
130 * rounding, e.g. for 0xEFEFEF, rounding bit is 1
131 */
132 rounding_bit = (backlight_24bit >> 7) & 1;
133
134 /* 1.3 Add the upper 16 bits of the 24 bit value with the rounding bit
135 * resulting in a 17 bit value e.g. 0xEFF0 = (0xEFEFEF >> 8) + 1
136 */
137 backlight_17bit = (backlight_24bit >> 8) + rounding_bit;
138
139 /*
140 * 2. Find 16 bit backlight active duty cycle, where 0 <= backlight
141 * active duty cycle <= backlight period 117 * active duty cycle <= backlight period
142 */ 118 */
143 119
144 /* 2.1 Apply bitmask for backlight period value based on value of BITCNT 120 /* 1.1 Apply bitmask for backlight period value based on value of BITCNT
145 */ 121 */
146 REG_GET_2(BL_PWM_PERIOD_CNTL, 122 REG_GET_2(BL_PWM_PERIOD_CNTL,
147 BL_PWM_PERIOD_BITCNT, &pwm_period_bitcnt, 123 BL_PWM_PERIOD_BITCNT, &pwm_period_bitcnt,
@@ -155,13 +131,13 @@ static void driver_set_backlight_level(struct dce_abm *abm_dce, uint32_t level)
155 /* e.g. maskedPwmPeriod = 0x24 when bitCount is 6 */ 131 /* e.g. maskedPwmPeriod = 0x24 when bitCount is 6 */
156 masked_pwm_period = masked_pwm_period & ((1 << bit_count) - 1); 132 masked_pwm_period = masked_pwm_period & ((1 << bit_count) - 1);
157 133
158 /* 2.2 Calculate integer active duty cycle required upper 16 bits 134 /* 1.2 Calculate integer active duty cycle required upper 16 bits
159 * contain integer component, lower 16 bits contain fractional component 135 * contain integer component, lower 16 bits contain fractional component
160 * of active duty cycle e.g. 0x21BDC0 = 0xEFF0 * 0x24 136 * of active duty cycle e.g. 0x21BDC0 = 0xEFF0 * 0x24
161 */ 137 */
162 active_duty_cycle = backlight_17bit * masked_pwm_period; 138 active_duty_cycle = backlight_pwm_u16_16 * masked_pwm_period;
163 139
164 /* 2.3 Calculate 16 bit active duty cycle from integer and fractional 140 /* 1.3 Calculate 16 bit active duty cycle from integer and fractional
165 * components shift by bitCount then mask 16 bits and add rounding bit 141 * components shift by bitCount then mask 16 bits and add rounding bit
166 * from MSB of fraction e.g. 0x86F7 = ((0x21BDC0 >> 6) & 0xFFF) + 0 142 * from MSB of fraction e.g. 0x86F7 = ((0x21BDC0 >> 6) & 0xFFF) + 0
167 */ 143 */
@@ -170,23 +146,23 @@ static void driver_set_backlight_level(struct dce_abm *abm_dce, uint32_t level)
170 backlight_16bit += (active_duty_cycle >> (bit_count - 1)) & 0x1; 146 backlight_16bit += (active_duty_cycle >> (bit_count - 1)) & 0x1;
171 147
172 /* 148 /*
173 * 3. Program register with updated value 149 * 2. Program register with updated value
174 */ 150 */
175 151
176 /* 3.1 Lock group 2 backlight registers */ 152 /* 2.1 Lock group 2 backlight registers */
177 153
178 REG_UPDATE_2(BL_PWM_GRP1_REG_LOCK, 154 REG_UPDATE_2(BL_PWM_GRP1_REG_LOCK,
179 BL_PWM_GRP1_IGNORE_MASTER_LOCK_EN, 1, 155 BL_PWM_GRP1_IGNORE_MASTER_LOCK_EN, 1,
180 BL_PWM_GRP1_REG_LOCK, 1); 156 BL_PWM_GRP1_REG_LOCK, 1);
181 157
182 // 3.2 Write new active duty cycle 158 // 2.2 Write new active duty cycle
183 REG_UPDATE(BL_PWM_CNTL, BL_ACTIVE_INT_FRAC_CNT, backlight_16bit); 159 REG_UPDATE(BL_PWM_CNTL, BL_ACTIVE_INT_FRAC_CNT, backlight_16bit);
184 160
185 /* 3.3 Unlock group 2 backlight registers */ 161 /* 2.3 Unlock group 2 backlight registers */
186 REG_UPDATE(BL_PWM_GRP1_REG_LOCK, 162 REG_UPDATE(BL_PWM_GRP1_REG_LOCK,
187 BL_PWM_GRP1_REG_LOCK, 0); 163 BL_PWM_GRP1_REG_LOCK, 0);
188 164
189 /* 5.4.4 Wait for pending bit to be cleared */ 165 /* 3 Wait for pending bit to be cleared */
190 REG_WAIT(BL_PWM_GRP1_REG_LOCK, 166 REG_WAIT(BL_PWM_GRP1_REG_LOCK,
191 BL_PWM_GRP1_REG_UPDATE_PENDING, 0, 167 BL_PWM_GRP1_REG_UPDATE_PENDING, 0,
192 1, 10000); 168 1, 10000);
@@ -194,16 +170,21 @@ static void driver_set_backlight_level(struct dce_abm *abm_dce, uint32_t level)
194 170
195static void dmcu_set_backlight_level( 171static void dmcu_set_backlight_level(
196 struct dce_abm *abm_dce, 172 struct dce_abm *abm_dce,
197 uint32_t level, 173 uint32_t backlight_pwm_u16_16,
198 uint32_t frame_ramp, 174 uint32_t frame_ramp,
199 uint32_t controller_id) 175 uint32_t controller_id)
200{ 176{
201 unsigned int backlight_16_bit = (level * 0x10101) >> 8; 177 unsigned int backlight_8_bit = 0;
202 unsigned int backlight_17_bit = backlight_16_bit +
203 (((backlight_16_bit & 0x80) >> 7) & 1);
204 uint32_t rampingBoundary = 0xFFFF; 178 uint32_t rampingBoundary = 0xFFFF;
205 uint32_t s2; 179 uint32_t s2;
206 180
181 if (backlight_pwm_u16_16 & 0x10000)
182 // Check for max backlight condition
183 backlight_8_bit = 0xFF;
184 else
185 // Take MSB of fractional part since backlight is not max
186 backlight_8_bit = (backlight_pwm_u16_16 >> 8) & 0xFF;
187
207 /* set ramping boundary */ 188 /* set ramping boundary */
208 REG_WRITE(MASTER_COMM_DATA_REG1, rampingBoundary); 189 REG_WRITE(MASTER_COMM_DATA_REG1, rampingBoundary);
209 190
@@ -220,7 +201,7 @@ static void dmcu_set_backlight_level(
220 0, 1, 80000); 201 0, 1, 80000);
221 202
222 /* setDMCUParam_BL */ 203 /* setDMCUParam_BL */
223 REG_UPDATE(BL1_PWM_USER_LEVEL, BL1_PWM_USER_LEVEL, backlight_17_bit); 204 REG_UPDATE(BL1_PWM_USER_LEVEL, BL1_PWM_USER_LEVEL, backlight_pwm_u16_16);
224 205
225 /* write ramp */ 206 /* write ramp */
226 if (controller_id == 0) 207 if (controller_id == 0)
@@ -237,9 +218,9 @@ static void dmcu_set_backlight_level(
237 s2 = REG_READ(BIOS_SCRATCH_2); 218 s2 = REG_READ(BIOS_SCRATCH_2);
238 219
239 s2 &= ~ATOM_S2_CURRENT_BL_LEVEL_MASK; 220 s2 &= ~ATOM_S2_CURRENT_BL_LEVEL_MASK;
240 level &= (ATOM_S2_CURRENT_BL_LEVEL_MASK >> 221 backlight_8_bit &= (ATOM_S2_CURRENT_BL_LEVEL_MASK >>
241 ATOM_S2_CURRENT_BL_LEVEL_SHIFT); 222 ATOM_S2_CURRENT_BL_LEVEL_SHIFT);
242 s2 |= (level << ATOM_S2_CURRENT_BL_LEVEL_SHIFT); 223 s2 |= (backlight_8_bit << ATOM_S2_CURRENT_BL_LEVEL_SHIFT);
243 224
244 REG_WRITE(BIOS_SCRATCH_2, s2); 225 REG_WRITE(BIOS_SCRATCH_2, s2);
245} 226}
@@ -247,7 +228,7 @@ static void dmcu_set_backlight_level(
247static void dce_abm_init(struct abm *abm) 228static void dce_abm_init(struct abm *abm)
248{ 229{
249 struct dce_abm *abm_dce = TO_DCE_ABM(abm); 230 struct dce_abm *abm_dce = TO_DCE_ABM(abm);
250 unsigned int backlight = get_current_backlight_16_bit(abm_dce); 231 unsigned int backlight = calculate_16_bit_backlight_from_pwm(abm_dce);
251 232
252 REG_WRITE(DC_ABM1_HG_SAMPLE_RATE, 0x103); 233 REG_WRITE(DC_ABM1_HG_SAMPLE_RATE, 0x103);
253 REG_WRITE(DC_ABM1_HG_SAMPLE_RATE, 0x101); 234 REG_WRITE(DC_ABM1_HG_SAMPLE_RATE, 0x101);
@@ -284,12 +265,26 @@ static void dce_abm_init(struct abm *abm)
284 ABM1_BL_REG_READ_MISSED_FRAME_CLEAR, 1); 265 ABM1_BL_REG_READ_MISSED_FRAME_CLEAR, 1);
285} 266}
286 267
287static unsigned int dce_abm_get_current_backlight_8_bit(struct abm *abm) 268static unsigned int dce_abm_get_current_backlight(struct abm *abm)
288{ 269{
289 struct dce_abm *abm_dce = TO_DCE_ABM(abm); 270 struct dce_abm *abm_dce = TO_DCE_ABM(abm);
290 unsigned int backlight = REG_READ(BL1_PWM_CURRENT_ABM_LEVEL); 271 unsigned int backlight = REG_READ(BL1_PWM_CURRENT_ABM_LEVEL);
291 272
292 return (backlight >> 8); 273 /* return backlight in hardware format which is unsigned 17 bits, with
274 * 1 bit integer and 16 bit fractional
275 */
276 return backlight;
277}
278
279static unsigned int dce_abm_get_target_backlight(struct abm *abm)
280{
281 struct dce_abm *abm_dce = TO_DCE_ABM(abm);
282 unsigned int backlight = REG_READ(BL1_PWM_TARGET_ABM_LEVEL);
283
284 /* return backlight in hardware format which is unsigned 17 bits, with
285 * 1 bit integer and 16 bit fractional
286 */
287 return backlight;
293} 288}
294 289
295static bool dce_abm_set_level(struct abm *abm, uint32_t level) 290static bool dce_abm_set_level(struct abm *abm, uint32_t level)
@@ -396,9 +391,9 @@ static bool dce_abm_init_backlight(struct abm *abm)
396 return true; 391 return true;
397} 392}
398 393
399static bool dce_abm_set_backlight_level( 394static bool dce_abm_set_backlight_level_pwm(
400 struct abm *abm, 395 struct abm *abm,
401 unsigned int backlight_level, 396 unsigned int backlight_pwm_u16_16,
402 unsigned int frame_ramp, 397 unsigned int frame_ramp,
403 unsigned int controller_id, 398 unsigned int controller_id,
404 bool use_smooth_brightness) 399 bool use_smooth_brightness)
@@ -406,16 +401,16 @@ static bool dce_abm_set_backlight_level(
406 struct dce_abm *abm_dce = TO_DCE_ABM(abm); 401 struct dce_abm *abm_dce = TO_DCE_ABM(abm);
407 402
408 DC_LOG_BACKLIGHT("New Backlight level: %d (0x%X)\n", 403 DC_LOG_BACKLIGHT("New Backlight level: %d (0x%X)\n",
409 backlight_level, backlight_level); 404 backlight_pwm_u16_16, backlight_pwm_u16_16);
410 405
411 /* If DMCU is in reset state, DMCU is uninitialized */ 406 /* If DMCU is in reset state, DMCU is uninitialized */
412 if (use_smooth_brightness) 407 if (use_smooth_brightness)
413 dmcu_set_backlight_level(abm_dce, 408 dmcu_set_backlight_level(abm_dce,
414 backlight_level, 409 backlight_pwm_u16_16,
415 frame_ramp, 410 frame_ramp,
416 controller_id); 411 controller_id);
417 else 412 else
418 driver_set_backlight_level(abm_dce, backlight_level); 413 driver_set_backlight_level(abm_dce, backlight_pwm_u16_16);
419 414
420 return true; 415 return true;
421} 416}
@@ -424,8 +419,9 @@ static const struct abm_funcs dce_funcs = {
424 .abm_init = dce_abm_init, 419 .abm_init = dce_abm_init,
425 .set_abm_level = dce_abm_set_level, 420 .set_abm_level = dce_abm_set_level,
426 .init_backlight = dce_abm_init_backlight, 421 .init_backlight = dce_abm_init_backlight,
427 .set_backlight_level = dce_abm_set_backlight_level, 422 .set_backlight_level_pwm = dce_abm_set_backlight_level_pwm,
428 .get_current_backlight_8_bit = dce_abm_get_current_backlight_8_bit, 423 .get_current_backlight = dce_abm_get_current_backlight,
424 .get_target_backlight = dce_abm_get_target_backlight,
429 .set_abm_immediate_disable = dce_abm_immediate_disable 425 .set_abm_immediate_disable = dce_abm_immediate_disable
430}; 426};
431 427
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c
new file mode 100644
index 000000000000..9a28a04417d1
--- /dev/null
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c
@@ -0,0 +1,879 @@
1/*
2 * Copyright 2012-16 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: AMD
23 *
24 */
25
26#include "dce_clk_mgr.h"
27
28#include "reg_helper.h"
29#include "dmcu.h"
30#include "core_types.h"
31#include "dal_asic_id.h"
32
33#define TO_DCE_CLK_MGR(clocks)\
34 container_of(clocks, struct dce_clk_mgr, base)
35
36#define REG(reg) \
37 (clk_mgr_dce->regs->reg)
38
39#undef FN
40#define FN(reg_name, field_name) \
41 clk_mgr_dce->clk_mgr_shift->field_name, clk_mgr_dce->clk_mgr_mask->field_name
42
43#define CTX \
44 clk_mgr_dce->base.ctx
45#define DC_LOGGER \
46 clk_mgr->ctx->logger
47
48/* Max clock values for each state indexed by "enum clocks_state": */
49static const struct state_dependent_clocks dce80_max_clks_by_state[] = {
50/* ClocksStateInvalid - should not be used */
51{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
52/* ClocksStateUltraLow - not expected to be used for DCE 8.0 */
53{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
54/* ClocksStateLow */
55{ .display_clk_khz = 352000, .pixel_clk_khz = 330000},
56/* ClocksStateNominal */
57{ .display_clk_khz = 600000, .pixel_clk_khz = 400000 },
58/* ClocksStatePerformance */
59{ .display_clk_khz = 600000, .pixel_clk_khz = 400000 } };
60
61static const struct state_dependent_clocks dce110_max_clks_by_state[] = {
62/*ClocksStateInvalid - should not be used*/
63{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
64/*ClocksStateUltraLow - currently by HW design team not supposed to be used*/
65{ .display_clk_khz = 352000, .pixel_clk_khz = 330000 },
66/*ClocksStateLow*/
67{ .display_clk_khz = 352000, .pixel_clk_khz = 330000 },
68/*ClocksStateNominal*/
69{ .display_clk_khz = 467000, .pixel_clk_khz = 400000 },
70/*ClocksStatePerformance*/
71{ .display_clk_khz = 643000, .pixel_clk_khz = 400000 } };
72
73static const struct state_dependent_clocks dce112_max_clks_by_state[] = {
74/*ClocksStateInvalid - should not be used*/
75{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
76/*ClocksStateUltraLow - currently by HW design team not supposed to be used*/
77{ .display_clk_khz = 389189, .pixel_clk_khz = 346672 },
78/*ClocksStateLow*/
79{ .display_clk_khz = 459000, .pixel_clk_khz = 400000 },
80/*ClocksStateNominal*/
81{ .display_clk_khz = 667000, .pixel_clk_khz = 600000 },
82/*ClocksStatePerformance*/
83{ .display_clk_khz = 1132000, .pixel_clk_khz = 600000 } };
84
85static const struct state_dependent_clocks dce120_max_clks_by_state[] = {
86/*ClocksStateInvalid - should not be used*/
87{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
88/*ClocksStateUltraLow - currently by HW design team not supposed to be used*/
89{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
90/*ClocksStateLow*/
91{ .display_clk_khz = 460000, .pixel_clk_khz = 400000 },
92/*ClocksStateNominal*/
93{ .display_clk_khz = 670000, .pixel_clk_khz = 600000 },
94/*ClocksStatePerformance*/
95{ .display_clk_khz = 1133000, .pixel_clk_khz = 600000 } };
96
97static int dentist_get_divider_from_did(int did)
98{
99 if (did < DENTIST_BASE_DID_1)
100 did = DENTIST_BASE_DID_1;
101 if (did > DENTIST_MAX_DID)
102 did = DENTIST_MAX_DID;
103
104 if (did < DENTIST_BASE_DID_2) {
105 return DENTIST_DIVIDER_RANGE_1_START + DENTIST_DIVIDER_RANGE_1_STEP
106 * (did - DENTIST_BASE_DID_1);
107 } else if (did < DENTIST_BASE_DID_3) {
108 return DENTIST_DIVIDER_RANGE_2_START + DENTIST_DIVIDER_RANGE_2_STEP
109 * (did - DENTIST_BASE_DID_2);
110 } else if (did < DENTIST_BASE_DID_4) {
111 return DENTIST_DIVIDER_RANGE_3_START + DENTIST_DIVIDER_RANGE_3_STEP
112 * (did - DENTIST_BASE_DID_3);
113 } else {
114 return DENTIST_DIVIDER_RANGE_4_START + DENTIST_DIVIDER_RANGE_4_STEP
115 * (did - DENTIST_BASE_DID_4);
116 }
117}
118
119/* SW will adjust DP REF Clock average value for all purposes
120 * (DP DTO / DP Audio DTO and DP GTC)
121 if clock is spread for all cases:
122 -if SS enabled on DP Ref clock and HW de-spreading enabled with SW
123 calculations for DS_INCR/DS_MODULO (this is planned to be default case)
124 -if SS enabled on DP Ref clock and HW de-spreading enabled with HW
125 calculations (not planned to be used, but average clock should still
126 be valid)
127 -if SS enabled on DP Ref clock and HW de-spreading disabled
128 (should not be case with CIK) then SW should program all rates
129 generated according to average value (case as with previous ASICs)
130 */
131static int clk_mgr_adjust_dp_ref_freq_for_ss(struct dce_clk_mgr *clk_mgr_dce, int dp_ref_clk_khz)
132{
133 if (clk_mgr_dce->ss_on_dprefclk && clk_mgr_dce->dprefclk_ss_divider != 0) {
134 struct fixed31_32 ss_percentage = dc_fixpt_div_int(
135 dc_fixpt_from_fraction(clk_mgr_dce->dprefclk_ss_percentage,
136 clk_mgr_dce->dprefclk_ss_divider), 200);
137 struct fixed31_32 adj_dp_ref_clk_khz;
138
139 ss_percentage = dc_fixpt_sub(dc_fixpt_one, ss_percentage);
140 adj_dp_ref_clk_khz = dc_fixpt_mul_int(ss_percentage, dp_ref_clk_khz);
141 dp_ref_clk_khz = dc_fixpt_floor(adj_dp_ref_clk_khz);
142 }
143 return dp_ref_clk_khz;
144}
145
146static int dce_get_dp_ref_freq_khz(struct clk_mgr *clk_mgr)
147{
148 struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr);
149 int dprefclk_wdivider;
150 int dprefclk_src_sel;
151 int dp_ref_clk_khz = 600000;
152 int target_div;
153
154 /* ASSERT DP Reference Clock source is from DFS*/
155 REG_GET(DPREFCLK_CNTL, DPREFCLK_SRC_SEL, &dprefclk_src_sel);
156 ASSERT(dprefclk_src_sel == 0);
157
158 /* Read the mmDENTIST_DISPCLK_CNTL to get the currently
159 * programmed DID DENTIST_DPREFCLK_WDIVIDER*/
160 REG_GET(DENTIST_DISPCLK_CNTL, DENTIST_DPREFCLK_WDIVIDER, &dprefclk_wdivider);
161
162 /* Convert DENTIST_DPREFCLK_WDIVIDERto actual divider*/
163 target_div = dentist_get_divider_from_did(dprefclk_wdivider);
164
165 /* Calculate the current DFS clock, in kHz.*/
166 dp_ref_clk_khz = (DENTIST_DIVIDER_RANGE_SCALE_FACTOR
167 * clk_mgr_dce->dentist_vco_freq_khz) / target_div;
168
169 return clk_mgr_adjust_dp_ref_freq_for_ss(clk_mgr_dce, dp_ref_clk_khz);
170}
171
172int dce12_get_dp_ref_freq_khz(struct clk_mgr *clk_mgr)
173{
174 struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr);
175
176 return clk_mgr_adjust_dp_ref_freq_for_ss(clk_mgr_dce, clk_mgr_dce->dprefclk_khz);
177}
178
179/* unit: in_khz before mode set, get pixel clock from context. ASIC register
180 * may not be programmed yet
181 */
182static uint32_t get_max_pixel_clock_for_all_paths(struct dc_state *context)
183{
184 uint32_t max_pix_clk = 0;
185 int i;
186
187 for (i = 0; i < MAX_PIPES; i++) {
188 struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
189
190 if (pipe_ctx->stream == NULL)
191 continue;
192
193 /* do not check under lay */
194 if (pipe_ctx->top_pipe)
195 continue;
196
197 if (pipe_ctx->stream_res.pix_clk_params.requested_pix_clk > max_pix_clk)
198 max_pix_clk = pipe_ctx->stream_res.pix_clk_params.requested_pix_clk;
199
200 /* raise clock state for HBR3/2 if required. Confirmed with HW DCE/DPCS
201 * logic for HBR3 still needs Nominal (0.8V) on VDDC rail
202 */
203 if (dc_is_dp_signal(pipe_ctx->stream->signal) &&
204 pipe_ctx->stream_res.pix_clk_params.requested_sym_clk > max_pix_clk)
205 max_pix_clk = pipe_ctx->stream_res.pix_clk_params.requested_sym_clk;
206 }
207
208 return max_pix_clk;
209}
210
211static enum dm_pp_clocks_state dce_get_required_clocks_state(
212 struct clk_mgr *clk_mgr,
213 struct dc_state *context)
214{
215 struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr);
216 int i;
217 enum dm_pp_clocks_state low_req_clk;
218 int max_pix_clk = get_max_pixel_clock_for_all_paths(context);
219
220 /* Iterate from highest supported to lowest valid state, and update
221 * lowest RequiredState with the lowest state that satisfies
222 * all required clocks
223 */
224 for (i = clk_mgr_dce->max_clks_state; i >= DM_PP_CLOCKS_STATE_ULTRA_LOW; i--)
225 if (context->bw.dce.dispclk_khz >
226 clk_mgr_dce->max_clks_by_state[i].display_clk_khz
227 || max_pix_clk >
228 clk_mgr_dce->max_clks_by_state[i].pixel_clk_khz)
229 break;
230
231 low_req_clk = i + 1;
232 if (low_req_clk > clk_mgr_dce->max_clks_state) {
233 /* set max clock state for high phyclock, invalid on exceeding display clock */
234 if (clk_mgr_dce->max_clks_by_state[clk_mgr_dce->max_clks_state].display_clk_khz
235 < context->bw.dce.dispclk_khz)
236 low_req_clk = DM_PP_CLOCKS_STATE_INVALID;
237 else
238 low_req_clk = clk_mgr_dce->max_clks_state;
239 }
240
241 return low_req_clk;
242}
243
244static int dce_set_clock(
245 struct clk_mgr *clk_mgr,
246 int requested_clk_khz)
247{
248 struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr);
249 struct bp_pixel_clock_parameters pxl_clk_params = { 0 };
250 struct dc_bios *bp = clk_mgr->ctx->dc_bios;
251 int actual_clock = requested_clk_khz;
252 struct dmcu *dmcu = clk_mgr_dce->base.ctx->dc->res_pool->dmcu;
253
254 /* Make sure requested clock isn't lower than minimum threshold*/
255 if (requested_clk_khz > 0)
256 requested_clk_khz = max(requested_clk_khz,
257 clk_mgr_dce->dentist_vco_freq_khz / 64);
258
259 /* Prepare to program display clock*/
260 pxl_clk_params.target_pixel_clock = requested_clk_khz;
261 pxl_clk_params.pll_id = CLOCK_SOURCE_ID_DFS;
262
263 if (clk_mgr_dce->dfs_bypass_active)
264 pxl_clk_params.flags.SET_DISPCLK_DFS_BYPASS = true;
265
266 bp->funcs->program_display_engine_pll(bp, &pxl_clk_params);
267
268 if (clk_mgr_dce->dfs_bypass_active) {
269 /* Cache the fixed display clock*/
270 clk_mgr_dce->dfs_bypass_disp_clk =
271 pxl_clk_params.dfs_bypass_display_clock;
272 actual_clock = pxl_clk_params.dfs_bypass_display_clock;
273 }
274
275 /* from power down, we need mark the clock state as ClocksStateNominal
276 * from HWReset, so when resume we will call pplib voltage regulator.*/
277 if (requested_clk_khz == 0)
278 clk_mgr_dce->cur_min_clks_state = DM_PP_CLOCKS_STATE_NOMINAL;
279
280 dmcu->funcs->set_psr_wait_loop(dmcu, actual_clock / 1000 / 7);
281
282 return actual_clock;
283}
284
285int dce112_set_clock(struct clk_mgr *clk_mgr, int requested_clk_khz)
286{
287 struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr);
288 struct bp_set_dce_clock_parameters dce_clk_params;
289 struct dc_bios *bp = clk_mgr->ctx->dc_bios;
290 struct dc *core_dc = clk_mgr->ctx->dc;
291 struct dmcu *dmcu = core_dc->res_pool->dmcu;
292 int actual_clock = requested_clk_khz;
293 /* Prepare to program display clock*/
294 memset(&dce_clk_params, 0, sizeof(dce_clk_params));
295
296 /* Make sure requested clock isn't lower than minimum threshold*/
297 if (requested_clk_khz > 0)
298 requested_clk_khz = max(requested_clk_khz,
299 clk_mgr_dce->dentist_vco_freq_khz / 62);
300
301 dce_clk_params.target_clock_frequency = requested_clk_khz;
302 dce_clk_params.pll_id = CLOCK_SOURCE_ID_DFS;
303 dce_clk_params.clock_type = DCECLOCK_TYPE_DISPLAY_CLOCK;
304
305 bp->funcs->set_dce_clock(bp, &dce_clk_params);
306 actual_clock = dce_clk_params.target_clock_frequency;
307
308 /* from power down, we need mark the clock state as ClocksStateNominal
309 * from HWReset, so when resume we will call pplib voltage regulator.*/
310 if (requested_clk_khz == 0)
311 clk_mgr_dce->cur_min_clks_state = DM_PP_CLOCKS_STATE_NOMINAL;
312
313 /*Program DP ref Clock*/
314 /*VBIOS will determine DPREFCLK frequency, so we don't set it*/
315 dce_clk_params.target_clock_frequency = 0;
316 dce_clk_params.clock_type = DCECLOCK_TYPE_DPREFCLK;
317 if (!ASICREV_IS_VEGA20_P(clk_mgr->ctx->asic_id.hw_internal_rev))
318 dce_clk_params.flags.USE_GENLOCK_AS_SOURCE_FOR_DPREFCLK =
319 (dce_clk_params.pll_id ==
320 CLOCK_SOURCE_COMBO_DISPLAY_PLL0);
321 else
322 dce_clk_params.flags.USE_GENLOCK_AS_SOURCE_FOR_DPREFCLK = false;
323
324 bp->funcs->set_dce_clock(bp, &dce_clk_params);
325
326 if (!IS_FPGA_MAXIMUS_DC(core_dc->ctx->dce_environment)) {
327 if (clk_mgr_dce->dfs_bypass_disp_clk != actual_clock)
328 dmcu->funcs->set_psr_wait_loop(dmcu,
329 actual_clock / 1000 / 7);
330 }
331
332 clk_mgr_dce->dfs_bypass_disp_clk = actual_clock;
333 return actual_clock;
334}
335
336static void dce_clock_read_integrated_info(struct dce_clk_mgr *clk_mgr_dce)
337{
338 struct dc_debug_options *debug = &clk_mgr_dce->base.ctx->dc->debug;
339 struct dc_bios *bp = clk_mgr_dce->base.ctx->dc_bios;
340 struct integrated_info info = { { { 0 } } };
341 struct dc_firmware_info fw_info = { { 0 } };
342 int i;
343
344 if (bp->integrated_info)
345 info = *bp->integrated_info;
346
347 clk_mgr_dce->dentist_vco_freq_khz = info.dentist_vco_freq;
348 if (clk_mgr_dce->dentist_vco_freq_khz == 0) {
349 bp->funcs->get_firmware_info(bp, &fw_info);
350 clk_mgr_dce->dentist_vco_freq_khz =
351 fw_info.smu_gpu_pll_output_freq;
352 if (clk_mgr_dce->dentist_vco_freq_khz == 0)
353 clk_mgr_dce->dentist_vco_freq_khz = 3600000;
354 }
355
356 /*update the maximum display clock for each power state*/
357 for (i = 0; i < NUMBER_OF_DISP_CLK_VOLTAGE; ++i) {
358 enum dm_pp_clocks_state clk_state = DM_PP_CLOCKS_STATE_INVALID;
359
360 switch (i) {
361 case 0:
362 clk_state = DM_PP_CLOCKS_STATE_ULTRA_LOW;
363 break;
364
365 case 1:
366 clk_state = DM_PP_CLOCKS_STATE_LOW;
367 break;
368
369 case 2:
370 clk_state = DM_PP_CLOCKS_STATE_NOMINAL;
371 break;
372
373 case 3:
374 clk_state = DM_PP_CLOCKS_STATE_PERFORMANCE;
375 break;
376
377 default:
378 clk_state = DM_PP_CLOCKS_STATE_INVALID;
379 break;
380 }
381
382 /*Do not allow bad VBIOS/SBIOS to override with invalid values,
383 * check for > 100MHz*/
384 if (info.disp_clk_voltage[i].max_supported_clk >= 100000)
385 clk_mgr_dce->max_clks_by_state[clk_state].display_clk_khz =
386 info.disp_clk_voltage[i].max_supported_clk;
387 }
388
389 if (!debug->disable_dfs_bypass && bp->integrated_info)
390 if (bp->integrated_info->gpu_cap_info & DFS_BYPASS_ENABLE)
391 clk_mgr_dce->dfs_bypass_enabled = true;
392}
393
394void dce_clock_read_ss_info(struct dce_clk_mgr *clk_mgr_dce)
395{
396 struct dc_bios *bp = clk_mgr_dce->base.ctx->dc_bios;
397 int ss_info_num = bp->funcs->get_ss_entry_number(
398 bp, AS_SIGNAL_TYPE_GPU_PLL);
399
400 if (ss_info_num) {
401 struct spread_spectrum_info info = { { 0 } };
402 enum bp_result result = bp->funcs->get_spread_spectrum_info(
403 bp, AS_SIGNAL_TYPE_GPU_PLL, 0, &info);
404
405 /* Based on VBIOS, VBIOS will keep entry for GPU PLL SS
406 * even if SS not enabled and in that case
407 * SSInfo.spreadSpectrumPercentage !=0 would be sign
408 * that SS is enabled
409 */
410 if (result == BP_RESULT_OK &&
411 info.spread_spectrum_percentage != 0) {
412 clk_mgr_dce->ss_on_dprefclk = true;
413 clk_mgr_dce->dprefclk_ss_divider = info.spread_percentage_divider;
414
415 if (info.type.CENTER_MODE == 0) {
416 /* TODO: Currently for DP Reference clock we
417 * need only SS percentage for
418 * downspread */
419 clk_mgr_dce->dprefclk_ss_percentage =
420 info.spread_spectrum_percentage;
421 }
422
423 return;
424 }
425
426 result = bp->funcs->get_spread_spectrum_info(
427 bp, AS_SIGNAL_TYPE_DISPLAY_PORT, 0, &info);
428
429 /* Based on VBIOS, VBIOS will keep entry for DPREFCLK SS
430 * even if SS not enabled and in that case
431 * SSInfo.spreadSpectrumPercentage !=0 would be sign
432 * that SS is enabled
433 */
434 if (result == BP_RESULT_OK &&
435 info.spread_spectrum_percentage != 0) {
436 clk_mgr_dce->ss_on_dprefclk = true;
437 clk_mgr_dce->dprefclk_ss_divider = info.spread_percentage_divider;
438
439 if (info.type.CENTER_MODE == 0) {
440 /* Currently for DP Reference clock we
441 * need only SS percentage for
442 * downspread */
443 clk_mgr_dce->dprefclk_ss_percentage =
444 info.spread_spectrum_percentage;
445 }
446 }
447 }
448}
449
450void dce110_fill_display_configs(
451 const struct dc_state *context,
452 struct dm_pp_display_configuration *pp_display_cfg)
453{
454 int j;
455 int num_cfgs = 0;
456
457 for (j = 0; j < context->stream_count; j++) {
458 int k;
459
460 const struct dc_stream_state *stream = context->streams[j];
461 struct dm_pp_single_disp_config *cfg =
462 &pp_display_cfg->disp_configs[num_cfgs];
463 const struct pipe_ctx *pipe_ctx = NULL;
464
465 for (k = 0; k < MAX_PIPES; k++)
466 if (stream == context->res_ctx.pipe_ctx[k].stream) {
467 pipe_ctx = &context->res_ctx.pipe_ctx[k];
468 break;
469 }
470
471 ASSERT(pipe_ctx != NULL);
472
473 /* only notify active stream */
474 if (stream->dpms_off)
475 continue;
476
477 num_cfgs++;
478 cfg->signal = pipe_ctx->stream->signal;
479 cfg->pipe_idx = pipe_ctx->stream_res.tg->inst;
480 cfg->src_height = stream->src.height;
481 cfg->src_width = stream->src.width;
482 cfg->ddi_channel_mapping =
483 stream->sink->link->ddi_channel_mapping.raw;
484 cfg->transmitter =
485 stream->sink->link->link_enc->transmitter;
486 cfg->link_settings.lane_count =
487 stream->sink->link->cur_link_settings.lane_count;
488 cfg->link_settings.link_rate =
489 stream->sink->link->cur_link_settings.link_rate;
490 cfg->link_settings.link_spread =
491 stream->sink->link->cur_link_settings.link_spread;
492 cfg->sym_clock = stream->phy_pix_clk;
493 /* Round v_refresh*/
494 cfg->v_refresh = stream->timing.pix_clk_khz * 1000;
495 cfg->v_refresh /= stream->timing.h_total;
496 cfg->v_refresh = (cfg->v_refresh + stream->timing.v_total / 2)
497 / stream->timing.v_total;
498 }
499
500 pp_display_cfg->display_count = num_cfgs;
501}
502
503static uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context)
504{
505 uint8_t j;
506 uint32_t min_vertical_blank_time = -1;
507
508 for (j = 0; j < context->stream_count; j++) {
509 struct dc_stream_state *stream = context->streams[j];
510 uint32_t vertical_blank_in_pixels = 0;
511 uint32_t vertical_blank_time = 0;
512
513 vertical_blank_in_pixels = stream->timing.h_total *
514 (stream->timing.v_total
515 - stream->timing.v_addressable);
516
517 vertical_blank_time = vertical_blank_in_pixels
518 * 1000 / stream->timing.pix_clk_khz;
519
520 if (min_vertical_blank_time > vertical_blank_time)
521 min_vertical_blank_time = vertical_blank_time;
522 }
523
524 return min_vertical_blank_time;
525}
526
527static int determine_sclk_from_bounding_box(
528 const struct dc *dc,
529 int required_sclk)
530{
531 int i;
532
533 /*
534 * Some asics do not give us sclk levels, so we just report the actual
535 * required sclk
536 */
537 if (dc->sclk_lvls.num_levels == 0)
538 return required_sclk;
539
540 for (i = 0; i < dc->sclk_lvls.num_levels; i++) {
541 if (dc->sclk_lvls.clocks_in_khz[i] >= required_sclk)
542 return dc->sclk_lvls.clocks_in_khz[i];
543 }
544 /*
545 * even maximum level could not satisfy requirement, this
546 * is unexpected at this stage, should have been caught at
547 * validation time
548 */
549 ASSERT(0);
550 return dc->sclk_lvls.clocks_in_khz[dc->sclk_lvls.num_levels - 1];
551}
552
553static void dce_pplib_apply_display_requirements(
554 struct dc *dc,
555 struct dc_state *context)
556{
557 struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg;
558
559 pp_display_cfg->avail_mclk_switch_time_us = dce110_get_min_vblank_time_us(context);
560
561 dce110_fill_display_configs(context, pp_display_cfg);
562
563 if (memcmp(&dc->current_state->pp_display_cfg, pp_display_cfg, sizeof(*pp_display_cfg)) != 0)
564 dm_pp_apply_display_requirements(dc->ctx, pp_display_cfg);
565}
566
567static void dce11_pplib_apply_display_requirements(
568 struct dc *dc,
569 struct dc_state *context)
570{
571 struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg;
572
573 pp_display_cfg->all_displays_in_sync =
574 context->bw.dce.all_displays_in_sync;
575 pp_display_cfg->nb_pstate_switch_disable =
576 context->bw.dce.nbp_state_change_enable == false;
577 pp_display_cfg->cpu_cc6_disable =
578 context->bw.dce.cpuc_state_change_enable == false;
579 pp_display_cfg->cpu_pstate_disable =
580 context->bw.dce.cpup_state_change_enable == false;
581 pp_display_cfg->cpu_pstate_separation_time =
582 context->bw.dce.blackout_recovery_time_us;
583
584 pp_display_cfg->min_memory_clock_khz = context->bw.dce.yclk_khz
585 / MEMORY_TYPE_MULTIPLIER_CZ;
586
587 pp_display_cfg->min_engine_clock_khz = determine_sclk_from_bounding_box(
588 dc,
589 context->bw.dce.sclk_khz);
590
591 pp_display_cfg->min_engine_clock_deep_sleep_khz
592 = context->bw.dce.sclk_deep_sleep_khz;
593
594 pp_display_cfg->avail_mclk_switch_time_us =
595 dce110_get_min_vblank_time_us(context);
596 /* TODO: dce11.2*/
597 pp_display_cfg->avail_mclk_switch_time_in_disp_active_us = 0;
598
599 pp_display_cfg->disp_clk_khz = dc->res_pool->clk_mgr->clks.dispclk_khz;
600
601 dce110_fill_display_configs(context, pp_display_cfg);
602
603 /* TODO: is this still applicable?*/
604 if (pp_display_cfg->display_count == 1) {
605 const struct dc_crtc_timing *timing =
606 &context->streams[0]->timing;
607
608 pp_display_cfg->crtc_index =
609 pp_display_cfg->disp_configs[0].pipe_idx;
610 pp_display_cfg->line_time_in_us = timing->h_total * 1000 / timing->pix_clk_khz;
611 }
612
613 if (memcmp(&dc->current_state->pp_display_cfg, pp_display_cfg, sizeof(*pp_display_cfg)) != 0)
614 dm_pp_apply_display_requirements(dc->ctx, pp_display_cfg);
615}
616
617static void dce_update_clocks(struct clk_mgr *clk_mgr,
618 struct dc_state *context,
619 bool safe_to_lower)
620{
621 struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr);
622 struct dm_pp_power_level_change_request level_change_req;
623 int unpatched_disp_clk = context->bw.dce.dispclk_khz;
624
625 /*TODO: W/A for dal3 linux, investigate why this works */
626 if (!clk_mgr_dce->dfs_bypass_active)
627 context->bw.dce.dispclk_khz = context->bw.dce.dispclk_khz * 115 / 100;
628
629 level_change_req.power_level = dce_get_required_clocks_state(clk_mgr, context);
630 /* get max clock state from PPLIB */
631 if ((level_change_req.power_level < clk_mgr_dce->cur_min_clks_state && safe_to_lower)
632 || level_change_req.power_level > clk_mgr_dce->cur_min_clks_state) {
633 if (dm_pp_apply_power_level_change_request(clk_mgr->ctx, &level_change_req))
634 clk_mgr_dce->cur_min_clks_state = level_change_req.power_level;
635 }
636
637 if (should_set_clock(safe_to_lower, context->bw.dce.dispclk_khz, clk_mgr->clks.dispclk_khz)) {
638 context->bw.dce.dispclk_khz = dce_set_clock(clk_mgr, context->bw.dce.dispclk_khz);
639 clk_mgr->clks.dispclk_khz = context->bw.dce.dispclk_khz;
640 }
641 dce_pplib_apply_display_requirements(clk_mgr->ctx->dc, context);
642
643 context->bw.dce.dispclk_khz = unpatched_disp_clk;
644}
645
646static void dce11_update_clocks(struct clk_mgr *clk_mgr,
647 struct dc_state *context,
648 bool safe_to_lower)
649{
650 struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr);
651 struct dm_pp_power_level_change_request level_change_req;
652
653 level_change_req.power_level = dce_get_required_clocks_state(clk_mgr, context);
654 /* get max clock state from PPLIB */
655 if ((level_change_req.power_level < clk_mgr_dce->cur_min_clks_state && safe_to_lower)
656 || level_change_req.power_level > clk_mgr_dce->cur_min_clks_state) {
657 if (dm_pp_apply_power_level_change_request(clk_mgr->ctx, &level_change_req))
658 clk_mgr_dce->cur_min_clks_state = level_change_req.power_level;
659 }
660
661 if (should_set_clock(safe_to_lower, context->bw.dce.dispclk_khz, clk_mgr->clks.dispclk_khz)) {
662 context->bw.dce.dispclk_khz = dce_set_clock(clk_mgr, context->bw.dce.dispclk_khz);
663 clk_mgr->clks.dispclk_khz = context->bw.dce.dispclk_khz;
664 }
665 dce11_pplib_apply_display_requirements(clk_mgr->ctx->dc, context);
666}
667
668static void dce112_update_clocks(struct clk_mgr *clk_mgr,
669 struct dc_state *context,
670 bool safe_to_lower)
671{
672 struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr);
673 struct dm_pp_power_level_change_request level_change_req;
674
675 level_change_req.power_level = dce_get_required_clocks_state(clk_mgr, context);
676 /* get max clock state from PPLIB */
677 if ((level_change_req.power_level < clk_mgr_dce->cur_min_clks_state && safe_to_lower)
678 || level_change_req.power_level > clk_mgr_dce->cur_min_clks_state) {
679 if (dm_pp_apply_power_level_change_request(clk_mgr->ctx, &level_change_req))
680 clk_mgr_dce->cur_min_clks_state = level_change_req.power_level;
681 }
682
683 if (should_set_clock(safe_to_lower, context->bw.dce.dispclk_khz, clk_mgr->clks.dispclk_khz)) {
684 context->bw.dce.dispclk_khz = dce112_set_clock(clk_mgr, context->bw.dce.dispclk_khz);
685 clk_mgr->clks.dispclk_khz = context->bw.dce.dispclk_khz;
686 }
687 dce11_pplib_apply_display_requirements(clk_mgr->ctx->dc, context);
688}
689
690static void dce12_update_clocks(struct clk_mgr *clk_mgr,
691 struct dc_state *context,
692 bool safe_to_lower)
693{
694 struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr);
695 struct dm_pp_clock_for_voltage_req clock_voltage_req = {0};
696 int max_pix_clk = get_max_pixel_clock_for_all_paths(context);
697 int unpatched_disp_clk = context->bw.dce.dispclk_khz;
698
699 /*TODO: W/A for dal3 linux, investigate why this works */
700 if (!clk_mgr_dce->dfs_bypass_active)
701 context->bw.dce.dispclk_khz = context->bw.dce.dispclk_khz * 115 / 100;
702
703 if (should_set_clock(safe_to_lower, context->bw.dce.dispclk_khz, clk_mgr->clks.dispclk_khz)) {
704 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DISPLAY_CLK;
705 clock_voltage_req.clocks_in_khz = context->bw.dce.dispclk_khz;
706 context->bw.dce.dispclk_khz = dce112_set_clock(clk_mgr, context->bw.dce.dispclk_khz);
707 clk_mgr->clks.dispclk_khz = context->bw.dce.dispclk_khz;
708
709 dm_pp_apply_clock_for_voltage_request(clk_mgr->ctx, &clock_voltage_req);
710 }
711
712 if (should_set_clock(safe_to_lower, max_pix_clk, clk_mgr->clks.phyclk_khz)) {
713 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DISPLAYPHYCLK;
714 clock_voltage_req.clocks_in_khz = max_pix_clk;
715 clk_mgr->clks.phyclk_khz = max_pix_clk;
716
717 dm_pp_apply_clock_for_voltage_request(clk_mgr->ctx, &clock_voltage_req);
718 }
719 dce11_pplib_apply_display_requirements(clk_mgr->ctx->dc, context);
720
721 context->bw.dce.dispclk_khz = unpatched_disp_clk;
722}
723
724static const struct clk_mgr_funcs dce120_funcs = {
725 .get_dp_ref_clk_frequency = dce12_get_dp_ref_freq_khz,
726 .update_clocks = dce12_update_clocks
727};
728
729static const struct clk_mgr_funcs dce112_funcs = {
730 .get_dp_ref_clk_frequency = dce_get_dp_ref_freq_khz,
731 .update_clocks = dce112_update_clocks
732};
733
734static const struct clk_mgr_funcs dce110_funcs = {
735 .get_dp_ref_clk_frequency = dce_get_dp_ref_freq_khz,
736 .update_clocks = dce11_update_clocks,
737};
738
739static const struct clk_mgr_funcs dce_funcs = {
740 .get_dp_ref_clk_frequency = dce_get_dp_ref_freq_khz,
741 .update_clocks = dce_update_clocks
742};
743
744static void dce_clk_mgr_construct(
745 struct dce_clk_mgr *clk_mgr_dce,
746 struct dc_context *ctx,
747 const struct clk_mgr_registers *regs,
748 const struct clk_mgr_shift *clk_shift,
749 const struct clk_mgr_mask *clk_mask)
750{
751 struct clk_mgr *base = &clk_mgr_dce->base;
752 struct dm_pp_static_clock_info static_clk_info = {0};
753
754 base->ctx = ctx;
755 base->funcs = &dce_funcs;
756
757 clk_mgr_dce->regs = regs;
758 clk_mgr_dce->clk_mgr_shift = clk_shift;
759 clk_mgr_dce->clk_mgr_mask = clk_mask;
760
761 clk_mgr_dce->dfs_bypass_disp_clk = 0;
762
763 clk_mgr_dce->dprefclk_ss_percentage = 0;
764 clk_mgr_dce->dprefclk_ss_divider = 1000;
765 clk_mgr_dce->ss_on_dprefclk = false;
766
767
768 if (dm_pp_get_static_clocks(ctx, &static_clk_info))
769 clk_mgr_dce->max_clks_state = static_clk_info.max_clocks_state;
770 else
771 clk_mgr_dce->max_clks_state = DM_PP_CLOCKS_STATE_NOMINAL;
772 clk_mgr_dce->cur_min_clks_state = DM_PP_CLOCKS_STATE_INVALID;
773
774 dce_clock_read_integrated_info(clk_mgr_dce);
775 dce_clock_read_ss_info(clk_mgr_dce);
776}
777
778struct clk_mgr *dce_clk_mgr_create(
779 struct dc_context *ctx,
780 const struct clk_mgr_registers *regs,
781 const struct clk_mgr_shift *clk_shift,
782 const struct clk_mgr_mask *clk_mask)
783{
784 struct dce_clk_mgr *clk_mgr_dce = kzalloc(sizeof(*clk_mgr_dce), GFP_KERNEL);
785
786 if (clk_mgr_dce == NULL) {
787 BREAK_TO_DEBUGGER();
788 return NULL;
789 }
790
791 memcpy(clk_mgr_dce->max_clks_by_state,
792 dce80_max_clks_by_state,
793 sizeof(dce80_max_clks_by_state));
794
795 dce_clk_mgr_construct(
796 clk_mgr_dce, ctx, regs, clk_shift, clk_mask);
797
798 return &clk_mgr_dce->base;
799}
800
801struct clk_mgr *dce110_clk_mgr_create(
802 struct dc_context *ctx,
803 const struct clk_mgr_registers *regs,
804 const struct clk_mgr_shift *clk_shift,
805 const struct clk_mgr_mask *clk_mask)
806{
807 struct dce_clk_mgr *clk_mgr_dce = kzalloc(sizeof(*clk_mgr_dce), GFP_KERNEL);
808
809 if (clk_mgr_dce == NULL) {
810 BREAK_TO_DEBUGGER();
811 return NULL;
812 }
813
814 memcpy(clk_mgr_dce->max_clks_by_state,
815 dce110_max_clks_by_state,
816 sizeof(dce110_max_clks_by_state));
817
818 dce_clk_mgr_construct(
819 clk_mgr_dce, ctx, regs, clk_shift, clk_mask);
820
821 clk_mgr_dce->base.funcs = &dce110_funcs;
822
823 return &clk_mgr_dce->base;
824}
825
826struct clk_mgr *dce112_clk_mgr_create(
827 struct dc_context *ctx,
828 const struct clk_mgr_registers *regs,
829 const struct clk_mgr_shift *clk_shift,
830 const struct clk_mgr_mask *clk_mask)
831{
832 struct dce_clk_mgr *clk_mgr_dce = kzalloc(sizeof(*clk_mgr_dce), GFP_KERNEL);
833
834 if (clk_mgr_dce == NULL) {
835 BREAK_TO_DEBUGGER();
836 return NULL;
837 }
838
839 memcpy(clk_mgr_dce->max_clks_by_state,
840 dce112_max_clks_by_state,
841 sizeof(dce112_max_clks_by_state));
842
843 dce_clk_mgr_construct(
844 clk_mgr_dce, ctx, regs, clk_shift, clk_mask);
845
846 clk_mgr_dce->base.funcs = &dce112_funcs;
847
848 return &clk_mgr_dce->base;
849}
850
851struct clk_mgr *dce120_clk_mgr_create(struct dc_context *ctx)
852{
853 struct dce_clk_mgr *clk_mgr_dce = kzalloc(sizeof(*clk_mgr_dce), GFP_KERNEL);
854
855 if (clk_mgr_dce == NULL) {
856 BREAK_TO_DEBUGGER();
857 return NULL;
858 }
859
860 memcpy(clk_mgr_dce->max_clks_by_state,
861 dce120_max_clks_by_state,
862 sizeof(dce120_max_clks_by_state));
863
864 dce_clk_mgr_construct(
865 clk_mgr_dce, ctx, NULL, NULL, NULL);
866
867 clk_mgr_dce->dprefclk_khz = 600000;
868 clk_mgr_dce->base.funcs = &dce120_funcs;
869
870 return &clk_mgr_dce->base;
871}
872
873void dce_clk_mgr_destroy(struct clk_mgr **clk_mgr)
874{
875 struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(*clk_mgr);
876
877 kfree(clk_mgr_dce);
878 *clk_mgr = NULL;
879}
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.h b/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.h
index 34fdb386c884..046077797416 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.h
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.h
@@ -24,10 +24,13 @@
24 */ 24 */
25 25
26 26
27#ifndef _DCE_CLOCKS_H_ 27#ifndef _DCE_CLK_MGR_H_
28#define _DCE_CLOCKS_H_ 28#define _DCE_CLK_MGR_H_
29 29
30#include "display_clock.h" 30#include "clk_mgr.h"
31#include "dccg.h"
32
33#define MEMORY_TYPE_MULTIPLIER_CZ 4
31 34
32#define CLK_COMMON_REG_LIST_DCE_BASE() \ 35#define CLK_COMMON_REG_LIST_DCE_BASE() \
33 .DPREFCLK_CNTL = mmDPREFCLK_CNTL, \ 36 .DPREFCLK_CNTL = mmDPREFCLK_CNTL, \
@@ -53,24 +56,31 @@
53 type DENTIST_DISPCLK_WDIVIDER; \ 56 type DENTIST_DISPCLK_WDIVIDER; \
54 type DENTIST_DISPCLK_CHG_DONE; 57 type DENTIST_DISPCLK_CHG_DONE;
55 58
56struct dccg_shift { 59struct clk_mgr_shift {
57 CLK_REG_FIELD_LIST(uint8_t) 60 CLK_REG_FIELD_LIST(uint8_t)
58}; 61};
59 62
60struct dccg_mask { 63struct clk_mgr_mask {
61 CLK_REG_FIELD_LIST(uint32_t) 64 CLK_REG_FIELD_LIST(uint32_t)
62}; 65};
63 66
64struct dccg_registers { 67struct clk_mgr_registers {
65 uint32_t DPREFCLK_CNTL; 68 uint32_t DPREFCLK_CNTL;
66 uint32_t DENTIST_DISPCLK_CNTL; 69 uint32_t DENTIST_DISPCLK_CNTL;
67}; 70};
68 71
69struct dce_dccg { 72struct state_dependent_clocks {
70 struct dccg base; 73 int display_clk_khz;
71 const struct dccg_registers *regs; 74 int pixel_clk_khz;
72 const struct dccg_shift *clk_shift; 75};
73 const struct dccg_mask *clk_mask; 76
77struct dce_clk_mgr {
78 struct clk_mgr base;
79 const struct clk_mgr_registers *regs;
80 const struct clk_mgr_shift *clk_mgr_shift;
81 const struct clk_mgr_mask *clk_mgr_mask;
82
83 struct dccg *dccg;
74 84
75 struct state_dependent_clocks max_clks_by_state[DM_PP_CLOCKS_MAX_STATES]; 85 struct state_dependent_clocks max_clks_by_state[DM_PP_CLOCKS_MAX_STATES];
76 86
@@ -91,33 +101,68 @@ struct dce_dccg {
91 /* DPREFCLK SS percentage Divider (100 or 1000) */ 101 /* DPREFCLK SS percentage Divider (100 or 1000) */
92 int dprefclk_ss_divider; 102 int dprefclk_ss_divider;
93 int dprefclk_khz; 103 int dprefclk_khz;
104
105 enum dm_pp_clocks_state max_clks_state;
106 enum dm_pp_clocks_state cur_min_clks_state;
94}; 107};
95 108
109/* Starting DID for each range */
110enum dentist_base_divider_id {
111 DENTIST_BASE_DID_1 = 0x08,
112 DENTIST_BASE_DID_2 = 0x40,
113 DENTIST_BASE_DID_3 = 0x60,
114 DENTIST_BASE_DID_4 = 0x7e,
115 DENTIST_MAX_DID = 0x7f
116};
96 117
97struct dccg *dce_dccg_create( 118/* Starting point and step size for each divider range.*/
98 struct dc_context *ctx, 119enum dentist_divider_range {
99 const struct dccg_registers *regs, 120 DENTIST_DIVIDER_RANGE_1_START = 8, /* 2.00 */
100 const struct dccg_shift *clk_shift, 121 DENTIST_DIVIDER_RANGE_1_STEP = 1, /* 0.25 */
101 const struct dccg_mask *clk_mask); 122 DENTIST_DIVIDER_RANGE_2_START = 64, /* 16.00 */
123 DENTIST_DIVIDER_RANGE_2_STEP = 2, /* 0.50 */
124 DENTIST_DIVIDER_RANGE_3_START = 128, /* 32.00 */
125 DENTIST_DIVIDER_RANGE_3_STEP = 4, /* 1.00 */
126 DENTIST_DIVIDER_RANGE_4_START = 248, /* 62.00 */
127 DENTIST_DIVIDER_RANGE_4_STEP = 264, /* 66.00 */
128 DENTIST_DIVIDER_RANGE_SCALE_FACTOR = 4
129};
130
131static inline bool should_set_clock(bool safe_to_lower, int calc_clk, int cur_clk)
132{
133 return ((safe_to_lower && calc_clk < cur_clk) || calc_clk > cur_clk);
134}
135
136void dce_clock_read_ss_info(struct dce_clk_mgr *dccg_dce);
137
138int dce12_get_dp_ref_freq_khz(struct clk_mgr *dccg);
102 139
103struct dccg *dce110_dccg_create( 140void dce110_fill_display_configs(
141 const struct dc_state *context,
142 struct dm_pp_display_configuration *pp_display_cfg);
143
144int dce112_set_clock(struct clk_mgr *dccg, int requested_clk_khz);
145
146struct clk_mgr *dce_clk_mgr_create(
104 struct dc_context *ctx, 147 struct dc_context *ctx,
105 const struct dccg_registers *regs, 148 const struct clk_mgr_registers *regs,
106 const struct dccg_shift *clk_shift, 149 const struct clk_mgr_shift *clk_shift,
107 const struct dccg_mask *clk_mask); 150 const struct clk_mgr_mask *clk_mask);
108 151
109struct dccg *dce112_dccg_create( 152struct clk_mgr *dce110_clk_mgr_create(
110 struct dc_context *ctx, 153 struct dc_context *ctx,
111 const struct dccg_registers *regs, 154 const struct clk_mgr_registers *regs,
112 const struct dccg_shift *clk_shift, 155 const struct clk_mgr_shift *clk_shift,
113 const struct dccg_mask *clk_mask); 156 const struct clk_mgr_mask *clk_mask);
114 157
115struct dccg *dce120_dccg_create(struct dc_context *ctx); 158struct clk_mgr *dce112_clk_mgr_create(
159 struct dc_context *ctx,
160 const struct clk_mgr_registers *regs,
161 const struct clk_mgr_shift *clk_shift,
162 const struct clk_mgr_mask *clk_mask);
116 163
117#ifdef CONFIG_DRM_AMD_DC_DCN1_0 164struct clk_mgr *dce120_clk_mgr_create(struct dc_context *ctx);
118struct dccg *dcn1_dccg_create(struct dc_context *ctx);
119#endif
120 165
121void dce_dccg_destroy(struct dccg **dccg); 166void dce_clk_mgr_destroy(struct clk_mgr **clk_mgr);
122 167
123#endif /* _DCE_CLOCKS_H_ */ 168#endif /* _DCE_CLK_MGR_H_ */
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c
deleted file mode 100644
index d89a097ba936..000000000000
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c
+++ /dev/null
@@ -1,947 +0,0 @@
1/*
2 * Copyright 2012-16 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: AMD
23 *
24 */
25
26#include "dce_clocks.h"
27#include "dm_services.h"
28#include "reg_helper.h"
29#include "fixed31_32.h"
30#include "bios_parser_interface.h"
31#include "dc.h"
32#include "dmcu.h"
33#if defined(CONFIG_DRM_AMD_DC_DCN1_0)
34#include "dcn_calcs.h"
35#endif
36#include "core_types.h"
37#include "dc_types.h"
38#include "dal_asic_id.h"
39
40#define TO_DCE_CLOCKS(clocks)\
41 container_of(clocks, struct dce_dccg, base)
42
43#define REG(reg) \
44 (clk_dce->regs->reg)
45
46#undef FN
47#define FN(reg_name, field_name) \
48 clk_dce->clk_shift->field_name, clk_dce->clk_mask->field_name
49
50#define CTX \
51 clk_dce->base.ctx
52#define DC_LOGGER \
53 clk->ctx->logger
54
55/* Max clock values for each state indexed by "enum clocks_state": */
56static const struct state_dependent_clocks dce80_max_clks_by_state[] = {
57/* ClocksStateInvalid - should not be used */
58{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
59/* ClocksStateUltraLow - not expected to be used for DCE 8.0 */
60{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
61/* ClocksStateLow */
62{ .display_clk_khz = 352000, .pixel_clk_khz = 330000},
63/* ClocksStateNominal */
64{ .display_clk_khz = 600000, .pixel_clk_khz = 400000 },
65/* ClocksStatePerformance */
66{ .display_clk_khz = 600000, .pixel_clk_khz = 400000 } };
67
68static const struct state_dependent_clocks dce110_max_clks_by_state[] = {
69/*ClocksStateInvalid - should not be used*/
70{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
71/*ClocksStateUltraLow - currently by HW design team not supposed to be used*/
72{ .display_clk_khz = 352000, .pixel_clk_khz = 330000 },
73/*ClocksStateLow*/
74{ .display_clk_khz = 352000, .pixel_clk_khz = 330000 },
75/*ClocksStateNominal*/
76{ .display_clk_khz = 467000, .pixel_clk_khz = 400000 },
77/*ClocksStatePerformance*/
78{ .display_clk_khz = 643000, .pixel_clk_khz = 400000 } };
79
80static const struct state_dependent_clocks dce112_max_clks_by_state[] = {
81/*ClocksStateInvalid - should not be used*/
82{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
83/*ClocksStateUltraLow - currently by HW design team not supposed to be used*/
84{ .display_clk_khz = 389189, .pixel_clk_khz = 346672 },
85/*ClocksStateLow*/
86{ .display_clk_khz = 459000, .pixel_clk_khz = 400000 },
87/*ClocksStateNominal*/
88{ .display_clk_khz = 667000, .pixel_clk_khz = 600000 },
89/*ClocksStatePerformance*/
90{ .display_clk_khz = 1132000, .pixel_clk_khz = 600000 } };
91
92static const struct state_dependent_clocks dce120_max_clks_by_state[] = {
93/*ClocksStateInvalid - should not be used*/
94{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
95/*ClocksStateUltraLow - currently by HW design team not supposed to be used*/
96{ .display_clk_khz = 0, .pixel_clk_khz = 0 },
97/*ClocksStateLow*/
98{ .display_clk_khz = 460000, .pixel_clk_khz = 400000 },
99/*ClocksStateNominal*/
100{ .display_clk_khz = 670000, .pixel_clk_khz = 600000 },
101/*ClocksStatePerformance*/
102{ .display_clk_khz = 1133000, .pixel_clk_khz = 600000 } };
103
104/* Starting DID for each range */
105enum dentist_base_divider_id {
106 DENTIST_BASE_DID_1 = 0x08,
107 DENTIST_BASE_DID_2 = 0x40,
108 DENTIST_BASE_DID_3 = 0x60,
109 DENTIST_BASE_DID_4 = 0x7e,
110 DENTIST_MAX_DID = 0x7f
111};
112
113/* Starting point and step size for each divider range.*/
114enum dentist_divider_range {
115 DENTIST_DIVIDER_RANGE_1_START = 8, /* 2.00 */
116 DENTIST_DIVIDER_RANGE_1_STEP = 1, /* 0.25 */
117 DENTIST_DIVIDER_RANGE_2_START = 64, /* 16.00 */
118 DENTIST_DIVIDER_RANGE_2_STEP = 2, /* 0.50 */
119 DENTIST_DIVIDER_RANGE_3_START = 128, /* 32.00 */
120 DENTIST_DIVIDER_RANGE_3_STEP = 4, /* 1.00 */
121 DENTIST_DIVIDER_RANGE_4_START = 248, /* 62.00 */
122 DENTIST_DIVIDER_RANGE_4_STEP = 264, /* 66.00 */
123 DENTIST_DIVIDER_RANGE_SCALE_FACTOR = 4
124};
125
126static int dentist_get_divider_from_did(int did)
127{
128 if (did < DENTIST_BASE_DID_1)
129 did = DENTIST_BASE_DID_1;
130 if (did > DENTIST_MAX_DID)
131 did = DENTIST_MAX_DID;
132
133 if (did < DENTIST_BASE_DID_2) {
134 return DENTIST_DIVIDER_RANGE_1_START + DENTIST_DIVIDER_RANGE_1_STEP
135 * (did - DENTIST_BASE_DID_1);
136 } else if (did < DENTIST_BASE_DID_3) {
137 return DENTIST_DIVIDER_RANGE_2_START + DENTIST_DIVIDER_RANGE_2_STEP
138 * (did - DENTIST_BASE_DID_2);
139 } else if (did < DENTIST_BASE_DID_4) {
140 return DENTIST_DIVIDER_RANGE_3_START + DENTIST_DIVIDER_RANGE_3_STEP
141 * (did - DENTIST_BASE_DID_3);
142 } else {
143 return DENTIST_DIVIDER_RANGE_4_START + DENTIST_DIVIDER_RANGE_4_STEP
144 * (did - DENTIST_BASE_DID_4);
145 }
146}
147
148/* SW will adjust DP REF Clock average value for all purposes
149 * (DP DTO / DP Audio DTO and DP GTC)
150 if clock is spread for all cases:
151 -if SS enabled on DP Ref clock and HW de-spreading enabled with SW
152 calculations for DS_INCR/DS_MODULO (this is planned to be default case)
153 -if SS enabled on DP Ref clock and HW de-spreading enabled with HW
154 calculations (not planned to be used, but average clock should still
155 be valid)
156 -if SS enabled on DP Ref clock and HW de-spreading disabled
157 (should not be case with CIK) then SW should program all rates
158 generated according to average value (case as with previous ASICs)
159 */
160static int dccg_adjust_dp_ref_freq_for_ss(struct dce_dccg *clk_dce, int dp_ref_clk_khz)
161{
162 if (clk_dce->ss_on_dprefclk && clk_dce->dprefclk_ss_divider != 0) {
163 struct fixed31_32 ss_percentage = dc_fixpt_div_int(
164 dc_fixpt_from_fraction(clk_dce->dprefclk_ss_percentage,
165 clk_dce->dprefclk_ss_divider), 200);
166 struct fixed31_32 adj_dp_ref_clk_khz;
167
168 ss_percentage = dc_fixpt_sub(dc_fixpt_one, ss_percentage);
169 adj_dp_ref_clk_khz = dc_fixpt_mul_int(ss_percentage, dp_ref_clk_khz);
170 dp_ref_clk_khz = dc_fixpt_floor(adj_dp_ref_clk_khz);
171 }
172 return dp_ref_clk_khz;
173}
174
175static int dce_get_dp_ref_freq_khz(struct dccg *clk)
176{
177 struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk);
178 int dprefclk_wdivider;
179 int dprefclk_src_sel;
180 int dp_ref_clk_khz = 600000;
181 int target_div;
182
183 /* ASSERT DP Reference Clock source is from DFS*/
184 REG_GET(DPREFCLK_CNTL, DPREFCLK_SRC_SEL, &dprefclk_src_sel);
185 ASSERT(dprefclk_src_sel == 0);
186
187 /* Read the mmDENTIST_DISPCLK_CNTL to get the currently
188 * programmed DID DENTIST_DPREFCLK_WDIVIDER*/
189 REG_GET(DENTIST_DISPCLK_CNTL, DENTIST_DPREFCLK_WDIVIDER, &dprefclk_wdivider);
190
191 /* Convert DENTIST_DPREFCLK_WDIVIDERto actual divider*/
192 target_div = dentist_get_divider_from_did(dprefclk_wdivider);
193
194 /* Calculate the current DFS clock, in kHz.*/
195 dp_ref_clk_khz = (DENTIST_DIVIDER_RANGE_SCALE_FACTOR
196 * clk_dce->dentist_vco_freq_khz) / target_div;
197
198 return dccg_adjust_dp_ref_freq_for_ss(clk_dce, dp_ref_clk_khz);
199}
200
201static int dce12_get_dp_ref_freq_khz(struct dccg *clk)
202{
203 struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk);
204
205 return dccg_adjust_dp_ref_freq_for_ss(clk_dce, clk_dce->dprefclk_khz);
206}
207
208static enum dm_pp_clocks_state dce_get_required_clocks_state(
209 struct dccg *clk,
210 struct dc_clocks *req_clocks)
211{
212 struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk);
213 int i;
214 enum dm_pp_clocks_state low_req_clk;
215
216 /* Iterate from highest supported to lowest valid state, and update
217 * lowest RequiredState with the lowest state that satisfies
218 * all required clocks
219 */
220 for (i = clk->max_clks_state; i >= DM_PP_CLOCKS_STATE_ULTRA_LOW; i--)
221 if (req_clocks->dispclk_khz >
222 clk_dce->max_clks_by_state[i].display_clk_khz
223 || req_clocks->phyclk_khz >
224 clk_dce->max_clks_by_state[i].pixel_clk_khz)
225 break;
226
227 low_req_clk = i + 1;
228 if (low_req_clk > clk->max_clks_state) {
229 /* set max clock state for high phyclock, invalid on exceeding display clock */
230 if (clk_dce->max_clks_by_state[clk->max_clks_state].display_clk_khz
231 < req_clocks->dispclk_khz)
232 low_req_clk = DM_PP_CLOCKS_STATE_INVALID;
233 else
234 low_req_clk = clk->max_clks_state;
235 }
236
237 return low_req_clk;
238}
239
240static int dce_set_clock(
241 struct dccg *clk,
242 int requested_clk_khz)
243{
244 struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk);
245 struct bp_pixel_clock_parameters pxl_clk_params = { 0 };
246 struct dc_bios *bp = clk->ctx->dc_bios;
247 int actual_clock = requested_clk_khz;
248
249 /* Make sure requested clock isn't lower than minimum threshold*/
250 if (requested_clk_khz > 0)
251 requested_clk_khz = max(requested_clk_khz,
252 clk_dce->dentist_vco_freq_khz / 64);
253
254 /* Prepare to program display clock*/
255 pxl_clk_params.target_pixel_clock = requested_clk_khz;
256 pxl_clk_params.pll_id = CLOCK_SOURCE_ID_DFS;
257
258 if (clk_dce->dfs_bypass_active)
259 pxl_clk_params.flags.SET_DISPCLK_DFS_BYPASS = true;
260
261 bp->funcs->program_display_engine_pll(bp, &pxl_clk_params);
262
263 if (clk_dce->dfs_bypass_active) {
264 /* Cache the fixed display clock*/
265 clk_dce->dfs_bypass_disp_clk =
266 pxl_clk_params.dfs_bypass_display_clock;
267 actual_clock = pxl_clk_params.dfs_bypass_display_clock;
268 }
269
270 /* from power down, we need mark the clock state as ClocksStateNominal
271 * from HWReset, so when resume we will call pplib voltage regulator.*/
272 if (requested_clk_khz == 0)
273 clk->cur_min_clks_state = DM_PP_CLOCKS_STATE_NOMINAL;
274 return actual_clock;
275}
276
277static int dce_psr_set_clock(
278 struct dccg *clk,
279 int requested_clk_khz)
280{
281 struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk);
282 struct dc_context *ctx = clk_dce->base.ctx;
283 struct dc *core_dc = ctx->dc;
284 struct dmcu *dmcu = core_dc->res_pool->dmcu;
285 int actual_clk_khz = requested_clk_khz;
286
287 actual_clk_khz = dce_set_clock(clk, requested_clk_khz);
288
289 dmcu->funcs->set_psr_wait_loop(dmcu, actual_clk_khz / 1000 / 7);
290 return actual_clk_khz;
291}
292
293static int dce112_set_clock(
294 struct dccg *clk,
295 int requested_clk_khz)
296{
297 struct dce_dccg *clk_dce = TO_DCE_CLOCKS(clk);
298 struct bp_set_dce_clock_parameters dce_clk_params;
299 struct dc_bios *bp = clk->ctx->dc_bios;
300 struct dc *core_dc = clk->ctx->dc;
301 struct dmcu *dmcu = core_dc->res_pool->dmcu;
302 int actual_clock = requested_clk_khz;
303 /* Prepare to program display clock*/
304 memset(&dce_clk_params, 0, sizeof(dce_clk_params));
305
306 /* Make sure requested clock isn't lower than minimum threshold*/
307 if (requested_clk_khz > 0)
308 requested_clk_khz = max(requested_clk_khz,
309 clk_dce->dentist_vco_freq_khz / 62);
310
311 dce_clk_params.target_clock_frequency = requested_clk_khz;
312 dce_clk_params.pll_id = CLOCK_SOURCE_ID_DFS;
313 dce_clk_params.clock_type = DCECLOCK_TYPE_DISPLAY_CLOCK;
314
315 bp->funcs->set_dce_clock(bp, &dce_clk_params);
316 actual_clock = dce_clk_params.target_clock_frequency;
317
318 /* from power down, we need mark the clock state as ClocksStateNominal
319 * from HWReset, so when resume we will call pplib voltage regulator.*/
320 if (requested_clk_khz == 0)
321 clk->cur_min_clks_state = DM_PP_CLOCKS_STATE_NOMINAL;
322
323 /*Program DP ref Clock*/
324 /*VBIOS will determine DPREFCLK frequency, so we don't set it*/
325 dce_clk_params.target_clock_frequency = 0;
326 dce_clk_params.clock_type = DCECLOCK_TYPE_DPREFCLK;
327 if (!ASICREV_IS_VEGA20_P(clk->ctx->asic_id.hw_internal_rev))
328 dce_clk_params.flags.USE_GENLOCK_AS_SOURCE_FOR_DPREFCLK =
329 (dce_clk_params.pll_id ==
330 CLOCK_SOURCE_COMBO_DISPLAY_PLL0);
331 else
332 dce_clk_params.flags.USE_GENLOCK_AS_SOURCE_FOR_DPREFCLK = false;
333
334 bp->funcs->set_dce_clock(bp, &dce_clk_params);
335
336 if (!IS_FPGA_MAXIMUS_DC(core_dc->ctx->dce_environment)) {
337 if (clk_dce->dfs_bypass_disp_clk != actual_clock)
338 dmcu->funcs->set_psr_wait_loop(dmcu,
339 actual_clock / 1000 / 7);
340 }
341
342 clk_dce->dfs_bypass_disp_clk = actual_clock;
343 return actual_clock;
344}
345
346static void dce_clock_read_integrated_info(struct dce_dccg *clk_dce)
347{
348 struct dc_debug_options *debug = &clk_dce->base.ctx->dc->debug;
349 struct dc_bios *bp = clk_dce->base.ctx->dc_bios;
350 struct integrated_info info = { { { 0 } } };
351 struct dc_firmware_info fw_info = { { 0 } };
352 int i;
353
354 if (bp->integrated_info)
355 info = *bp->integrated_info;
356
357 clk_dce->dentist_vco_freq_khz = info.dentist_vco_freq;
358 if (clk_dce->dentist_vco_freq_khz == 0) {
359 bp->funcs->get_firmware_info(bp, &fw_info);
360 clk_dce->dentist_vco_freq_khz =
361 fw_info.smu_gpu_pll_output_freq;
362 if (clk_dce->dentist_vco_freq_khz == 0)
363 clk_dce->dentist_vco_freq_khz = 3600000;
364 }
365
366 /*update the maximum display clock for each power state*/
367 for (i = 0; i < NUMBER_OF_DISP_CLK_VOLTAGE; ++i) {
368 enum dm_pp_clocks_state clk_state = DM_PP_CLOCKS_STATE_INVALID;
369
370 switch (i) {
371 case 0:
372 clk_state = DM_PP_CLOCKS_STATE_ULTRA_LOW;
373 break;
374
375 case 1:
376 clk_state = DM_PP_CLOCKS_STATE_LOW;
377 break;
378
379 case 2:
380 clk_state = DM_PP_CLOCKS_STATE_NOMINAL;
381 break;
382
383 case 3:
384 clk_state = DM_PP_CLOCKS_STATE_PERFORMANCE;
385 break;
386
387 default:
388 clk_state = DM_PP_CLOCKS_STATE_INVALID;
389 break;
390 }
391
392 /*Do not allow bad VBIOS/SBIOS to override with invalid values,
393 * check for > 100MHz*/
394 if (info.disp_clk_voltage[i].max_supported_clk >= 100000)
395 clk_dce->max_clks_by_state[clk_state].display_clk_khz =
396 info.disp_clk_voltage[i].max_supported_clk;
397 }
398
399 if (!debug->disable_dfs_bypass && bp->integrated_info)
400 if (bp->integrated_info->gpu_cap_info & DFS_BYPASS_ENABLE)
401 clk_dce->dfs_bypass_enabled = true;
402}
403
404static void dce_clock_read_ss_info(struct dce_dccg *clk_dce)
405{
406 struct dc_bios *bp = clk_dce->base.ctx->dc_bios;
407 int ss_info_num = bp->funcs->get_ss_entry_number(
408 bp, AS_SIGNAL_TYPE_GPU_PLL);
409
410 if (ss_info_num) {
411 struct spread_spectrum_info info = { { 0 } };
412 enum bp_result result = bp->funcs->get_spread_spectrum_info(
413 bp, AS_SIGNAL_TYPE_GPU_PLL, 0, &info);
414
415 /* Based on VBIOS, VBIOS will keep entry for GPU PLL SS
416 * even if SS not enabled and in that case
417 * SSInfo.spreadSpectrumPercentage !=0 would be sign
418 * that SS is enabled
419 */
420 if (result == BP_RESULT_OK &&
421 info.spread_spectrum_percentage != 0) {
422 clk_dce->ss_on_dprefclk = true;
423 clk_dce->dprefclk_ss_divider = info.spread_percentage_divider;
424
425 if (info.type.CENTER_MODE == 0) {
426 /* TODO: Currently for DP Reference clock we
427 * need only SS percentage for
428 * downspread */
429 clk_dce->dprefclk_ss_percentage =
430 info.spread_spectrum_percentage;
431 }
432
433 return;
434 }
435
436 result = bp->funcs->get_spread_spectrum_info(
437 bp, AS_SIGNAL_TYPE_DISPLAY_PORT, 0, &info);
438
439 /* Based on VBIOS, VBIOS will keep entry for DPREFCLK SS
440 * even if SS not enabled and in that case
441 * SSInfo.spreadSpectrumPercentage !=0 would be sign
442 * that SS is enabled
443 */
444 if (result == BP_RESULT_OK &&
445 info.spread_spectrum_percentage != 0) {
446 clk_dce->ss_on_dprefclk = true;
447 clk_dce->dprefclk_ss_divider = info.spread_percentage_divider;
448
449 if (info.type.CENTER_MODE == 0) {
450 /* Currently for DP Reference clock we
451 * need only SS percentage for
452 * downspread */
453 clk_dce->dprefclk_ss_percentage =
454 info.spread_spectrum_percentage;
455 }
456 }
457 }
458}
459
460static inline bool should_set_clock(bool safe_to_lower, int calc_clk, int cur_clk)
461{
462 return ((safe_to_lower && calc_clk < cur_clk) || calc_clk > cur_clk);
463}
464
465static void dce12_update_clocks(struct dccg *dccg,
466 struct dc_clocks *new_clocks,
467 bool safe_to_lower)
468{
469 struct dm_pp_clock_for_voltage_req clock_voltage_req = {0};
470
471 /* TODO: Investigate why this is needed to fix display corruption. */
472 new_clocks->dispclk_khz = new_clocks->dispclk_khz * 115 / 100;
473
474 if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) {
475 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DISPLAY_CLK;
476 clock_voltage_req.clocks_in_khz = new_clocks->dispclk_khz;
477 new_clocks->dispclk_khz = dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz);
478 dccg->clks.dispclk_khz = new_clocks->dispclk_khz;
479
480 dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req);
481 }
482
483 if (should_set_clock(safe_to_lower, new_clocks->phyclk_khz, dccg->clks.phyclk_khz)) {
484 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DISPLAYPHYCLK;
485 clock_voltage_req.clocks_in_khz = new_clocks->phyclk_khz;
486 dccg->clks.phyclk_khz = new_clocks->phyclk_khz;
487
488 dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req);
489 }
490}
491
492#ifdef CONFIG_DRM_AMD_DC_DCN1_0
493static int dcn1_determine_dppclk_threshold(struct dccg *dccg, struct dc_clocks *new_clocks)
494{
495 bool request_dpp_div = new_clocks->dispclk_khz > new_clocks->dppclk_khz;
496 bool dispclk_increase = new_clocks->dispclk_khz > dccg->clks.dispclk_khz;
497 int disp_clk_threshold = new_clocks->max_supported_dppclk_khz;
498 bool cur_dpp_div = dccg->clks.dispclk_khz > dccg->clks.dppclk_khz;
499
500 /* increase clock, looking for div is 0 for current, request div is 1*/
501 if (dispclk_increase) {
502 /* already divided by 2, no need to reach target clk with 2 steps*/
503 if (cur_dpp_div)
504 return new_clocks->dispclk_khz;
505
506 /* request disp clk is lower than maximum supported dpp clk,
507 * no need to reach target clk with two steps.
508 */
509 if (new_clocks->dispclk_khz <= disp_clk_threshold)
510 return new_clocks->dispclk_khz;
511
512 /* target dpp clk not request divided by 2, still within threshold */
513 if (!request_dpp_div)
514 return new_clocks->dispclk_khz;
515
516 } else {
517 /* decrease clock, looking for current dppclk divided by 2,
518 * request dppclk not divided by 2.
519 */
520
521 /* current dpp clk not divided by 2, no need to ramp*/
522 if (!cur_dpp_div)
523 return new_clocks->dispclk_khz;
524
525 /* current disp clk is lower than current maximum dpp clk,
526 * no need to ramp
527 */
528 if (dccg->clks.dispclk_khz <= disp_clk_threshold)
529 return new_clocks->dispclk_khz;
530
531 /* request dpp clk need to be divided by 2 */
532 if (request_dpp_div)
533 return new_clocks->dispclk_khz;
534 }
535
536 return disp_clk_threshold;
537}
538
539static void dcn1_ramp_up_dispclk_with_dpp(struct dccg *dccg, struct dc_clocks *new_clocks)
540{
541 struct dc *dc = dccg->ctx->dc;
542 int dispclk_to_dpp_threshold = dcn1_determine_dppclk_threshold(dccg, new_clocks);
543 bool request_dpp_div = new_clocks->dispclk_khz > new_clocks->dppclk_khz;
544 int i;
545
546 /* set disp clk to dpp clk threshold */
547 dccg->funcs->set_dispclk(dccg, dispclk_to_dpp_threshold);
548
549 /* update request dpp clk division option */
550 for (i = 0; i < dc->res_pool->pipe_count; i++) {
551 struct pipe_ctx *pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i];
552
553 if (!pipe_ctx->plane_state)
554 continue;
555
556 pipe_ctx->plane_res.dpp->funcs->dpp_dppclk_control(
557 pipe_ctx->plane_res.dpp,
558 request_dpp_div,
559 true);
560 }
561
562 /* If target clk not same as dppclk threshold, set to target clock */
563 if (dispclk_to_dpp_threshold != new_clocks->dispclk_khz)
564 dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz);
565
566 dccg->clks.dispclk_khz = new_clocks->dispclk_khz;
567 dccg->clks.dppclk_khz = new_clocks->dppclk_khz;
568 dccg->clks.max_supported_dppclk_khz = new_clocks->max_supported_dppclk_khz;
569}
570
571static void dcn1_update_clocks(struct dccg *dccg,
572 struct dc_clocks *new_clocks,
573 bool safe_to_lower)
574{
575 struct dc *dc = dccg->ctx->dc;
576 struct pp_smu_display_requirement_rv *smu_req_cur =
577 &dc->res_pool->pp_smu_req;
578 struct pp_smu_display_requirement_rv smu_req = *smu_req_cur;
579 struct pp_smu_funcs_rv *pp_smu = dc->res_pool->pp_smu;
580 struct dm_pp_clock_for_voltage_req clock_voltage_req = {0};
581 bool send_request_to_increase = false;
582 bool send_request_to_lower = false;
583
584 if (new_clocks->phyclk_khz)
585 smu_req.display_count = 1;
586 else
587 smu_req.display_count = 0;
588
589 if (new_clocks->dispclk_khz > dccg->clks.dispclk_khz
590 || new_clocks->phyclk_khz > dccg->clks.phyclk_khz
591 || new_clocks->fclk_khz > dccg->clks.fclk_khz
592 || new_clocks->dcfclk_khz > dccg->clks.dcfclk_khz)
593 send_request_to_increase = true;
594
595 if (should_set_clock(safe_to_lower, new_clocks->phyclk_khz, dccg->clks.phyclk_khz)) {
596 dccg->clks.phyclk_khz = new_clocks->phyclk_khz;
597
598 send_request_to_lower = true;
599 }
600
601 if (should_set_clock(safe_to_lower, new_clocks->fclk_khz, dccg->clks.fclk_khz)) {
602 dccg->clks.fclk_khz = new_clocks->fclk_khz;
603 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_FCLK;
604 clock_voltage_req.clocks_in_khz = new_clocks->fclk_khz;
605 smu_req.hard_min_fclk_khz = new_clocks->fclk_khz;
606
607 dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req);
608 send_request_to_lower = true;
609 }
610
611 if (should_set_clock(safe_to_lower, new_clocks->dcfclk_khz, dccg->clks.dcfclk_khz)) {
612 dccg->clks.dcfclk_khz = new_clocks->dcfclk_khz;
613 smu_req.hard_min_dcefclk_khz = new_clocks->dcfclk_khz;
614
615 send_request_to_lower = true;
616 }
617
618 if (should_set_clock(safe_to_lower,
619 new_clocks->dcfclk_deep_sleep_khz, dccg->clks.dcfclk_deep_sleep_khz)) {
620 dccg->clks.dcfclk_deep_sleep_khz = new_clocks->dcfclk_deep_sleep_khz;
621 smu_req.min_deep_sleep_dcefclk_mhz = new_clocks->dcfclk_deep_sleep_khz;
622
623 send_request_to_lower = true;
624 }
625
626 /* make sure dcf clk is before dpp clk to
627 * make sure we have enough voltage to run dpp clk
628 */
629 if (send_request_to_increase) {
630 /*use dcfclk to request voltage*/
631 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DCFCLK;
632 clock_voltage_req.clocks_in_khz = dcn_find_dcfclk_suits_all(dc, new_clocks);
633 dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req);
634 if (pp_smu->set_display_requirement)
635 pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req);
636 }
637
638 /* dcn1 dppclk is tied to dispclk */
639 /* program dispclk on = as a w/a for sleep resume clock ramping issues */
640 if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)
641 || new_clocks->dispclk_khz == dccg->clks.dispclk_khz) {
642 dcn1_ramp_up_dispclk_with_dpp(dccg, new_clocks);
643 dccg->clks.dispclk_khz = new_clocks->dispclk_khz;
644
645 send_request_to_lower = true;
646 }
647
648 if (!send_request_to_increase && send_request_to_lower) {
649 /*use dcfclk to request voltage*/
650 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DCFCLK;
651 clock_voltage_req.clocks_in_khz = dcn_find_dcfclk_suits_all(dc, new_clocks);
652 dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req);
653 if (pp_smu->set_display_requirement)
654 pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req);
655 }
656
657
658 *smu_req_cur = smu_req;
659}
660#endif
661
662static void dce_update_clocks(struct dccg *dccg,
663 struct dc_clocks *new_clocks,
664 bool safe_to_lower)
665{
666 struct dm_pp_power_level_change_request level_change_req;
667 struct dce_dccg *clk_dce = TO_DCE_CLOCKS(dccg);
668
669 /* TODO: Investigate why this is needed to fix display corruption. */
670 if (!clk_dce->dfs_bypass_active)
671 new_clocks->dispclk_khz = new_clocks->dispclk_khz * 115 / 100;
672
673 level_change_req.power_level = dce_get_required_clocks_state(dccg, new_clocks);
674 /* get max clock state from PPLIB */
675 if ((level_change_req.power_level < dccg->cur_min_clks_state && safe_to_lower)
676 || level_change_req.power_level > dccg->cur_min_clks_state) {
677 if (dm_pp_apply_power_level_change_request(dccg->ctx, &level_change_req))
678 dccg->cur_min_clks_state = level_change_req.power_level;
679 }
680
681 if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) {
682 new_clocks->dispclk_khz = dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz);
683 dccg->clks.dispclk_khz = new_clocks->dispclk_khz;
684 }
685}
686
687static bool dce_update_dfs_bypass(
688 struct dccg *dccg,
689 struct dc *dc,
690 struct dc_state *context,
691 int requested_clock_khz)
692{
693 struct dce_dccg *clk_dce = TO_DCE_CLOCKS(dccg);
694 struct resource_context *res_ctx = &context->res_ctx;
695 enum signal_type signal_type = SIGNAL_TYPE_NONE;
696 bool was_active = clk_dce->dfs_bypass_active;
697 int i;
698
699 /* Disable DFS bypass by default. */
700 clk_dce->dfs_bypass_active = false;
701
702 /* Check that DFS bypass is available. */
703 if (!clk_dce->dfs_bypass_enabled)
704 goto update;
705
706 /* Check if the requested display clock is below the threshold. */
707 if (requested_clock_khz >= 400000)
708 goto update;
709
710 /* DFS-bypass should only be enabled on single stream setups */
711 if (context->stream_count != 1)
712 goto update;
713
714 /* Check that the stream's signal type is an embedded panel */
715 for (i = 0; i < dc->res_pool->pipe_count; i++) {
716 if (res_ctx->pipe_ctx[i].stream) {
717 struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[i];
718
719 signal_type = pipe_ctx->stream->sink->link->connector_signal;
720 break;
721 }
722 }
723
724 if (signal_type == SIGNAL_TYPE_EDP ||
725 signal_type == SIGNAL_TYPE_LVDS)
726 clk_dce->dfs_bypass_active = true;
727
728update:
729 /* Update the clock state. We don't need to respect safe_to_lower
730 * because DFS bypass should always be greater than the current
731 * display clock frequency.
732 */
733 if (was_active != clk_dce->dfs_bypass_active) {
734 dccg->clks.dispclk_khz =
735 dccg->funcs->set_dispclk(dccg, dccg->clks.dispclk_khz);
736 return true;
737 }
738
739 return false;
740}
741
742#ifdef CONFIG_DRM_AMD_DC_DCN1_0
743static const struct display_clock_funcs dcn1_funcs = {
744 .get_dp_ref_clk_frequency = dce12_get_dp_ref_freq_khz,
745 .set_dispclk = dce112_set_clock,
746 .update_clocks = dcn1_update_clocks
747};
748#endif
749
750static const struct display_clock_funcs dce120_funcs = {
751 .get_dp_ref_clk_frequency = dce12_get_dp_ref_freq_khz,
752 .set_dispclk = dce112_set_clock,
753 .update_clocks = dce12_update_clocks
754};
755
756static const struct display_clock_funcs dce112_funcs = {
757 .get_dp_ref_clk_frequency = dce_get_dp_ref_freq_khz,
758 .set_dispclk = dce112_set_clock,
759 .update_clocks = dce_update_clocks
760};
761
762static const struct display_clock_funcs dce110_funcs = {
763 .get_dp_ref_clk_frequency = dce_get_dp_ref_freq_khz,
764 .set_dispclk = dce_psr_set_clock,
765 .update_clocks = dce_update_clocks,
766 .update_dfs_bypass = dce_update_dfs_bypass
767};
768
769static const struct display_clock_funcs dce_funcs = {
770 .get_dp_ref_clk_frequency = dce_get_dp_ref_freq_khz,
771 .set_dispclk = dce_set_clock,
772 .update_clocks = dce_update_clocks
773};
774
775static void dce_dccg_construct(
776 struct dce_dccg *clk_dce,
777 struct dc_context *ctx,
778 const struct dccg_registers *regs,
779 const struct dccg_shift *clk_shift,
780 const struct dccg_mask *clk_mask)
781{
782 struct dccg *base = &clk_dce->base;
783
784 base->ctx = ctx;
785 base->funcs = &dce_funcs;
786
787 clk_dce->regs = regs;
788 clk_dce->clk_shift = clk_shift;
789 clk_dce->clk_mask = clk_mask;
790
791 clk_dce->dfs_bypass_disp_clk = 0;
792
793 clk_dce->dprefclk_ss_percentage = 0;
794 clk_dce->dprefclk_ss_divider = 1000;
795 clk_dce->ss_on_dprefclk = false;
796
797 base->max_clks_state = DM_PP_CLOCKS_STATE_NOMINAL;
798 base->cur_min_clks_state = DM_PP_CLOCKS_STATE_INVALID;
799
800 dce_clock_read_integrated_info(clk_dce);
801 dce_clock_read_ss_info(clk_dce);
802}
803
804struct dccg *dce_dccg_create(
805 struct dc_context *ctx,
806 const struct dccg_registers *regs,
807 const struct dccg_shift *clk_shift,
808 const struct dccg_mask *clk_mask)
809{
810 struct dce_dccg *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL);
811
812 if (clk_dce == NULL) {
813 BREAK_TO_DEBUGGER();
814 return NULL;
815 }
816
817 memcpy(clk_dce->max_clks_by_state,
818 dce80_max_clks_by_state,
819 sizeof(dce80_max_clks_by_state));
820
821 dce_dccg_construct(
822 clk_dce, ctx, regs, clk_shift, clk_mask);
823
824 return &clk_dce->base;
825}
826
827struct dccg *dce110_dccg_create(
828 struct dc_context *ctx,
829 const struct dccg_registers *regs,
830 const struct dccg_shift *clk_shift,
831 const struct dccg_mask *clk_mask)
832{
833 struct dce_dccg *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL);
834
835 if (clk_dce == NULL) {
836 BREAK_TO_DEBUGGER();
837 return NULL;
838 }
839
840 memcpy(clk_dce->max_clks_by_state,
841 dce110_max_clks_by_state,
842 sizeof(dce110_max_clks_by_state));
843
844 dce_dccg_construct(
845 clk_dce, ctx, regs, clk_shift, clk_mask);
846
847 clk_dce->base.funcs = &dce110_funcs;
848
849 return &clk_dce->base;
850}
851
852struct dccg *dce112_dccg_create(
853 struct dc_context *ctx,
854 const struct dccg_registers *regs,
855 const struct dccg_shift *clk_shift,
856 const struct dccg_mask *clk_mask)
857{
858 struct dce_dccg *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL);
859
860 if (clk_dce == NULL) {
861 BREAK_TO_DEBUGGER();
862 return NULL;
863 }
864
865 memcpy(clk_dce->max_clks_by_state,
866 dce112_max_clks_by_state,
867 sizeof(dce112_max_clks_by_state));
868
869 dce_dccg_construct(
870 clk_dce, ctx, regs, clk_shift, clk_mask);
871
872 clk_dce->base.funcs = &dce112_funcs;
873
874 return &clk_dce->base;
875}
876
877struct dccg *dce120_dccg_create(struct dc_context *ctx)
878{
879 struct dce_dccg *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL);
880
881 if (clk_dce == NULL) {
882 BREAK_TO_DEBUGGER();
883 return NULL;
884 }
885
886 memcpy(clk_dce->max_clks_by_state,
887 dce120_max_clks_by_state,
888 sizeof(dce120_max_clks_by_state));
889
890 dce_dccg_construct(
891 clk_dce, ctx, NULL, NULL, NULL);
892
893 clk_dce->dprefclk_khz = 600000;
894 clk_dce->base.funcs = &dce120_funcs;
895
896 return &clk_dce->base;
897}
898
899#ifdef CONFIG_DRM_AMD_DC_DCN1_0
900struct dccg *dcn1_dccg_create(struct dc_context *ctx)
901{
902 struct dc_debug_options *debug = &ctx->dc->debug;
903 struct dc_bios *bp = ctx->dc_bios;
904 struct dc_firmware_info fw_info = { { 0 } };
905 struct dce_dccg *clk_dce = kzalloc(sizeof(*clk_dce), GFP_KERNEL);
906
907 if (clk_dce == NULL) {
908 BREAK_TO_DEBUGGER();
909 return NULL;
910 }
911
912 clk_dce->base.ctx = ctx;
913 clk_dce->base.funcs = &dcn1_funcs;
914
915 clk_dce->dfs_bypass_disp_clk = 0;
916
917 clk_dce->dprefclk_ss_percentage = 0;
918 clk_dce->dprefclk_ss_divider = 1000;
919 clk_dce->ss_on_dprefclk = false;
920
921 clk_dce->dprefclk_khz = 600000;
922 if (bp->integrated_info)
923 clk_dce->dentist_vco_freq_khz = bp->integrated_info->dentist_vco_freq;
924 if (clk_dce->dentist_vco_freq_khz == 0) {
925 bp->funcs->get_firmware_info(bp, &fw_info);
926 clk_dce->dentist_vco_freq_khz = fw_info.smu_gpu_pll_output_freq;
927 if (clk_dce->dentist_vco_freq_khz == 0)
928 clk_dce->dentist_vco_freq_khz = 3600000;
929 }
930
931 if (!debug->disable_dfs_bypass && bp->integrated_info)
932 if (bp->integrated_info->gpu_cap_info & DFS_BYPASS_ENABLE)
933 clk_dce->dfs_bypass_enabled = true;
934
935 dce_clock_read_ss_info(clk_dce);
936
937 return &clk_dce->base;
938}
939#endif
940
941void dce_dccg_destroy(struct dccg **dccg)
942{
943 struct dce_dccg *clk_dce = TO_DCE_CLOCKS(*dccg);
944
945 kfree(clk_dce);
946 *dccg = NULL;
947}
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h
index 64dc75378541..c83a7f05f14c 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_hwseq.h
@@ -233,6 +233,16 @@ struct dce_hwseq_registers {
233 uint32_t DOMAIN5_PG_CONFIG; 233 uint32_t DOMAIN5_PG_CONFIG;
234 uint32_t DOMAIN6_PG_CONFIG; 234 uint32_t DOMAIN6_PG_CONFIG;
235 uint32_t DOMAIN7_PG_CONFIG; 235 uint32_t DOMAIN7_PG_CONFIG;
236 uint32_t DOMAIN8_PG_CONFIG;
237 uint32_t DOMAIN9_PG_CONFIG;
238 uint32_t DOMAIN10_PG_CONFIG;
239 uint32_t DOMAIN11_PG_CONFIG;
240 uint32_t DOMAIN16_PG_CONFIG;
241 uint32_t DOMAIN17_PG_CONFIG;
242 uint32_t DOMAIN18_PG_CONFIG;
243 uint32_t DOMAIN19_PG_CONFIG;
244 uint32_t DOMAIN20_PG_CONFIG;
245 uint32_t DOMAIN21_PG_CONFIG;
236 uint32_t DOMAIN0_PG_STATUS; 246 uint32_t DOMAIN0_PG_STATUS;
237 uint32_t DOMAIN1_PG_STATUS; 247 uint32_t DOMAIN1_PG_STATUS;
238 uint32_t DOMAIN2_PG_STATUS; 248 uint32_t DOMAIN2_PG_STATUS;
@@ -241,6 +251,16 @@ struct dce_hwseq_registers {
241 uint32_t DOMAIN5_PG_STATUS; 251 uint32_t DOMAIN5_PG_STATUS;
242 uint32_t DOMAIN6_PG_STATUS; 252 uint32_t DOMAIN6_PG_STATUS;
243 uint32_t DOMAIN7_PG_STATUS; 253 uint32_t DOMAIN7_PG_STATUS;
254 uint32_t DOMAIN8_PG_STATUS;
255 uint32_t DOMAIN9_PG_STATUS;
256 uint32_t DOMAIN10_PG_STATUS;
257 uint32_t DOMAIN11_PG_STATUS;
258 uint32_t DOMAIN16_PG_STATUS;
259 uint32_t DOMAIN17_PG_STATUS;
260 uint32_t DOMAIN18_PG_STATUS;
261 uint32_t DOMAIN19_PG_STATUS;
262 uint32_t DOMAIN20_PG_STATUS;
263 uint32_t DOMAIN21_PG_STATUS;
244 uint32_t DIO_MEM_PWR_CTRL; 264 uint32_t DIO_MEM_PWR_CTRL;
245 uint32_t DCCG_GATE_DISABLE_CNTL; 265 uint32_t DCCG_GATE_DISABLE_CNTL;
246 uint32_t DCCG_GATE_DISABLE_CNTL2; 266 uint32_t DCCG_GATE_DISABLE_CNTL2;
@@ -262,6 +282,8 @@ struct dce_hwseq_registers {
262 uint32_t D2VGA_CONTROL; 282 uint32_t D2VGA_CONTROL;
263 uint32_t D3VGA_CONTROL; 283 uint32_t D3VGA_CONTROL;
264 uint32_t D4VGA_CONTROL; 284 uint32_t D4VGA_CONTROL;
285 uint32_t D5VGA_CONTROL;
286 uint32_t D6VGA_CONTROL;
265 uint32_t VGA_TEST_CONTROL; 287 uint32_t VGA_TEST_CONTROL;
266 /* MMHUB registers. read only. temporary hack */ 288 /* MMHUB registers. read only. temporary hack */
267 uint32_t VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32; 289 uint32_t VM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32;
@@ -489,6 +511,26 @@ struct dce_hwseq_registers {
489 type DOMAIN6_POWER_GATE; \ 511 type DOMAIN6_POWER_GATE; \
490 type DOMAIN7_POWER_FORCEON; \ 512 type DOMAIN7_POWER_FORCEON; \
491 type DOMAIN7_POWER_GATE; \ 513 type DOMAIN7_POWER_GATE; \
514 type DOMAIN8_POWER_FORCEON; \
515 type DOMAIN8_POWER_GATE; \
516 type DOMAIN9_POWER_FORCEON; \
517 type DOMAIN9_POWER_GATE; \
518 type DOMAIN10_POWER_FORCEON; \
519 type DOMAIN10_POWER_GATE; \
520 type DOMAIN11_POWER_FORCEON; \
521 type DOMAIN11_POWER_GATE; \
522 type DOMAIN16_POWER_FORCEON; \
523 type DOMAIN16_POWER_GATE; \
524 type DOMAIN17_POWER_FORCEON; \
525 type DOMAIN17_POWER_GATE; \
526 type DOMAIN18_POWER_FORCEON; \
527 type DOMAIN18_POWER_GATE; \
528 type DOMAIN19_POWER_FORCEON; \
529 type DOMAIN19_POWER_GATE; \
530 type DOMAIN20_POWER_FORCEON; \
531 type DOMAIN20_POWER_GATE; \
532 type DOMAIN21_POWER_FORCEON; \
533 type DOMAIN21_POWER_GATE; \
492 type DOMAIN0_PGFSM_PWR_STATUS; \ 534 type DOMAIN0_PGFSM_PWR_STATUS; \
493 type DOMAIN1_PGFSM_PWR_STATUS; \ 535 type DOMAIN1_PGFSM_PWR_STATUS; \
494 type DOMAIN2_PGFSM_PWR_STATUS; \ 536 type DOMAIN2_PGFSM_PWR_STATUS; \
@@ -497,6 +539,16 @@ struct dce_hwseq_registers {
497 type DOMAIN5_PGFSM_PWR_STATUS; \ 539 type DOMAIN5_PGFSM_PWR_STATUS; \
498 type DOMAIN6_PGFSM_PWR_STATUS; \ 540 type DOMAIN6_PGFSM_PWR_STATUS; \
499 type DOMAIN7_PGFSM_PWR_STATUS; \ 541 type DOMAIN7_PGFSM_PWR_STATUS; \
542 type DOMAIN8_PGFSM_PWR_STATUS; \
543 type DOMAIN9_PGFSM_PWR_STATUS; \
544 type DOMAIN10_PGFSM_PWR_STATUS; \
545 type DOMAIN11_PGFSM_PWR_STATUS; \
546 type DOMAIN16_PGFSM_PWR_STATUS; \
547 type DOMAIN17_PGFSM_PWR_STATUS; \
548 type DOMAIN18_PGFSM_PWR_STATUS; \
549 type DOMAIN19_PGFSM_PWR_STATUS; \
550 type DOMAIN20_PGFSM_PWR_STATUS; \
551 type DOMAIN21_PGFSM_PWR_STATUS; \
500 type DCFCLK_GATE_DIS; \ 552 type DCFCLK_GATE_DIS; \
501 type DCHUBBUB_GLOBAL_TIMER_REFDIV; \ 553 type DCHUBBUB_GLOBAL_TIMER_REFDIV; \
502 type VGA_TEST_ENABLE; \ 554 type VGA_TEST_ENABLE; \
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
index 366bc8c2c643..3e18ea84b1f9 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
@@ -645,7 +645,7 @@ static bool dce110_link_encoder_validate_hdmi_output(
645 return false; 645 return false;
646 646
647 /* DCE11 HW does not support 420 */ 647 /* DCE11 HW does not support 420 */
648 if (!enc110->base.features.ycbcr420_supported && 648 if (!enc110->base.features.hdmi_ycbcr420_supported &&
649 crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) 649 crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
650 return false; 650 return false;
651 651
diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c
index 74c05e878807..bc50a8e25f4f 100644
--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.c
@@ -105,74 +105,18 @@ bool dce100_enable_display_power_gating(
105 return false; 105 return false;
106} 106}
107 107
108static void dce100_pplib_apply_display_requirements( 108void dce100_prepare_bandwidth(
109 struct dc *dc,
110 struct dc_state *context)
111{
112 struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg;
113
114 pp_display_cfg->avail_mclk_switch_time_us =
115 dce110_get_min_vblank_time_us(context);
116 /*pp_display_cfg->min_memory_clock_khz = context->bw.dce.yclk_khz
117 / MEMORY_TYPE_MULTIPLIER;*/
118
119 dce110_fill_display_configs(context, pp_display_cfg);
120
121 if (memcmp(&dc->prev_display_config, pp_display_cfg, sizeof(
122 struct dm_pp_display_configuration)) != 0)
123 dm_pp_apply_display_requirements(dc->ctx, pp_display_cfg);
124
125 dc->prev_display_config = *pp_display_cfg;
126}
127
128/* unit: in_khz before mode set, get pixel clock from context. ASIC register
129 * may not be programmed yet
130 */
131static uint32_t get_max_pixel_clock_for_all_paths(
132 struct dc *dc,
133 struct dc_state *context)
134{
135 uint32_t max_pix_clk = 0;
136 int i;
137
138 for (i = 0; i < MAX_PIPES; i++) {
139 struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
140
141 if (pipe_ctx->stream == NULL)
142 continue;
143
144 /* do not check under lay */
145 if (pipe_ctx->top_pipe)
146 continue;
147
148 if (pipe_ctx->stream_res.pix_clk_params.requested_pix_clk > max_pix_clk)
149 max_pix_clk =
150 pipe_ctx->stream_res.pix_clk_params.requested_pix_clk;
151 }
152 return max_pix_clk;
153}
154
155void dce100_set_bandwidth(
156 struct dc *dc, 109 struct dc *dc,
157 struct dc_state *context, 110 struct dc_state *context)
158 bool decrease_allowed)
159{ 111{
160 struct dc_clocks req_clks;
161
162 req_clks.dispclk_khz = context->bw.dce.dispclk_khz * 115 / 100;
163 req_clks.phyclk_khz = get_max_pixel_clock_for_all_paths(dc, context);
164
165 dce110_set_safe_displaymarks(&context->res_ctx, dc->res_pool); 112 dce110_set_safe_displaymarks(&context->res_ctx, dc->res_pool);
166 113
167 dc->res_pool->dccg->funcs->update_clocks( 114 dc->res_pool->clk_mgr->funcs->update_clocks(
168 dc->res_pool->dccg, 115 dc->res_pool->clk_mgr,
169 &req_clks, 116 context,
170 decrease_allowed); 117 false);
171
172 dce100_pplib_apply_display_requirements(dc, context);
173} 118}
174 119
175
176/**************************************************************************/ 120/**************************************************************************/
177 121
178void dce100_hw_sequencer_construct(struct dc *dc) 122void dce100_hw_sequencer_construct(struct dc *dc)
@@ -180,8 +124,7 @@ void dce100_hw_sequencer_construct(struct dc *dc)
180 dce110_hw_sequencer_construct(dc); 124 dce110_hw_sequencer_construct(dc);
181 125
182 dc->hwss.enable_display_power_gating = dce100_enable_display_power_gating; 126 dc->hwss.enable_display_power_gating = dce100_enable_display_power_gating;
183 dc->hwss.set_bandwidth = dce100_set_bandwidth; 127 dc->hwss.prepare_bandwidth = dce100_prepare_bandwidth;
184 dc->hwss.pplib_apply_display_requirements = 128 dc->hwss.optimize_bandwidth = dce100_prepare_bandwidth;
185 dce100_pplib_apply_display_requirements;
186} 129}
187 130
diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h
index c6ec0ed6ec3d..acd418515346 100644
--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h
+++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h
@@ -33,10 +33,9 @@ struct dc_state;
33 33
34void dce100_hw_sequencer_construct(struct dc *dc); 34void dce100_hw_sequencer_construct(struct dc *dc);
35 35
36void dce100_set_bandwidth( 36void dce100_prepare_bandwidth(
37 struct dc *dc, 37 struct dc *dc,
38 struct dc_state *context, 38 struct dc_state *context);
39 bool decrease_allowed);
40 39
41bool dce100_enable_display_power_gating(struct dc *dc, uint8_t controller_id, 40bool dce100_enable_display_power_gating(struct dc *dc, uint8_t controller_id,
42 struct dc_bios *dcb, 41 struct dc_bios *dcb,
diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
index 14754a87156c..6ae51a5dfc04 100644
--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
@@ -36,11 +36,11 @@
36#include "dce/dce_link_encoder.h" 36#include "dce/dce_link_encoder.h"
37#include "dce/dce_stream_encoder.h" 37#include "dce/dce_stream_encoder.h"
38 38
39#include "dce/dce_clk_mgr.h"
39#include "dce/dce_mem_input.h" 40#include "dce/dce_mem_input.h"
40#include "dce/dce_ipp.h" 41#include "dce/dce_ipp.h"
41#include "dce/dce_transform.h" 42#include "dce/dce_transform.h"
42#include "dce/dce_opp.h" 43#include "dce/dce_opp.h"
43#include "dce/dce_clocks.h"
44#include "dce/dce_clock_source.h" 44#include "dce/dce_clock_source.h"
45#include "dce/dce_audio.h" 45#include "dce/dce_audio.h"
46#include "dce/dce_hwseq.h" 46#include "dce/dce_hwseq.h"
@@ -137,15 +137,15 @@ static const struct dce110_timing_generator_offsets dce100_tg_offsets[] = {
137 .reg_name = mm ## block ## id ## _ ## reg_name 137 .reg_name = mm ## block ## id ## _ ## reg_name
138 138
139 139
140static const struct dccg_registers disp_clk_regs = { 140static const struct clk_mgr_registers disp_clk_regs = {
141 CLK_COMMON_REG_LIST_DCE_BASE() 141 CLK_COMMON_REG_LIST_DCE_BASE()
142}; 142};
143 143
144static const struct dccg_shift disp_clk_shift = { 144static const struct clk_mgr_shift disp_clk_shift = {
145 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT) 145 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
146}; 146};
147 147
148static const struct dccg_mask disp_clk_mask = { 148static const struct clk_mgr_mask disp_clk_mask = {
149 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK) 149 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
150}; 150};
151 151
@@ -722,8 +722,8 @@ static void destruct(struct dce110_resource_pool *pool)
722 dce_aud_destroy(&pool->base.audios[i]); 722 dce_aud_destroy(&pool->base.audios[i]);
723 } 723 }
724 724
725 if (pool->base.dccg != NULL) 725 if (pool->base.clk_mgr != NULL)
726 dce_dccg_destroy(&pool->base.dccg); 726 dce_clk_mgr_destroy(&pool->base.clk_mgr);
727 727
728 if (pool->base.abm != NULL) 728 if (pool->base.abm != NULL)
729 dce_abm_destroy(&pool->base.abm); 729 dce_abm_destroy(&pool->base.abm);
@@ -767,7 +767,7 @@ bool dce100_validate_bandwidth(
767 if (at_least_one_pipe) { 767 if (at_least_one_pipe) {
768 /* TODO implement when needed but for now hardcode max value*/ 768 /* TODO implement when needed but for now hardcode max value*/
769 context->bw.dce.dispclk_khz = 681000; 769 context->bw.dce.dispclk_khz = 681000;
770 context->bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER; 770 context->bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER_CZ;
771 } else { 771 } else {
772 context->bw.dce.dispclk_khz = 0; 772 context->bw.dce.dispclk_khz = 0;
773 context->bw.dce.yclk_khz = 0; 773 context->bw.dce.yclk_khz = 0;
@@ -860,7 +860,6 @@ static bool construct(
860 struct dc_context *ctx = dc->ctx; 860 struct dc_context *ctx = dc->ctx;
861 struct dc_firmware_info info; 861 struct dc_firmware_info info;
862 struct dc_bios *bp; 862 struct dc_bios *bp;
863 struct dm_pp_static_clock_info static_clk_info = {0};
864 863
865 ctx->dc_bios->regs = &bios_regs; 864 ctx->dc_bios->regs = &bios_regs;
866 865
@@ -908,11 +907,11 @@ static bool construct(
908 } 907 }
909 } 908 }
910 909
911 pool->base.dccg = dce_dccg_create(ctx, 910 pool->base.clk_mgr = dce_clk_mgr_create(ctx,
912 &disp_clk_regs, 911 &disp_clk_regs,
913 &disp_clk_shift, 912 &disp_clk_shift,
914 &disp_clk_mask); 913 &disp_clk_mask);
915 if (pool->base.dccg == NULL) { 914 if (pool->base.clk_mgr == NULL) {
916 dm_error("DC: failed to create display clock!\n"); 915 dm_error("DC: failed to create display clock!\n");
917 BREAK_TO_DEBUGGER(); 916 BREAK_TO_DEBUGGER();
918 goto res_create_fail; 917 goto res_create_fail;
@@ -938,12 +937,6 @@ static bool construct(
938 goto res_create_fail; 937 goto res_create_fail;
939 } 938 }
940 939
941 /* get static clock information for PPLIB or firmware, save
942 * max_clock_state
943 */
944 if (dm_pp_get_static_clocks(ctx, &static_clk_info))
945 pool->base.dccg->max_clks_state =
946 static_clk_info.max_clocks_state;
947 { 940 {
948 struct irq_service_init_data init_data; 941 struct irq_service_init_data init_data;
949 init_data.ctx = dc->ctx; 942 init_data.ctx = dc->ctx;
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
index b75ede5f84f7..9724a17e352b 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
@@ -548,14 +548,14 @@ dce110_translate_regamma_to_hw_format(const struct dc_transfer_func *output_tf,
548 548
549 regamma_params->hw_points_num = hw_points; 549 regamma_params->hw_points_num = hw_points;
550 550
551 i = 1; 551 k = 0;
552 for (k = 0; k < 16 && i < 16; k++) { 552 for (i = 1; i < 16; i++) {
553 if (seg_distr[k] != -1) { 553 if (seg_distr[k] != -1) {
554 regamma_params->arr_curve_points[k].segments_num = seg_distr[k]; 554 regamma_params->arr_curve_points[k].segments_num = seg_distr[k];
555 regamma_params->arr_curve_points[i].offset = 555 regamma_params->arr_curve_points[i].offset =
556 regamma_params->arr_curve_points[k].offset + (1 << seg_distr[k]); 556 regamma_params->arr_curve_points[k].offset + (1 << seg_distr[k]);
557 } 557 }
558 i++; 558 k++;
559 } 559 }
560 560
561 if (seg_distr[k] != -1) 561 if (seg_distr[k] != -1)
@@ -1085,7 +1085,6 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx,
1085 1085
1086 if (link->local_sink && link->local_sink->sink_signal == SIGNAL_TYPE_EDP) { 1086 if (link->local_sink && link->local_sink->sink_signal == SIGNAL_TYPE_EDP) {
1087 link->dc->hwss.edp_backlight_control(link, true); 1087 link->dc->hwss.edp_backlight_control(link, true);
1088 stream->bl_pwm_level = EDP_BACKLIGHT_RAMP_DISABLE_LEVEL;
1089 } 1088 }
1090} 1089}
1091void dce110_blank_stream(struct pipe_ctx *pipe_ctx) 1090void dce110_blank_stream(struct pipe_ctx *pipe_ctx)
@@ -1192,8 +1191,8 @@ static void build_audio_output(
1192 if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT || 1191 if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT ||
1193 pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { 1192 pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
1194 audio_output->pll_info.dp_dto_source_clock_in_khz = 1193 audio_output->pll_info.dp_dto_source_clock_in_khz =
1195 state->dis_clk->funcs->get_dp_ref_clk_frequency( 1194 state->dccg->funcs->get_dp_ref_clk_frequency(
1196 state->dis_clk); 1195 state->dccg);
1197 } 1196 }
1198 1197
1199 audio_output->pll_info.feed_back_divider = 1198 audio_output->pll_info.feed_back_divider =
@@ -1547,6 +1546,7 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
1547 int i; 1546 int i;
1548 struct dc_link *edp_link_to_turnoff = NULL; 1547 struct dc_link *edp_link_to_turnoff = NULL;
1549 struct dc_link *edp_link = get_link_for_edp(dc); 1548 struct dc_link *edp_link = get_link_for_edp(dc);
1549 struct dc_bios *bios = dc->ctx->dc_bios;
1550 bool can_edp_fast_boot_optimize = false; 1550 bool can_edp_fast_boot_optimize = false;
1551 bool apply_edp_fast_boot_optimization = false; 1551 bool apply_edp_fast_boot_optimization = false;
1552 1552
@@ -1573,6 +1573,20 @@ void dce110_enable_accelerated_mode(struct dc *dc, struct dc_state *context)
1573 if (context->streams[i]->signal == SIGNAL_TYPE_EDP) { 1573 if (context->streams[i]->signal == SIGNAL_TYPE_EDP) {
1574 context->streams[i]->apply_edp_fast_boot_optimization = true; 1574 context->streams[i]->apply_edp_fast_boot_optimization = true;
1575 apply_edp_fast_boot_optimization = true; 1575 apply_edp_fast_boot_optimization = true;
1576
1577 /* When after S4 and S5, vbios may post edp and previous dpms_off
1578 * doesn't make sense.
1579 * Update dpms_off state to align hw and sw state via check
1580 * vBios scratch register.
1581 */
1582 if (bios->funcs->is_active_display) {
1583 const struct connector_device_tag_info *device_tag = &(edp_link->device_tag);
1584
1585 if (bios->funcs->is_active_display(bios,
1586 context->streams[i]->signal,
1587 device_tag))
1588 context->streams[i]->dpms_off = false;
1589 }
1576 } 1590 }
1577 } 1591 }
1578 } 1592 }
@@ -1736,41 +1750,18 @@ static void set_static_screen_control(struct pipe_ctx **pipe_ctx,
1736 if (events->force_trigger) 1750 if (events->force_trigger)
1737 value |= 0x1; 1751 value |= 0x1;
1738 1752
1739 value |= 0x84; 1753 if (num_pipes) {
1754 struct dc *dc = pipe_ctx[0]->stream->ctx->dc;
1755
1756 if (dc->fbc_compressor)
1757 value |= 0x84;
1758 }
1740 1759
1741 for (i = 0; i < num_pipes; i++) 1760 for (i = 0; i < num_pipes; i++)
1742 pipe_ctx[i]->stream_res.tg->funcs-> 1761 pipe_ctx[i]->stream_res.tg->funcs->
1743 set_static_screen_control(pipe_ctx[i]->stream_res.tg, value); 1762 set_static_screen_control(pipe_ctx[i]->stream_res.tg, value);
1744} 1763}
1745 1764
1746/* unit: in_khz before mode set, get pixel clock from context. ASIC register
1747 * may not be programmed yet
1748 */
1749static uint32_t get_max_pixel_clock_for_all_paths(
1750 struct dc *dc,
1751 struct dc_state *context)
1752{
1753 uint32_t max_pix_clk = 0;
1754 int i;
1755
1756 for (i = 0; i < MAX_PIPES; i++) {
1757 struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
1758
1759 if (pipe_ctx->stream == NULL)
1760 continue;
1761
1762 /* do not check under lay */
1763 if (pipe_ctx->top_pipe)
1764 continue;
1765
1766 if (pipe_ctx->stream_res.pix_clk_params.requested_pix_clk > max_pix_clk)
1767 max_pix_clk =
1768 pipe_ctx->stream_res.pix_clk_params.requested_pix_clk;
1769 }
1770
1771 return max_pix_clk;
1772}
1773
1774/* 1765/*
1775 * Check if FBC can be enabled 1766 * Check if FBC can be enabled
1776 */ 1767 */
@@ -2380,191 +2371,33 @@ static void init_hw(struct dc *dc)
2380 2371
2381} 2372}
2382 2373
2383void dce110_fill_display_configs(
2384 const struct dc_state *context,
2385 struct dm_pp_display_configuration *pp_display_cfg)
2386{
2387 int j;
2388 int num_cfgs = 0;
2389
2390 for (j = 0; j < context->stream_count; j++) {
2391 int k;
2392
2393 const struct dc_stream_state *stream = context->streams[j];
2394 struct dm_pp_single_disp_config *cfg =
2395 &pp_display_cfg->disp_configs[num_cfgs];
2396 const struct pipe_ctx *pipe_ctx = NULL;
2397
2398 for (k = 0; k < MAX_PIPES; k++)
2399 if (stream == context->res_ctx.pipe_ctx[k].stream) {
2400 pipe_ctx = &context->res_ctx.pipe_ctx[k];
2401 break;
2402 }
2403
2404 ASSERT(pipe_ctx != NULL);
2405
2406 /* only notify active stream */
2407 if (stream->dpms_off)
2408 continue;
2409
2410 num_cfgs++;
2411 cfg->signal = pipe_ctx->stream->signal;
2412 cfg->pipe_idx = pipe_ctx->stream_res.tg->inst;
2413 cfg->src_height = stream->src.height;
2414 cfg->src_width = stream->src.width;
2415 cfg->ddi_channel_mapping =
2416 stream->sink->link->ddi_channel_mapping.raw;
2417 cfg->transmitter =
2418 stream->sink->link->link_enc->transmitter;
2419 cfg->link_settings.lane_count =
2420 stream->sink->link->cur_link_settings.lane_count;
2421 cfg->link_settings.link_rate =
2422 stream->sink->link->cur_link_settings.link_rate;
2423 cfg->link_settings.link_spread =
2424 stream->sink->link->cur_link_settings.link_spread;
2425 cfg->sym_clock = stream->phy_pix_clk;
2426 /* Round v_refresh*/
2427 cfg->v_refresh = stream->timing.pix_clk_khz * 1000;
2428 cfg->v_refresh /= stream->timing.h_total;
2429 cfg->v_refresh = (cfg->v_refresh + stream->timing.v_total / 2)
2430 / stream->timing.v_total;
2431 }
2432
2433 pp_display_cfg->display_count = num_cfgs;
2434}
2435
2436uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context)
2437{
2438 uint8_t j;
2439 uint32_t min_vertical_blank_time = -1;
2440
2441 for (j = 0; j < context->stream_count; j++) {
2442 struct dc_stream_state *stream = context->streams[j];
2443 uint32_t vertical_blank_in_pixels = 0;
2444 uint32_t vertical_blank_time = 0;
2445
2446 vertical_blank_in_pixels = stream->timing.h_total *
2447 (stream->timing.v_total
2448 - stream->timing.v_addressable);
2449
2450 vertical_blank_time = vertical_blank_in_pixels
2451 * 1000 / stream->timing.pix_clk_khz;
2452
2453 if (min_vertical_blank_time > vertical_blank_time)
2454 min_vertical_blank_time = vertical_blank_time;
2455 }
2456
2457 return min_vertical_blank_time;
2458}
2459
2460static int determine_sclk_from_bounding_box(
2461 const struct dc *dc,
2462 int required_sclk)
2463{
2464 int i;
2465 2374
2466 /* 2375void dce110_prepare_bandwidth(
2467 * Some asics do not give us sclk levels, so we just report the actual 2376 struct dc *dc,
2468 * required sclk 2377 struct dc_state *context)
2469 */
2470 if (dc->sclk_lvls.num_levels == 0)
2471 return required_sclk;
2472
2473 for (i = 0; i < dc->sclk_lvls.num_levels; i++) {
2474 if (dc->sclk_lvls.clocks_in_khz[i] >= required_sclk)
2475 return dc->sclk_lvls.clocks_in_khz[i];
2476 }
2477 /*
2478 * even maximum level could not satisfy requirement, this
2479 * is unexpected at this stage, should have been caught at
2480 * validation time
2481 */
2482 ASSERT(0);
2483 return dc->sclk_lvls.clocks_in_khz[dc->sclk_lvls.num_levels - 1];
2484}
2485
2486static void pplib_apply_display_requirements(
2487 struct dc *dc,
2488 struct dc_state *context)
2489{ 2378{
2490 struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg; 2379 struct clk_mgr *dccg = dc->res_pool->clk_mgr;
2491 2380
2492 pp_display_cfg->all_displays_in_sync = 2381 dce110_set_safe_displaymarks(&context->res_ctx, dc->res_pool);
2493 context->bw.dce.all_displays_in_sync;
2494 pp_display_cfg->nb_pstate_switch_disable =
2495 context->bw.dce.nbp_state_change_enable == false;
2496 pp_display_cfg->cpu_cc6_disable =
2497 context->bw.dce.cpuc_state_change_enable == false;
2498 pp_display_cfg->cpu_pstate_disable =
2499 context->bw.dce.cpup_state_change_enable == false;
2500 pp_display_cfg->cpu_pstate_separation_time =
2501 context->bw.dce.blackout_recovery_time_us;
2502 2382
2503 pp_display_cfg->min_memory_clock_khz = context->bw.dce.yclk_khz 2383 dccg->funcs->update_clocks(
2504 / MEMORY_TYPE_MULTIPLIER; 2384 dccg,
2505 2385 context,
2506 pp_display_cfg->min_engine_clock_khz = determine_sclk_from_bounding_box( 2386 false);
2507 dc,
2508 context->bw.dce.sclk_khz);
2509
2510 pp_display_cfg->min_engine_clock_deep_sleep_khz
2511 = context->bw.dce.sclk_deep_sleep_khz;
2512
2513 pp_display_cfg->avail_mclk_switch_time_us =
2514 dce110_get_min_vblank_time_us(context);
2515 /* TODO: dce11.2*/
2516 pp_display_cfg->avail_mclk_switch_time_in_disp_active_us = 0;
2517
2518 pp_display_cfg->disp_clk_khz = dc->res_pool->dccg->clks.dispclk_khz;
2519
2520 dce110_fill_display_configs(context, pp_display_cfg);
2521
2522 /* TODO: is this still applicable?*/
2523 if (pp_display_cfg->display_count == 1) {
2524 const struct dc_crtc_timing *timing =
2525 &context->streams[0]->timing;
2526
2527 pp_display_cfg->crtc_index =
2528 pp_display_cfg->disp_configs[0].pipe_idx;
2529 pp_display_cfg->line_time_in_us = timing->h_total * 1000
2530 / timing->pix_clk_khz;
2531 }
2532
2533 if (memcmp(&dc->prev_display_config, pp_display_cfg, sizeof(
2534 struct dm_pp_display_configuration)) != 0)
2535 dm_pp_apply_display_requirements(dc->ctx, pp_display_cfg);
2536
2537 dc->prev_display_config = *pp_display_cfg;
2538} 2387}
2539 2388
2540static void dce110_set_bandwidth( 2389void dce110_optimize_bandwidth(
2541 struct dc *dc, 2390 struct dc *dc,
2542 struct dc_state *context, 2391 struct dc_state *context)
2543 bool decrease_allowed)
2544{ 2392{
2545 struct dc_clocks req_clks; 2393 struct clk_mgr *dccg = dc->res_pool->clk_mgr;
2546 struct dccg *dccg = dc->res_pool->dccg;
2547
2548 req_clks.dispclk_khz = context->bw.dce.dispclk_khz;
2549 req_clks.phyclk_khz = get_max_pixel_clock_for_all_paths(dc, context);
2550
2551 if (decrease_allowed)
2552 dce110_set_displaymarks(dc, context);
2553 else
2554 dce110_set_safe_displaymarks(&context->res_ctx, dc->res_pool);
2555 2394
2556 if (dccg->funcs->update_dfs_bypass) 2395 dce110_set_displaymarks(dc, context);
2557 dccg->funcs->update_dfs_bypass(
2558 dccg,
2559 dc,
2560 context,
2561 req_clks.dispclk_khz);
2562 2396
2563 dccg->funcs->update_clocks( 2397 dccg->funcs->update_clocks(
2564 dccg, 2398 dccg,
2565 &req_clks, 2399 context,
2566 decrease_allowed); 2400 true);
2567 pplib_apply_display_requirements(dc, context);
2568} 2401}
2569 2402
2570static void dce110_program_front_end_for_pipe( 2403static void dce110_program_front_end_for_pipe(
@@ -2769,28 +2602,6 @@ static void dce110_wait_for_mpcc_disconnect(
2769 /* do nothing*/ 2602 /* do nothing*/
2770} 2603}
2771 2604
2772static void program_csc_matrix(struct pipe_ctx *pipe_ctx,
2773 enum dc_color_space colorspace,
2774 uint16_t *matrix)
2775{
2776 int i;
2777 struct out_csc_color_matrix tbl_entry;
2778
2779 if (pipe_ctx->stream->csc_color_matrix.enable_adjustment
2780 == true) {
2781 enum dc_color_space color_space =
2782 pipe_ctx->stream->output_color_space;
2783
2784 //uint16_t matrix[12];
2785 for (i = 0; i < 12; i++)
2786 tbl_entry.regval[i] = pipe_ctx->stream->csc_color_matrix.matrix[i];
2787
2788 tbl_entry.color_space = color_space;
2789 //tbl_entry.regval = matrix;
2790 pipe_ctx->plane_res.xfm->funcs->opp_set_csc_adjustment(pipe_ctx->plane_res.xfm, &tbl_entry);
2791 }
2792}
2793
2794void dce110_set_cursor_position(struct pipe_ctx *pipe_ctx) 2605void dce110_set_cursor_position(struct pipe_ctx *pipe_ctx)
2795{ 2606{
2796 struct dc_cursor_position pos_cpy = pipe_ctx->stream->cursor_position; 2607 struct dc_cursor_position pos_cpy = pipe_ctx->stream->cursor_position;
@@ -2839,13 +2650,8 @@ void dce110_set_cursor_attribute(struct pipe_ctx *pipe_ctx)
2839 pipe_ctx->plane_res.xfm, attributes); 2650 pipe_ctx->plane_res.xfm, attributes);
2840} 2651}
2841 2652
2842static void ready_shared_resources(struct dc *dc, struct dc_state *context) {}
2843
2844static void optimize_shared_resources(struct dc *dc) {}
2845
2846static const struct hw_sequencer_funcs dce110_funcs = { 2653static const struct hw_sequencer_funcs dce110_funcs = {
2847 .program_gamut_remap = program_gamut_remap, 2654 .program_gamut_remap = program_gamut_remap,
2848 .program_csc_matrix = program_csc_matrix,
2849 .init_hw = init_hw, 2655 .init_hw = init_hw,
2850 .apply_ctx_to_hw = dce110_apply_ctx_to_hw, 2656 .apply_ctx_to_hw = dce110_apply_ctx_to_hw,
2851 .apply_ctx_for_surface = dce110_apply_ctx_for_surface, 2657 .apply_ctx_for_surface = dce110_apply_ctx_for_surface,
@@ -2868,7 +2674,8 @@ static const struct hw_sequencer_funcs dce110_funcs = {
2868 .enable_display_power_gating = dce110_enable_display_power_gating, 2674 .enable_display_power_gating = dce110_enable_display_power_gating,
2869 .disable_plane = dce110_power_down_fe, 2675 .disable_plane = dce110_power_down_fe,
2870 .pipe_control_lock = dce_pipe_control_lock, 2676 .pipe_control_lock = dce_pipe_control_lock,
2871 .set_bandwidth = dce110_set_bandwidth, 2677 .prepare_bandwidth = dce110_prepare_bandwidth,
2678 .optimize_bandwidth = dce110_optimize_bandwidth,
2872 .set_drr = set_drr, 2679 .set_drr = set_drr,
2873 .get_position = get_position, 2680 .get_position = get_position,
2874 .set_static_screen_control = set_static_screen_control, 2681 .set_static_screen_control = set_static_screen_control,
@@ -2877,9 +2684,6 @@ static const struct hw_sequencer_funcs dce110_funcs = {
2877 .setup_stereo = NULL, 2684 .setup_stereo = NULL,
2878 .set_avmute = dce110_set_avmute, 2685 .set_avmute = dce110_set_avmute,
2879 .wait_for_mpcc_disconnect = dce110_wait_for_mpcc_disconnect, 2686 .wait_for_mpcc_disconnect = dce110_wait_for_mpcc_disconnect,
2880 .ready_shared_resources = ready_shared_resources,
2881 .optimize_shared_resources = optimize_shared_resources,
2882 .pplib_apply_display_requirements = pplib_apply_display_requirements,
2883 .edp_backlight_control = hwss_edp_backlight_control, 2687 .edp_backlight_control = hwss_edp_backlight_control,
2884 .edp_power_control = hwss_edp_power_control, 2688 .edp_power_control = hwss_edp_power_control,
2885 .edp_wait_for_hpd_ready = hwss_edp_wait_for_hpd_ready, 2689 .edp_wait_for_hpd_ready = hwss_edp_wait_for_hpd_ready,
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h
index d6db3dbd9015..cd3e36d52a52 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h
@@ -40,7 +40,6 @@ enum dc_status dce110_apply_ctx_to_hw(
40 struct dc_state *context); 40 struct dc_state *context);
41 41
42 42
43
44void dce110_enable_stream(struct pipe_ctx *pipe_ctx); 43void dce110_enable_stream(struct pipe_ctx *pipe_ctx);
45 44
46void dce110_disable_stream(struct pipe_ctx *pipe_ctx, int option); 45void dce110_disable_stream(struct pipe_ctx *pipe_ctx, int option);
@@ -64,11 +63,13 @@ void dce110_set_safe_displaymarks(
64 struct resource_context *res_ctx, 63 struct resource_context *res_ctx,
65 const struct resource_pool *pool); 64 const struct resource_pool *pool);
66 65
67void dce110_fill_display_configs( 66void dce110_prepare_bandwidth(
68 const struct dc_state *context, 67 struct dc *dc,
69 struct dm_pp_display_configuration *pp_display_cfg); 68 struct dc_state *context);
70 69
71uint32_t dce110_get_min_vblank_time_us(const struct dc_state *context); 70void dce110_optimize_bandwidth(
71 struct dc *dc,
72 struct dc_state *context);
72 73
73void dp_receiver_power_ctrl(struct dc_link *link, bool on); 74void dp_receiver_power_ctrl(struct dc_link *link, bool on);
74 75
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
index e3624ca24574..e33d11785b1f 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_resource.c
@@ -31,6 +31,7 @@
31#include "resource.h" 31#include "resource.h"
32#include "dce110/dce110_resource.h" 32#include "dce110/dce110_resource.h"
33 33
34#include "dce/dce_clk_mgr.h"
34#include "include/irq_service_interface.h" 35#include "include/irq_service_interface.h"
35#include "dce/dce_audio.h" 36#include "dce/dce_audio.h"
36#include "dce110/dce110_timing_generator.h" 37#include "dce110/dce110_timing_generator.h"
@@ -45,7 +46,6 @@
45#include "dce110/dce110_transform_v.h" 46#include "dce110/dce110_transform_v.h"
46#include "dce/dce_opp.h" 47#include "dce/dce_opp.h"
47#include "dce110/dce110_opp_v.h" 48#include "dce110/dce110_opp_v.h"
48#include "dce/dce_clocks.h"
49#include "dce/dce_clock_source.h" 49#include "dce/dce_clock_source.h"
50#include "dce/dce_hwseq.h" 50#include "dce/dce_hwseq.h"
51#include "dce110/dce110_hw_sequencer.h" 51#include "dce110/dce110_hw_sequencer.h"
@@ -148,15 +148,15 @@ static const struct dce110_timing_generator_offsets dce110_tg_offsets[] = {
148#define SRI(reg_name, block, id)\ 148#define SRI(reg_name, block, id)\
149 .reg_name = mm ## block ## id ## _ ## reg_name 149 .reg_name = mm ## block ## id ## _ ## reg_name
150 150
151static const struct dccg_registers disp_clk_regs = { 151static const struct clk_mgr_registers disp_clk_regs = {
152 CLK_COMMON_REG_LIST_DCE_BASE() 152 CLK_COMMON_REG_LIST_DCE_BASE()
153}; 153};
154 154
155static const struct dccg_shift disp_clk_shift = { 155static const struct clk_mgr_shift disp_clk_shift = {
156 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT) 156 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
157}; 157};
158 158
159static const struct dccg_mask disp_clk_mask = { 159static const struct clk_mgr_mask disp_clk_mask = {
160 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK) 160 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
161}; 161};
162 162
@@ -760,8 +760,8 @@ static void destruct(struct dce110_resource_pool *pool)
760 if (pool->base.dmcu != NULL) 760 if (pool->base.dmcu != NULL)
761 dce_dmcu_destroy(&pool->base.dmcu); 761 dce_dmcu_destroy(&pool->base.dmcu);
762 762
763 if (pool->base.dccg != NULL) 763 if (pool->base.clk_mgr != NULL)
764 dce_dccg_destroy(&pool->base.dccg); 764 dce_clk_mgr_destroy(&pool->base.clk_mgr);
765 765
766 if (pool->base.irqs != NULL) { 766 if (pool->base.irqs != NULL) {
767 dal_irq_service_destroy(&pool->base.irqs); 767 dal_irq_service_destroy(&pool->base.irqs);
@@ -1173,12 +1173,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc)
1173 &clks); 1173 &clks);
1174 1174
1175 dc->bw_vbios->low_yclk = bw_frc_to_fixed( 1175 dc->bw_vbios->low_yclk = bw_frc_to_fixed(
1176 clks.clocks_in_khz[0] * MEMORY_TYPE_MULTIPLIER, 1000); 1176 clks.clocks_in_khz[0] * MEMORY_TYPE_MULTIPLIER_CZ, 1000);
1177 dc->bw_vbios->mid_yclk = bw_frc_to_fixed( 1177 dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
1178 clks.clocks_in_khz[clks.num_levels>>1] * MEMORY_TYPE_MULTIPLIER, 1178 clks.clocks_in_khz[clks.num_levels>>1] * MEMORY_TYPE_MULTIPLIER_CZ,
1179 1000); 1179 1000);
1180 dc->bw_vbios->high_yclk = bw_frc_to_fixed( 1180 dc->bw_vbios->high_yclk = bw_frc_to_fixed(
1181 clks.clocks_in_khz[clks.num_levels-1] * MEMORY_TYPE_MULTIPLIER, 1181 clks.clocks_in_khz[clks.num_levels-1] * MEMORY_TYPE_MULTIPLIER_CZ,
1182 1000); 1182 1000);
1183} 1183}
1184 1184
@@ -1201,7 +1201,6 @@ static bool construct(
1201 struct dc_context *ctx = dc->ctx; 1201 struct dc_context *ctx = dc->ctx;
1202 struct dc_firmware_info info; 1202 struct dc_firmware_info info;
1203 struct dc_bios *bp; 1203 struct dc_bios *bp;
1204 struct dm_pp_static_clock_info static_clk_info = {0};
1205 1204
1206 ctx->dc_bios->regs = &bios_regs; 1205 ctx->dc_bios->regs = &bios_regs;
1207 1206
@@ -1257,11 +1256,11 @@ static bool construct(
1257 } 1256 }
1258 } 1257 }
1259 1258
1260 pool->base.dccg = dce110_dccg_create(ctx, 1259 pool->base.clk_mgr = dce110_clk_mgr_create(ctx,
1261 &disp_clk_regs, 1260 &disp_clk_regs,
1262 &disp_clk_shift, 1261 &disp_clk_shift,
1263 &disp_clk_mask); 1262 &disp_clk_mask);
1264 if (pool->base.dccg == NULL) { 1263 if (pool->base.clk_mgr == NULL) {
1265 dm_error("DC: failed to create display clock!\n"); 1264 dm_error("DC: failed to create display clock!\n");
1266 BREAK_TO_DEBUGGER(); 1265 BREAK_TO_DEBUGGER();
1267 goto res_create_fail; 1266 goto res_create_fail;
@@ -1287,13 +1286,6 @@ static bool construct(
1287 goto res_create_fail; 1286 goto res_create_fail;
1288 } 1287 }
1289 1288
1290 /* get static clock information for PPLIB or firmware, save
1291 * max_clock_state
1292 */
1293 if (dm_pp_get_static_clocks(ctx, &static_clk_info))
1294 pool->base.dccg->max_clks_state =
1295 static_clk_info.max_clocks_state;
1296
1297 { 1289 {
1298 struct irq_service_init_data init_data; 1290 struct irq_service_init_data init_data;
1299 init_data.ctx = dc->ctx; 1291 init_data.ctx = dc->ctx;
@@ -1362,7 +1354,8 @@ static bool construct(
1362 pool->base.sw_i2cs[i] = NULL; 1354 pool->base.sw_i2cs[i] = NULL;
1363 } 1355 }
1364 1356
1365 dc->fbc_compressor = dce110_compressor_create(ctx); 1357 if (dc->config.fbc_support)
1358 dc->fbc_compressor = dce110_compressor_create(ctx);
1366 1359
1367 if (!underlay_create(ctx, &pool->base)) 1360 if (!underlay_create(ctx, &pool->base))
1368 goto res_create_fail; 1361 goto res_create_fail;
diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
index 3ce79c208ddf..969d4e72dc94 100644
--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
@@ -35,6 +35,7 @@
35 35
36#include "irq/dce110/irq_service_dce110.h" 36#include "irq/dce110/irq_service_dce110.h"
37 37
38#include "dce/dce_clk_mgr.h"
38#include "dce/dce_mem_input.h" 39#include "dce/dce_mem_input.h"
39#include "dce/dce_transform.h" 40#include "dce/dce_transform.h"
40#include "dce/dce_link_encoder.h" 41#include "dce/dce_link_encoder.h"
@@ -42,7 +43,6 @@
42#include "dce/dce_audio.h" 43#include "dce/dce_audio.h"
43#include "dce/dce_opp.h" 44#include "dce/dce_opp.h"
44#include "dce/dce_ipp.h" 45#include "dce/dce_ipp.h"
45#include "dce/dce_clocks.h"
46#include "dce/dce_clock_source.h" 46#include "dce/dce_clock_source.h"
47 47
48#include "dce/dce_hwseq.h" 48#include "dce/dce_hwseq.h"
@@ -148,15 +148,15 @@ static const struct dce110_timing_generator_offsets dce112_tg_offsets[] = {
148 .reg_name = mm ## block ## id ## _ ## reg_name 148 .reg_name = mm ## block ## id ## _ ## reg_name
149 149
150 150
151static const struct dccg_registers disp_clk_regs = { 151static const struct clk_mgr_registers disp_clk_regs = {
152 CLK_COMMON_REG_LIST_DCE_BASE() 152 CLK_COMMON_REG_LIST_DCE_BASE()
153}; 153};
154 154
155static const struct dccg_shift disp_clk_shift = { 155static const struct clk_mgr_shift disp_clk_shift = {
156 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT) 156 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
157}; 157};
158 158
159static const struct dccg_mask disp_clk_mask = { 159static const struct clk_mgr_mask disp_clk_mask = {
160 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK) 160 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
161}; 161};
162 162
@@ -551,7 +551,8 @@ static struct transform *dce112_transform_create(
551static const struct encoder_feature_support link_enc_feature = { 551static const struct encoder_feature_support link_enc_feature = {
552 .max_hdmi_deep_color = COLOR_DEPTH_121212, 552 .max_hdmi_deep_color = COLOR_DEPTH_121212,
553 .max_hdmi_pixel_clock = 600000, 553 .max_hdmi_pixel_clock = 600000,
554 .ycbcr420_supported = true, 554 .hdmi_ycbcr420_supported = true,
555 .dp_ycbcr420_supported = false,
555 .flags.bits.IS_HBR2_CAPABLE = true, 556 .flags.bits.IS_HBR2_CAPABLE = true,
556 .flags.bits.IS_HBR3_CAPABLE = true, 557 .flags.bits.IS_HBR3_CAPABLE = true,
557 .flags.bits.IS_TPS3_CAPABLE = true, 558 .flags.bits.IS_TPS3_CAPABLE = true,
@@ -749,8 +750,8 @@ static void destruct(struct dce110_resource_pool *pool)
749 if (pool->base.dmcu != NULL) 750 if (pool->base.dmcu != NULL)
750 dce_dmcu_destroy(&pool->base.dmcu); 751 dce_dmcu_destroy(&pool->base.dmcu);
751 752
752 if (pool->base.dccg != NULL) 753 if (pool->base.clk_mgr != NULL)
753 dce_dccg_destroy(&pool->base.dccg); 754 dce_clk_mgr_destroy(&pool->base.clk_mgr);
754 755
755 if (pool->base.irqs != NULL) { 756 if (pool->base.irqs != NULL) {
756 dal_irq_service_destroy(&pool->base.irqs); 757 dal_irq_service_destroy(&pool->base.irqs);
@@ -1015,12 +1016,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc)
1015 &clks); 1016 &clks);
1016 1017
1017 dc->bw_vbios->low_yclk = bw_frc_to_fixed( 1018 dc->bw_vbios->low_yclk = bw_frc_to_fixed(
1018 clks.clocks_in_khz[0] * MEMORY_TYPE_MULTIPLIER, 1000); 1019 clks.clocks_in_khz[0] * MEMORY_TYPE_MULTIPLIER_CZ, 1000);
1019 dc->bw_vbios->mid_yclk = bw_frc_to_fixed( 1020 dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
1020 clks.clocks_in_khz[clks.num_levels>>1] * MEMORY_TYPE_MULTIPLIER, 1021 clks.clocks_in_khz[clks.num_levels>>1] * MEMORY_TYPE_MULTIPLIER_CZ,
1021 1000); 1022 1000);
1022 dc->bw_vbios->high_yclk = bw_frc_to_fixed( 1023 dc->bw_vbios->high_yclk = bw_frc_to_fixed(
1023 clks.clocks_in_khz[clks.num_levels-1] * MEMORY_TYPE_MULTIPLIER, 1024 clks.clocks_in_khz[clks.num_levels-1] * MEMORY_TYPE_MULTIPLIER_CZ,
1024 1000); 1025 1000);
1025 1026
1026 return; 1027 return;
@@ -1056,12 +1057,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc)
1056 * YCLK = UMACLK*m_memoryTypeMultiplier 1057 * YCLK = UMACLK*m_memoryTypeMultiplier
1057 */ 1058 */
1058 dc->bw_vbios->low_yclk = bw_frc_to_fixed( 1059 dc->bw_vbios->low_yclk = bw_frc_to_fixed(
1059 mem_clks.data[0].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, 1000); 1060 mem_clks.data[0].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ, 1000);
1060 dc->bw_vbios->mid_yclk = bw_frc_to_fixed( 1061 dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
1061 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, 1062 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ,
1062 1000); 1063 1000);
1063 dc->bw_vbios->high_yclk = bw_frc_to_fixed( 1064 dc->bw_vbios->high_yclk = bw_frc_to_fixed(
1064 mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, 1065 mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ,
1065 1000); 1066 1000);
1066 1067
1067 /* Now notify PPLib/SMU about which Watermarks sets they should select 1068 /* Now notify PPLib/SMU about which Watermarks sets they should select
@@ -1131,7 +1132,6 @@ static bool construct(
1131{ 1132{
1132 unsigned int i; 1133 unsigned int i;
1133 struct dc_context *ctx = dc->ctx; 1134 struct dc_context *ctx = dc->ctx;
1134 struct dm_pp_static_clock_info static_clk_info = {0};
1135 1135
1136 ctx->dc_bios->regs = &bios_regs; 1136 ctx->dc_bios->regs = &bios_regs;
1137 1137
@@ -1199,11 +1199,11 @@ static bool construct(
1199 } 1199 }
1200 } 1200 }
1201 1201
1202 pool->base.dccg = dce112_dccg_create(ctx, 1202 pool->base.clk_mgr = dce112_clk_mgr_create(ctx,
1203 &disp_clk_regs, 1203 &disp_clk_regs,
1204 &disp_clk_shift, 1204 &disp_clk_shift,
1205 &disp_clk_mask); 1205 &disp_clk_mask);
1206 if (pool->base.dccg == NULL) { 1206 if (pool->base.clk_mgr == NULL) {
1207 dm_error("DC: failed to create display clock!\n"); 1207 dm_error("DC: failed to create display clock!\n");
1208 BREAK_TO_DEBUGGER(); 1208 BREAK_TO_DEBUGGER();
1209 goto res_create_fail; 1209 goto res_create_fail;
@@ -1229,13 +1229,6 @@ static bool construct(
1229 goto res_create_fail; 1229 goto res_create_fail;
1230 } 1230 }
1231 1231
1232 /* get static clock information for PPLIB or firmware, save
1233 * max_clock_state
1234 */
1235 if (dm_pp_get_static_clocks(ctx, &static_clk_info))
1236 pool->base.dccg->max_clks_state =
1237 static_clk_info.max_clocks_state;
1238
1239 { 1232 {
1240 struct irq_service_init_data init_data; 1233 struct irq_service_init_data init_data;
1241 init_data.ctx = dc->ctx; 1234 init_data.ctx = dc->ctx;
diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
index 79ab5f9f9115..f12696674eb0 100644
--- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
@@ -31,6 +31,7 @@
31#include "resource.h" 31#include "resource.h"
32#include "include/irq_service_interface.h" 32#include "include/irq_service_interface.h"
33#include "dce120_resource.h" 33#include "dce120_resource.h"
34
34#include "dce112/dce112_resource.h" 35#include "dce112/dce112_resource.h"
35 36
36#include "dce110/dce110_resource.h" 37#include "dce110/dce110_resource.h"
@@ -39,7 +40,6 @@
39#include "irq/dce120/irq_service_dce120.h" 40#include "irq/dce120/irq_service_dce120.h"
40#include "dce/dce_opp.h" 41#include "dce/dce_opp.h"
41#include "dce/dce_clock_source.h" 42#include "dce/dce_clock_source.h"
42#include "dce/dce_clocks.h"
43#include "dce/dce_ipp.h" 43#include "dce/dce_ipp.h"
44#include "dce/dce_mem_input.h" 44#include "dce/dce_mem_input.h"
45 45
@@ -47,6 +47,7 @@
47#include "dce120/dce120_hw_sequencer.h" 47#include "dce120/dce120_hw_sequencer.h"
48#include "dce/dce_transform.h" 48#include "dce/dce_transform.h"
49 49
50#include "dce/dce_clk_mgr.h"
50#include "dce/dce_audio.h" 51#include "dce/dce_audio.h"
51#include "dce/dce_link_encoder.h" 52#include "dce/dce_link_encoder.h"
52#include "dce/dce_stream_encoder.h" 53#include "dce/dce_stream_encoder.h"
@@ -573,8 +574,8 @@ static void destruct(struct dce110_resource_pool *pool)
573 if (pool->base.dmcu != NULL) 574 if (pool->base.dmcu != NULL)
574 dce_dmcu_destroy(&pool->base.dmcu); 575 dce_dmcu_destroy(&pool->base.dmcu);
575 576
576 if (pool->base.dccg != NULL) 577 if (pool->base.clk_mgr != NULL)
577 dce_dccg_destroy(&pool->base.dccg); 578 dce_clk_mgr_destroy(&pool->base.clk_mgr);
578} 579}
579 580
580static void read_dce_straps( 581static void read_dce_straps(
@@ -606,7 +607,8 @@ static struct audio *create_audio(
606static const struct encoder_feature_support link_enc_feature = { 607static const struct encoder_feature_support link_enc_feature = {
607 .max_hdmi_deep_color = COLOR_DEPTH_121212, 608 .max_hdmi_deep_color = COLOR_DEPTH_121212,
608 .max_hdmi_pixel_clock = 600000, 609 .max_hdmi_pixel_clock = 600000,
609 .ycbcr420_supported = true, 610 .hdmi_ycbcr420_supported = true,
611 .dp_ycbcr420_supported = false,
610 .flags.bits.IS_HBR2_CAPABLE = true, 612 .flags.bits.IS_HBR2_CAPABLE = true,
611 .flags.bits.IS_HBR3_CAPABLE = true, 613 .flags.bits.IS_HBR3_CAPABLE = true,
612 .flags.bits.IS_TPS3_CAPABLE = true, 614 .flags.bits.IS_TPS3_CAPABLE = true,
@@ -834,12 +836,12 @@ static void bw_calcs_data_update_from_pplib(struct dc *dc)
834 * YCLK = UMACLK*m_memoryTypeMultiplier 836 * YCLK = UMACLK*m_memoryTypeMultiplier
835 */ 837 */
836 dc->bw_vbios->low_yclk = bw_frc_to_fixed( 838 dc->bw_vbios->low_yclk = bw_frc_to_fixed(
837 mem_clks.data[0].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, 1000); 839 mem_clks.data[0].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ, 1000);
838 dc->bw_vbios->mid_yclk = bw_frc_to_fixed( 840 dc->bw_vbios->mid_yclk = bw_frc_to_fixed(
839 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, 841 mem_clks.data[mem_clks.num_levels>>1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ,
840 1000); 842 1000);
841 dc->bw_vbios->high_yclk = bw_frc_to_fixed( 843 dc->bw_vbios->high_yclk = bw_frc_to_fixed(
842 mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER, 844 mem_clks.data[mem_clks.num_levels-1].clocks_in_khz * MEMORY_TYPE_MULTIPLIER_CZ,
843 1000); 845 1000);
844 846
845 /* Now notify PPLib/SMU about which Watermarks sets they should select 847 /* Now notify PPLib/SMU about which Watermarks sets they should select
@@ -973,8 +975,8 @@ static bool construct(
973 } 975 }
974 } 976 }
975 977
976 pool->base.dccg = dce120_dccg_create(ctx); 978 pool->base.clk_mgr = dce120_clk_mgr_create(ctx);
977 if (pool->base.dccg == NULL) { 979 if (pool->base.clk_mgr == NULL) {
978 dm_error("DC: failed to create display clock!\n"); 980 dm_error("DC: failed to create display clock!\n");
979 BREAK_TO_DEBUGGER(); 981 BREAK_TO_DEBUGGER();
980 goto dccg_create_fail; 982 goto dccg_create_fail;
diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c
index 6c6a1a16af19..a60a90e68d91 100644
--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c
@@ -76,6 +76,7 @@ void dce80_hw_sequencer_construct(struct dc *dc)
76 76
77 dc->hwss.enable_display_power_gating = dce100_enable_display_power_gating; 77 dc->hwss.enable_display_power_gating = dce100_enable_display_power_gating;
78 dc->hwss.pipe_control_lock = dce_pipe_control_lock; 78 dc->hwss.pipe_control_lock = dce_pipe_control_lock;
79 dc->hwss.set_bandwidth = dce100_set_bandwidth; 79 dc->hwss.prepare_bandwidth = dce100_prepare_bandwidth;
80 dc->hwss.optimize_bandwidth = dce100_prepare_bandwidth;
80} 81}
81 82
diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
index d68f951f9869..6d40b3d54ac1 100644
--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
@@ -37,6 +37,7 @@
37#include "dce110/dce110_timing_generator.h" 37#include "dce110/dce110_timing_generator.h"
38#include "dce110/dce110_resource.h" 38#include "dce110/dce110_resource.h"
39#include "dce80/dce80_timing_generator.h" 39#include "dce80/dce80_timing_generator.h"
40#include "dce/dce_clk_mgr.h"
40#include "dce/dce_mem_input.h" 41#include "dce/dce_mem_input.h"
41#include "dce/dce_link_encoder.h" 42#include "dce/dce_link_encoder.h"
42#include "dce/dce_stream_encoder.h" 43#include "dce/dce_stream_encoder.h"
@@ -44,7 +45,6 @@
44#include "dce/dce_ipp.h" 45#include "dce/dce_ipp.h"
45#include "dce/dce_transform.h" 46#include "dce/dce_transform.h"
46#include "dce/dce_opp.h" 47#include "dce/dce_opp.h"
47#include "dce/dce_clocks.h"
48#include "dce/dce_clock_source.h" 48#include "dce/dce_clock_source.h"
49#include "dce/dce_audio.h" 49#include "dce/dce_audio.h"
50#include "dce/dce_hwseq.h" 50#include "dce/dce_hwseq.h"
@@ -155,15 +155,15 @@ static const struct dce110_timing_generator_offsets dce80_tg_offsets[] = {
155 .reg_name = mm ## block ## id ## _ ## reg_name 155 .reg_name = mm ## block ## id ## _ ## reg_name
156 156
157 157
158static const struct dccg_registers disp_clk_regs = { 158static const struct clk_mgr_registers disp_clk_regs = {
159 CLK_COMMON_REG_LIST_DCE_BASE() 159 CLK_COMMON_REG_LIST_DCE_BASE()
160}; 160};
161 161
162static const struct dccg_shift disp_clk_shift = { 162static const struct clk_mgr_shift disp_clk_shift = {
163 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT) 163 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(__SHIFT)
164}; 164};
165 165
166static const struct dccg_mask disp_clk_mask = { 166static const struct clk_mgr_mask disp_clk_mask = {
167 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK) 167 CLK_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
168}; 168};
169 169
@@ -779,8 +779,8 @@ static void destruct(struct dce110_resource_pool *pool)
779 } 779 }
780 } 780 }
781 781
782 if (pool->base.dccg != NULL) 782 if (pool->base.clk_mgr != NULL)
783 dce_dccg_destroy(&pool->base.dccg); 783 dce_clk_mgr_destroy(&pool->base.clk_mgr);
784 784
785 if (pool->base.irqs != NULL) { 785 if (pool->base.irqs != NULL) {
786 dal_irq_service_destroy(&pool->base.irqs); 786 dal_irq_service_destroy(&pool->base.irqs);
@@ -793,7 +793,7 @@ bool dce80_validate_bandwidth(
793{ 793{
794 /* TODO implement when needed but for now hardcode max value*/ 794 /* TODO implement when needed but for now hardcode max value*/
795 context->bw.dce.dispclk_khz = 681000; 795 context->bw.dce.dispclk_khz = 681000;
796 context->bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER; 796 context->bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER_CZ;
797 797
798 return true; 798 return true;
799} 799}
@@ -855,7 +855,6 @@ static bool dce80_construct(
855 struct dc_context *ctx = dc->ctx; 855 struct dc_context *ctx = dc->ctx;
856 struct dc_firmware_info info; 856 struct dc_firmware_info info;
857 struct dc_bios *bp; 857 struct dc_bios *bp;
858 struct dm_pp_static_clock_info static_clk_info = {0};
859 858
860 ctx->dc_bios->regs = &bios_regs; 859 ctx->dc_bios->regs = &bios_regs;
861 860
@@ -918,11 +917,11 @@ static bool dce80_construct(
918 } 917 }
919 } 918 }
920 919
921 pool->base.dccg = dce_dccg_create(ctx, 920 pool->base.clk_mgr = dce_clk_mgr_create(ctx,
922 &disp_clk_regs, 921 &disp_clk_regs,
923 &disp_clk_shift, 922 &disp_clk_shift,
924 &disp_clk_mask); 923 &disp_clk_mask);
925 if (pool->base.dccg == NULL) { 924 if (pool->base.clk_mgr == NULL) {
926 dm_error("DC: failed to create display clock!\n"); 925 dm_error("DC: failed to create display clock!\n");
927 BREAK_TO_DEBUGGER(); 926 BREAK_TO_DEBUGGER();
928 goto res_create_fail; 927 goto res_create_fail;
@@ -948,10 +947,6 @@ static bool dce80_construct(
948 goto res_create_fail; 947 goto res_create_fail;
949 } 948 }
950 949
951 if (dm_pp_get_static_clocks(ctx, &static_clk_info))
952 pool->base.dccg->max_clks_state =
953 static_clk_info.max_clocks_state;
954
955 { 950 {
956 struct irq_service_init_data init_data; 951 struct irq_service_init_data init_data;
957 init_data.ctx = dc->ctx; 952 init_data.ctx = dc->ctx;
@@ -1065,7 +1060,6 @@ static bool dce81_construct(
1065 struct dc_context *ctx = dc->ctx; 1060 struct dc_context *ctx = dc->ctx;
1066 struct dc_firmware_info info; 1061 struct dc_firmware_info info;
1067 struct dc_bios *bp; 1062 struct dc_bios *bp;
1068 struct dm_pp_static_clock_info static_clk_info = {0};
1069 1063
1070 ctx->dc_bios->regs = &bios_regs; 1064 ctx->dc_bios->regs = &bios_regs;
1071 1065
@@ -1128,11 +1122,11 @@ static bool dce81_construct(
1128 } 1122 }
1129 } 1123 }
1130 1124
1131 pool->base.dccg = dce_dccg_create(ctx, 1125 pool->base.clk_mgr = dce_clk_mgr_create(ctx,
1132 &disp_clk_regs, 1126 &disp_clk_regs,
1133 &disp_clk_shift, 1127 &disp_clk_shift,
1134 &disp_clk_mask); 1128 &disp_clk_mask);
1135 if (pool->base.dccg == NULL) { 1129 if (pool->base.clk_mgr == NULL) {
1136 dm_error("DC: failed to create display clock!\n"); 1130 dm_error("DC: failed to create display clock!\n");
1137 BREAK_TO_DEBUGGER(); 1131 BREAK_TO_DEBUGGER();
1138 goto res_create_fail; 1132 goto res_create_fail;
@@ -1158,10 +1152,6 @@ static bool dce81_construct(
1158 goto res_create_fail; 1152 goto res_create_fail;
1159 } 1153 }
1160 1154
1161 if (dm_pp_get_static_clocks(ctx, &static_clk_info))
1162 pool->base.dccg->max_clks_state =
1163 static_clk_info.max_clocks_state;
1164
1165 { 1155 {
1166 struct irq_service_init_data init_data; 1156 struct irq_service_init_data init_data;
1167 init_data.ctx = dc->ctx; 1157 init_data.ctx = dc->ctx;
@@ -1275,7 +1265,6 @@ static bool dce83_construct(
1275 struct dc_context *ctx = dc->ctx; 1265 struct dc_context *ctx = dc->ctx;
1276 struct dc_firmware_info info; 1266 struct dc_firmware_info info;
1277 struct dc_bios *bp; 1267 struct dc_bios *bp;
1278 struct dm_pp_static_clock_info static_clk_info = {0};
1279 1268
1280 ctx->dc_bios->regs = &bios_regs; 1269 ctx->dc_bios->regs = &bios_regs;
1281 1270
@@ -1334,11 +1323,11 @@ static bool dce83_construct(
1334 } 1323 }
1335 } 1324 }
1336 1325
1337 pool->base.dccg = dce_dccg_create(ctx, 1326 pool->base.clk_mgr = dce_clk_mgr_create(ctx,
1338 &disp_clk_regs, 1327 &disp_clk_regs,
1339 &disp_clk_shift, 1328 &disp_clk_shift,
1340 &disp_clk_mask); 1329 &disp_clk_mask);
1341 if (pool->base.dccg == NULL) { 1330 if (pool->base.clk_mgr == NULL) {
1342 dm_error("DC: failed to create display clock!\n"); 1331 dm_error("DC: failed to create display clock!\n");
1343 BREAK_TO_DEBUGGER(); 1332 BREAK_TO_DEBUGGER();
1344 goto res_create_fail; 1333 goto res_create_fail;
@@ -1364,10 +1353,6 @@ static bool dce83_construct(
1364 goto res_create_fail; 1353 goto res_create_fail;
1365 } 1354 }
1366 1355
1367 if (dm_pp_get_static_clocks(ctx, &static_clk_info))
1368 pool->base.dccg->max_clks_state =
1369 static_clk_info.max_clocks_state;
1370
1371 { 1356 {
1372 struct irq_service_init_data init_data; 1357 struct irq_service_init_data init_data;
1373 init_data.ctx = dc->ctx; 1358 init_data.ctx = dc->ctx;
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile
index 032f872be89c..55f293c8a3c0 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/Makefile
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/Makefile
@@ -24,7 +24,7 @@
24 24
25DCN10 = dcn10_resource.o dcn10_ipp.o dcn10_hw_sequencer.o dcn10_hw_sequencer_debug.o \ 25DCN10 = dcn10_resource.o dcn10_ipp.o dcn10_hw_sequencer.o dcn10_hw_sequencer_debug.o \
26 dcn10_dpp.o dcn10_opp.o dcn10_optc.o \ 26 dcn10_dpp.o dcn10_opp.o dcn10_optc.o \
27 dcn10_hubp.o dcn10_mpc.o \ 27 dcn10_hubp.o dcn10_mpc.o dcn10_clk_mgr.o \
28 dcn10_dpp_dscl.o dcn10_dpp_cm.o dcn10_cm_common.o \ 28 dcn10_dpp_dscl.o dcn10_dpp_cm.o dcn10_cm_common.o \
29 dcn10_hubbub.o dcn10_stream_encoder.o dcn10_link_encoder.o 29 dcn10_hubbub.o dcn10_stream_encoder.o dcn10_link_encoder.o
30 30
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c
new file mode 100644
index 000000000000..20f531d27e2b
--- /dev/null
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.c
@@ -0,0 +1,379 @@
1/*
2 * Copyright 2018 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: AMD
23 *
24 */
25
26#include "dcn10_clk_mgr.h"
27
28#include "reg_helper.h"
29#include "core_types.h"
30
31#define TO_DCE_CLK_MGR(clocks)\
32 container_of(clocks, struct dce_clk_mgr, base)
33
34#define REG(reg) \
35 (clk_mgr_dce->regs->reg)
36
37#undef FN
38#define FN(reg_name, field_name) \
39 clk_mgr_dce->clk_mgr_shift->field_name, clk_mgr_dce->clk_mgr_mask->field_name
40
41#define CTX \
42 clk_mgr_dce->base.ctx
43#define DC_LOGGER \
44 clk_mgr->ctx->logger
45
46void dcn1_pplib_apply_display_requirements(
47 struct dc *dc,
48 struct dc_state *context)
49{
50 struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg;
51
52 pp_display_cfg->min_engine_clock_khz = dc->res_pool->clk_mgr->clks.dcfclk_khz;
53 pp_display_cfg->min_memory_clock_khz = dc->res_pool->clk_mgr->clks.fclk_khz;
54 pp_display_cfg->min_engine_clock_deep_sleep_khz = dc->res_pool->clk_mgr->clks.dcfclk_deep_sleep_khz;
55 pp_display_cfg->min_dcfc_deep_sleep_clock_khz = dc->res_pool->clk_mgr->clks.dcfclk_deep_sleep_khz;
56 pp_display_cfg->min_dcfclock_khz = dc->res_pool->clk_mgr->clks.dcfclk_khz;
57 pp_display_cfg->disp_clk_khz = dc->res_pool->clk_mgr->clks.dispclk_khz;
58 dce110_fill_display_configs(context, pp_display_cfg);
59
60 dm_pp_apply_display_requirements(dc->ctx, pp_display_cfg);
61}
62
63static int dcn1_determine_dppclk_threshold(struct clk_mgr *clk_mgr, struct dc_clocks *new_clocks)
64{
65 bool request_dpp_div = new_clocks->dispclk_khz > new_clocks->dppclk_khz;
66 bool dispclk_increase = new_clocks->dispclk_khz > clk_mgr->clks.dispclk_khz;
67 int disp_clk_threshold = new_clocks->max_supported_dppclk_khz;
68 bool cur_dpp_div = clk_mgr->clks.dispclk_khz > clk_mgr->clks.dppclk_khz;
69
70 /* increase clock, looking for div is 0 for current, request div is 1*/
71 if (dispclk_increase) {
72 /* already divided by 2, no need to reach target clk with 2 steps*/
73 if (cur_dpp_div)
74 return new_clocks->dispclk_khz;
75
76 /* request disp clk is lower than maximum supported dpp clk,
77 * no need to reach target clk with two steps.
78 */
79 if (new_clocks->dispclk_khz <= disp_clk_threshold)
80 return new_clocks->dispclk_khz;
81
82 /* target dpp clk not request divided by 2, still within threshold */
83 if (!request_dpp_div)
84 return new_clocks->dispclk_khz;
85
86 } else {
87 /* decrease clock, looking for current dppclk divided by 2,
88 * request dppclk not divided by 2.
89 */
90
91 /* current dpp clk not divided by 2, no need to ramp*/
92 if (!cur_dpp_div)
93 return new_clocks->dispclk_khz;
94
95 /* current disp clk is lower than current maximum dpp clk,
96 * no need to ramp
97 */
98 if (clk_mgr->clks.dispclk_khz <= disp_clk_threshold)
99 return new_clocks->dispclk_khz;
100
101 /* request dpp clk need to be divided by 2 */
102 if (request_dpp_div)
103 return new_clocks->dispclk_khz;
104 }
105
106 return disp_clk_threshold;
107}
108
109static void dcn1_ramp_up_dispclk_with_dpp(struct clk_mgr *clk_mgr, struct dc_clocks *new_clocks)
110{
111 struct dc *dc = clk_mgr->ctx->dc;
112 int dispclk_to_dpp_threshold = dcn1_determine_dppclk_threshold(clk_mgr, new_clocks);
113 bool request_dpp_div = new_clocks->dispclk_khz > new_clocks->dppclk_khz;
114 int i;
115
116 /* set disp clk to dpp clk threshold */
117 dce112_set_clock(clk_mgr, dispclk_to_dpp_threshold);
118
119 /* update request dpp clk division option */
120 for (i = 0; i < dc->res_pool->pipe_count; i++) {
121 struct pipe_ctx *pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i];
122
123 if (!pipe_ctx->plane_state)
124 continue;
125
126 pipe_ctx->plane_res.dpp->funcs->dpp_dppclk_control(
127 pipe_ctx->plane_res.dpp,
128 request_dpp_div,
129 true);
130 }
131
132 /* If target clk not same as dppclk threshold, set to target clock */
133 if (dispclk_to_dpp_threshold != new_clocks->dispclk_khz)
134 dce112_set_clock(clk_mgr, new_clocks->dispclk_khz);
135
136 clk_mgr->clks.dispclk_khz = new_clocks->dispclk_khz;
137 clk_mgr->clks.dppclk_khz = new_clocks->dppclk_khz;
138 clk_mgr->clks.max_supported_dppclk_khz = new_clocks->max_supported_dppclk_khz;
139}
140
141static int get_active_display_cnt(
142 struct dc *dc,
143 struct dc_state *context)
144{
145 int i, display_count;
146
147 display_count = 0;
148 for (i = 0; i < context->stream_count; i++) {
149 const struct dc_stream_state *stream = context->streams[i];
150
151 /*
152 * Only notify active stream or virtual stream.
153 * Need to notify virtual stream to work around
154 * headless case. HPD does not fire when system is in
155 * S0i2.
156 */
157 if (!stream->dpms_off || stream->signal == SIGNAL_TYPE_VIRTUAL)
158 display_count++;
159 }
160
161 return display_count;
162}
163
164static void notify_deep_sleep_dcfclk_to_smu(
165 struct pp_smu_funcs_rv *pp_smu, int min_dcef_deep_sleep_clk_khz)
166{
167 int min_dcef_deep_sleep_clk_mhz; //minimum required DCEF Deep Sleep clock in mhz
168 /*
169 * if function pointer not set up, this message is
170 * sent as part of pplib_apply_display_requirements.
171 * So just return.
172 */
173 if (!pp_smu || !pp_smu->set_min_deep_sleep_dcfclk)
174 return;
175
176 min_dcef_deep_sleep_clk_mhz = (min_dcef_deep_sleep_clk_khz + 999) / 1000; //Round up
177 pp_smu->set_min_deep_sleep_dcfclk(&pp_smu->pp_smu, min_dcef_deep_sleep_clk_mhz);
178}
179
180static void notify_hard_min_dcfclk_to_smu(
181 struct pp_smu_funcs_rv *pp_smu, int min_dcf_clk_khz)
182{
183 int min_dcf_clk_mhz; //minimum required DCF clock in mhz
184
185 /*
186 * if function pointer not set up, this message is
187 * sent as part of pplib_apply_display_requirements.
188 * So just return.
189 */
190 if (!pp_smu || !pp_smu->set_hard_min_dcfclk_by_freq)
191 return;
192
193 min_dcf_clk_mhz = min_dcf_clk_khz / 1000;
194
195 pp_smu->set_hard_min_dcfclk_by_freq(&pp_smu->pp_smu, min_dcf_clk_mhz);
196}
197
198static void notify_hard_min_fclk_to_smu(
199 struct pp_smu_funcs_rv *pp_smu, int min_f_clk_khz)
200{
201 int min_f_clk_mhz; //minimum required F clock in mhz
202
203 /*
204 * if function pointer not set up, this message is
205 * sent as part of pplib_apply_display_requirements.
206 * So just return.
207 */
208 if (!pp_smu || !pp_smu->set_hard_min_fclk_by_freq)
209 return;
210
211 min_f_clk_mhz = min_f_clk_khz / 1000;
212
213 pp_smu->set_hard_min_fclk_by_freq(&pp_smu->pp_smu, min_f_clk_mhz);
214}
215
216static void dcn1_update_clocks(struct clk_mgr *clk_mgr,
217 struct dc_state *context,
218 bool safe_to_lower)
219{
220 struct dc *dc = clk_mgr->ctx->dc;
221 struct dc_clocks *new_clocks = &context->bw.dcn.clk;
222 struct pp_smu_display_requirement_rv *smu_req_cur =
223 &dc->res_pool->pp_smu_req;
224 struct pp_smu_display_requirement_rv smu_req = *smu_req_cur;
225 struct pp_smu_funcs_rv *pp_smu = dc->res_pool->pp_smu;
226 struct dm_pp_clock_for_voltage_req clock_voltage_req = {0};
227 bool send_request_to_increase = false;
228 bool send_request_to_lower = false;
229 int display_count;
230
231 bool enter_display_off = false;
232
233 display_count = get_active_display_cnt(dc, context);
234
235 if (display_count == 0)
236 enter_display_off = true;
237
238 if (enter_display_off == safe_to_lower) {
239 /*
240 * Notify SMU active displays
241 * if function pointer not set up, this message is
242 * sent as part of pplib_apply_display_requirements.
243 */
244 if (pp_smu->set_display_count)
245 pp_smu->set_display_count(&pp_smu->pp_smu, display_count);
246 else
247 smu_req.display_count = display_count;
248
249 }
250
251 if (new_clocks->dispclk_khz > clk_mgr->clks.dispclk_khz
252 || new_clocks->phyclk_khz > clk_mgr->clks.phyclk_khz
253 || new_clocks->fclk_khz > clk_mgr->clks.fclk_khz
254 || new_clocks->dcfclk_khz > clk_mgr->clks.dcfclk_khz)
255 send_request_to_increase = true;
256
257 if (should_set_clock(safe_to_lower, new_clocks->phyclk_khz, clk_mgr->clks.phyclk_khz)) {
258 clk_mgr->clks.phyclk_khz = new_clocks->phyclk_khz;
259
260 send_request_to_lower = true;
261 }
262
263 // F Clock
264 if (should_set_clock(safe_to_lower, new_clocks->fclk_khz, clk_mgr->clks.fclk_khz)) {
265 clk_mgr->clks.fclk_khz = new_clocks->fclk_khz;
266 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_FCLK;
267 clock_voltage_req.clocks_in_khz = new_clocks->fclk_khz;
268 smu_req.hard_min_fclk_mhz = new_clocks->fclk_khz / 1000;
269
270 notify_hard_min_fclk_to_smu(pp_smu, new_clocks->fclk_khz);
271
272 send_request_to_lower = true;
273 }
274
275 //DCF Clock
276 if (should_set_clock(safe_to_lower, new_clocks->dcfclk_khz, clk_mgr->clks.dcfclk_khz)) {
277 clk_mgr->clks.dcfclk_khz = new_clocks->dcfclk_khz;
278 smu_req.hard_min_dcefclk_mhz = new_clocks->dcfclk_khz / 1000;
279
280 send_request_to_lower = true;
281 }
282
283 if (should_set_clock(safe_to_lower,
284 new_clocks->dcfclk_deep_sleep_khz, clk_mgr->clks.dcfclk_deep_sleep_khz)) {
285 clk_mgr->clks.dcfclk_deep_sleep_khz = new_clocks->dcfclk_deep_sleep_khz;
286 smu_req.min_deep_sleep_dcefclk_mhz = new_clocks->dcfclk_deep_sleep_khz / 1000;
287
288 send_request_to_lower = true;
289 }
290
291 /* make sure dcf clk is before dpp clk to
292 * make sure we have enough voltage to run dpp clk
293 */
294 if (send_request_to_increase) {
295 /*use dcfclk to request voltage*/
296 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DCFCLK;
297 clock_voltage_req.clocks_in_khz = dcn_find_dcfclk_suits_all(dc, new_clocks);
298
299 notify_hard_min_dcfclk_to_smu(pp_smu, clock_voltage_req.clocks_in_khz);
300
301 if (pp_smu->set_display_requirement)
302 pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req);
303
304 notify_deep_sleep_dcfclk_to_smu(pp_smu, clk_mgr->clks.dcfclk_deep_sleep_khz);
305 dcn1_pplib_apply_display_requirements(dc, context);
306 }
307
308 /* dcn1 dppclk is tied to dispclk */
309 /* program dispclk on = as a w/a for sleep resume clock ramping issues */
310 if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, clk_mgr->clks.dispclk_khz)
311 || new_clocks->dispclk_khz == clk_mgr->clks.dispclk_khz) {
312 dcn1_ramp_up_dispclk_with_dpp(clk_mgr, new_clocks);
313 clk_mgr->clks.dispclk_khz = new_clocks->dispclk_khz;
314
315 send_request_to_lower = true;
316 }
317
318 if (!send_request_to_increase && send_request_to_lower) {
319 /*use dcfclk to request voltage*/
320 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DCFCLK;
321 clock_voltage_req.clocks_in_khz = dcn_find_dcfclk_suits_all(dc, new_clocks);
322
323 notify_hard_min_dcfclk_to_smu(pp_smu, clock_voltage_req.clocks_in_khz);
324
325 if (pp_smu->set_display_requirement)
326 pp_smu->set_display_requirement(&pp_smu->pp_smu, &smu_req);
327
328 notify_deep_sleep_dcfclk_to_smu(pp_smu, clk_mgr->clks.dcfclk_deep_sleep_khz);
329 dcn1_pplib_apply_display_requirements(dc, context);
330 }
331
332
333 *smu_req_cur = smu_req;
334}
335
336static const struct clk_mgr_funcs dcn1_funcs = {
337 .get_dp_ref_clk_frequency = dce12_get_dp_ref_freq_khz,
338 .update_clocks = dcn1_update_clocks
339};
340
341struct clk_mgr *dcn1_clk_mgr_create(struct dc_context *ctx)
342{
343 struct dc_debug_options *debug = &ctx->dc->debug;
344 struct dc_bios *bp = ctx->dc_bios;
345 struct dc_firmware_info fw_info = { { 0 } };
346 struct dce_clk_mgr *clk_mgr_dce = kzalloc(sizeof(*clk_mgr_dce), GFP_KERNEL);
347
348 if (clk_mgr_dce == NULL) {
349 BREAK_TO_DEBUGGER();
350 return NULL;
351 }
352
353 clk_mgr_dce->base.ctx = ctx;
354 clk_mgr_dce->base.funcs = &dcn1_funcs;
355
356 clk_mgr_dce->dfs_bypass_disp_clk = 0;
357
358 clk_mgr_dce->dprefclk_ss_percentage = 0;
359 clk_mgr_dce->dprefclk_ss_divider = 1000;
360 clk_mgr_dce->ss_on_dprefclk = false;
361
362 clk_mgr_dce->dprefclk_khz = 600000;
363 if (bp->integrated_info)
364 clk_mgr_dce->dentist_vco_freq_khz = bp->integrated_info->dentist_vco_freq;
365 if (clk_mgr_dce->dentist_vco_freq_khz == 0) {
366 bp->funcs->get_firmware_info(bp, &fw_info);
367 clk_mgr_dce->dentist_vco_freq_khz = fw_info.smu_gpu_pll_output_freq;
368 if (clk_mgr_dce->dentist_vco_freq_khz == 0)
369 clk_mgr_dce->dentist_vco_freq_khz = 3600000;
370 }
371
372 if (!debug->disable_dfs_bypass && bp->integrated_info)
373 if (bp->integrated_info->gpu_cap_info & DFS_BYPASS_ENABLE)
374 clk_mgr_dce->dfs_bypass_enabled = true;
375
376 dce_clock_read_ss_info(clk_mgr_dce);
377
378 return &clk_mgr_dce->base;
379}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.h
new file mode 100644
index 000000000000..9dbaf6578006
--- /dev/null
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_clk_mgr.h
@@ -0,0 +1,37 @@
1/*
2 * Copyright 2018 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: AMD
23 *
24 */
25
26#ifndef __DCN10_CLK_MGR_H__
27#define __DCN10_CLK_MGR_H__
28
29#include "../dce/dce_clk_mgr.h"
30
31void dcn1_pplib_apply_display_requirements(
32 struct dc *dc,
33 struct dc_state *context);
34
35struct clk_mgr *dcn1_clk_mgr_create(struct dc_context *ctx);
36
37#endif //__DCN10_CLK_MGR_H__
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c
index 5d95a997fd9f..3eea44092a04 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.c
@@ -71,39 +71,39 @@ void cm_helper_program_xfer_func(
71 unsigned int i = 0; 71 unsigned int i = 0;
72 72
73 REG_SET_2(reg->start_cntl_b, 0, 73 REG_SET_2(reg->start_cntl_b, 0,
74 exp_region_start, params->arr_points[0].custom_float_x, 74 exp_region_start, params->corner_points[0].blue.custom_float_x,
75 exp_resion_start_segment, 0); 75 exp_resion_start_segment, 0);
76 REG_SET_2(reg->start_cntl_g, 0, 76 REG_SET_2(reg->start_cntl_g, 0,
77 exp_region_start, params->arr_points[0].custom_float_x, 77 exp_region_start, params->corner_points[0].green.custom_float_x,
78 exp_resion_start_segment, 0); 78 exp_resion_start_segment, 0);
79 REG_SET_2(reg->start_cntl_r, 0, 79 REG_SET_2(reg->start_cntl_r, 0,
80 exp_region_start, params->arr_points[0].custom_float_x, 80 exp_region_start, params->corner_points[0].red.custom_float_x,
81 exp_resion_start_segment, 0); 81 exp_resion_start_segment, 0);
82 82
83 REG_SET(reg->start_slope_cntl_b, 0, 83 REG_SET(reg->start_slope_cntl_b, 0,
84 field_region_linear_slope, params->arr_points[0].custom_float_slope); 84 field_region_linear_slope, params->corner_points[0].blue.custom_float_slope);
85 REG_SET(reg->start_slope_cntl_g, 0, 85 REG_SET(reg->start_slope_cntl_g, 0,
86 field_region_linear_slope, params->arr_points[0].custom_float_slope); 86 field_region_linear_slope, params->corner_points[0].green.custom_float_slope);
87 REG_SET(reg->start_slope_cntl_r, 0, 87 REG_SET(reg->start_slope_cntl_r, 0,
88 field_region_linear_slope, params->arr_points[0].custom_float_slope); 88 field_region_linear_slope, params->corner_points[0].red.custom_float_slope);
89 89
90 REG_SET(reg->start_end_cntl1_b, 0, 90 REG_SET(reg->start_end_cntl1_b, 0,
91 field_region_end, params->arr_points[1].custom_float_x); 91 field_region_end, params->corner_points[1].blue.custom_float_x);
92 REG_SET_2(reg->start_end_cntl2_b, 0, 92 REG_SET_2(reg->start_end_cntl2_b, 0,
93 field_region_end_slope, params->arr_points[1].custom_float_slope, 93 field_region_end_slope, params->corner_points[1].blue.custom_float_slope,
94 field_region_end_base, params->arr_points[1].custom_float_y); 94 field_region_end_base, params->corner_points[1].blue.custom_float_y);
95 95
96 REG_SET(reg->start_end_cntl1_g, 0, 96 REG_SET(reg->start_end_cntl1_g, 0,
97 field_region_end, params->arr_points[1].custom_float_x); 97 field_region_end, params->corner_points[1].green.custom_float_x);
98 REG_SET_2(reg->start_end_cntl2_g, 0, 98 REG_SET_2(reg->start_end_cntl2_g, 0,
99 field_region_end_slope, params->arr_points[1].custom_float_slope, 99 field_region_end_slope, params->corner_points[1].green.custom_float_slope,
100 field_region_end_base, params->arr_points[1].custom_float_y); 100 field_region_end_base, params->corner_points[1].green.custom_float_y);
101 101
102 REG_SET(reg->start_end_cntl1_r, 0, 102 REG_SET(reg->start_end_cntl1_r, 0,
103 field_region_end, params->arr_points[1].custom_float_x); 103 field_region_end, params->corner_points[1].red.custom_float_x);
104 REG_SET_2(reg->start_end_cntl2_r, 0, 104 REG_SET_2(reg->start_end_cntl2_r, 0,
105 field_region_end_slope, params->arr_points[1].custom_float_slope, 105 field_region_end_slope, params->corner_points[1].red.custom_float_slope,
106 field_region_end_base, params->arr_points[1].custom_float_y); 106 field_region_end_base, params->corner_points[1].red.custom_float_y);
107 107
108 for (reg_region_cur = reg->region_start; 108 for (reg_region_cur = reg->region_start;
109 reg_region_cur <= reg->region_end; 109 reg_region_cur <= reg->region_end;
@@ -127,7 +127,7 @@ void cm_helper_program_xfer_func(
127 127
128bool cm_helper_convert_to_custom_float( 128bool cm_helper_convert_to_custom_float(
129 struct pwl_result_data *rgb_resulted, 129 struct pwl_result_data *rgb_resulted,
130 struct curve_points *arr_points, 130 struct curve_points3 *corner_points,
131 uint32_t hw_points_num, 131 uint32_t hw_points_num,
132 bool fixpoint) 132 bool fixpoint)
133{ 133{
@@ -141,20 +141,53 @@ bool cm_helper_convert_to_custom_float(
141 fmt.mantissa_bits = 12; 141 fmt.mantissa_bits = 12;
142 fmt.sign = false; 142 fmt.sign = false;
143 143
144 if (!convert_to_custom_float_format(arr_points[0].x, &fmt, 144 /* corner_points[0] - beginning base, slope offset for R,G,B
145 &arr_points[0].custom_float_x)) { 145 * corner_points[1] - end base, slope offset for R,G,B
146 */
147 if (!convert_to_custom_float_format(corner_points[0].red.x, &fmt,
148 &corner_points[0].red.custom_float_x)) {
149 BREAK_TO_DEBUGGER();
150 return false;
151 }
152 if (!convert_to_custom_float_format(corner_points[0].green.x, &fmt,
153 &corner_points[0].green.custom_float_x)) {
154 BREAK_TO_DEBUGGER();
155 return false;
156 }
157 if (!convert_to_custom_float_format(corner_points[0].blue.x, &fmt,
158 &corner_points[0].blue.custom_float_x)) {
146 BREAK_TO_DEBUGGER(); 159 BREAK_TO_DEBUGGER();
147 return false; 160 return false;
148 } 161 }
149 162
150 if (!convert_to_custom_float_format(arr_points[0].offset, &fmt, 163 if (!convert_to_custom_float_format(corner_points[0].red.offset, &fmt,
151 &arr_points[0].custom_float_offset)) { 164 &corner_points[0].red.custom_float_offset)) {
165 BREAK_TO_DEBUGGER();
166 return false;
167 }
168 if (!convert_to_custom_float_format(corner_points[0].green.offset, &fmt,
169 &corner_points[0].green.custom_float_offset)) {
170 BREAK_TO_DEBUGGER();
171 return false;
172 }
173 if (!convert_to_custom_float_format(corner_points[0].blue.offset, &fmt,
174 &corner_points[0].blue.custom_float_offset)) {
152 BREAK_TO_DEBUGGER(); 175 BREAK_TO_DEBUGGER();
153 return false; 176 return false;
154 } 177 }
155 178
156 if (!convert_to_custom_float_format(arr_points[0].slope, &fmt, 179 if (!convert_to_custom_float_format(corner_points[0].red.slope, &fmt,
157 &arr_points[0].custom_float_slope)) { 180 &corner_points[0].red.custom_float_slope)) {
181 BREAK_TO_DEBUGGER();
182 return false;
183 }
184 if (!convert_to_custom_float_format(corner_points[0].green.slope, &fmt,
185 &corner_points[0].green.custom_float_slope)) {
186 BREAK_TO_DEBUGGER();
187 return false;
188 }
189 if (!convert_to_custom_float_format(corner_points[0].blue.slope, &fmt,
190 &corner_points[0].blue.custom_float_slope)) {
158 BREAK_TO_DEBUGGER(); 191 BREAK_TO_DEBUGGER();
159 return false; 192 return false;
160 } 193 }
@@ -162,22 +195,59 @@ bool cm_helper_convert_to_custom_float(
162 fmt.mantissa_bits = 10; 195 fmt.mantissa_bits = 10;
163 fmt.sign = false; 196 fmt.sign = false;
164 197
165 if (!convert_to_custom_float_format(arr_points[1].x, &fmt, 198 if (!convert_to_custom_float_format(corner_points[1].red.x, &fmt,
166 &arr_points[1].custom_float_x)) { 199 &corner_points[1].red.custom_float_x)) {
167 BREAK_TO_DEBUGGER(); 200 BREAK_TO_DEBUGGER();
168 return false; 201 return false;
169 } 202 }
170 203 if (!convert_to_custom_float_format(corner_points[1].green.x, &fmt,
171 if (fixpoint == true) 204 &corner_points[1].green.custom_float_x)) {
172 arr_points[1].custom_float_y = dc_fixpt_clamp_u0d14(arr_points[1].y); 205 BREAK_TO_DEBUGGER();
173 else if (!convert_to_custom_float_format(arr_points[1].y, &fmt, 206 return false;
174 &arr_points[1].custom_float_y)) { 207 }
208 if (!convert_to_custom_float_format(corner_points[1].blue.x, &fmt,
209 &corner_points[1].blue.custom_float_x)) {
175 BREAK_TO_DEBUGGER(); 210 BREAK_TO_DEBUGGER();
176 return false; 211 return false;
177 } 212 }
178 213
179 if (!convert_to_custom_float_format(arr_points[1].slope, &fmt, 214 if (fixpoint == true) {
180 &arr_points[1].custom_float_slope)) { 215 corner_points[1].red.custom_float_y =
216 dc_fixpt_clamp_u0d14(corner_points[1].red.y);
217 corner_points[1].green.custom_float_y =
218 dc_fixpt_clamp_u0d14(corner_points[1].green.y);
219 corner_points[1].blue.custom_float_y =
220 dc_fixpt_clamp_u0d14(corner_points[1].blue.y);
221 } else {
222 if (!convert_to_custom_float_format(corner_points[1].red.y,
223 &fmt, &corner_points[1].red.custom_float_y)) {
224 BREAK_TO_DEBUGGER();
225 return false;
226 }
227 if (!convert_to_custom_float_format(corner_points[1].green.y,
228 &fmt, &corner_points[1].green.custom_float_y)) {
229 BREAK_TO_DEBUGGER();
230 return false;
231 }
232 if (!convert_to_custom_float_format(corner_points[1].blue.y,
233 &fmt, &corner_points[1].blue.custom_float_y)) {
234 BREAK_TO_DEBUGGER();
235 return false;
236 }
237 }
238
239 if (!convert_to_custom_float_format(corner_points[1].red.slope, &fmt,
240 &corner_points[1].red.custom_float_slope)) {
241 BREAK_TO_DEBUGGER();
242 return false;
243 }
244 if (!convert_to_custom_float_format(corner_points[1].green.slope, &fmt,
245 &corner_points[1].green.custom_float_slope)) {
246 BREAK_TO_DEBUGGER();
247 return false;
248 }
249 if (!convert_to_custom_float_format(corner_points[1].blue.slope, &fmt,
250 &corner_points[1].blue.custom_float_slope)) {
181 BREAK_TO_DEBUGGER(); 251 BREAK_TO_DEBUGGER();
182 return false; 252 return false;
183 } 253 }
@@ -242,15 +312,10 @@ bool cm_helper_translate_curve_to_hw_format(
242 const struct dc_transfer_func *output_tf, 312 const struct dc_transfer_func *output_tf,
243 struct pwl_params *lut_params, bool fixpoint) 313 struct pwl_params *lut_params, bool fixpoint)
244{ 314{
245 struct curve_points *arr_points; 315 struct curve_points3 *corner_points;
246 struct pwl_result_data *rgb_resulted; 316 struct pwl_result_data *rgb_resulted;
247 struct pwl_result_data *rgb; 317 struct pwl_result_data *rgb;
248 struct pwl_result_data *rgb_plus_1; 318 struct pwl_result_data *rgb_plus_1;
249 struct fixed31_32 y_r;
250 struct fixed31_32 y_g;
251 struct fixed31_32 y_b;
252 struct fixed31_32 y1_min;
253 struct fixed31_32 y3_max;
254 319
255 int32_t region_start, region_end; 320 int32_t region_start, region_end;
256 int32_t i; 321 int32_t i;
@@ -261,14 +326,14 @@ bool cm_helper_translate_curve_to_hw_format(
261 326
262 PERF_TRACE(); 327 PERF_TRACE();
263 328
264 arr_points = lut_params->arr_points; 329 corner_points = lut_params->corner_points;
265 rgb_resulted = lut_params->rgb_resulted; 330 rgb_resulted = lut_params->rgb_resulted;
266 hw_points = 0; 331 hw_points = 0;
267 332
268 memset(lut_params, 0, sizeof(struct pwl_params)); 333 memset(lut_params, 0, sizeof(struct pwl_params));
269 memset(seg_distr, 0, sizeof(seg_distr)); 334 memset(seg_distr, 0, sizeof(seg_distr));
270 335
271 if (output_tf->tf == TRANSFER_FUNCTION_PQ) { 336 if (output_tf->tf == TRANSFER_FUNCTION_PQ || output_tf->tf == TRANSFER_FUNCTION_GAMMA22) {
272 /* 32 segments 337 /* 32 segments
273 * segments are from 2^-25 to 2^7 338 * segments are from 2^-25 to 2^7
274 */ 339 */
@@ -327,31 +392,37 @@ bool cm_helper_translate_curve_to_hw_format(
327 rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index]; 392 rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
328 rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index]; 393 rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
329 394
330 arr_points[0].x = dc_fixpt_pow(dc_fixpt_from_int(2), 395 // All 3 color channels have same x
396 corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
331 dc_fixpt_from_int(region_start)); 397 dc_fixpt_from_int(region_start));
332 arr_points[1].x = dc_fixpt_pow(dc_fixpt_from_int(2), 398 corner_points[0].green.x = corner_points[0].red.x;
333 dc_fixpt_from_int(region_end)); 399 corner_points[0].blue.x = corner_points[0].red.x;
334 400
335 y_r = rgb_resulted[0].red; 401 corner_points[1].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
336 y_g = rgb_resulted[0].green; 402 dc_fixpt_from_int(region_end));
337 y_b = rgb_resulted[0].blue; 403 corner_points[1].green.x = corner_points[1].red.x;
404 corner_points[1].blue.x = corner_points[1].red.x;
338 405
339 y1_min = dc_fixpt_min(y_r, dc_fixpt_min(y_g, y_b)); 406 corner_points[0].red.y = rgb_resulted[0].red;
407 corner_points[0].green.y = rgb_resulted[0].green;
408 corner_points[0].blue.y = rgb_resulted[0].blue;
340 409
341 arr_points[0].y = y1_min; 410 corner_points[0].red.slope = dc_fixpt_div(corner_points[0].red.y,
342 arr_points[0].slope = dc_fixpt_div(arr_points[0].y, arr_points[0].x); 411 corner_points[0].red.x);
343 y_r = rgb_resulted[hw_points - 1].red; 412 corner_points[0].green.slope = dc_fixpt_div(corner_points[0].green.y,
344 y_g = rgb_resulted[hw_points - 1].green; 413 corner_points[0].green.x);
345 y_b = rgb_resulted[hw_points - 1].blue; 414 corner_points[0].blue.slope = dc_fixpt_div(corner_points[0].blue.y,
415 corner_points[0].blue.x);
346 416
347 /* see comment above, m_arrPoints[1].y should be the Y value for the 417 /* see comment above, m_arrPoints[1].y should be the Y value for the
348 * region end (m_numOfHwPoints), not last HW point(m_numOfHwPoints - 1) 418 * region end (m_numOfHwPoints), not last HW point(m_numOfHwPoints - 1)
349 */ 419 */
350 y3_max = dc_fixpt_max(y_r, dc_fixpt_max(y_g, y_b)); 420 corner_points[1].red.y = rgb_resulted[hw_points - 1].red;
351 421 corner_points[1].green.y = rgb_resulted[hw_points - 1].green;
352 arr_points[1].y = y3_max; 422 corner_points[1].blue.y = rgb_resulted[hw_points - 1].blue;
353 423 corner_points[1].red.slope = dc_fixpt_zero;
354 arr_points[1].slope = dc_fixpt_zero; 424 corner_points[1].green.slope = dc_fixpt_zero;
425 corner_points[1].blue.slope = dc_fixpt_zero;
355 426
356 if (output_tf->tf == TRANSFER_FUNCTION_PQ) { 427 if (output_tf->tf == TRANSFER_FUNCTION_PQ) {
357 /* for PQ, we want to have a straight line from last HW X point, 428 /* for PQ, we want to have a straight line from last HW X point,
@@ -360,9 +431,15 @@ bool cm_helper_translate_curve_to_hw_format(
360 const struct fixed31_32 end_value = 431 const struct fixed31_32 end_value =
361 dc_fixpt_from_int(125); 432 dc_fixpt_from_int(125);
362 433
363 arr_points[1].slope = dc_fixpt_div( 434 corner_points[1].red.slope = dc_fixpt_div(
364 dc_fixpt_sub(dc_fixpt_one, arr_points[1].y), 435 dc_fixpt_sub(dc_fixpt_one, corner_points[1].red.y),
365 dc_fixpt_sub(end_value, arr_points[1].x)); 436 dc_fixpt_sub(end_value, corner_points[1].red.x));
437 corner_points[1].green.slope = dc_fixpt_div(
438 dc_fixpt_sub(dc_fixpt_one, corner_points[1].green.y),
439 dc_fixpt_sub(end_value, corner_points[1].green.x));
440 corner_points[1].blue.slope = dc_fixpt_div(
441 dc_fixpt_sub(dc_fixpt_one, corner_points[1].blue.y),
442 dc_fixpt_sub(end_value, corner_points[1].blue.x));
366 } 443 }
367 444
368 lut_params->hw_points_num = hw_points; 445 lut_params->hw_points_num = hw_points;
@@ -411,7 +488,7 @@ bool cm_helper_translate_curve_to_hw_format(
411 ++i; 488 ++i;
412 } 489 }
413 cm_helper_convert_to_custom_float(rgb_resulted, 490 cm_helper_convert_to_custom_float(rgb_resulted,
414 lut_params->arr_points, 491 lut_params->corner_points,
415 hw_points, fixpoint); 492 hw_points, fixpoint);
416 493
417 return true; 494 return true;
@@ -424,15 +501,10 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
424 const struct dc_transfer_func *output_tf, 501 const struct dc_transfer_func *output_tf,
425 struct pwl_params *lut_params) 502 struct pwl_params *lut_params)
426{ 503{
427 struct curve_points *arr_points; 504 struct curve_points3 *corner_points;
428 struct pwl_result_data *rgb_resulted; 505 struct pwl_result_data *rgb_resulted;
429 struct pwl_result_data *rgb; 506 struct pwl_result_data *rgb;
430 struct pwl_result_data *rgb_plus_1; 507 struct pwl_result_data *rgb_plus_1;
431 struct fixed31_32 y_r;
432 struct fixed31_32 y_g;
433 struct fixed31_32 y_b;
434 struct fixed31_32 y1_min;
435 struct fixed31_32 y3_max;
436 508
437 int32_t region_start, region_end; 509 int32_t region_start, region_end;
438 int32_t i; 510 int32_t i;
@@ -443,7 +515,7 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
443 515
444 PERF_TRACE(); 516 PERF_TRACE();
445 517
446 arr_points = lut_params->arr_points; 518 corner_points = lut_params->corner_points;
447 rgb_resulted = lut_params->rgb_resulted; 519 rgb_resulted = lut_params->rgb_resulted;
448 hw_points = 0; 520 hw_points = 0;
449 521
@@ -489,31 +561,28 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
489 rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index]; 561 rgb_resulted[hw_points - 1].green = output_tf->tf_pts.green[start_index];
490 rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index]; 562 rgb_resulted[hw_points - 1].blue = output_tf->tf_pts.blue[start_index];
491 563
492 arr_points[0].x = dc_fixpt_pow(dc_fixpt_from_int(2), 564 corner_points[0].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
493 dc_fixpt_from_int(region_start)); 565 dc_fixpt_from_int(region_start));
494 arr_points[1].x = dc_fixpt_pow(dc_fixpt_from_int(2), 566 corner_points[0].green.x = corner_points[0].red.x;
567 corner_points[0].blue.x = corner_points[0].red.x;
568 corner_points[1].red.x = dc_fixpt_pow(dc_fixpt_from_int(2),
495 dc_fixpt_from_int(region_end)); 569 dc_fixpt_from_int(region_end));
570 corner_points[1].green.x = corner_points[1].red.x;
571 corner_points[1].blue.x = corner_points[1].red.x;
496 572
497 y_r = rgb_resulted[0].red; 573 corner_points[0].red.y = rgb_resulted[0].red;
498 y_g = rgb_resulted[0].green; 574 corner_points[0].green.y = rgb_resulted[0].green;
499 y_b = rgb_resulted[0].blue; 575 corner_points[0].blue.y = rgb_resulted[0].blue;
500
501 y1_min = dc_fixpt_min(y_r, dc_fixpt_min(y_g, y_b));
502
503 arr_points[0].y = y1_min;
504 arr_points[0].slope = dc_fixpt_div(arr_points[0].y, arr_points[0].x);
505 y_r = rgb_resulted[hw_points - 1].red;
506 y_g = rgb_resulted[hw_points - 1].green;
507 y_b = rgb_resulted[hw_points - 1].blue;
508 576
509 /* see comment above, m_arrPoints[1].y should be the Y value for the 577 /* see comment above, m_arrPoints[1].y should be the Y value for the
510 * region end (m_numOfHwPoints), not last HW point(m_numOfHwPoints - 1) 578 * region end (m_numOfHwPoints), not last HW point(m_numOfHwPoints - 1)
511 */ 579 */
512 y3_max = dc_fixpt_max(y_r, dc_fixpt_max(y_g, y_b)); 580 corner_points[1].red.y = rgb_resulted[hw_points - 1].red;
513 581 corner_points[1].green.y = rgb_resulted[hw_points - 1].green;
514 arr_points[1].y = y3_max; 582 corner_points[1].blue.y = rgb_resulted[hw_points - 1].blue;
515 583 corner_points[1].red.slope = dc_fixpt_zero;
516 arr_points[1].slope = dc_fixpt_zero; 584 corner_points[1].green.slope = dc_fixpt_zero;
585 corner_points[1].blue.slope = dc_fixpt_zero;
517 586
518 if (output_tf->tf == TRANSFER_FUNCTION_PQ) { 587 if (output_tf->tf == TRANSFER_FUNCTION_PQ) {
519 /* for PQ, we want to have a straight line from last HW X point, 588 /* for PQ, we want to have a straight line from last HW X point,
@@ -522,9 +591,15 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
522 const struct fixed31_32 end_value = 591 const struct fixed31_32 end_value =
523 dc_fixpt_from_int(125); 592 dc_fixpt_from_int(125);
524 593
525 arr_points[1].slope = dc_fixpt_div( 594 corner_points[1].red.slope = dc_fixpt_div(
526 dc_fixpt_sub(dc_fixpt_one, arr_points[1].y), 595 dc_fixpt_sub(dc_fixpt_one, corner_points[1].red.y),
527 dc_fixpt_sub(end_value, arr_points[1].x)); 596 dc_fixpt_sub(end_value, corner_points[1].red.x));
597 corner_points[1].green.slope = dc_fixpt_div(
598 dc_fixpt_sub(dc_fixpt_one, corner_points[1].green.y),
599 dc_fixpt_sub(end_value, corner_points[1].green.x));
600 corner_points[1].blue.slope = dc_fixpt_div(
601 dc_fixpt_sub(dc_fixpt_one, corner_points[1].blue.y),
602 dc_fixpt_sub(end_value, corner_points[1].blue.x));
528 } 603 }
529 604
530 lut_params->hw_points_num = hw_points; 605 lut_params->hw_points_num = hw_points;
@@ -564,7 +639,7 @@ bool cm_helper_translate_curve_to_degamma_hw_format(
564 ++i; 639 ++i;
565 } 640 }
566 cm_helper_convert_to_custom_float(rgb_resulted, 641 cm_helper_convert_to_custom_float(rgb_resulted,
567 lut_params->arr_points, 642 lut_params->corner_points,
568 hw_points, false); 643 hw_points, false);
569 644
570 return true; 645 return true;
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.h
index 7a531b02871f..5ae4d69391a5 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_cm_common.h
@@ -98,7 +98,7 @@ void cm_helper_program_xfer_func(
98 98
99bool cm_helper_convert_to_custom_float( 99bool cm_helper_convert_to_custom_float(
100 struct pwl_result_data *rgb_resulted, 100 struct pwl_result_data *rgb_resulted,
101 struct curve_points *arr_points, 101 struct curve_points3 *corner_points,
102 uint32_t hw_points_num, 102 uint32_t hw_points_num,
103 bool fixpoint); 103 bool fixpoint);
104 104
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index 193184affefb..87495dea45ec 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -45,6 +45,7 @@
45#include "dcn10_hubbub.h" 45#include "dcn10_hubbub.h"
46#include "dcn10_cm_common.h" 46#include "dcn10_cm_common.h"
47#include "dc_link_dp.h" 47#include "dc_link_dp.h"
48#include "dccg.h"
48 49
49#define DC_LOGGER_INIT(logger) 50#define DC_LOGGER_INIT(logger)
50 51
@@ -786,7 +787,7 @@ static bool dcn10_hw_wa_force_recovery(struct dc *dc)
786 &dc->current_state->res_ctx.pipe_ctx[i]; 787 &dc->current_state->res_ctx.pipe_ctx[i];
787 if (pipe_ctx != NULL) { 788 if (pipe_ctx != NULL) {
788 hubp = pipe_ctx->plane_res.hubp; 789 hubp = pipe_ctx->plane_res.hubp;
789 if (hubp != NULL) { 790 if (hubp != NULL && hubp->funcs->hubp_get_underflow_status) {
790 if (hubp->funcs->hubp_get_underflow_status(hubp) != 0) { 791 if (hubp->funcs->hubp_get_underflow_status(hubp) != 0) {
791 /* one pipe underflow, we will reset all the pipes*/ 792 /* one pipe underflow, we will reset all the pipes*/
792 need_recover = true; 793 need_recover = true;
@@ -812,7 +813,7 @@ static bool dcn10_hw_wa_force_recovery(struct dc *dc)
812 if (pipe_ctx != NULL) { 813 if (pipe_ctx != NULL) {
813 hubp = pipe_ctx->plane_res.hubp; 814 hubp = pipe_ctx->plane_res.hubp;
814 /*DCHUBP_CNTL:HUBP_BLANK_EN=1*/ 815 /*DCHUBP_CNTL:HUBP_BLANK_EN=1*/
815 if (hubp != NULL) 816 if (hubp != NULL && hubp->funcs->set_hubp_blank_en)
816 hubp->funcs->set_hubp_blank_en(hubp, true); 817 hubp->funcs->set_hubp_blank_en(hubp, true);
817 } 818 }
818 } 819 }
@@ -825,7 +826,7 @@ static bool dcn10_hw_wa_force_recovery(struct dc *dc)
825 if (pipe_ctx != NULL) { 826 if (pipe_ctx != NULL) {
826 hubp = pipe_ctx->plane_res.hubp; 827 hubp = pipe_ctx->plane_res.hubp;
827 /*DCHUBP_CNTL:HUBP_DISABLE=1*/ 828 /*DCHUBP_CNTL:HUBP_DISABLE=1*/
828 if (hubp != NULL) 829 if (hubp != NULL && hubp->funcs->hubp_disable_control)
829 hubp->funcs->hubp_disable_control(hubp, true); 830 hubp->funcs->hubp_disable_control(hubp, true);
830 } 831 }
831 } 832 }
@@ -835,7 +836,7 @@ static bool dcn10_hw_wa_force_recovery(struct dc *dc)
835 if (pipe_ctx != NULL) { 836 if (pipe_ctx != NULL) {
836 hubp = pipe_ctx->plane_res.hubp; 837 hubp = pipe_ctx->plane_res.hubp;
837 /*DCHUBP_CNTL:HUBP_DISABLE=0*/ 838 /*DCHUBP_CNTL:HUBP_DISABLE=0*/
838 if (hubp != NULL) 839 if (hubp != NULL && hubp->funcs->hubp_disable_control)
839 hubp->funcs->hubp_disable_control(hubp, true); 840 hubp->funcs->hubp_disable_control(hubp, true);
840 } 841 }
841 } 842 }
@@ -847,7 +848,7 @@ static bool dcn10_hw_wa_force_recovery(struct dc *dc)
847 if (pipe_ctx != NULL) { 848 if (pipe_ctx != NULL) {
848 hubp = pipe_ctx->plane_res.hubp; 849 hubp = pipe_ctx->plane_res.hubp;
849 /*DCHUBP_CNTL:HUBP_BLANK_EN=0*/ 850 /*DCHUBP_CNTL:HUBP_BLANK_EN=0*/
850 if (hubp != NULL) 851 if (hubp != NULL && hubp->funcs->set_hubp_blank_en)
851 hubp->funcs->set_hubp_blank_en(hubp, true); 852 hubp->funcs->set_hubp_blank_en(hubp, true);
852 } 853 }
853 } 854 }
@@ -1126,7 +1127,7 @@ static void dcn10_init_hw(struct dc *dc)
1126 1127
1127 enable_power_gating_plane(dc->hwseq, true); 1128 enable_power_gating_plane(dc->hwseq, true);
1128 1129
1129 memset(&dc->res_pool->dccg->clks, 0, sizeof(dc->res_pool->dccg->clks)); 1130 memset(&dc->res_pool->clk_mgr->clks, 0, sizeof(dc->res_pool->clk_mgr->clks));
1130} 1131}
1131 1132
1132static void reset_hw_ctx_wrap( 1133static void reset_hw_ctx_wrap(
@@ -1603,7 +1604,7 @@ static void mmhub_read_vm_context0_settings(struct dcn10_hubp *hubp1,
1603} 1604}
1604 1605
1605 1606
1606static void dcn10_program_pte_vm(struct dce_hwseq *hws, struct hubp *hubp) 1607void dcn10_program_pte_vm(struct dce_hwseq *hws, struct hubp *hubp)
1607{ 1608{
1608 struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp); 1609 struct dcn10_hubp *hubp1 = TO_DCN10_HUBP(hubp);
1609 struct vm_system_aperture_param apt = { {{ 0 } } }; 1610 struct vm_system_aperture_param apt = { {{ 0 } } };
@@ -1703,33 +1704,22 @@ static void program_gamut_remap(struct pipe_ctx *pipe_ctx)
1703 pipe_ctx->plane_res.dpp->funcs->dpp_set_gamut_remap(pipe_ctx->plane_res.dpp, &adjust); 1704 pipe_ctx->plane_res.dpp->funcs->dpp_set_gamut_remap(pipe_ctx->plane_res.dpp, &adjust);
1704} 1705}
1705 1706
1706 1707static void dcn10_program_output_csc(struct dc *dc,
1707static void program_csc_matrix(struct pipe_ctx *pipe_ctx, 1708 struct pipe_ctx *pipe_ctx,
1708 enum dc_color_space colorspace, 1709 enum dc_color_space colorspace,
1709 uint16_t *matrix) 1710 uint16_t *matrix,
1711 int opp_id)
1710{ 1712{
1711 if (pipe_ctx->stream->csc_color_matrix.enable_adjustment == true) { 1713 if (pipe_ctx->stream->csc_color_matrix.enable_adjustment == true) {
1712 if (pipe_ctx->plane_res.dpp->funcs->dpp_set_csc_adjustment != NULL) 1714 if (pipe_ctx->plane_res.dpp->funcs->dpp_set_csc_adjustment != NULL)
1713 pipe_ctx->plane_res.dpp->funcs->dpp_set_csc_adjustment(pipe_ctx->plane_res.dpp, matrix); 1715 pipe_ctx->plane_res.dpp->funcs->dpp_set_csc_adjustment(pipe_ctx->plane_res.dpp, matrix);
1714 } else { 1716 } else {
1715 if (pipe_ctx->plane_res.dpp->funcs->dpp_set_csc_default != NULL) 1717 if (pipe_ctx->plane_res.dpp->funcs->dpp_set_csc_default != NULL)
1716 pipe_ctx->plane_res.dpp->funcs->dpp_set_csc_default(pipe_ctx->plane_res.dpp, colorspace); 1718 pipe_ctx->plane_res.dpp->funcs->dpp_set_csc_default(pipe_ctx->plane_res.dpp, colorspace);
1717 } 1719 }
1718} 1720}
1719 1721
1720static void dcn10_program_output_csc(struct dc *dc, 1722bool is_lower_pipe_tree_visible(struct pipe_ctx *pipe_ctx)
1721 struct pipe_ctx *pipe_ctx,
1722 enum dc_color_space colorspace,
1723 uint16_t *matrix,
1724 int opp_id)
1725{
1726 if (pipe_ctx->plane_res.dpp->funcs->dpp_set_csc_adjustment != NULL)
1727 program_csc_matrix(pipe_ctx,
1728 colorspace,
1729 matrix);
1730}
1731
1732static bool is_lower_pipe_tree_visible(struct pipe_ctx *pipe_ctx)
1733{ 1723{
1734 if (pipe_ctx->plane_state->visible) 1724 if (pipe_ctx->plane_state->visible)
1735 return true; 1725 return true;
@@ -1738,7 +1728,7 @@ static bool is_lower_pipe_tree_visible(struct pipe_ctx *pipe_ctx)
1738 return false; 1728 return false;
1739} 1729}
1740 1730
1741static bool is_upper_pipe_tree_visible(struct pipe_ctx *pipe_ctx) 1731bool is_upper_pipe_tree_visible(struct pipe_ctx *pipe_ctx)
1742{ 1732{
1743 if (pipe_ctx->plane_state->visible) 1733 if (pipe_ctx->plane_state->visible)
1744 return true; 1734 return true;
@@ -1747,7 +1737,7 @@ static bool is_upper_pipe_tree_visible(struct pipe_ctx *pipe_ctx)
1747 return false; 1737 return false;
1748} 1738}
1749 1739
1750static bool is_pipe_tree_visible(struct pipe_ctx *pipe_ctx) 1740bool is_pipe_tree_visible(struct pipe_ctx *pipe_ctx)
1751{ 1741{
1752 if (pipe_ctx->plane_state->visible) 1742 if (pipe_ctx->plane_state->visible)
1753 return true; 1743 return true;
@@ -1943,10 +1933,6 @@ static void dcn10_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
1943 struct mpc *mpc = dc->res_pool->mpc; 1933 struct mpc *mpc = dc->res_pool->mpc;
1944 struct mpc_tree *mpc_tree_params = &(pipe_ctx->stream_res.opp->mpc_tree_params); 1934 struct mpc_tree *mpc_tree_params = &(pipe_ctx->stream_res.opp->mpc_tree_params);
1945 1935
1946
1947
1948 /* TODO: proper fix once fpga works */
1949
1950 if (dc->debug.visual_confirm == VISUAL_CONFIRM_HDR) { 1936 if (dc->debug.visual_confirm == VISUAL_CONFIRM_HDR) {
1951 dcn10_get_hdr_visual_confirm_color( 1937 dcn10_get_hdr_visual_confirm_color(
1952 pipe_ctx, &blnd_cfg.black_color); 1938 pipe_ctx, &blnd_cfg.black_color);
@@ -2026,8 +2012,6 @@ static void update_scaler(struct pipe_ctx *pipe_ctx)
2026 bool per_pixel_alpha = 2012 bool per_pixel_alpha =
2027 pipe_ctx->plane_state->per_pixel_alpha && pipe_ctx->bottom_pipe; 2013 pipe_ctx->plane_state->per_pixel_alpha && pipe_ctx->bottom_pipe;
2028 2014
2029 /* TODO: proper fix once fpga works */
2030
2031 pipe_ctx->plane_res.scl_data.lb_params.alpha_en = per_pixel_alpha; 2015 pipe_ctx->plane_res.scl_data.lb_params.alpha_en = per_pixel_alpha;
2032 pipe_ctx->plane_res.scl_data.lb_params.depth = LB_PIXEL_DEPTH_30BPP; 2016 pipe_ctx->plane_res.scl_data.lb_params.depth = LB_PIXEL_DEPTH_30BPP;
2033 /* scaler configuration */ 2017 /* scaler configuration */
@@ -2035,7 +2019,7 @@ static void update_scaler(struct pipe_ctx *pipe_ctx)
2035 pipe_ctx->plane_res.dpp, &pipe_ctx->plane_res.scl_data); 2019 pipe_ctx->plane_res.dpp, &pipe_ctx->plane_res.scl_data);
2036} 2020}
2037 2021
2038static void update_dchubp_dpp( 2022void update_dchubp_dpp(
2039 struct dc *dc, 2023 struct dc *dc,
2040 struct pipe_ctx *pipe_ctx, 2024 struct pipe_ctx *pipe_ctx,
2041 struct dc_state *context) 2025 struct dc_state *context)
@@ -2052,16 +2036,22 @@ static void update_dchubp_dpp(
2052 */ 2036 */
2053 if (plane_state->update_flags.bits.full_update) { 2037 if (plane_state->update_flags.bits.full_update) {
2054 bool should_divided_by_2 = context->bw.dcn.clk.dppclk_khz <= 2038 bool should_divided_by_2 = context->bw.dcn.clk.dppclk_khz <=
2055 dc->res_pool->dccg->clks.dispclk_khz / 2; 2039 dc->res_pool->clk_mgr->clks.dispclk_khz / 2;
2056 2040
2057 dpp->funcs->dpp_dppclk_control( 2041 dpp->funcs->dpp_dppclk_control(
2058 dpp, 2042 dpp,
2059 should_divided_by_2, 2043 should_divided_by_2,
2060 true); 2044 true);
2061 2045
2062 dc->res_pool->dccg->clks.dppclk_khz = should_divided_by_2 ? 2046 if (dc->res_pool->dccg)
2063 dc->res_pool->dccg->clks.dispclk_khz / 2 : 2047 dc->res_pool->dccg->funcs->update_dpp_dto(
2064 dc->res_pool->dccg->clks.dispclk_khz; 2048 dc->res_pool->dccg,
2049 dpp->inst,
2050 pipe_ctx->plane_res.bw.calc.dppclk_khz);
2051 else
2052 dc->res_pool->clk_mgr->clks.dppclk_khz = should_divided_by_2 ?
2053 dc->res_pool->clk_mgr->clks.dispclk_khz / 2 :
2054 dc->res_pool->clk_mgr->clks.dispclk_khz;
2065 } 2055 }
2066 2056
2067 /* TODO: Need input parameter to tell current DCHUB pipe tie to which OTG 2057 /* TODO: Need input parameter to tell current DCHUB pipe tie to which OTG
@@ -2182,7 +2172,7 @@ static void dcn10_blank_pixel_data(
2182 } 2172 }
2183} 2173}
2184 2174
2185static void set_hdr_multiplier(struct pipe_ctx *pipe_ctx) 2175void set_hdr_multiplier(struct pipe_ctx *pipe_ctx)
2186{ 2176{
2187 struct fixed31_32 multiplier = dc_fixpt_from_fraction( 2177 struct fixed31_32 multiplier = dc_fixpt_from_fraction(
2188 pipe_ctx->plane_state->sdr_white_level, 80); 2178 pipe_ctx->plane_state->sdr_white_level, 80);
@@ -2257,47 +2247,7 @@ static void program_all_pipe_in_tree(
2257 } 2247 }
2258} 2248}
2259 2249
2260static void dcn10_pplib_apply_display_requirements( 2250struct pipe_ctx *find_top_pipe_for_stream(
2261 struct dc *dc,
2262 struct dc_state *context)
2263{
2264 struct dm_pp_display_configuration *pp_display_cfg = &context->pp_display_cfg;
2265
2266 pp_display_cfg->min_engine_clock_khz = dc->res_pool->dccg->clks.dcfclk_khz;
2267 pp_display_cfg->min_memory_clock_khz = dc->res_pool->dccg->clks.fclk_khz;
2268 pp_display_cfg->min_engine_clock_deep_sleep_khz = dc->res_pool->dccg->clks.dcfclk_deep_sleep_khz;
2269 pp_display_cfg->min_dcfc_deep_sleep_clock_khz = dc->res_pool->dccg->clks.dcfclk_deep_sleep_khz;
2270 pp_display_cfg->min_dcfclock_khz = dc->res_pool->dccg->clks.dcfclk_khz;
2271 pp_display_cfg->disp_clk_khz = dc->res_pool->dccg->clks.dispclk_khz;
2272 dce110_fill_display_configs(context, pp_display_cfg);
2273
2274 if (memcmp(&dc->prev_display_config, pp_display_cfg, sizeof(
2275 struct dm_pp_display_configuration)) != 0)
2276 dm_pp_apply_display_requirements(dc->ctx, pp_display_cfg);
2277
2278 dc->prev_display_config = *pp_display_cfg;
2279}
2280
2281static void optimize_shared_resources(struct dc *dc)
2282{
2283 if (dc->current_state->stream_count == 0) {
2284 /* S0i2 message */
2285 dcn10_pplib_apply_display_requirements(dc, dc->current_state);
2286 }
2287
2288 if (dc->debug.pplib_wm_report_mode == WM_REPORT_OVERRIDE)
2289 dcn_bw_notify_pplib_of_wm_ranges(dc);
2290}
2291
2292static void ready_shared_resources(struct dc *dc, struct dc_state *context)
2293{
2294 /* S0i2 message */
2295 if (dc->current_state->stream_count == 0 &&
2296 context->stream_count != 0)
2297 dcn10_pplib_apply_display_requirements(dc, context);
2298}
2299
2300static struct pipe_ctx *find_top_pipe_for_stream(
2301 struct dc *dc, 2251 struct dc *dc,
2302 struct dc_state *context, 2252 struct dc_state *context,
2303 const struct dc_stream_state *stream) 2253 const struct dc_stream_state *stream)
@@ -2398,10 +2348,9 @@ static void dcn10_apply_ctx_for_surface(
2398 hubbub1_wm_change_req_wa(dc->res_pool->hubbub); 2348 hubbub1_wm_change_req_wa(dc->res_pool->hubbub);
2399} 2349}
2400 2350
2401static void dcn10_set_bandwidth( 2351static void dcn10_prepare_bandwidth(
2402 struct dc *dc, 2352 struct dc *dc,
2403 struct dc_state *context, 2353 struct dc_state *context)
2404 bool safe_to_lower)
2405{ 2354{
2406 if (dc->debug.sanity_checks) 2355 if (dc->debug.sanity_checks)
2407 dcn10_verify_allow_pstate_change_high(dc); 2356 dcn10_verify_allow_pstate_change_high(dc);
@@ -2410,12 +2359,39 @@ static void dcn10_set_bandwidth(
2410 if (context->stream_count == 0) 2359 if (context->stream_count == 0)
2411 context->bw.dcn.clk.phyclk_khz = 0; 2360 context->bw.dcn.clk.phyclk_khz = 0;
2412 2361
2413 dc->res_pool->dccg->funcs->update_clocks( 2362 dc->res_pool->clk_mgr->funcs->update_clocks(
2414 dc->res_pool->dccg, 2363 dc->res_pool->clk_mgr,
2415 &context->bw.dcn.clk, 2364 context,
2416 safe_to_lower); 2365 false);
2366 }
2417 2367
2418 dcn10_pplib_apply_display_requirements(dc, context); 2368 hubbub1_program_watermarks(dc->res_pool->hubbub,
2369 &context->bw.dcn.watermarks,
2370 dc->res_pool->ref_clock_inKhz / 1000,
2371 true);
2372
2373 if (dc->debug.pplib_wm_report_mode == WM_REPORT_OVERRIDE)
2374 dcn_bw_notify_pplib_of_wm_ranges(dc);
2375
2376 if (dc->debug.sanity_checks)
2377 dcn10_verify_allow_pstate_change_high(dc);
2378}
2379
2380static void dcn10_optimize_bandwidth(
2381 struct dc *dc,
2382 struct dc_state *context)
2383{
2384 if (dc->debug.sanity_checks)
2385 dcn10_verify_allow_pstate_change_high(dc);
2386
2387 if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) {
2388 if (context->stream_count == 0)
2389 context->bw.dcn.clk.phyclk_khz = 0;
2390
2391 dc->res_pool->clk_mgr->funcs->update_clocks(
2392 dc->res_pool->clk_mgr,
2393 context,
2394 true);
2419 } 2395 }
2420 2396
2421 hubbub1_program_watermarks(dc->res_pool->hubbub, 2397 hubbub1_program_watermarks(dc->res_pool->hubbub,
@@ -2423,6 +2399,9 @@ static void dcn10_set_bandwidth(
2423 dc->res_pool->ref_clock_inKhz / 1000, 2399 dc->res_pool->ref_clock_inKhz / 1000,
2424 true); 2400 true);
2425 2401
2402 if (dc->debug.pplib_wm_report_mode == WM_REPORT_OVERRIDE)
2403 dcn_bw_notify_pplib_of_wm_ranges(dc);
2404
2426 if (dc->debug.sanity_checks) 2405 if (dc->debug.sanity_checks)
2427 dcn10_verify_allow_pstate_change_high(dc); 2406 dcn10_verify_allow_pstate_change_high(dc);
2428} 2407}
@@ -2694,7 +2673,6 @@ static void dcn10_set_cursor_sdr_white_level(struct pipe_ctx *pipe_ctx)
2694 2673
2695static const struct hw_sequencer_funcs dcn10_funcs = { 2674static const struct hw_sequencer_funcs dcn10_funcs = {
2696 .program_gamut_remap = program_gamut_remap, 2675 .program_gamut_remap = program_gamut_remap,
2697 .program_csc_matrix = program_csc_matrix,
2698 .init_hw = dcn10_init_hw, 2676 .init_hw = dcn10_init_hw,
2699 .apply_ctx_to_hw = dce110_apply_ctx_to_hw, 2677 .apply_ctx_to_hw = dce110_apply_ctx_to_hw,
2700 .apply_ctx_for_surface = dcn10_apply_ctx_for_surface, 2678 .apply_ctx_for_surface = dcn10_apply_ctx_for_surface,
@@ -2721,7 +2699,8 @@ static const struct hw_sequencer_funcs dcn10_funcs = {
2721 .disable_plane = dcn10_disable_plane, 2699 .disable_plane = dcn10_disable_plane,
2722 .blank_pixel_data = dcn10_blank_pixel_data, 2700 .blank_pixel_data = dcn10_blank_pixel_data,
2723 .pipe_control_lock = dcn10_pipe_control_lock, 2701 .pipe_control_lock = dcn10_pipe_control_lock,
2724 .set_bandwidth = dcn10_set_bandwidth, 2702 .prepare_bandwidth = dcn10_prepare_bandwidth,
2703 .optimize_bandwidth = dcn10_optimize_bandwidth,
2725 .reset_hw_ctx_wrap = reset_hw_ctx_wrap, 2704 .reset_hw_ctx_wrap = reset_hw_ctx_wrap,
2726 .enable_stream_timing = dcn10_enable_stream_timing, 2705 .enable_stream_timing = dcn10_enable_stream_timing,
2727 .set_drr = set_drr, 2706 .set_drr = set_drr,
@@ -2732,10 +2711,6 @@ static const struct hw_sequencer_funcs dcn10_funcs = {
2732 .log_hw_state = dcn10_log_hw_state, 2711 .log_hw_state = dcn10_log_hw_state,
2733 .get_hw_state = dcn10_get_hw_state, 2712 .get_hw_state = dcn10_get_hw_state,
2734 .wait_for_mpcc_disconnect = dcn10_wait_for_mpcc_disconnect, 2713 .wait_for_mpcc_disconnect = dcn10_wait_for_mpcc_disconnect,
2735 .ready_shared_resources = ready_shared_resources,
2736 .optimize_shared_resources = optimize_shared_resources,
2737 .pplib_apply_display_requirements =
2738 dcn10_pplib_apply_display_requirements,
2739 .edp_backlight_control = hwss_edp_backlight_control, 2714 .edp_backlight_control = hwss_edp_backlight_control,
2740 .edp_power_control = hwss_edp_power_control, 2715 .edp_power_control = hwss_edp_power_control,
2741 .edp_wait_for_hpd_ready = hwss_edp_wait_for_hpd_ready, 2716 .edp_wait_for_hpd_ready = hwss_edp_wait_for_hpd_ready,
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h
index 84d461e0ed3e..5e5610c9e600 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h
@@ -51,4 +51,24 @@ void dcn10_get_hw_state(
51 char *pBuf, unsigned int bufSize, 51 char *pBuf, unsigned int bufSize,
52 unsigned int mask); 52 unsigned int mask);
53 53
54bool is_lower_pipe_tree_visible(struct pipe_ctx *pipe_ctx);
55
56bool is_upper_pipe_tree_visible(struct pipe_ctx *pipe_ctx);
57
58bool is_pipe_tree_visible(struct pipe_ctx *pipe_ctx);
59
60void dcn10_program_pte_vm(struct dce_hwseq *hws, struct hubp *hubp);
61
62void set_hdr_multiplier(struct pipe_ctx *pipe_ctx);
63
64void update_dchubp_dpp(
65 struct dc *dc,
66 struct pipe_ctx *pipe_ctx,
67 struct dc_state *context);
68
69struct pipe_ctx *find_top_pipe_for_stream(
70 struct dc *dc,
71 struct dc_state *context,
72 const struct dc_stream_state *stream);
73
54#endif /* __DC_HWSS_DCN10_H__ */ 74#endif /* __DC_HWSS_DCN10_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
index ba6a8686062f..477ab9222216 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.c
@@ -589,7 +589,7 @@ static bool dcn10_link_encoder_validate_hdmi_output(
589 return false; 589 return false;
590 590
591 /* DCE11 HW does not support 420 */ 591 /* DCE11 HW does not support 420 */
592 if (!enc10->base.features.ycbcr420_supported && 592 if (!enc10->base.features.hdmi_ycbcr420_supported &&
593 crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) 593 crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR420)
594 return false; 594 return false;
595 595
@@ -606,8 +606,10 @@ bool dcn10_link_encoder_validate_dp_output(
606 const struct dcn10_link_encoder *enc10, 606 const struct dcn10_link_encoder *enc10,
607 const struct dc_crtc_timing *crtc_timing) 607 const struct dc_crtc_timing *crtc_timing)
608{ 608{
609 if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) 609 if (crtc_timing->pixel_encoding == PIXEL_ENCODING_YCBCR420) {
610 return false; 610 if (!enc10->base.features.dp_ycbcr420_supported)
611 return false;
612 }
611 613
612 return true; 614 return true;
613} 615}
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
index 54626682bab2..7d1f66797cb3 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_optc.c
@@ -87,9 +87,8 @@ static void optc1_disable_stereo(struct timing_generator *optc)
87 REG_SET(OTG_STEREO_CONTROL, 0, 87 REG_SET(OTG_STEREO_CONTROL, 0,
88 OTG_STEREO_EN, 0); 88 OTG_STEREO_EN, 0);
89 89
90 REG_SET_3(OTG_3D_STRUCTURE_CONTROL, 0, 90 REG_SET_2(OTG_3D_STRUCTURE_CONTROL, 0,
91 OTG_3D_STRUCTURE_EN, 0, 91 OTG_3D_STRUCTURE_EN, 0,
92 OTG_3D_STRUCTURE_V_UPDATE_MODE, 0,
93 OTG_3D_STRUCTURE_STEREO_SEL_OVR, 0); 92 OTG_3D_STRUCTURE_STEREO_SEL_OVR, 0);
94} 93}
95 94
@@ -274,10 +273,12 @@ void optc1_program_timing(
274 * program the reg for interrupt postition. 273 * program the reg for interrupt postition.
275 */ 274 */
276 vertical_line_start = asic_blank_end - optc->dlg_otg_param.vstartup_start + 1; 275 vertical_line_start = asic_blank_end - optc->dlg_otg_param.vstartup_start + 1;
277 if (vertical_line_start < 0) { 276 v_fp2 = 0;
278 ASSERT(0); 277 if (vertical_line_start < 0)
278 v_fp2 = -vertical_line_start;
279 if (vertical_line_start < 0)
279 vertical_line_start = 0; 280 vertical_line_start = 0;
280 } 281
281 REG_SET(OTG_VERTICAL_INTERRUPT2_POSITION, 0, 282 REG_SET(OTG_VERTICAL_INTERRUPT2_POSITION, 0,
282 OTG_VERTICAL_INTERRUPT2_LINE_START, vertical_line_start); 283 OTG_VERTICAL_INTERRUPT2_LINE_START, vertical_line_start);
283 284
@@ -296,9 +297,6 @@ void optc1_program_timing(
296 if (patched_crtc_timing.flags.INTERLACE == 1) 297 if (patched_crtc_timing.flags.INTERLACE == 1)
297 field_num = 1; 298 field_num = 1;
298 } 299 }
299 v_fp2 = 0;
300 if (optc->dlg_otg_param.vstartup_start > asic_blank_end)
301 v_fp2 = optc->dlg_otg_param.vstartup_start > asic_blank_end;
302 300
303 /* Interlace */ 301 /* Interlace */
304 if (patched_crtc_timing.flags.INTERLACE == 1) { 302 if (patched_crtc_timing.flags.INTERLACE == 1) {
@@ -1155,9 +1153,8 @@ static void optc1_enable_stereo(struct timing_generator *optc,
1155 OTG_DISABLE_STEREOSYNC_OUTPUT_FOR_DP, 1); 1153 OTG_DISABLE_STEREOSYNC_OUTPUT_FOR_DP, 1);
1156 1154
1157 if (flags->PROGRAM_STEREO) 1155 if (flags->PROGRAM_STEREO)
1158 REG_UPDATE_3(OTG_3D_STRUCTURE_CONTROL, 1156 REG_UPDATE_2(OTG_3D_STRUCTURE_CONTROL,
1159 OTG_3D_STRUCTURE_EN, flags->FRAME_PACKED, 1157 OTG_3D_STRUCTURE_EN, flags->FRAME_PACKED,
1160 OTG_3D_STRUCTURE_V_UPDATE_MODE, flags->FRAME_PACKED,
1161 OTG_3D_STRUCTURE_STEREO_SEL_OVR, flags->FRAME_PACKED); 1158 OTG_3D_STRUCTURE_STEREO_SEL_OVR, flags->FRAME_PACKED);
1162 1159
1163 } 1160 }
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
index a71453a15ae3..47dbe4bb294a 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
@@ -28,23 +28,23 @@
28 28
29#include "resource.h" 29#include "resource.h"
30#include "include/irq_service_interface.h" 30#include "include/irq_service_interface.h"
31#include "dcn10/dcn10_resource.h" 31#include "dcn10_resource.h"
32 32
33#include "dcn10/dcn10_ipp.h" 33#include "dcn10_ipp.h"
34#include "dcn10/dcn10_mpc.h" 34#include "dcn10_mpc.h"
35#include "irq/dcn10/irq_service_dcn10.h" 35#include "irq/dcn10/irq_service_dcn10.h"
36#include "dcn10/dcn10_dpp.h" 36#include "dcn10_dpp.h"
37#include "dcn10_optc.h" 37#include "dcn10_optc.h"
38#include "dcn10/dcn10_hw_sequencer.h" 38#include "dcn10_hw_sequencer.h"
39#include "dce110/dce110_hw_sequencer.h" 39#include "dce110/dce110_hw_sequencer.h"
40#include "dcn10/dcn10_opp.h" 40#include "dcn10_opp.h"
41#include "dcn10/dcn10_link_encoder.h" 41#include "dcn10_link_encoder.h"
42#include "dcn10/dcn10_stream_encoder.h" 42#include "dcn10_stream_encoder.h"
43#include "dce/dce_clocks.h" 43#include "dcn10_clk_mgr.h"
44#include "dce/dce_clock_source.h" 44#include "dce/dce_clock_source.h"
45#include "dce/dce_audio.h" 45#include "dce/dce_audio.h"
46#include "dce/dce_hwseq.h" 46#include "dce/dce_hwseq.h"
47#include "../virtual/virtual_stream_encoder.h" 47#include "virtual/virtual_stream_encoder.h"
48#include "dce110/dce110_resource.h" 48#include "dce110/dce110_resource.h"
49#include "dce112/dce112_resource.h" 49#include "dce112/dce112_resource.h"
50#include "dcn10_hubp.h" 50#include "dcn10_hubp.h"
@@ -438,6 +438,7 @@ static const struct dcn_optc_mask tg_mask = {
438 438
439 439
440static const struct bios_registers bios_regs = { 440static const struct bios_registers bios_regs = {
441 NBIO_SR(BIOS_SCRATCH_0),
441 NBIO_SR(BIOS_SCRATCH_3), 442 NBIO_SR(BIOS_SCRATCH_3),
442 NBIO_SR(BIOS_SCRATCH_6) 443 NBIO_SR(BIOS_SCRATCH_6)
443}; 444};
@@ -719,7 +720,8 @@ static struct timing_generator *dcn10_timing_generator_create(
719static const struct encoder_feature_support link_enc_feature = { 720static const struct encoder_feature_support link_enc_feature = {
720 .max_hdmi_deep_color = COLOR_DEPTH_121212, 721 .max_hdmi_deep_color = COLOR_DEPTH_121212,
721 .max_hdmi_pixel_clock = 600000, 722 .max_hdmi_pixel_clock = 600000,
722 .ycbcr420_supported = true, 723 .hdmi_ycbcr420_supported = true,
724 .dp_ycbcr420_supported = false,
723 .flags.bits.IS_HBR2_CAPABLE = true, 725 .flags.bits.IS_HBR2_CAPABLE = true,
724 .flags.bits.IS_HBR3_CAPABLE = true, 726 .flags.bits.IS_HBR3_CAPABLE = true,
725 .flags.bits.IS_TPS3_CAPABLE = true, 727 .flags.bits.IS_TPS3_CAPABLE = true,
@@ -949,8 +951,8 @@ static void destruct(struct dcn10_resource_pool *pool)
949 if (pool->base.dmcu != NULL) 951 if (pool->base.dmcu != NULL)
950 dce_dmcu_destroy(&pool->base.dmcu); 952 dce_dmcu_destroy(&pool->base.dmcu);
951 953
952 if (pool->base.dccg != NULL) 954 if (pool->base.clk_mgr != NULL)
953 dce_dccg_destroy(&pool->base.dccg); 955 dce_clk_mgr_destroy(&pool->base.clk_mgr);
954 956
955 kfree(pool->base.pp_smu); 957 kfree(pool->base.pp_smu);
956} 958}
@@ -1276,8 +1278,8 @@ static bool construct(
1276 } 1278 }
1277 } 1279 }
1278 1280
1279 pool->base.dccg = dcn1_dccg_create(ctx); 1281 pool->base.clk_mgr = dcn1_clk_mgr_create(ctx);
1280 if (pool->base.dccg == NULL) { 1282 if (pool->base.clk_mgr == NULL) {
1281 dm_error("DC: failed to create display clock!\n"); 1283 dm_error("DC: failed to create display clock!\n");
1282 BREAK_TO_DEBUGGER(); 1284 BREAK_TO_DEBUGGER();
1283 goto fail; 1285 goto fail;
diff --git a/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h b/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h
index f2ea8452d48f..beb08fd12b1d 100644
--- a/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h
+++ b/drivers/gpu/drm/amd/display/dc/dm_pp_smu.h
@@ -55,10 +55,10 @@ struct pp_smu {
55 55
56struct pp_smu_wm_set_range { 56struct pp_smu_wm_set_range {
57 unsigned int wm_inst; 57 unsigned int wm_inst;
58 uint32_t min_fill_clk_khz; 58 uint32_t min_fill_clk_mhz;
59 uint32_t max_fill_clk_khz; 59 uint32_t max_fill_clk_mhz;
60 uint32_t min_drain_clk_khz; 60 uint32_t min_drain_clk_mhz;
61 uint32_t max_drain_clk_khz; 61 uint32_t max_drain_clk_mhz;
62}; 62};
63 63
64#define MAX_WATERMARK_SETS 4 64#define MAX_WATERMARK_SETS 4
@@ -77,15 +77,15 @@ struct pp_smu_display_requirement_rv {
77 */ 77 */
78 unsigned int display_count; 78 unsigned int display_count;
79 79
80 /* PPSMC_MSG_SetHardMinFclkByFreq: khz 80 /* PPSMC_MSG_SetHardMinFclkByFreq: mhz
81 * FCLK will vary with DPM, but never below requested hard min 81 * FCLK will vary with DPM, but never below requested hard min
82 */ 82 */
83 unsigned int hard_min_fclk_khz; 83 unsigned int hard_min_fclk_mhz;
84 84
85 /* PPSMC_MSG_SetHardMinDcefclkByFreq: khz 85 /* PPSMC_MSG_SetHardMinDcefclkByFreq: mhz
86 * fixed clock at requested freq, either from FCH bypass or DFS 86 * fixed clock at requested freq, either from FCH bypass or DFS
87 */ 87 */
88 unsigned int hard_min_dcefclk_khz; 88 unsigned int hard_min_dcefclk_mhz;
89 89
90 /* PPSMC_MSG_SetMinDeepSleepDcefclk: mhz 90 /* PPSMC_MSG_SetMinDeepSleepDcefclk: mhz
91 * when DF is in cstate, dcf clock is further divided down 91 * when DF is in cstate, dcf clock is further divided down
@@ -103,13 +103,19 @@ struct pp_smu_funcs_rv {
103 void (*set_display_count)(struct pp_smu *pp, int count); 103 void (*set_display_count)(struct pp_smu *pp, int count);
104 104
105 /* which SMU message? are reader and writer WM separate SMU msg? */ 105 /* which SMU message? are reader and writer WM separate SMU msg? */
106 /*
107 * PPSMC_MSG_SetDriverDramAddrHigh
108 * PPSMC_MSG_SetDriverDramAddrLow
109 * PPSMC_MSG_TransferTableDram2Smu
110 *
111 * */
106 void (*set_wm_ranges)(struct pp_smu *pp, 112 void (*set_wm_ranges)(struct pp_smu *pp,
107 struct pp_smu_wm_range_sets *ranges); 113 struct pp_smu_wm_range_sets *ranges);
108 114
109 /* PPSMC_MSG_SetHardMinDcfclkByFreq 115 /* PPSMC_MSG_SetHardMinDcfclkByFreq
110 * fixed clock at requested freq, either from FCH bypass or DFS 116 * fixed clock at requested freq, either from FCH bypass or DFS
111 */ 117 */
112 void (*set_hard_min_dcfclk_by_freq)(struct pp_smu *pp, int khz); 118 void (*set_hard_min_dcfclk_by_freq)(struct pp_smu *pp, int mhz);
113 119
114 /* PPSMC_MSG_SetMinDeepSleepDcfclk 120 /* PPSMC_MSG_SetMinDeepSleepDcfclk
115 * when DF is in cstate, dcf clock is further divided down 121 * when DF is in cstate, dcf clock is further divided down
@@ -120,12 +126,12 @@ struct pp_smu_funcs_rv {
120 /* PPSMC_MSG_SetHardMinFclkByFreq 126 /* PPSMC_MSG_SetHardMinFclkByFreq
121 * FCLK will vary with DPM, but never below requested hard min 127 * FCLK will vary with DPM, but never below requested hard min
122 */ 128 */
123 void (*set_hard_min_fclk_by_freq)(struct pp_smu *pp, int khz); 129 void (*set_hard_min_fclk_by_freq)(struct pp_smu *pp, int mhz);
124 130
125 /* PPSMC_MSG_SetHardMinSocclkByFreq 131 /* PPSMC_MSG_SetHardMinSocclkByFreq
126 * Needed for DWB support 132 * Needed for DWB support
127 */ 133 */
128 void (*set_hard_min_socclk_by_freq)(struct pp_smu *pp, int khz); 134 void (*set_hard_min_socclk_by_freq)(struct pp_smu *pp, int mhz);
129 135
130 /* PME w/a */ 136 /* PME w/a */
131 void (*set_pme_wa_enable)(struct pp_smu *pp); 137 void (*set_pme_wa_enable)(struct pp_smu *pp);
diff --git a/drivers/gpu/drm/amd/display/dc/dm_services_types.h b/drivers/gpu/drm/amd/display/dc/dm_services_types.h
index 2b83f922ac02..1af8c777b3ac 100644
--- a/drivers/gpu/drm/amd/display/dc/dm_services_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dm_services_types.h
@@ -208,22 +208,20 @@ struct dm_bl_data_point {
208 /* Brightness level as effective value in range 0-255, 208 /* Brightness level as effective value in range 0-255,
209 * corresponding to above percentage 209 * corresponding to above percentage
210 */ 210 */
211 uint8_t signalLevel; 211 uint8_t signal_level;
212}; 212};
213 213
214/* Total size of the structure should not exceed 256 bytes */ 214/* Total size of the structure should not exceed 256 bytes */
215struct dm_acpi_atif_backlight_caps { 215struct dm_acpi_atif_backlight_caps {
216
217
218 uint16_t size; /* Bytes 0-1 (2 bytes) */ 216 uint16_t size; /* Bytes 0-1 (2 bytes) */
219 uint16_t flags; /* Byted 2-3 (2 bytes) */ 217 uint16_t flags; /* Byted 2-3 (2 bytes) */
220 uint8_t errorCode; /* Byte 4 */ 218 uint8_t error_code; /* Byte 4 */
221 uint8_t acLevelPercentage; /* Byte 5 */ 219 uint8_t ac_level_percentage; /* Byte 5 */
222 uint8_t dcLevelPercentage; /* Byte 6 */ 220 uint8_t dc_level_percentage; /* Byte 6 */
223 uint8_t minInputSignal; /* Byte 7 */ 221 uint8_t min_input_signal; /* Byte 7 */
224 uint8_t maxInputSignal; /* Byte 8 */ 222 uint8_t max_input_signal; /* Byte 8 */
225 uint8_t numOfDataPoints; /* Byte 9 */ 223 uint8_t num_data_points; /* Byte 9 */
226 struct dm_bl_data_point dataPoints[99]; /* Bytes 10-207 (198 bytes)*/ 224 struct dm_bl_data_point data_points[99]; /* Bytes 10-207 (198 bytes)*/
227}; 225};
228 226
229enum dm_acpi_display_type { 227enum dm_acpi_display_type {
diff --git a/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h b/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h
index cbafce649e33..5dd04520ceca 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h
+++ b/drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h
@@ -113,7 +113,8 @@ struct _vcs_dpi_soc_bounding_box_st {
113 int use_urgent_burst_bw; 113 int use_urgent_burst_bw;
114 double max_hscl_ratio; 114 double max_hscl_ratio;
115 double max_vscl_ratio; 115 double max_vscl_ratio;
116 struct _vcs_dpi_voltage_scaling_st clock_limits[7]; 116 unsigned int num_states;
117 struct _vcs_dpi_voltage_scaling_st clock_limits[8];
117}; 118};
118 119
119struct _vcs_dpi_ip_params_st { 120struct _vcs_dpi_ip_params_st {
diff --git a/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h b/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h
index 39ee8eba3c31..d1656c9d50df 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/bw_fixed.h
@@ -126,7 +126,7 @@ static inline struct bw_fixed bw_div(const struct bw_fixed arg1, const struct bw
126static inline struct bw_fixed bw_mod(const struct bw_fixed arg1, const struct bw_fixed arg2) 126static inline struct bw_fixed bw_mod(const struct bw_fixed arg1, const struct bw_fixed arg2)
127{ 127{
128 struct bw_fixed res; 128 struct bw_fixed res;
129 div64_u64_rem(arg1.value, arg2.value, &res.value); 129 div64_u64_rem(arg1.value, arg2.value, (uint64_t *)&res.value);
130 return res; 130 return res;
131} 131}
132 132
diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h
index c1976c175b57..e3ee96afa60e 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h
@@ -82,7 +82,7 @@ void core_link_disable_stream(struct pipe_ctx *pipe_ctx, int option);
82 82
83void core_link_set_avmute(struct pipe_ctx *pipe_ctx, bool enable); 83void core_link_set_avmute(struct pipe_ctx *pipe_ctx, bool enable);
84/********** DAL Core*********************/ 84/********** DAL Core*********************/
85#include "display_clock.h" 85#include "hw/clk_mgr.h"
86#include "transform.h" 86#include "transform.h"
87#include "dpp.h" 87#include "dpp.h"
88 88
@@ -169,6 +169,7 @@ struct resource_pool {
169 unsigned int audio_count; 169 unsigned int audio_count;
170 struct audio_support audio_support; 170 struct audio_support audio_support;
171 171
172 struct clk_mgr *clk_mgr;
172 struct dccg *dccg; 173 struct dccg *dccg;
173 struct irq_service *irqs; 174 struct irq_service *irqs;
174 175
@@ -287,7 +288,7 @@ struct dc_state {
287 struct dcn_bw_internal_vars dcn_bw_vars; 288 struct dcn_bw_internal_vars dcn_bw_vars;
288#endif 289#endif
289 290
290 struct dccg *dis_clk; 291 struct clk_mgr *dccg;
291 292
292 struct kref refcount; 293 struct kref refcount;
293}; 294};
diff --git a/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h b/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h
index e688eb9b975c..ece954a40a8e 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/dcn_calcs.h
@@ -31,8 +31,8 @@
31#define __DCN_CALCS_H__ 31#define __DCN_CALCS_H__
32 32
33#include "bw_fixed.h" 33#include "bw_fixed.h"
34#include "display_clock.h"
35#include "../dml/display_mode_lib.h" 34#include "../dml/display_mode_lib.h"
35#include "hw/clk_mgr.h"
36 36
37struct dc; 37struct dc;
38struct dc_state; 38struct dc_state;
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h b/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h
index a83a48494613..abc961c0906e 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h
@@ -47,12 +47,18 @@ struct abm_funcs {
47 bool (*set_abm_level)(struct abm *abm, unsigned int abm_level); 47 bool (*set_abm_level)(struct abm *abm, unsigned int abm_level);
48 bool (*set_abm_immediate_disable)(struct abm *abm); 48 bool (*set_abm_immediate_disable)(struct abm *abm);
49 bool (*init_backlight)(struct abm *abm); 49 bool (*init_backlight)(struct abm *abm);
50 bool (*set_backlight_level)(struct abm *abm, 50
51 unsigned int backlight_level, 51 /* backlight_pwm_u16_16 is unsigned 32 bit,
52 * 16 bit integer + 16 fractional, where 1.0 is max backlight value.
53 */
54 bool (*set_backlight_level_pwm)(struct abm *abm,
55 unsigned int backlight_pwm_u16_16,
52 unsigned int frame_ramp, 56 unsigned int frame_ramp,
53 unsigned int controller_id, 57 unsigned int controller_id,
54 bool use_smooth_brightness); 58 bool use_smooth_brightness);
55 unsigned int (*get_current_backlight_8_bit)(struct abm *abm); 59
60 unsigned int (*get_current_backlight)(struct abm *abm);
61 unsigned int (*get_target_backlight)(struct abm *abm);
56}; 62};
57 63
58#endif 64#endif
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h
index 689faa16c0ae..23a4b18e5fee 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/display_clock.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h
@@ -23,41 +23,25 @@
23 * 23 *
24 */ 24 */
25 25
26#ifndef __DISPLAY_CLOCK_H__ 26#ifndef __DAL_CLK_MGR_H__
27#define __DISPLAY_CLOCK_H__ 27#define __DAL_CLK_MGR_H__
28 28
29#include "dm_services_types.h" 29#include "dm_services_types.h"
30#include "dc.h" 30#include "dc.h"
31 31
32/* Structure containing all state-dependent clocks 32struct clk_mgr {
33 * (dependent on "enum clocks_state") */
34struct state_dependent_clocks {
35 int display_clk_khz;
36 int pixel_clk_khz;
37};
38
39struct dccg {
40 struct dc_context *ctx; 33 struct dc_context *ctx;
41 const struct display_clock_funcs *funcs; 34 const struct clk_mgr_funcs *funcs;
42 35
43 enum dm_pp_clocks_state max_clks_state;
44 enum dm_pp_clocks_state cur_min_clks_state;
45 struct dc_clocks clks; 36 struct dc_clocks clks;
46}; 37};
47 38
48struct display_clock_funcs { 39struct clk_mgr_funcs {
49 void (*update_clocks)(struct dccg *dccg, 40 void (*update_clocks)(struct clk_mgr *clk_mgr,
50 struct dc_clocks *new_clocks, 41 struct dc_state *context,
51 bool safe_to_lower); 42 bool safe_to_lower);
52 int (*set_dispclk)(struct dccg *dccg,
53 int requested_clock_khz);
54
55 int (*get_dp_ref_clk_frequency)(struct dccg *dccg);
56 43
57 bool (*update_dfs_bypass)(struct dccg *dccg, 44 int (*get_dp_ref_clk_frequency)(struct clk_mgr *clk_mgr);
58 struct dc *dc,
59 struct dc_state *context,
60 int requested_clock_khz);
61}; 45};
62 46
63#endif /* __DISPLAY_CLOCK_H__ */ 47#endif /* __DAL_CLK_MGR_H__ */
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h
new file mode 100644
index 000000000000..95a56d012626
--- /dev/null
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dccg.h
@@ -0,0 +1,44 @@
1/*
2 * Copyright 2018 Advanced Micro Devices, Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * Authors: AMD
23 *
24 */
25
26#ifndef __DAL_DCCG_H__
27#define __DAL_DCCG_H__
28
29#include "dc_types.h"
30
31struct dccg {
32 struct dc_context *ctx;
33 const struct dccg_funcs *funcs;
34
35 int ref_dppclk;
36};
37
38struct dccg_funcs {
39 void (*update_dpp_dto)(struct dccg *dccg,
40 int dpp_inst,
41 int req_dppclk);
42};
43
44#endif //__DAL_DCCG_H__
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h b/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h
index cf7433ebf91a..da85537a4488 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h
@@ -53,6 +53,12 @@ struct curve_points {
53 uint32_t custom_float_slope; 53 uint32_t custom_float_slope;
54}; 54};
55 55
56struct curve_points3 {
57 struct curve_points red;
58 struct curve_points green;
59 struct curve_points blue;
60};
61
56struct pwl_result_data { 62struct pwl_result_data {
57 struct fixed31_32 red; 63 struct fixed31_32 red;
58 struct fixed31_32 green; 64 struct fixed31_32 green;
@@ -71,9 +77,17 @@ struct pwl_result_data {
71 uint32_t delta_blue_reg; 77 uint32_t delta_blue_reg;
72}; 78};
73 79
80/* arr_curve_points - regamma regions/segments specification
81 * arr_points - beginning and end point specified separately (only one on DCE)
82 * corner_points - beginning and end point for all 3 colors (DCN)
83 * rgb_resulted - final curve
84 */
74struct pwl_params { 85struct pwl_params {
75 struct gamma_curve arr_curve_points[34]; 86 struct gamma_curve arr_curve_points[34];
76 struct curve_points arr_points[2]; 87 union {
88 struct curve_points arr_points[2];
89 struct curve_points3 corner_points[2];
90 };
77 struct pwl_result_data rgb_resulted[256 + 3]; 91 struct pwl_result_data rgb_resulted[256 + 3];
78 uint32_t hw_points_num; 92 uint32_t hw_points_num;
79}; 93};
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h b/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h
index e28e9770e0a3..c20fdcaac53b 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h
@@ -65,7 +65,8 @@ struct encoder_feature_support {
65 65
66 enum dc_color_depth max_hdmi_deep_color; 66 enum dc_color_depth max_hdmi_deep_color;
67 unsigned int max_hdmi_pixel_clock; 67 unsigned int max_hdmi_pixel_clock;
68 bool ycbcr420_supported; 68 bool hdmi_ycbcr420_supported;
69 bool dp_ycbcr420_supported;
69}; 70};
70 71
71union dpcd_psr_configuration { 72union dpcd_psr_configuration {
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h b/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h
index da89c2edb07c..06df02ddff6a 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/mem_input.h
@@ -31,7 +31,7 @@
31#include "dml/display_mode_structs.h" 31#include "dml/display_mode_structs.h"
32 32
33struct dchub_init_data; 33struct dchub_init_data;
34struct cstate_pstate_watermarks_st { 34struct cstate_pstate_watermarks_st1 {
35 uint32_t cstate_exit_ns; 35 uint32_t cstate_exit_ns;
36 uint32_t cstate_enter_plus_exit_ns; 36 uint32_t cstate_enter_plus_exit_ns;
37 uint32_t pstate_change_ns; 37 uint32_t pstate_change_ns;
@@ -40,7 +40,7 @@ struct cstate_pstate_watermarks_st {
40struct dcn_watermarks { 40struct dcn_watermarks {
41 uint32_t pte_meta_urgent_ns; 41 uint32_t pte_meta_urgent_ns;
42 uint32_t urgent_ns; 42 uint32_t urgent_ns;
43 struct cstate_pstate_watermarks_st cstate_pstate; 43 struct cstate_pstate_watermarks_st1 cstate_pstate;
44}; 44};
45 45
46struct dcn_watermark_set { 46struct dcn_watermark_set {
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h
index 26f29d5da3d8..e9b702ce02dd 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h
@@ -32,8 +32,6 @@
32#include "inc/hw/link_encoder.h" 32#include "inc/hw/link_encoder.h"
33#include "core_status.h" 33#include "core_status.h"
34 34
35#define EDP_BACKLIGHT_RAMP_DISABLE_LEVEL 0xFFFFFFFF
36
37enum pipe_gating_control { 35enum pipe_gating_control {
38 PIPE_GATING_CONTROL_DISABLE = 0, 36 PIPE_GATING_CONTROL_DISABLE = 0,
39 PIPE_GATING_CONTROL_ENABLE, 37 PIPE_GATING_CONTROL_ENABLE,
@@ -87,11 +85,6 @@ struct hw_sequencer_funcs {
87 void (*program_gamut_remap)( 85 void (*program_gamut_remap)(
88 struct pipe_ctx *pipe_ctx); 86 struct pipe_ctx *pipe_ctx);
89 87
90 void (*program_csc_matrix)(
91 struct pipe_ctx *pipe_ctx,
92 enum dc_color_space colorspace,
93 uint16_t *matrix);
94
95 void (*program_output_csc)(struct dc *dc, 88 void (*program_output_csc)(struct dc *dc,
96 struct pipe_ctx *pipe_ctx, 89 struct pipe_ctx *pipe_ctx,
97 enum dc_color_space colorspace, 90 enum dc_color_space colorspace,
@@ -177,10 +170,12 @@ struct hw_sequencer_funcs {
177 struct pipe_ctx *pipe_ctx, 170 struct pipe_ctx *pipe_ctx,
178 bool blank); 171 bool blank);
179 172
180 void (*set_bandwidth)( 173 void (*prepare_bandwidth)(
181 struct dc *dc, 174 struct dc *dc,
182 struct dc_state *context, 175 struct dc_state *context);
183 bool safe_to_lower); 176 void (*optimize_bandwidth)(
177 struct dc *dc,
178 struct dc_state *context);
184 179
185 void (*set_drr)(struct pipe_ctx **pipe_ctx, int num_pipes, 180 void (*set_drr)(struct pipe_ctx **pipe_ctx, int num_pipes,
186 int vmin, int vmax); 181 int vmin, int vmax);
@@ -210,11 +205,6 @@ struct hw_sequencer_funcs {
210 struct resource_pool *res_pool, 205 struct resource_pool *res_pool,
211 struct pipe_ctx *pipe_ctx); 206 struct pipe_ctx *pipe_ctx);
212 207
213 void (*ready_shared_resources)(struct dc *dc, struct dc_state *context);
214 void (*optimize_shared_resources)(struct dc *dc);
215 void (*pplib_apply_display_requirements)(
216 struct dc *dc,
217 struct dc_state *context);
218 void (*edp_power_control)( 208 void (*edp_power_control)(
219 struct dc_link *link, 209 struct dc_link *link,
220 bool enable); 210 bool enable);
diff --git a/drivers/gpu/drm/amd/display/dc/inc/resource.h b/drivers/gpu/drm/amd/display/dc/inc/resource.h
index 33b99e3ab10d..0086a2f1d21a 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/resource.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/resource.h
@@ -30,9 +30,6 @@
30#include "dal_asic_id.h" 30#include "dal_asic_id.h"
31#include "dm_pp_smu.h" 31#include "dm_pp_smu.h"
32 32
33/* TODO unhardcode, 4 for CZ*/
34#define MEMORY_TYPE_MULTIPLIER 4
35
36enum dce_version resource_parse_asic_id( 33enum dce_version resource_parse_asic_id(
37 struct hw_asic_id asic_id); 34 struct hw_asic_id asic_id);
38 35
diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
index cdcefd087487..7480f072c375 100644
--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
+++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
@@ -306,6 +306,18 @@ static struct fixed31_32 translate_from_linear_space(
306 a1); 306 a1);
307} 307}
308 308
309static struct fixed31_32 calculate_gamma22(struct fixed31_32 arg)
310{
311 struct fixed31_32 gamma = dc_fixpt_from_fraction(22, 10);
312
313 return translate_from_linear_space(arg,
314 dc_fixpt_zero,
315 dc_fixpt_zero,
316 dc_fixpt_zero,
317 dc_fixpt_zero,
318 gamma);
319}
320
309static struct fixed31_32 translate_to_linear_space( 321static struct fixed31_32 translate_to_linear_space(
310 struct fixed31_32 arg, 322 struct fixed31_32 arg,
311 struct fixed31_32 a0, 323 struct fixed31_32 a0,
@@ -709,6 +721,169 @@ static void build_regamma(struct pwl_float_data_ex *rgb_regamma,
709 } 721 }
710} 722}
711 723
724static void hermite_spline_eetf(struct fixed31_32 input_x,
725 struct fixed31_32 max_display,
726 struct fixed31_32 min_display,
727 struct fixed31_32 max_content,
728 struct fixed31_32 *out_x)
729{
730 struct fixed31_32 min_lum_pq;
731 struct fixed31_32 max_lum_pq;
732 struct fixed31_32 max_content_pq;
733 struct fixed31_32 ks;
734 struct fixed31_32 E1;
735 struct fixed31_32 E2;
736 struct fixed31_32 E3;
737 struct fixed31_32 t;
738 struct fixed31_32 t2;
739 struct fixed31_32 t3;
740 struct fixed31_32 two;
741 struct fixed31_32 three;
742 struct fixed31_32 temp1;
743 struct fixed31_32 temp2;
744 struct fixed31_32 a = dc_fixpt_from_fraction(15, 10);
745 struct fixed31_32 b = dc_fixpt_from_fraction(5, 10);
746 struct fixed31_32 epsilon = dc_fixpt_from_fraction(1, 1000000); // dc_fixpt_epsilon is a bit too small
747
748 if (dc_fixpt_eq(max_content, dc_fixpt_zero)) {
749 *out_x = dc_fixpt_zero;
750 return;
751 }
752
753 compute_pq(input_x, &E1);
754 compute_pq(dc_fixpt_div(min_display, max_content), &min_lum_pq);
755 compute_pq(dc_fixpt_div(max_display, max_content), &max_lum_pq);
756 compute_pq(dc_fixpt_one, &max_content_pq); // always 1? DAL2 code is weird
757 a = dc_fixpt_div(dc_fixpt_add(dc_fixpt_one, b), max_content_pq); // (1+b)/maxContent
758 ks = dc_fixpt_sub(dc_fixpt_mul(a, max_lum_pq), b); // a * max_lum_pq - b
759
760 if (dc_fixpt_lt(E1, ks))
761 E2 = E1;
762 else if (dc_fixpt_le(ks, E1) && dc_fixpt_le(E1, dc_fixpt_one)) {
763 if (dc_fixpt_lt(epsilon, dc_fixpt_sub(dc_fixpt_one, ks)))
764 // t = (E1 - ks) / (1 - ks)
765 t = dc_fixpt_div(dc_fixpt_sub(E1, ks),
766 dc_fixpt_sub(dc_fixpt_one, ks));
767 else
768 t = dc_fixpt_zero;
769
770 two = dc_fixpt_from_int(2);
771 three = dc_fixpt_from_int(3);
772
773 t2 = dc_fixpt_mul(t, t);
774 t3 = dc_fixpt_mul(t2, t);
775 temp1 = dc_fixpt_mul(two, t3);
776 temp2 = dc_fixpt_mul(three, t2);
777
778 // (2t^3 - 3t^2 + 1) * ks
779 E2 = dc_fixpt_mul(ks, dc_fixpt_add(dc_fixpt_one,
780 dc_fixpt_sub(temp1, temp2)));
781
782 // (-2t^3 + 3t^2) * max_lum_pq
783 E2 = dc_fixpt_add(E2, dc_fixpt_mul(max_lum_pq,
784 dc_fixpt_sub(temp2, temp1)));
785
786 temp1 = dc_fixpt_mul(two, t2);
787 temp2 = dc_fixpt_sub(dc_fixpt_one, ks);
788
789 // (t^3 - 2t^2 + t) * (1-ks)
790 E2 = dc_fixpt_add(E2, dc_fixpt_mul(temp2,
791 dc_fixpt_add(t, dc_fixpt_sub(t3, temp1))));
792 } else
793 E2 = dc_fixpt_one;
794
795 temp1 = dc_fixpt_sub(dc_fixpt_one, E2);
796 temp2 = dc_fixpt_mul(temp1, temp1);
797 temp2 = dc_fixpt_mul(temp2, temp2);
798 // temp2 = (1-E2)^4
799
800 E3 = dc_fixpt_add(E2, dc_fixpt_mul(min_lum_pq, temp2));
801 compute_de_pq(E3, out_x);
802
803 *out_x = dc_fixpt_div(*out_x, dc_fixpt_div(max_display, max_content));
804}
805
806static bool build_freesync_hdr(struct pwl_float_data_ex *rgb_regamma,
807 uint32_t hw_points_num,
808 const struct hw_x_point *coordinate_x,
809 const struct freesync_hdr_tf_params *fs_params)
810{
811 uint32_t i;
812 struct pwl_float_data_ex *rgb = rgb_regamma;
813 const struct hw_x_point *coord_x = coordinate_x;
814 struct fixed31_32 scaledX = dc_fixpt_zero;
815 struct fixed31_32 scaledX1 = dc_fixpt_zero;
816 struct fixed31_32 max_display = dc_fixpt_from_int(fs_params->max_display);
817 struct fixed31_32 min_display = dc_fixpt_from_fraction(fs_params->min_display, 10000);
818 struct fixed31_32 max_content = dc_fixpt_from_int(fs_params->max_content);
819 struct fixed31_32 min_content = dc_fixpt_from_fraction(fs_params->min_content, 10000);
820 struct fixed31_32 clip = dc_fixpt_one;
821 struct fixed31_32 output;
822 bool use_eetf = false;
823 bool is_clipped = false;
824 struct fixed31_32 sdr_white_level = dc_fixpt_from_int(fs_params->sdr_white_level);
825
826 if (fs_params == NULL || fs_params->max_content == 0 ||
827 fs_params->max_display == 0)
828 return false;
829
830 if (fs_params->min_display > 1000) // cap at 0.1 at the bottom
831 min_display = dc_fixpt_from_fraction(1, 10);
832 if (fs_params->max_display < 100) // cap at 100 at the top
833 max_display = dc_fixpt_from_int(100);
834
835 if (fs_params->min_content < fs_params->min_display)
836 use_eetf = true;
837 else
838 min_content = min_display;
839
840 if (fs_params->max_content > fs_params->max_display)
841 use_eetf = true;
842 else
843 max_content = max_display;
844
845 rgb += 32; // first 32 points have problems with fixed point, too small
846 coord_x += 32;
847 for (i = 32; i <= hw_points_num; i++) {
848 if (!is_clipped) {
849 if (use_eetf) {
850 /*max content is equal 1 */
851 scaledX1 = dc_fixpt_div(coord_x->x,
852 dc_fixpt_div(max_content, sdr_white_level));
853 hermite_spline_eetf(scaledX1, max_display, min_display,
854 max_content, &scaledX);
855 } else
856 scaledX = dc_fixpt_div(coord_x->x,
857 dc_fixpt_div(max_display, sdr_white_level));
858
859 if (dc_fixpt_lt(scaledX, clip)) {
860 if (dc_fixpt_lt(scaledX, dc_fixpt_zero))
861 output = dc_fixpt_zero;
862 else
863 output = calculate_gamma22(scaledX);
864
865 rgb->r = output;
866 rgb->g = output;
867 rgb->b = output;
868 } else {
869 is_clipped = true;
870 rgb->r = clip;
871 rgb->g = clip;
872 rgb->b = clip;
873 }
874 } else {
875 rgb->r = clip;
876 rgb->g = clip;
877 rgb->b = clip;
878 }
879
880 ++coord_x;
881 ++rgb;
882 }
883
884 return true;
885}
886
712static void build_degamma(struct pwl_float_data_ex *curve, 887static void build_degamma(struct pwl_float_data_ex *curve,
713 uint32_t hw_points_num, 888 uint32_t hw_points_num,
714 const struct hw_x_point *coordinate_x, bool is_2_4) 889 const struct hw_x_point *coordinate_x, bool is_2_4)
@@ -1356,7 +1531,8 @@ static bool map_regamma_hw_to_x_user(
1356#define _EXTRA_POINTS 3 1531#define _EXTRA_POINTS 3
1357 1532
1358bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf, 1533bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
1359 const struct dc_gamma *ramp, bool mapUserRamp, bool canRomBeUsed) 1534 const struct dc_gamma *ramp, bool mapUserRamp, bool canRomBeUsed,
1535 const struct freesync_hdr_tf_params *fs_params)
1360{ 1536{
1361 struct dc_transfer_func_distributed_points *tf_pts = &output_tf->tf_pts; 1537 struct dc_transfer_func_distributed_points *tf_pts = &output_tf->tf_pts;
1362 struct dividers dividers; 1538 struct dividers dividers;
@@ -1374,7 +1550,7 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
1374 /* we can use hardcoded curve for plain SRGB TF */ 1550 /* we can use hardcoded curve for plain SRGB TF */
1375 if (output_tf->type == TF_TYPE_PREDEFINED && canRomBeUsed == true && 1551 if (output_tf->type == TF_TYPE_PREDEFINED && canRomBeUsed == true &&
1376 output_tf->tf == TRANSFER_FUNCTION_SRGB && 1552 output_tf->tf == TRANSFER_FUNCTION_SRGB &&
1377 (!mapUserRamp && ramp->type == GAMMA_RGB_256)) 1553 (ramp->is_identity || (!mapUserRamp && ramp->type == GAMMA_RGB_256)))
1378 return true; 1554 return true;
1379 1555
1380 output_tf->type = TF_TYPE_DISTRIBUTED_POINTS; 1556 output_tf->type = TF_TYPE_DISTRIBUTED_POINTS;
@@ -1424,6 +1600,12 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
1424 MAX_HW_POINTS, 1600 MAX_HW_POINTS,
1425 coordinates_x, 1601 coordinates_x,
1426 output_tf->sdr_ref_white_level); 1602 output_tf->sdr_ref_white_level);
1603 } else if (tf == TRANSFER_FUNCTION_GAMMA22 &&
1604 fs_params != NULL) {
1605 build_freesync_hdr(rgb_regamma,
1606 MAX_HW_POINTS,
1607 coordinates_x,
1608 fs_params);
1427 } else { 1609 } else {
1428 tf_pts->end_exponent = 0; 1610 tf_pts->end_exponent = 0;
1429 tf_pts->x_point_at_y1_red = 1; 1611 tf_pts->x_point_at_y1_red = 1;
diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.h b/drivers/gpu/drm/amd/display/modules/color/color_gamma.h
index 63ccb9c91224..a6e164df090a 100644
--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.h
+++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.h
@@ -73,12 +73,21 @@ struct regamma_lut {
73 }; 73 };
74}; 74};
75 75
76struct freesync_hdr_tf_params {
77 unsigned int sdr_white_level;
78 unsigned int min_content; // luminance in 1/10000 nits
79 unsigned int max_content; // luminance in nits
80 unsigned int min_display; // luminance in 1/10000 nits
81 unsigned int max_display; // luminance in nits
82};
83
76void setup_x_points_distribution(void); 84void setup_x_points_distribution(void);
77void precompute_pq(void); 85void precompute_pq(void);
78void precompute_de_pq(void); 86void precompute_de_pq(void);
79 87
80bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf, 88bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf,
81 const struct dc_gamma *ramp, bool mapUserRamp, bool canRomBeUsed); 89 const struct dc_gamma *ramp, bool mapUserRamp, bool canRomBeUsed,
90 const struct freesync_hdr_tf_params *fs_params);
82 91
83bool mod_color_calculate_degamma_params(struct dc_transfer_func *output_tf, 92bool mod_color_calculate_degamma_params(struct dc_transfer_func *output_tf,
84 const struct dc_gamma *ramp, bool mapUserRamp); 93 const struct dc_gamma *ramp, bool mapUserRamp);
diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
index 4018c7180d00..620a171620ee 100644
--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
@@ -37,6 +37,8 @@
37#define RENDER_TIMES_MAX_COUNT 10 37#define RENDER_TIMES_MAX_COUNT 10
38/* Threshold to exit BTR (to avoid frequent enter-exits at the lower limit) */ 38/* Threshold to exit BTR (to avoid frequent enter-exits at the lower limit) */
39#define BTR_EXIT_MARGIN 2000 39#define BTR_EXIT_MARGIN 2000
40/*Threshold to exit fixed refresh rate*/
41#define FIXED_REFRESH_EXIT_MARGIN_IN_HZ 4
40/* Number of consecutive frames to check before entering/exiting fixed refresh*/ 42/* Number of consecutive frames to check before entering/exiting fixed refresh*/
41#define FIXED_REFRESH_ENTER_FRAME_COUNT 5 43#define FIXED_REFRESH_ENTER_FRAME_COUNT 5
42#define FIXED_REFRESH_EXIT_FRAME_COUNT 5 44#define FIXED_REFRESH_EXIT_FRAME_COUNT 5
@@ -257,40 +259,14 @@ static void apply_below_the_range(struct core_freesync *core_freesync,
257 if (in_out_vrr->btr.btr_active) { 259 if (in_out_vrr->btr.btr_active) {
258 in_out_vrr->btr.frame_counter = 0; 260 in_out_vrr->btr.frame_counter = 0;
259 in_out_vrr->btr.btr_active = false; 261 in_out_vrr->btr.btr_active = false;
260
261 /* Exit Fixed Refresh mode */
262 } else if (in_out_vrr->fixed.fixed_active) {
263
264 in_out_vrr->fixed.frame_counter++;
265
266 if (in_out_vrr->fixed.frame_counter >
267 FIXED_REFRESH_EXIT_FRAME_COUNT) {
268 in_out_vrr->fixed.frame_counter = 0;
269 in_out_vrr->fixed.fixed_active = false;
270 }
271 } 262 }
272 } else if (last_render_time_in_us > max_render_time_in_us) { 263 } else if (last_render_time_in_us > max_render_time_in_us) {
273 /* Enter Below the Range */ 264 /* Enter Below the Range */
274 if (!in_out_vrr->btr.btr_active && 265 in_out_vrr->btr.btr_active = true;
275 in_out_vrr->btr.btr_enabled) {
276 in_out_vrr->btr.btr_active = true;
277
278 /* Enter Fixed Refresh mode */
279 } else if (!in_out_vrr->fixed.fixed_active &&
280 !in_out_vrr->btr.btr_enabled) {
281 in_out_vrr->fixed.frame_counter++;
282
283 if (in_out_vrr->fixed.frame_counter >
284 FIXED_REFRESH_ENTER_FRAME_COUNT) {
285 in_out_vrr->fixed.frame_counter = 0;
286 in_out_vrr->fixed.fixed_active = true;
287 }
288 }
289 } 266 }
290 267
291 /* BTR set to "not active" so disengage */ 268 /* BTR set to "not active" so disengage */
292 if (!in_out_vrr->btr.btr_active) { 269 if (!in_out_vrr->btr.btr_active) {
293 in_out_vrr->btr.btr_active = false;
294 in_out_vrr->btr.inserted_duration_in_us = 0; 270 in_out_vrr->btr.inserted_duration_in_us = 0;
295 in_out_vrr->btr.frames_to_insert = 0; 271 in_out_vrr->btr.frames_to_insert = 0;
296 in_out_vrr->btr.frame_counter = 0; 272 in_out_vrr->btr.frame_counter = 0;
@@ -375,7 +351,12 @@ static void apply_fixed_refresh(struct core_freesync *core_freesync,
375 bool update = false; 351 bool update = false;
376 unsigned int max_render_time_in_us = in_out_vrr->max_duration_in_us; 352 unsigned int max_render_time_in_us = in_out_vrr->max_duration_in_us;
377 353
378 if (last_render_time_in_us + BTR_EXIT_MARGIN < max_render_time_in_us) { 354 //Compute the exit refresh rate and exit frame duration
355 unsigned int exit_refresh_rate_in_milli_hz = ((1000000000/max_render_time_in_us)
356 + (1000*FIXED_REFRESH_EXIT_MARGIN_IN_HZ));
357 unsigned int exit_frame_duration_in_us = 1000000000/exit_refresh_rate_in_milli_hz;
358
359 if (last_render_time_in_us < exit_frame_duration_in_us) {
379 /* Exit Fixed Refresh mode */ 360 /* Exit Fixed Refresh mode */
380 if (in_out_vrr->fixed.fixed_active) { 361 if (in_out_vrr->fixed.fixed_active) {
381 in_out_vrr->fixed.frame_counter++; 362 in_out_vrr->fixed.frame_counter++;
diff --git a/drivers/gpu/drm/amd/include/amd_shared.h b/drivers/gpu/drm/amd/include/amd_shared.h
index 2083c308007c..470d7b89071a 100644
--- a/drivers/gpu/drm/amd/include/amd_shared.h
+++ b/drivers/gpu/drm/amd/include/amd_shared.h
@@ -133,6 +133,10 @@ enum PP_FEATURE_MASK {
133 PP_AVFS_MASK = 0x40000, 133 PP_AVFS_MASK = 0x40000,
134}; 134};
135 135
136enum DC_FEATURE_MASK {
137 DC_FBC_MASK = 0x1,
138};
139
136/** 140/**
137 * struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks 141 * struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks
138 */ 142 */
diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h b/drivers/gpu/drm/amd/include/atomfirmware.h
index d2e7c0fa96c2..8eb0bb241210 100644
--- a/drivers/gpu/drm/amd/include/atomfirmware.h
+++ b/drivers/gpu/drm/amd/include/atomfirmware.h
@@ -1325,7 +1325,7 @@ struct atom_smu_info_v3_3 {
1325 struct atom_common_table_header table_header; 1325 struct atom_common_table_header table_header;
1326 uint8_t smuip_min_ver; 1326 uint8_t smuip_min_ver;
1327 uint8_t smuip_max_ver; 1327 uint8_t smuip_max_ver;
1328 uint8_t smu_rsd1; 1328 uint8_t waflclk_ss_mode;
1329 uint8_t gpuclk_ss_mode; 1329 uint8_t gpuclk_ss_mode;
1330 uint16_t sclk_ss_percentage; 1330 uint16_t sclk_ss_percentage;
1331 uint16_t sclk_ss_rate_10hz; 1331 uint16_t sclk_ss_rate_10hz;
@@ -1355,7 +1355,10 @@ struct atom_smu_info_v3_3 {
1355 uint32_t syspll3_1_vco_freq_10khz; 1355 uint32_t syspll3_1_vco_freq_10khz;
1356 uint32_t bootup_fclk_10khz; 1356 uint32_t bootup_fclk_10khz;
1357 uint32_t bootup_waflclk_10khz; 1357 uint32_t bootup_waflclk_10khz;
1358 uint32_t reserved[3]; 1358 uint32_t smu_info_caps;
1359 uint16_t waflclk_ss_percentage; // in unit of 0.001%
1360 uint16_t smuinitoffset;
1361 uint32_t reserved;
1359}; 1362};
1360 1363
1361/* 1364/*
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
index 64ecffd52126..58ac0b90c310 100644
--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
@@ -205,20 +205,6 @@ struct tile_config {
205/** 205/**
206 * struct kfd2kgd_calls 206 * struct kfd2kgd_calls
207 * 207 *
208 * @init_gtt_mem_allocation: Allocate a buffer on the gart aperture.
209 * The buffer can be used for mqds, hpds, kernel queue, fence and runlists
210 *
211 * @free_gtt_mem: Frees a buffer that was allocated on the gart aperture
212 *
213 * @get_local_mem_info: Retrieves information about GPU local memory
214 *
215 * @get_gpu_clock_counter: Retrieves GPU clock counter
216 *
217 * @get_max_engine_clock_in_mhz: Retrieves maximum GPU clock in MHz
218 *
219 * @alloc_pasid: Allocate a PASID
220 * @free_pasid: Free a PASID
221 *
222 * @program_sh_mem_settings: A function that should initiate the memory 208 * @program_sh_mem_settings: A function that should initiate the memory
223 * properties such as main aperture memory type (cache / non cached) and 209 * properties such as main aperture memory type (cache / non cached) and
224 * secondary aperture base address, size and memory type. 210 * secondary aperture base address, size and memory type.
@@ -255,64 +241,16 @@ struct tile_config {
255 * 241 *
256 * @get_tile_config: Returns GPU-specific tiling mode information 242 * @get_tile_config: Returns GPU-specific tiling mode information
257 * 243 *
258 * @get_cu_info: Retrieves activated cu info
259 *
260 * @get_vram_usage: Returns current VRAM usage
261 *
262 * @create_process_vm: Create a VM address space for a given process and GPU
263 *
264 * @destroy_process_vm: Destroy a VM
265 *
266 * @get_process_page_dir: Get physical address of a VM page directory
267 *
268 * @set_vm_context_page_table_base: Program page table base for a VMID 244 * @set_vm_context_page_table_base: Program page table base for a VMID
269 * 245 *
270 * @alloc_memory_of_gpu: Allocate GPUVM memory
271 *
272 * @free_memory_of_gpu: Free GPUVM memory
273 *
274 * @map_memory_to_gpu: Map GPUVM memory into a specific VM address
275 * space. Allocates and updates page tables and page directories as
276 * needed. This function may return before all page table updates have
277 * completed. This allows multiple map operations (on multiple GPUs)
278 * to happen concurrently. Use sync_memory to synchronize with all
279 * pending updates.
280 *
281 * @unmap_memor_to_gpu: Unmap GPUVM memory from a specific VM address space
282 *
283 * @sync_memory: Wait for pending page table updates to complete
284 *
285 * @map_gtt_bo_to_kernel: Map a GTT BO for kernel access
286 * Pins the BO, maps it to kernel address space. Such BOs are never evicted.
287 * The kernel virtual address remains valid until the BO is freed.
288 *
289 * @restore_process_bos: Restore all BOs that belong to the
290 * process. This is intended for restoring memory mappings after a TTM
291 * eviction.
292 *
293 * @invalidate_tlbs: Invalidate TLBs for a specific PASID 246 * @invalidate_tlbs: Invalidate TLBs for a specific PASID
294 * 247 *
295 * @invalidate_tlbs_vmid: Invalidate TLBs for a specific VMID 248 * @invalidate_tlbs_vmid: Invalidate TLBs for a specific VMID
296 * 249 *
297 * @submit_ib: Submits an IB to the engine specified by inserting the
298 * IB to the corresponding ring (ring type). The IB is executed with the
299 * specified VMID in a user mode context.
300 *
301 * @get_vm_fault_info: Return information about a recent VM fault on
302 * GFXv7 and v8. If multiple VM faults occurred since the last call of
303 * this function, it will return information about the first of those
304 * faults. On GFXv9 VM fault information is fully contained in the IH
305 * packet and this function is not needed.
306 *
307 * @read_vmid_from_vmfault_reg: On Hawaii the VMID is not set in the 250 * @read_vmid_from_vmfault_reg: On Hawaii the VMID is not set in the
308 * IH ring entry. This function allows the KFD ISR to get the VMID 251 * IH ring entry. This function allows the KFD ISR to get the VMID
309 * from the fault status register as early as possible. 252 * from the fault status register as early as possible.
310 * 253 *
311 * @gpu_recover: let kgd reset gpu after kfd detect CPC hang
312 *
313 * @set_compute_idle: Indicates that compute is idle on a device. This
314 * can be used to change power profiles depending on compute activity.
315 *
316 * @get_hive_id: Returns hive id of current device, 0 if xgmi is not enabled 254 * @get_hive_id: Returns hive id of current device, 0 if xgmi is not enabled
317 * 255 *
318 * This structure contains function pointers to services that the kgd driver 256 * This structure contains function pointers to services that the kgd driver
@@ -320,21 +258,6 @@ struct tile_config {
320 * 258 *
321 */ 259 */
322struct kfd2kgd_calls { 260struct kfd2kgd_calls {
323 int (*init_gtt_mem_allocation)(struct kgd_dev *kgd, size_t size,
324 void **mem_obj, uint64_t *gpu_addr,
325 void **cpu_ptr, bool mqd_gfx9);
326
327 void (*free_gtt_mem)(struct kgd_dev *kgd, void *mem_obj);
328
329 void (*get_local_mem_info)(struct kgd_dev *kgd,
330 struct kfd_local_mem_info *mem_info);
331 uint64_t (*get_gpu_clock_counter)(struct kgd_dev *kgd);
332
333 uint32_t (*get_max_engine_clock_in_mhz)(struct kgd_dev *kgd);
334
335 int (*alloc_pasid)(unsigned int bits);
336 void (*free_pasid)(unsigned int pasid);
337
338 /* Register access functions */ 261 /* Register access functions */
339 void (*program_sh_mem_settings)(struct kgd_dev *kgd, uint32_t vmid, 262 void (*program_sh_mem_settings)(struct kgd_dev *kgd, uint32_t vmid,
340 uint32_t sh_mem_config, uint32_t sh_mem_ape1_base, 263 uint32_t sh_mem_config, uint32_t sh_mem_ape1_base,
@@ -398,49 +321,11 @@ struct kfd2kgd_calls {
398 uint64_t va, uint32_t vmid); 321 uint64_t va, uint32_t vmid);
399 int (*get_tile_config)(struct kgd_dev *kgd, struct tile_config *config); 322 int (*get_tile_config)(struct kgd_dev *kgd, struct tile_config *config);
400 323
401 void (*get_cu_info)(struct kgd_dev *kgd,
402 struct kfd_cu_info *cu_info);
403 uint64_t (*get_vram_usage)(struct kgd_dev *kgd);
404
405 int (*create_process_vm)(struct kgd_dev *kgd, unsigned int pasid, void **vm,
406 void **process_info, struct dma_fence **ef);
407 int (*acquire_process_vm)(struct kgd_dev *kgd, struct file *filp,
408 unsigned int pasid, void **vm, void **process_info,
409 struct dma_fence **ef);
410 void (*destroy_process_vm)(struct kgd_dev *kgd, void *vm);
411 void (*release_process_vm)(struct kgd_dev *kgd, void *vm);
412 uint64_t (*get_process_page_dir)(void *vm);
413 void (*set_vm_context_page_table_base)(struct kgd_dev *kgd, 324 void (*set_vm_context_page_table_base)(struct kgd_dev *kgd,
414 uint32_t vmid, uint64_t page_table_base); 325 uint32_t vmid, uint64_t page_table_base);
415 int (*alloc_memory_of_gpu)(struct kgd_dev *kgd, uint64_t va,
416 uint64_t size, void *vm,
417 struct kgd_mem **mem, uint64_t *offset,
418 uint32_t flags);
419 int (*free_memory_of_gpu)(struct kgd_dev *kgd, struct kgd_mem *mem);
420 int (*map_memory_to_gpu)(struct kgd_dev *kgd, struct kgd_mem *mem,
421 void *vm);
422 int (*unmap_memory_to_gpu)(struct kgd_dev *kgd, struct kgd_mem *mem,
423 void *vm);
424 int (*sync_memory)(struct kgd_dev *kgd, struct kgd_mem *mem, bool intr);
425 int (*map_gtt_bo_to_kernel)(struct kgd_dev *kgd, struct kgd_mem *mem,
426 void **kptr, uint64_t *size);
427 int (*restore_process_bos)(void *process_info, struct dma_fence **ef);
428
429 int (*invalidate_tlbs)(struct kgd_dev *kgd, uint16_t pasid); 326 int (*invalidate_tlbs)(struct kgd_dev *kgd, uint16_t pasid);
430 int (*invalidate_tlbs_vmid)(struct kgd_dev *kgd, uint16_t vmid); 327 int (*invalidate_tlbs_vmid)(struct kgd_dev *kgd, uint16_t vmid);
431
432 int (*submit_ib)(struct kgd_dev *kgd, enum kgd_engine_type engine,
433 uint32_t vmid, uint64_t gpu_addr,
434 uint32_t *ib_cmd, uint32_t ib_len);
435
436 int (*get_vm_fault_info)(struct kgd_dev *kgd,
437 struct kfd_vm_fault_info *info);
438 uint32_t (*read_vmid_from_vmfault_reg)(struct kgd_dev *kgd); 328 uint32_t (*read_vmid_from_vmfault_reg)(struct kgd_dev *kgd);
439
440 void (*gpu_recover)(struct kgd_dev *kgd);
441
442 void (*set_compute_idle)(struct kgd_dev *kgd, bool idle);
443
444 uint64_t (*get_hive_id)(struct kgd_dev *kgd); 329 uint64_t (*get_hive_id)(struct kgd_dev *kgd);
445 330
446}; 331};
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_powertune.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_powertune.c
index 5e19f5977eb1..d138ddae563d 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_powertune.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_powertune.c
@@ -967,7 +967,7 @@ int smu7_enable_didt_config(struct pp_hwmgr *hwmgr)
967 PP_CAP(PHM_PlatformCaps_TDRamping) || 967 PP_CAP(PHM_PlatformCaps_TDRamping) ||
968 PP_CAP(PHM_PlatformCaps_TCPRamping)) { 968 PP_CAP(PHM_PlatformCaps_TCPRamping)) {
969 969
970 adev->gfx.rlc.funcs->enter_safe_mode(adev); 970 amdgpu_gfx_rlc_enter_safe_mode(adev);
971 mutex_lock(&adev->grbm_idx_mutex); 971 mutex_lock(&adev->grbm_idx_mutex);
972 value = 0; 972 value = 0;
973 value2 = cgs_read_register(hwmgr->device, mmGRBM_GFX_INDEX); 973 value2 = cgs_read_register(hwmgr->device, mmGRBM_GFX_INDEX);
@@ -1014,13 +1014,13 @@ int smu7_enable_didt_config(struct pp_hwmgr *hwmgr)
1014 "Failed to enable DPM DIDT.", goto error); 1014 "Failed to enable DPM DIDT.", goto error);
1015 } 1015 }
1016 mutex_unlock(&adev->grbm_idx_mutex); 1016 mutex_unlock(&adev->grbm_idx_mutex);
1017 adev->gfx.rlc.funcs->exit_safe_mode(adev); 1017 amdgpu_gfx_rlc_exit_safe_mode(adev);
1018 } 1018 }
1019 1019
1020 return 0; 1020 return 0;
1021error: 1021error:
1022 mutex_unlock(&adev->grbm_idx_mutex); 1022 mutex_unlock(&adev->grbm_idx_mutex);
1023 adev->gfx.rlc.funcs->exit_safe_mode(adev); 1023 amdgpu_gfx_rlc_exit_safe_mode(adev);
1024 return result; 1024 return result;
1025} 1025}
1026 1026
@@ -1034,7 +1034,7 @@ int smu7_disable_didt_config(struct pp_hwmgr *hwmgr)
1034 PP_CAP(PHM_PlatformCaps_TDRamping) || 1034 PP_CAP(PHM_PlatformCaps_TDRamping) ||
1035 PP_CAP(PHM_PlatformCaps_TCPRamping)) { 1035 PP_CAP(PHM_PlatformCaps_TCPRamping)) {
1036 1036
1037 adev->gfx.rlc.funcs->enter_safe_mode(adev); 1037 amdgpu_gfx_rlc_enter_safe_mode(adev);
1038 1038
1039 result = smu7_enable_didt(hwmgr, false); 1039 result = smu7_enable_didt(hwmgr, false);
1040 PP_ASSERT_WITH_CODE((result == 0), 1040 PP_ASSERT_WITH_CODE((result == 0),
@@ -1046,12 +1046,12 @@ int smu7_disable_didt_config(struct pp_hwmgr *hwmgr)
1046 PP_ASSERT_WITH_CODE((0 == result), 1046 PP_ASSERT_WITH_CODE((0 == result),
1047 "Failed to disable DPM DIDT.", goto error); 1047 "Failed to disable DPM DIDT.", goto error);
1048 } 1048 }
1049 adev->gfx.rlc.funcs->exit_safe_mode(adev); 1049 amdgpu_gfx_rlc_exit_safe_mode(adev);
1050 } 1050 }
1051 1051
1052 return 0; 1052 return 0;
1053error: 1053error:
1054 adev->gfx.rlc.funcs->exit_safe_mode(adev); 1054 amdgpu_gfx_rlc_exit_safe_mode(adev);
1055 return result; 1055 return result;
1056} 1056}
1057 1057
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c
index 99a33c33a32c..101c09b212ad 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu_helper.c
@@ -713,20 +713,20 @@ int smu_set_watermarks_for_clocks_ranges(void *wt_table,
713 for (i = 0; i < wm_with_clock_ranges->num_wm_dmif_sets; i++) { 713 for (i = 0; i < wm_with_clock_ranges->num_wm_dmif_sets; i++) {
714 table->WatermarkRow[1][i].MinClock = 714 table->WatermarkRow[1][i].MinClock =
715 cpu_to_le16((uint16_t) 715 cpu_to_le16((uint16_t)
716 (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_dcfclk_clk_in_khz) / 716 (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_dcfclk_clk_in_khz /
717 1000); 717 1000));
718 table->WatermarkRow[1][i].MaxClock = 718 table->WatermarkRow[1][i].MaxClock =
719 cpu_to_le16((uint16_t) 719 cpu_to_le16((uint16_t)
720 (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_dcfclk_clk_in_khz) / 720 (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_dcfclk_clk_in_khz /
721 1000); 721 1000));
722 table->WatermarkRow[1][i].MinUclk = 722 table->WatermarkRow[1][i].MinUclk =
723 cpu_to_le16((uint16_t) 723 cpu_to_le16((uint16_t)
724 (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_mem_clk_in_khz) / 724 (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_min_mem_clk_in_khz /
725 1000); 725 1000));
726 table->WatermarkRow[1][i].MaxUclk = 726 table->WatermarkRow[1][i].MaxUclk =
727 cpu_to_le16((uint16_t) 727 cpu_to_le16((uint16_t)
728 (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_mem_clk_in_khz) / 728 (wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_max_mem_clk_in_khz /
729 1000); 729 1000));
730 table->WatermarkRow[1][i].WmSetting = (uint8_t) 730 table->WatermarkRow[1][i].WmSetting = (uint8_t)
731 wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_set_id; 731 wm_with_clock_ranges->wm_dmif_clocks_ranges[i].wm_set_id;
732 } 732 }
@@ -734,20 +734,20 @@ int smu_set_watermarks_for_clocks_ranges(void *wt_table,
734 for (i = 0; i < wm_with_clock_ranges->num_wm_mcif_sets; i++) { 734 for (i = 0; i < wm_with_clock_ranges->num_wm_mcif_sets; i++) {
735 table->WatermarkRow[0][i].MinClock = 735 table->WatermarkRow[0][i].MinClock =
736 cpu_to_le16((uint16_t) 736 cpu_to_le16((uint16_t)
737 (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_socclk_clk_in_khz) / 737 (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_socclk_clk_in_khz /
738 1000); 738 1000));
739 table->WatermarkRow[0][i].MaxClock = 739 table->WatermarkRow[0][i].MaxClock =
740 cpu_to_le16((uint16_t) 740 cpu_to_le16((uint16_t)
741 (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_socclk_clk_in_khz) / 741 (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_socclk_clk_in_khz /
742 1000); 742 1000));
743 table->WatermarkRow[0][i].MinUclk = 743 table->WatermarkRow[0][i].MinUclk =
744 cpu_to_le16((uint16_t) 744 cpu_to_le16((uint16_t)
745 (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_mem_clk_in_khz) / 745 (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_min_mem_clk_in_khz /
746 1000); 746 1000));
747 table->WatermarkRow[0][i].MaxUclk = 747 table->WatermarkRow[0][i].MaxUclk =
748 cpu_to_le16((uint16_t) 748 cpu_to_le16((uint16_t)
749 (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_mem_clk_in_khz) / 749 (wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_max_mem_clk_in_khz /
750 1000); 750 1000));
751 table->WatermarkRow[0][i].WmSetting = (uint8_t) 751 table->WatermarkRow[0][i].WmSetting = (uint8_t)
752 wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id; 752 wm_with_clock_ranges->wm_mcif_clocks_ranges[i].wm_set_id;
753 } 753 }
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c
index 2d88abf97e7b..6f26cb241ecc 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_powertune.c
@@ -937,7 +937,7 @@ static int vega10_enable_cac_driving_se_didt_config(struct pp_hwmgr *hwmgr)
937 937
938 num_se = adev->gfx.config.max_shader_engines; 938 num_se = adev->gfx.config.max_shader_engines;
939 939
940 adev->gfx.rlc.funcs->enter_safe_mode(adev); 940 amdgpu_gfx_rlc_enter_safe_mode(adev);
941 941
942 mutex_lock(&adev->grbm_idx_mutex); 942 mutex_lock(&adev->grbm_idx_mutex);
943 for (count = 0; count < num_se; count++) { 943 for (count = 0; count < num_se; count++) {
@@ -962,7 +962,7 @@ static int vega10_enable_cac_driving_se_didt_config(struct pp_hwmgr *hwmgr)
962 962
963 vega10_didt_set_mask(hwmgr, true); 963 vega10_didt_set_mask(hwmgr, true);
964 964
965 adev->gfx.rlc.funcs->exit_safe_mode(adev); 965 amdgpu_gfx_rlc_exit_safe_mode(adev);
966 966
967 return 0; 967 return 0;
968} 968}
@@ -971,11 +971,11 @@ static int vega10_disable_cac_driving_se_didt_config(struct pp_hwmgr *hwmgr)
971{ 971{
972 struct amdgpu_device *adev = hwmgr->adev; 972 struct amdgpu_device *adev = hwmgr->adev;
973 973
974 adev->gfx.rlc.funcs->enter_safe_mode(adev); 974 amdgpu_gfx_rlc_enter_safe_mode(adev);
975 975
976 vega10_didt_set_mask(hwmgr, false); 976 vega10_didt_set_mask(hwmgr, false);
977 977
978 adev->gfx.rlc.funcs->exit_safe_mode(adev); 978 amdgpu_gfx_rlc_exit_safe_mode(adev);
979 979
980 return 0; 980 return 0;
981} 981}
@@ -988,7 +988,7 @@ static int vega10_enable_psm_gc_didt_config(struct pp_hwmgr *hwmgr)
988 988
989 num_se = adev->gfx.config.max_shader_engines; 989 num_se = adev->gfx.config.max_shader_engines;
990 990
991 adev->gfx.rlc.funcs->enter_safe_mode(adev); 991 amdgpu_gfx_rlc_enter_safe_mode(adev);
992 992
993 mutex_lock(&adev->grbm_idx_mutex); 993 mutex_lock(&adev->grbm_idx_mutex);
994 for (count = 0; count < num_se; count++) { 994 for (count = 0; count < num_se; count++) {
@@ -1007,7 +1007,7 @@ static int vega10_enable_psm_gc_didt_config(struct pp_hwmgr *hwmgr)
1007 1007
1008 vega10_didt_set_mask(hwmgr, true); 1008 vega10_didt_set_mask(hwmgr, true);
1009 1009
1010 adev->gfx.rlc.funcs->exit_safe_mode(adev); 1010 amdgpu_gfx_rlc_exit_safe_mode(adev);
1011 1011
1012 vega10_program_gc_didt_config_registers(hwmgr, GCDiDtDroopCtrlConfig_vega10); 1012 vega10_program_gc_didt_config_registers(hwmgr, GCDiDtDroopCtrlConfig_vega10);
1013 if (PP_CAP(PHM_PlatformCaps_GCEDC)) 1013 if (PP_CAP(PHM_PlatformCaps_GCEDC))
@@ -1024,11 +1024,11 @@ static int vega10_disable_psm_gc_didt_config(struct pp_hwmgr *hwmgr)
1024 struct amdgpu_device *adev = hwmgr->adev; 1024 struct amdgpu_device *adev = hwmgr->adev;
1025 uint32_t data; 1025 uint32_t data;
1026 1026
1027 adev->gfx.rlc.funcs->enter_safe_mode(adev); 1027 amdgpu_gfx_rlc_enter_safe_mode(adev);
1028 1028
1029 vega10_didt_set_mask(hwmgr, false); 1029 vega10_didt_set_mask(hwmgr, false);
1030 1030
1031 adev->gfx.rlc.funcs->exit_safe_mode(adev); 1031 amdgpu_gfx_rlc_exit_safe_mode(adev);
1032 1032
1033 if (PP_CAP(PHM_PlatformCaps_GCEDC)) { 1033 if (PP_CAP(PHM_PlatformCaps_GCEDC)) {
1034 data = 0x00000000; 1034 data = 0x00000000;
@@ -1049,7 +1049,7 @@ static int vega10_enable_se_edc_config(struct pp_hwmgr *hwmgr)
1049 1049
1050 num_se = adev->gfx.config.max_shader_engines; 1050 num_se = adev->gfx.config.max_shader_engines;
1051 1051
1052 adev->gfx.rlc.funcs->enter_safe_mode(adev); 1052 amdgpu_gfx_rlc_enter_safe_mode(adev);
1053 1053
1054 mutex_lock(&adev->grbm_idx_mutex); 1054 mutex_lock(&adev->grbm_idx_mutex);
1055 for (count = 0; count < num_se; count++) { 1055 for (count = 0; count < num_se; count++) {
@@ -1070,7 +1070,7 @@ static int vega10_enable_se_edc_config(struct pp_hwmgr *hwmgr)
1070 1070
1071 vega10_didt_set_mask(hwmgr, true); 1071 vega10_didt_set_mask(hwmgr, true);
1072 1072
1073 adev->gfx.rlc.funcs->exit_safe_mode(adev); 1073 amdgpu_gfx_rlc_exit_safe_mode(adev);
1074 1074
1075 return 0; 1075 return 0;
1076} 1076}
@@ -1079,11 +1079,11 @@ static int vega10_disable_se_edc_config(struct pp_hwmgr *hwmgr)
1079{ 1079{
1080 struct amdgpu_device *adev = hwmgr->adev; 1080 struct amdgpu_device *adev = hwmgr->adev;
1081 1081
1082 adev->gfx.rlc.funcs->enter_safe_mode(adev); 1082 amdgpu_gfx_rlc_enter_safe_mode(adev);
1083 1083
1084 vega10_didt_set_mask(hwmgr, false); 1084 vega10_didt_set_mask(hwmgr, false);
1085 1085
1086 adev->gfx.rlc.funcs->exit_safe_mode(adev); 1086 amdgpu_gfx_rlc_exit_safe_mode(adev);
1087 1087
1088 return 0; 1088 return 0;
1089} 1089}
@@ -1097,7 +1097,7 @@ static int vega10_enable_psm_gc_edc_config(struct pp_hwmgr *hwmgr)
1097 1097
1098 num_se = adev->gfx.config.max_shader_engines; 1098 num_se = adev->gfx.config.max_shader_engines;
1099 1099
1100 adev->gfx.rlc.funcs->enter_safe_mode(adev); 1100 amdgpu_gfx_rlc_enter_safe_mode(adev);
1101 1101
1102 vega10_program_gc_didt_config_registers(hwmgr, AvfsPSMResetConfig_vega10); 1102 vega10_program_gc_didt_config_registers(hwmgr, AvfsPSMResetConfig_vega10);
1103 1103
@@ -1118,7 +1118,7 @@ static int vega10_enable_psm_gc_edc_config(struct pp_hwmgr *hwmgr)
1118 1118
1119 vega10_didt_set_mask(hwmgr, true); 1119 vega10_didt_set_mask(hwmgr, true);
1120 1120
1121 adev->gfx.rlc.funcs->exit_safe_mode(adev); 1121 amdgpu_gfx_rlc_exit_safe_mode(adev);
1122 1122
1123 vega10_program_gc_didt_config_registers(hwmgr, PSMGCEDCDroopCtrlConfig_vega10); 1123 vega10_program_gc_didt_config_registers(hwmgr, PSMGCEDCDroopCtrlConfig_vega10);
1124 1124
@@ -1138,11 +1138,11 @@ static int vega10_disable_psm_gc_edc_config(struct pp_hwmgr *hwmgr)
1138 struct amdgpu_device *adev = hwmgr->adev; 1138 struct amdgpu_device *adev = hwmgr->adev;
1139 uint32_t data; 1139 uint32_t data;
1140 1140
1141 adev->gfx.rlc.funcs->enter_safe_mode(adev); 1141 amdgpu_gfx_rlc_enter_safe_mode(adev);
1142 1142
1143 vega10_didt_set_mask(hwmgr, false); 1143 vega10_didt_set_mask(hwmgr, false);
1144 1144
1145 adev->gfx.rlc.funcs->exit_safe_mode(adev); 1145 amdgpu_gfx_rlc_exit_safe_mode(adev);
1146 1146
1147 if (PP_CAP(PHM_PlatformCaps_GCEDC)) { 1147 if (PP_CAP(PHM_PlatformCaps_GCEDC)) {
1148 data = 0x00000000; 1148 data = 0x00000000;
@@ -1160,7 +1160,7 @@ static int vega10_enable_se_edc_force_stall_config(struct pp_hwmgr *hwmgr)
1160 struct amdgpu_device *adev = hwmgr->adev; 1160 struct amdgpu_device *adev = hwmgr->adev;
1161 int result; 1161 int result;
1162 1162
1163 adev->gfx.rlc.funcs->enter_safe_mode(adev); 1163 amdgpu_gfx_rlc_enter_safe_mode(adev);
1164 1164
1165 mutex_lock(&adev->grbm_idx_mutex); 1165 mutex_lock(&adev->grbm_idx_mutex);
1166 WREG32_SOC15(GC, 0, mmGRBM_GFX_INDEX, 0xE0000000); 1166 WREG32_SOC15(GC, 0, mmGRBM_GFX_INDEX, 0xE0000000);
@@ -1173,7 +1173,7 @@ static int vega10_enable_se_edc_force_stall_config(struct pp_hwmgr *hwmgr)
1173 1173
1174 vega10_didt_set_mask(hwmgr, false); 1174 vega10_didt_set_mask(hwmgr, false);
1175 1175
1176 adev->gfx.rlc.funcs->exit_safe_mode(adev); 1176 amdgpu_gfx_rlc_exit_safe_mode(adev);
1177 1177
1178 return 0; 1178 return 0;
1179} 1179}
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
index 57143d51e3ee..f2daf00cc911 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c
@@ -120,6 +120,7 @@ static void vega20_set_default_registry_data(struct pp_hwmgr *hwmgr)
120 data->registry_data.disable_auto_wattman = 1; 120 data->registry_data.disable_auto_wattman = 1;
121 data->registry_data.auto_wattman_debug = 0; 121 data->registry_data.auto_wattman_debug = 0;
122 data->registry_data.auto_wattman_sample_period = 100; 122 data->registry_data.auto_wattman_sample_period = 100;
123 data->registry_data.fclk_gfxclk_ratio = 0x3F6CCCCD;
123 data->registry_data.auto_wattman_threshold = 50; 124 data->registry_data.auto_wattman_threshold = 50;
124 data->registry_data.gfxoff_controlled_by_driver = 1; 125 data->registry_data.gfxoff_controlled_by_driver = 1;
125 data->gfxoff_allowed = false; 126 data->gfxoff_allowed = false;
@@ -829,6 +830,28 @@ static int vega20_enable_all_smu_features(struct pp_hwmgr *hwmgr)
829 return 0; 830 return 0;
830} 831}
831 832
833static int vega20_notify_smc_display_change(struct pp_hwmgr *hwmgr)
834{
835 struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
836
837 if (data->smu_features[GNLD_DPM_UCLK].enabled)
838 return smum_send_msg_to_smc_with_parameter(hwmgr,
839 PPSMC_MSG_SetUclkFastSwitch,
840 1);
841
842 return 0;
843}
844
845static int vega20_send_clock_ratio(struct pp_hwmgr *hwmgr)
846{
847 struct vega20_hwmgr *data =
848 (struct vega20_hwmgr *)(hwmgr->backend);
849
850 return smum_send_msg_to_smc_with_parameter(hwmgr,
851 PPSMC_MSG_SetFclkGfxClkRatio,
852 data->registry_data.fclk_gfxclk_ratio);
853}
854
832static int vega20_disable_all_smu_features(struct pp_hwmgr *hwmgr) 855static int vega20_disable_all_smu_features(struct pp_hwmgr *hwmgr)
833{ 856{
834 struct vega20_hwmgr *data = 857 struct vega20_hwmgr *data =
@@ -1532,6 +1555,16 @@ static int vega20_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
1532 "[EnableDPMTasks] Failed to enable all smu features!", 1555 "[EnableDPMTasks] Failed to enable all smu features!",
1533 return result); 1556 return result);
1534 1557
1558 result = vega20_notify_smc_display_change(hwmgr);
1559 PP_ASSERT_WITH_CODE(!result,
1560 "[EnableDPMTasks] Failed to notify smc display change!",
1561 return result);
1562
1563 result = vega20_send_clock_ratio(hwmgr);
1564 PP_ASSERT_WITH_CODE(!result,
1565 "[EnableDPMTasks] Failed to send clock ratio!",
1566 return result);
1567
1535 /* Initialize UVD/VCE powergating state */ 1568 /* Initialize UVD/VCE powergating state */
1536 vega20_init_powergate_state(hwmgr); 1569 vega20_init_powergate_state(hwmgr);
1537 1570
@@ -1972,19 +2005,6 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx,
1972 return ret; 2005 return ret;
1973} 2006}
1974 2007
1975static int vega20_notify_smc_display_change(struct pp_hwmgr *hwmgr,
1976 bool has_disp)
1977{
1978 struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
1979
1980 if (data->smu_features[GNLD_DPM_UCLK].enabled)
1981 return smum_send_msg_to_smc_with_parameter(hwmgr,
1982 PPSMC_MSG_SetUclkFastSwitch,
1983 has_disp ? 1 : 0);
1984
1985 return 0;
1986}
1987
1988int vega20_display_clock_voltage_request(struct pp_hwmgr *hwmgr, 2008int vega20_display_clock_voltage_request(struct pp_hwmgr *hwmgr,
1989 struct pp_display_clock_request *clock_req) 2009 struct pp_display_clock_request *clock_req)
1990{ 2010{
@@ -2044,13 +2064,6 @@ static int vega20_notify_smc_display_config_after_ps_adjustment(
2044 struct pp_display_clock_request clock_req; 2064 struct pp_display_clock_request clock_req;
2045 int ret = 0; 2065 int ret = 0;
2046 2066
2047 if ((hwmgr->display_config->num_display > 1) &&
2048 !hwmgr->display_config->multi_monitor_in_sync &&
2049 !hwmgr->display_config->nb_pstate_switch_disable)
2050 vega20_notify_smc_display_change(hwmgr, false);
2051 else
2052 vega20_notify_smc_display_change(hwmgr, true);
2053
2054 min_clocks.dcefClock = hwmgr->display_config->min_dcef_set_clk; 2067 min_clocks.dcefClock = hwmgr->display_config->min_dcef_set_clk;
2055 min_clocks.dcefClockInSR = hwmgr->display_config->min_dcef_deep_sleep_set_clk; 2068 min_clocks.dcefClockInSR = hwmgr->display_config->min_dcef_deep_sleep_set_clk;
2056 min_clocks.memoryClock = hwmgr->display_config->min_mem_set_clock; 2069 min_clocks.memoryClock = hwmgr->display_config->min_mem_set_clock;
@@ -2742,7 +2755,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,
2742 for (i = 0; i < clocks.num_levels; i++) 2755 for (i = 0; i < clocks.num_levels; i++)
2743 size += sprintf(buf + size, "%d: %uMhz %s\n", 2756 size += sprintf(buf + size, "%d: %uMhz %s\n",
2744 i, clocks.data[i].clocks_in_khz / 1000, 2757 i, clocks.data[i].clocks_in_khz / 1000,
2745 (clocks.data[i].clocks_in_khz == now) ? "*" : ""); 2758 (clocks.data[i].clocks_in_khz == now * 10) ? "*" : "");
2746 break; 2759 break;
2747 2760
2748 case PP_MCLK: 2761 case PP_MCLK:
@@ -2759,7 +2772,7 @@ static int vega20_print_clock_levels(struct pp_hwmgr *hwmgr,
2759 for (i = 0; i < clocks.num_levels; i++) 2772 for (i = 0; i < clocks.num_levels; i++)
2760 size += sprintf(buf + size, "%d: %uMhz %s\n", 2773 size += sprintf(buf + size, "%d: %uMhz %s\n",
2761 i, clocks.data[i].clocks_in_khz / 1000, 2774 i, clocks.data[i].clocks_in_khz / 1000,
2762 (clocks.data[i].clocks_in_khz == now) ? "*" : ""); 2775 (clocks.data[i].clocks_in_khz == now * 10) ? "*" : "");
2763 break; 2776 break;
2764 2777
2765 case PP_PCIE: 2778 case PP_PCIE:
@@ -3441,109 +3454,64 @@ static int vega20_get_thermal_temperature_range(struct pp_hwmgr *hwmgr,
3441 3454
3442static const struct pp_hwmgr_func vega20_hwmgr_funcs = { 3455static const struct pp_hwmgr_func vega20_hwmgr_funcs = {
3443 /* init/fini related */ 3456 /* init/fini related */
3444 .backend_init = 3457 .backend_init = vega20_hwmgr_backend_init,
3445 vega20_hwmgr_backend_init, 3458 .backend_fini = vega20_hwmgr_backend_fini,
3446 .backend_fini = 3459 .asic_setup = vega20_setup_asic_task,
3447 vega20_hwmgr_backend_fini, 3460 .power_off_asic = vega20_power_off_asic,
3448 .asic_setup = 3461 .dynamic_state_management_enable = vega20_enable_dpm_tasks,
3449 vega20_setup_asic_task, 3462 .dynamic_state_management_disable = vega20_disable_dpm_tasks,
3450 .power_off_asic =
3451 vega20_power_off_asic,
3452 .dynamic_state_management_enable =
3453 vega20_enable_dpm_tasks,
3454 .dynamic_state_management_disable =
3455 vega20_disable_dpm_tasks,
3456 /* power state related */ 3463 /* power state related */
3457 .apply_clocks_adjust_rules = 3464 .apply_clocks_adjust_rules = vega20_apply_clocks_adjust_rules,
3458 vega20_apply_clocks_adjust_rules, 3465 .pre_display_config_changed = vega20_pre_display_configuration_changed_task,
3459 .pre_display_config_changed = 3466 .display_config_changed = vega20_display_configuration_changed_task,
3460 vega20_pre_display_configuration_changed_task,
3461 .display_config_changed =
3462 vega20_display_configuration_changed_task,
3463 .check_smc_update_required_for_display_configuration = 3467 .check_smc_update_required_for_display_configuration =
3464 vega20_check_smc_update_required_for_display_configuration, 3468 vega20_check_smc_update_required_for_display_configuration,
3465 .notify_smc_display_config_after_ps_adjustment = 3469 .notify_smc_display_config_after_ps_adjustment =
3466 vega20_notify_smc_display_config_after_ps_adjustment, 3470 vega20_notify_smc_display_config_after_ps_adjustment,
3467 /* export to DAL */ 3471 /* export to DAL */
3468 .get_sclk = 3472 .get_sclk = vega20_dpm_get_sclk,
3469 vega20_dpm_get_sclk, 3473 .get_mclk = vega20_dpm_get_mclk,
3470 .get_mclk = 3474 .get_dal_power_level = vega20_get_dal_power_level,
3471 vega20_dpm_get_mclk, 3475 .get_clock_by_type_with_latency = vega20_get_clock_by_type_with_latency,
3472 .get_dal_power_level = 3476 .get_clock_by_type_with_voltage = vega20_get_clock_by_type_with_voltage,
3473 vega20_get_dal_power_level, 3477 .set_watermarks_for_clocks_ranges = vega20_set_watermarks_for_clocks_ranges,
3474 .get_clock_by_type_with_latency = 3478 .display_clock_voltage_request = vega20_display_clock_voltage_request,
3475 vega20_get_clock_by_type_with_latency, 3479 .get_performance_level = vega20_get_performance_level,
3476 .get_clock_by_type_with_voltage =
3477 vega20_get_clock_by_type_with_voltage,
3478 .set_watermarks_for_clocks_ranges =
3479 vega20_set_watermarks_for_clocks_ranges,
3480 .display_clock_voltage_request =
3481 vega20_display_clock_voltage_request,
3482 .get_performance_level =
3483 vega20_get_performance_level,
3484 /* UMD pstate, profile related */ 3480 /* UMD pstate, profile related */
3485 .force_dpm_level = 3481 .force_dpm_level = vega20_dpm_force_dpm_level,
3486 vega20_dpm_force_dpm_level, 3482 .get_power_profile_mode = vega20_get_power_profile_mode,
3487 .get_power_profile_mode = 3483 .set_power_profile_mode = vega20_set_power_profile_mode,
3488 vega20_get_power_profile_mode,
3489 .set_power_profile_mode =
3490 vega20_set_power_profile_mode,
3491 /* od related */ 3484 /* od related */
3492 .set_power_limit = 3485 .set_power_limit = vega20_set_power_limit,
3493 vega20_set_power_limit, 3486 .get_sclk_od = vega20_get_sclk_od,
3494 .get_sclk_od = 3487 .set_sclk_od = vega20_set_sclk_od,
3495 vega20_get_sclk_od, 3488 .get_mclk_od = vega20_get_mclk_od,
3496 .set_sclk_od = 3489 .set_mclk_od = vega20_set_mclk_od,
3497 vega20_set_sclk_od, 3490 .odn_edit_dpm_table = vega20_odn_edit_dpm_table,
3498 .get_mclk_od =
3499 vega20_get_mclk_od,
3500 .set_mclk_od =
3501 vega20_set_mclk_od,
3502 .odn_edit_dpm_table =
3503 vega20_odn_edit_dpm_table,
3504 /* for sysfs to retrive/set gfxclk/memclk */ 3491 /* for sysfs to retrive/set gfxclk/memclk */
3505 .force_clock_level = 3492 .force_clock_level = vega20_force_clock_level,
3506 vega20_force_clock_level, 3493 .print_clock_levels = vega20_print_clock_levels,
3507 .print_clock_levels = 3494 .read_sensor = vega20_read_sensor,
3508 vega20_print_clock_levels,
3509 .read_sensor =
3510 vega20_read_sensor,
3511 /* powergate related */ 3495 /* powergate related */
3512 .powergate_uvd = 3496 .powergate_uvd = vega20_power_gate_uvd,
3513 vega20_power_gate_uvd, 3497 .powergate_vce = vega20_power_gate_vce,
3514 .powergate_vce =
3515 vega20_power_gate_vce,
3516 /* thermal related */ 3498 /* thermal related */
3517 .start_thermal_controller = 3499 .start_thermal_controller = vega20_start_thermal_controller,
3518 vega20_start_thermal_controller, 3500 .stop_thermal_controller = vega20_thermal_stop_thermal_controller,
3519 .stop_thermal_controller = 3501 .get_thermal_temperature_range = vega20_get_thermal_temperature_range,
3520 vega20_thermal_stop_thermal_controller, 3502 .register_irq_handlers = smu9_register_irq_handlers,
3521 .get_thermal_temperature_range = 3503 .disable_smc_firmware_ctf = vega20_thermal_disable_alert,
3522 vega20_get_thermal_temperature_range,
3523 .register_irq_handlers =
3524 smu9_register_irq_handlers,
3525 .disable_smc_firmware_ctf =
3526 vega20_thermal_disable_alert,
3527 /* fan control related */ 3504 /* fan control related */
3528 .get_fan_speed_percent = 3505 .get_fan_speed_percent = vega20_fan_ctrl_get_fan_speed_percent,
3529 vega20_fan_ctrl_get_fan_speed_percent, 3506 .set_fan_speed_percent = vega20_fan_ctrl_set_fan_speed_percent,
3530 .set_fan_speed_percent = 3507 .get_fan_speed_info = vega20_fan_ctrl_get_fan_speed_info,
3531 vega20_fan_ctrl_set_fan_speed_percent, 3508 .get_fan_speed_rpm = vega20_fan_ctrl_get_fan_speed_rpm,
3532 .get_fan_speed_info = 3509 .set_fan_speed_rpm = vega20_fan_ctrl_set_fan_speed_rpm,
3533 vega20_fan_ctrl_get_fan_speed_info, 3510 .get_fan_control_mode = vega20_get_fan_control_mode,
3534 .get_fan_speed_rpm = 3511 .set_fan_control_mode = vega20_set_fan_control_mode,
3535 vega20_fan_ctrl_get_fan_speed_rpm,
3536 .set_fan_speed_rpm =
3537 vega20_fan_ctrl_set_fan_speed_rpm,
3538 .get_fan_control_mode =
3539 vega20_get_fan_control_mode,
3540 .set_fan_control_mode =
3541 vega20_set_fan_control_mode,
3542 /* smu memory related */ 3512 /* smu memory related */
3543 .notify_cac_buffer_info = 3513 .notify_cac_buffer_info = vega20_notify_cac_buffer_info,
3544 vega20_notify_cac_buffer_info, 3514 .enable_mgpu_fan_boost = vega20_enable_mgpu_fan_boost,
3545 .enable_mgpu_fan_boost =
3546 vega20_enable_mgpu_fan_boost,
3547}; 3515};
3548 3516
3549int vega20_hwmgr_init(struct pp_hwmgr *hwmgr) 3517int vega20_hwmgr_init(struct pp_hwmgr *hwmgr)
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h
index 56fe6a0d42e8..25faaa5c5b10 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.h
@@ -328,6 +328,7 @@ struct vega20_registry_data {
328 uint8_t disable_auto_wattman; 328 uint8_t disable_auto_wattman;
329 uint32_t auto_wattman_debug; 329 uint32_t auto_wattman_debug;
330 uint32_t auto_wattman_sample_period; 330 uint32_t auto_wattman_sample_period;
331 uint32_t fclk_gfxclk_ratio;
331 uint8_t auto_wattman_threshold; 332 uint8_t auto_wattman_threshold;
332 uint8_t log_avfs_param; 333 uint8_t log_avfs_param;
333 uint8_t enable_enginess; 334 uint8_t enable_enginess;
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
index e5a60aa44b5d..07d180ce4d18 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
@@ -28,7 +28,6 @@
28#include "hardwaremanager.h" 28#include "hardwaremanager.h"
29#include "hwmgr_ppt.h" 29#include "hwmgr_ppt.h"
30#include "ppatomctrl.h" 30#include "ppatomctrl.h"
31#include "hwmgr_ppt.h"
32#include "power_state.h" 31#include "power_state.h"
33#include "smu_helper.h" 32#include "smu_helper.h"
34 33
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu7_common.h b/drivers/gpu/drm/amd/powerplay/inc/smu7_common.h
index 65eb630bfea3..94bf7b649c20 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/smu7_common.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/smu7_common.h
@@ -40,10 +40,6 @@
40#include "bif/bif_5_0_d.h" 40#include "bif/bif_5_0_d.h"
41#include "bif/bif_5_0_sh_mask.h" 41#include "bif/bif_5_0_sh_mask.h"
42 42
43
44#include "bif/bif_5_0_d.h"
45#include "bif/bif_5_0_sh_mask.h"
46
47#include "dce/dce_10_0_d.h" 43#include "dce/dce_10_0_d.h"
48#include "dce/dce_10_0_sh_mask.h" 44#include "dce/dce_10_0_sh_mask.h"
49 45
diff --git a/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h b/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h
index 45d64a81e945..4f63a736ea0e 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/vega20_ppsmc.h
@@ -105,7 +105,8 @@
105#define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x4B 105#define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x4B
106#define PPSMC_MSG_SetSystemVirtualDramAddrLow 0x4C 106#define PPSMC_MSG_SetSystemVirtualDramAddrLow 0x4C
107#define PPSMC_MSG_WaflTest 0x4D 107#define PPSMC_MSG_WaflTest 0x4D
108// Unused ID 0x4E to 0x50 108#define PPSMC_MSG_SetFclkGfxClkRatio 0x4E
109// Unused ID 0x4F to 0x50
109#define PPSMC_MSG_AllowGfxOff 0x51 110#define PPSMC_MSG_AllowGfxOff 0x51
110#define PPSMC_MSG_DisallowGfxOff 0x52 111#define PPSMC_MSG_DisallowGfxOff 0x52
111#define PPSMC_MSG_GetPptLimit 0x53 112#define PPSMC_MSG_GetPptLimit 0x53
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
index 872d3824337b..2b2c26616902 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
@@ -44,7 +44,6 @@
44 44
45#include "smu7_hwmgr.h" 45#include "smu7_hwmgr.h"
46#include "hardwaremanager.h" 46#include "hardwaremanager.h"
47#include "ppatomctrl.h"
48#include "atombios.h" 47#include "atombios.h"
49#include "pppcielanes.h" 48#include "pppcielanes.h"
50 49
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu10_smumgr.c
index d0eb8ab50148..d111dd4e03d7 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu10_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu10_smumgr.c
@@ -29,7 +29,6 @@
29#include "rv_ppsmc.h" 29#include "rv_ppsmc.h"
30#include "smu10_driver_if.h" 30#include "smu10_driver_if.h"
31#include "smu10.h" 31#include "smu10.h"
32#include "ppatomctrl.h"
33#include "pp_debug.h" 32#include "pp_debug.h"
34 33
35 34
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c
index 09b844ec3eab..e2787e14a500 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c
@@ -24,6 +24,7 @@
24#include <linux/delay.h> 24#include <linux/delay.h>
25#include <linux/gfp.h> 25#include <linux/gfp.h>
26#include <linux/kernel.h> 26#include <linux/kernel.h>
27#include <linux/ktime.h>
27#include <linux/slab.h> 28#include <linux/slab.h>
28#include <linux/types.h> 29#include <linux/types.h>
29 30
@@ -61,9 +62,13 @@ static uint32_t smu8_get_argument(struct pp_hwmgr *hwmgr)
61 mmSMU_MP1_SRBM2P_ARG_0); 62 mmSMU_MP1_SRBM2P_ARG_0);
62} 63}
63 64
64static int smu8_send_msg_to_smc_async(struct pp_hwmgr *hwmgr, uint16_t msg) 65/* Send a message to the SMC, and wait for its response.*/
66static int smu8_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
67 uint16_t msg, uint32_t parameter)
65{ 68{
66 int result = 0; 69 int result = 0;
70 ktime_t t_start;
71 s64 elapsed_us;
67 72
68 if (hwmgr == NULL || hwmgr->device == NULL) 73 if (hwmgr == NULL || hwmgr->device == NULL)
69 return -EINVAL; 74 return -EINVAL;
@@ -74,28 +79,31 @@ static int smu8_send_msg_to_smc_async(struct pp_hwmgr *hwmgr, uint16_t msg)
74 /* Read the last message to SMU, to report actual cause */ 79 /* Read the last message to SMU, to report actual cause */
75 uint32_t val = cgs_read_register(hwmgr->device, 80 uint32_t val = cgs_read_register(hwmgr->device,
76 mmSMU_MP1_SRBM2P_MSG_0); 81 mmSMU_MP1_SRBM2P_MSG_0);
77 pr_err("smu8_send_msg_to_smc_async (0x%04x) failed\n", msg); 82 pr_err("%s(0x%04x) aborted; SMU still servicing msg (0x%04x)\n",
78 pr_err("SMU still servicing msg (0x%04x)\n", val); 83 __func__, msg, val);
79 return result; 84 return result;
80 } 85 }
86 t_start = ktime_get();
87
88 cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_ARG_0, parameter);
81 89
82 cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_RESP_0, 0); 90 cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_RESP_0, 0);
83 cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_MSG_0, msg); 91 cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_MSG_0, msg);
84 92
85 return 0; 93 result = PHM_WAIT_FIELD_UNEQUAL(hwmgr,
94 SMU_MP1_SRBM2P_RESP_0, CONTENT, 0);
95
96 elapsed_us = ktime_us_delta(ktime_get(), t_start);
97
98 WARN(result, "%s(0x%04x, %#x) timed out after %lld us\n",
99 __func__, msg, parameter, elapsed_us);
100
101 return result;
86} 102}
87 103
88/* Send a message to the SMC, and wait for its response.*/
89static int smu8_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg) 104static int smu8_send_msg_to_smc(struct pp_hwmgr *hwmgr, uint16_t msg)
90{ 105{
91 int result = 0; 106 return smu8_send_msg_to_smc_with_parameter(hwmgr, msg, 0);
92
93 result = smu8_send_msg_to_smc_async(hwmgr, msg);
94 if (result != 0)
95 return result;
96
97 return PHM_WAIT_FIELD_UNEQUAL(hwmgr,
98 SMU_MP1_SRBM2P_RESP_0, CONTENT, 0);
99} 107}
100 108
101static int smu8_set_smc_sram_address(struct pp_hwmgr *hwmgr, 109static int smu8_set_smc_sram_address(struct pp_hwmgr *hwmgr,
@@ -135,17 +143,6 @@ static int smu8_write_smc_sram_dword(struct pp_hwmgr *hwmgr,
135 return result; 143 return result;
136} 144}
137 145
138static int smu8_send_msg_to_smc_with_parameter(struct pp_hwmgr *hwmgr,
139 uint16_t msg, uint32_t parameter)
140{
141 if (hwmgr == NULL || hwmgr->device == NULL)
142 return -EINVAL;
143
144 cgs_write_register(hwmgr->device, mmSMU_MP1_SRBM2P_ARG_0, parameter);
145
146 return smu8_send_msg_to_smc(hwmgr, msg);
147}
148
149static int smu8_check_fw_load_finish(struct pp_hwmgr *hwmgr, 146static int smu8_check_fw_load_finish(struct pp_hwmgr *hwmgr,
150 uint32_t firmware) 147 uint32_t firmware)
151{ 148{
@@ -737,6 +734,10 @@ static int smu8_start_smu(struct pp_hwmgr *hwmgr)
737 734
738 cgs_write_register(hwmgr->device, mmMP0PUB_IND_INDEX, index); 735 cgs_write_register(hwmgr->device, mmMP0PUB_IND_INDEX, index);
739 hwmgr->smu_version = cgs_read_register(hwmgr->device, mmMP0PUB_IND_DATA); 736 hwmgr->smu_version = cgs_read_register(hwmgr->device, mmMP0PUB_IND_DATA);
737 pr_info("smu version %02d.%02d.%02d\n",
738 ((hwmgr->smu_version >> 16) & 0xFF),
739 ((hwmgr->smu_version >> 8) & 0xFF),
740 (hwmgr->smu_version & 0xFF));
740 adev->pm.fw_version = hwmgr->smu_version >> 8; 741 adev->pm.fw_version = hwmgr->smu_version >> 8;
741 742
742 return smu8_request_smu_load_fw(hwmgr); 743 return smu8_request_smu_load_fw(hwmgr);
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c
index 99d5e4f98f49..a6edd5df33b0 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c
@@ -37,10 +37,13 @@ MODULE_FIRMWARE("amdgpu/fiji_smc.bin");
37MODULE_FIRMWARE("amdgpu/polaris10_smc.bin"); 37MODULE_FIRMWARE("amdgpu/polaris10_smc.bin");
38MODULE_FIRMWARE("amdgpu/polaris10_smc_sk.bin"); 38MODULE_FIRMWARE("amdgpu/polaris10_smc_sk.bin");
39MODULE_FIRMWARE("amdgpu/polaris10_k_smc.bin"); 39MODULE_FIRMWARE("amdgpu/polaris10_k_smc.bin");
40MODULE_FIRMWARE("amdgpu/polaris10_k2_smc.bin");
40MODULE_FIRMWARE("amdgpu/polaris11_smc.bin"); 41MODULE_FIRMWARE("amdgpu/polaris11_smc.bin");
41MODULE_FIRMWARE("amdgpu/polaris11_smc_sk.bin"); 42MODULE_FIRMWARE("amdgpu/polaris11_smc_sk.bin");
42MODULE_FIRMWARE("amdgpu/polaris11_k_smc.bin"); 43MODULE_FIRMWARE("amdgpu/polaris11_k_smc.bin");
44MODULE_FIRMWARE("amdgpu/polaris11_k2_smc.bin");
43MODULE_FIRMWARE("amdgpu/polaris12_smc.bin"); 45MODULE_FIRMWARE("amdgpu/polaris12_smc.bin");
46MODULE_FIRMWARE("amdgpu/polaris12_k_smc.bin");
44MODULE_FIRMWARE("amdgpu/vegam_smc.bin"); 47MODULE_FIRMWARE("amdgpu/vegam_smc.bin");
45MODULE_FIRMWARE("amdgpu/vega10_smc.bin"); 48MODULE_FIRMWARE("amdgpu/vega10_smc.bin");
46MODULE_FIRMWARE("amdgpu/vega10_acg_smc.bin"); 49MODULE_FIRMWARE("amdgpu/vega10_acg_smc.bin");
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c
index 9f71512b2510..1e69300f6175 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c
@@ -40,7 +40,6 @@
40 40
41#include "smu7_hwmgr.h" 41#include "smu7_hwmgr.h"
42#include "hardwaremanager.h" 42#include "hardwaremanager.h"
43#include "ppatomctrl.h"
44#include "atombios.h" 43#include "atombios.h"
45#include "pppcielanes.h" 44#include "pppcielanes.h"
46 45
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index e6c4cd3dc50e..bfc65040dfcb 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -104,8 +104,6 @@ struct ast_private {
104 int fb_mtrr; 104 int fb_mtrr;
105 105
106 struct { 106 struct {
107 struct drm_global_reference mem_global_ref;
108 struct ttm_bo_global_ref bo_global_ref;
109 struct ttm_bo_device bdev; 107 struct ttm_bo_device bdev;
110 } ttm; 108 } ttm;
111 109
diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
index fe354ebf374d..c168d62fe8f9 100644
--- a/drivers/gpu/drm/ast/ast_ttm.c
+++ b/drivers/gpu/drm/ast/ast_ttm.c
@@ -36,63 +36,6 @@ ast_bdev(struct ttm_bo_device *bd)
36 return container_of(bd, struct ast_private, ttm.bdev); 36 return container_of(bd, struct ast_private, ttm.bdev);
37} 37}
38 38
39static int
40ast_ttm_mem_global_init(struct drm_global_reference *ref)
41{
42 return ttm_mem_global_init(ref->object);
43}
44
45static void
46ast_ttm_mem_global_release(struct drm_global_reference *ref)
47{
48 ttm_mem_global_release(ref->object);
49}
50
51static int ast_ttm_global_init(struct ast_private *ast)
52{
53 struct drm_global_reference *global_ref;
54 int r;
55
56 global_ref = &ast->ttm.mem_global_ref;
57 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
58 global_ref->size = sizeof(struct ttm_mem_global);
59 global_ref->init = &ast_ttm_mem_global_init;
60 global_ref->release = &ast_ttm_mem_global_release;
61 r = drm_global_item_ref(global_ref);
62 if (r != 0) {
63 DRM_ERROR("Failed setting up TTM memory accounting "
64 "subsystem.\n");
65 return r;
66 }
67
68 ast->ttm.bo_global_ref.mem_glob =
69 ast->ttm.mem_global_ref.object;
70 global_ref = &ast->ttm.bo_global_ref.ref;
71 global_ref->global_type = DRM_GLOBAL_TTM_BO;
72 global_ref->size = sizeof(struct ttm_bo_global);
73 global_ref->init = &ttm_bo_global_init;
74 global_ref->release = &ttm_bo_global_release;
75 r = drm_global_item_ref(global_ref);
76 if (r != 0) {
77 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
78 drm_global_item_unref(&ast->ttm.mem_global_ref);
79 return r;
80 }
81 return 0;
82}
83
84static void
85ast_ttm_global_release(struct ast_private *ast)
86{
87 if (ast->ttm.mem_global_ref.release == NULL)
88 return;
89
90 drm_global_item_unref(&ast->ttm.bo_global_ref.ref);
91 drm_global_item_unref(&ast->ttm.mem_global_ref);
92 ast->ttm.mem_global_ref.release = NULL;
93}
94
95
96static void ast_bo_ttm_destroy(struct ttm_buffer_object *tbo) 39static void ast_bo_ttm_destroy(struct ttm_buffer_object *tbo)
97{ 40{
98 struct ast_bo *bo; 41 struct ast_bo *bo;
@@ -232,12 +175,7 @@ int ast_mm_init(struct ast_private *ast)
232 struct drm_device *dev = ast->dev; 175 struct drm_device *dev = ast->dev;
233 struct ttm_bo_device *bdev = &ast->ttm.bdev; 176 struct ttm_bo_device *bdev = &ast->ttm.bdev;
234 177
235 ret = ast_ttm_global_init(ast);
236 if (ret)
237 return ret;
238
239 ret = ttm_bo_device_init(&ast->ttm.bdev, 178 ret = ttm_bo_device_init(&ast->ttm.bdev,
240 ast->ttm.bo_global_ref.ref.object,
241 &ast_bo_driver, 179 &ast_bo_driver,
242 dev->anon_inode->i_mapping, 180 dev->anon_inode->i_mapping,
243 DRM_FILE_PAGE_OFFSET, 181 DRM_FILE_PAGE_OFFSET,
@@ -268,8 +206,6 @@ void ast_mm_fini(struct ast_private *ast)
268 206
269 ttm_bo_device_release(&ast->ttm.bdev); 207 ttm_bo_device_release(&ast->ttm.bdev);
270 208
271 ast_ttm_global_release(ast);
272
273 arch_phys_wc_del(ast->fb_mtrr); 209 arch_phys_wc_del(ast->fb_mtrr);
274 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0), 210 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
275 pci_resource_len(dev->pdev, 0)); 211 pci_resource_len(dev->pdev, 0));
diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
index 577a8b917cb9..fb38c8b857b5 100644
--- a/drivers/gpu/drm/bochs/bochs.h
+++ b/drivers/gpu/drm/bochs/bochs.h
@@ -77,8 +77,6 @@ struct bochs_device {
77 77
78 /* ttm */ 78 /* ttm */
79 struct { 79 struct {
80 struct drm_global_reference mem_global_ref;
81 struct ttm_bo_global_ref bo_global_ref;
82 struct ttm_bo_device bdev; 80 struct ttm_bo_device bdev;
83 bool initialized; 81 bool initialized;
84 } ttm; 82 } ttm;
diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
index e6ccf7fa92d4..0980411e41bf 100644
--- a/drivers/gpu/drm/bochs/bochs_mm.c
+++ b/drivers/gpu/drm/bochs/bochs_mm.c
@@ -16,61 +16,6 @@ static inline struct bochs_device *bochs_bdev(struct ttm_bo_device *bd)
16 return container_of(bd, struct bochs_device, ttm.bdev); 16 return container_of(bd, struct bochs_device, ttm.bdev);
17} 17}
18 18
19static int bochs_ttm_mem_global_init(struct drm_global_reference *ref)
20{
21 return ttm_mem_global_init(ref->object);
22}
23
24static void bochs_ttm_mem_global_release(struct drm_global_reference *ref)
25{
26 ttm_mem_global_release(ref->object);
27}
28
29static int bochs_ttm_global_init(struct bochs_device *bochs)
30{
31 struct drm_global_reference *global_ref;
32 int r;
33
34 global_ref = &bochs->ttm.mem_global_ref;
35 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
36 global_ref->size = sizeof(struct ttm_mem_global);
37 global_ref->init = &bochs_ttm_mem_global_init;
38 global_ref->release = &bochs_ttm_mem_global_release;
39 r = drm_global_item_ref(global_ref);
40 if (r != 0) {
41 DRM_ERROR("Failed setting up TTM memory accounting "
42 "subsystem.\n");
43 return r;
44 }
45
46 bochs->ttm.bo_global_ref.mem_glob =
47 bochs->ttm.mem_global_ref.object;
48 global_ref = &bochs->ttm.bo_global_ref.ref;
49 global_ref->global_type = DRM_GLOBAL_TTM_BO;
50 global_ref->size = sizeof(struct ttm_bo_global);
51 global_ref->init = &ttm_bo_global_init;
52 global_ref->release = &ttm_bo_global_release;
53 r = drm_global_item_ref(global_ref);
54 if (r != 0) {
55 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
56 drm_global_item_unref(&bochs->ttm.mem_global_ref);
57 return r;
58 }
59
60 return 0;
61}
62
63static void bochs_ttm_global_release(struct bochs_device *bochs)
64{
65 if (bochs->ttm.mem_global_ref.release == NULL)
66 return;
67
68 drm_global_item_unref(&bochs->ttm.bo_global_ref.ref);
69 drm_global_item_unref(&bochs->ttm.mem_global_ref);
70 bochs->ttm.mem_global_ref.release = NULL;
71}
72
73
74static void bochs_bo_ttm_destroy(struct ttm_buffer_object *tbo) 19static void bochs_bo_ttm_destroy(struct ttm_buffer_object *tbo)
75{ 20{
76 struct bochs_bo *bo; 21 struct bochs_bo *bo;
@@ -208,12 +153,7 @@ int bochs_mm_init(struct bochs_device *bochs)
208 struct ttm_bo_device *bdev = &bochs->ttm.bdev; 153 struct ttm_bo_device *bdev = &bochs->ttm.bdev;
209 int ret; 154 int ret;
210 155
211 ret = bochs_ttm_global_init(bochs);
212 if (ret)
213 return ret;
214
215 ret = ttm_bo_device_init(&bochs->ttm.bdev, 156 ret = ttm_bo_device_init(&bochs->ttm.bdev,
216 bochs->ttm.bo_global_ref.ref.object,
217 &bochs_bo_driver, 157 &bochs_bo_driver,
218 bochs->dev->anon_inode->i_mapping, 158 bochs->dev->anon_inode->i_mapping,
219 DRM_FILE_PAGE_OFFSET, 159 DRM_FILE_PAGE_OFFSET,
@@ -240,7 +180,6 @@ void bochs_mm_fini(struct bochs_device *bochs)
240 return; 180 return;
241 181
242 ttm_bo_device_release(&bochs->ttm.bdev); 182 ttm_bo_device_release(&bochs->ttm.bdev);
243 bochs_ttm_global_release(bochs);
244 bochs->ttm.initialized = false; 183 bochs->ttm.initialized = false;
245} 184}
246 185
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
index a29f87e98d9d..f2b2e0d169fa 100644
--- a/drivers/gpu/drm/cirrus/cirrus_drv.h
+++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
@@ -136,8 +136,6 @@ struct cirrus_device {
136 int fb_mtrr; 136 int fb_mtrr;
137 137
138 struct { 138 struct {
139 struct drm_global_reference mem_global_ref;
140 struct ttm_bo_global_ref bo_global_ref;
141 struct ttm_bo_device bdev; 139 struct ttm_bo_device bdev;
142 } ttm; 140 } ttm;
143 bool mm_inited; 141 bool mm_inited;
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
index f21953243790..e075810b4bd4 100644
--- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
+++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
@@ -36,63 +36,6 @@ cirrus_bdev(struct ttm_bo_device *bd)
36 return container_of(bd, struct cirrus_device, ttm.bdev); 36 return container_of(bd, struct cirrus_device, ttm.bdev);
37} 37}
38 38
39static int
40cirrus_ttm_mem_global_init(struct drm_global_reference *ref)
41{
42 return ttm_mem_global_init(ref->object);
43}
44
45static void
46cirrus_ttm_mem_global_release(struct drm_global_reference *ref)
47{
48 ttm_mem_global_release(ref->object);
49}
50
51static int cirrus_ttm_global_init(struct cirrus_device *cirrus)
52{
53 struct drm_global_reference *global_ref;
54 int r;
55
56 global_ref = &cirrus->ttm.mem_global_ref;
57 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
58 global_ref->size = sizeof(struct ttm_mem_global);
59 global_ref->init = &cirrus_ttm_mem_global_init;
60 global_ref->release = &cirrus_ttm_mem_global_release;
61 r = drm_global_item_ref(global_ref);
62 if (r != 0) {
63 DRM_ERROR("Failed setting up TTM memory accounting "
64 "subsystem.\n");
65 return r;
66 }
67
68 cirrus->ttm.bo_global_ref.mem_glob =
69 cirrus->ttm.mem_global_ref.object;
70 global_ref = &cirrus->ttm.bo_global_ref.ref;
71 global_ref->global_type = DRM_GLOBAL_TTM_BO;
72 global_ref->size = sizeof(struct ttm_bo_global);
73 global_ref->init = &ttm_bo_global_init;
74 global_ref->release = &ttm_bo_global_release;
75 r = drm_global_item_ref(global_ref);
76 if (r != 0) {
77 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
78 drm_global_item_unref(&cirrus->ttm.mem_global_ref);
79 return r;
80 }
81 return 0;
82}
83
84static void
85cirrus_ttm_global_release(struct cirrus_device *cirrus)
86{
87 if (cirrus->ttm.mem_global_ref.release == NULL)
88 return;
89
90 drm_global_item_unref(&cirrus->ttm.bo_global_ref.ref);
91 drm_global_item_unref(&cirrus->ttm.mem_global_ref);
92 cirrus->ttm.mem_global_ref.release = NULL;
93}
94
95
96static void cirrus_bo_ttm_destroy(struct ttm_buffer_object *tbo) 39static void cirrus_bo_ttm_destroy(struct ttm_buffer_object *tbo)
97{ 40{
98 struct cirrus_bo *bo; 41 struct cirrus_bo *bo;
@@ -232,12 +175,7 @@ int cirrus_mm_init(struct cirrus_device *cirrus)
232 struct drm_device *dev = cirrus->dev; 175 struct drm_device *dev = cirrus->dev;
233 struct ttm_bo_device *bdev = &cirrus->ttm.bdev; 176 struct ttm_bo_device *bdev = &cirrus->ttm.bdev;
234 177
235 ret = cirrus_ttm_global_init(cirrus);
236 if (ret)
237 return ret;
238
239 ret = ttm_bo_device_init(&cirrus->ttm.bdev, 178 ret = ttm_bo_device_init(&cirrus->ttm.bdev,
240 cirrus->ttm.bo_global_ref.ref.object,
241 &cirrus_bo_driver, 179 &cirrus_bo_driver,
242 dev->anon_inode->i_mapping, 180 dev->anon_inode->i_mapping,
243 DRM_FILE_PAGE_OFFSET, 181 DRM_FILE_PAGE_OFFSET,
@@ -273,8 +211,6 @@ void cirrus_mm_fini(struct cirrus_device *cirrus)
273 211
274 ttm_bo_device_release(&cirrus->ttm.bdev); 212 ttm_bo_device_release(&cirrus->ttm.bdev);
275 213
276 cirrus_ttm_global_release(cirrus);
277
278 arch_phys_wc_del(cirrus->fb_mtrr); 214 arch_phys_wc_del(cirrus->fb_mtrr);
279 cirrus->fb_mtrr = 0; 215 cirrus->fb_mtrr = 0;
280 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0), 216 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 7e23b150ca80..9ac26437051b 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -398,6 +398,11 @@ static int drm_atomic_connector_check(struct drm_connector *connector,
398{ 398{
399 struct drm_crtc_state *crtc_state; 399 struct drm_crtc_state *crtc_state;
400 struct drm_writeback_job *writeback_job = state->writeback_job; 400 struct drm_writeback_job *writeback_job = state->writeback_job;
401 const struct drm_display_info *info = &connector->display_info;
402
403 state->max_bpc = info->bpc ? info->bpc : 8;
404 if (connector->max_bpc_property)
405 state->max_bpc = min(state->max_bpc, state->max_requested_bpc);
401 406
402 if ((connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK) || !writeback_job) 407 if ((connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK) || !writeback_job)
403 return 0; 408 return 0;
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c
index fe8dd8aa4ae4..bc9fc9665614 100644
--- a/drivers/gpu/drm/drm_atomic_helper.c
+++ b/drivers/gpu/drm/drm_atomic_helper.c
@@ -669,6 +669,10 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
669 if (old_connector_state->link_status != 669 if (old_connector_state->link_status !=
670 new_connector_state->link_status) 670 new_connector_state->link_status)
671 new_crtc_state->connectors_changed = true; 671 new_crtc_state->connectors_changed = true;
672
673 if (old_connector_state->max_requested_bpc !=
674 new_connector_state->max_requested_bpc)
675 new_crtc_state->connectors_changed = true;
672 } 676 }
673 677
674 if (funcs->atomic_check) 678 if (funcs->atomic_check)
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index d5b7f315098c..86ac33922b09 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -740,6 +740,8 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector,
740 740
741 return set_out_fence_for_connector(state->state, connector, 741 return set_out_fence_for_connector(state->state, connector,
742 fence_ptr); 742 fence_ptr);
743 } else if (property == connector->max_bpc_property) {
744 state->max_requested_bpc = val;
743 } else if (connector->funcs->atomic_set_property) { 745 } else if (connector->funcs->atomic_set_property) {
744 return connector->funcs->atomic_set_property(connector, 746 return connector->funcs->atomic_set_property(connector,
745 state, property, val); 747 state, property, val);
@@ -804,6 +806,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector,
804 *val = 0; 806 *val = 0;
805 } else if (property == config->writeback_out_fence_ptr_property) { 807 } else if (property == config->writeback_out_fence_ptr_property) {
806 *val = 0; 808 *val = 0;
809 } else if (property == connector->max_bpc_property) {
810 *val = state->max_requested_bpc;
807 } else if (connector->funcs->atomic_get_property) { 811 } else if (connector->funcs->atomic_get_property) {
808 return connector->funcs->atomic_get_property(connector, 812 return connector->funcs->atomic_get_property(connector,
809 state, property, val); 813 state, property, val);
diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
index aa18b1d7d3e4..fa9baacc863b 100644
--- a/drivers/gpu/drm/drm_connector.c
+++ b/drivers/gpu/drm/drm_connector.c
@@ -932,6 +932,13 @@ DRM_ENUM_NAME_FN(drm_get_content_protection_name, drm_cp_enum_list)
932 * is no longer protected and userspace should take appropriate action 932 * is no longer protected and userspace should take appropriate action
933 * (whatever that might be). 933 * (whatever that might be).
934 * 934 *
935 * max bpc:
936 * This range property is used by userspace to limit the bit depth. When
937 * used the driver would limit the bpc in accordance with the valid range
938 * supported by the hardware and sink. Drivers to use the function
939 * drm_connector_attach_max_bpc_property() to create and attach the
940 * property to the connector during initialization.
941 *
935 * Connectors also have one standardized atomic property: 942 * Connectors also have one standardized atomic property:
936 * 943 *
937 * CRTC_ID: 944 * CRTC_ID:
@@ -1600,6 +1607,40 @@ void drm_connector_set_link_status_property(struct drm_connector *connector,
1600EXPORT_SYMBOL(drm_connector_set_link_status_property); 1607EXPORT_SYMBOL(drm_connector_set_link_status_property);
1601 1608
1602/** 1609/**
1610 * drm_connector_attach_max_bpc_property - attach "max bpc" property
1611 * @connector: connector to attach max bpc property on.
1612 * @min: The minimum bit depth supported by the connector.
1613 * @max: The maximum bit depth supported by the connector.
1614 *
1615 * This is used to add support for limiting the bit depth on a connector.
1616 *
1617 * Returns:
1618 * Zero on success, negative errno on failure.
1619 */
1620int drm_connector_attach_max_bpc_property(struct drm_connector *connector,
1621 int min, int max)
1622{
1623 struct drm_device *dev = connector->dev;
1624 struct drm_property *prop;
1625
1626 prop = connector->max_bpc_property;
1627 if (!prop) {
1628 prop = drm_property_create_range(dev, 0, "max bpc", min, max);
1629 if (!prop)
1630 return -ENOMEM;
1631
1632 connector->max_bpc_property = prop;
1633 }
1634
1635 drm_object_attach_property(&connector->base, prop, max);
1636 connector->state->max_requested_bpc = max;
1637 connector->state->max_bpc = max;
1638
1639 return 0;
1640}
1641EXPORT_SYMBOL(drm_connector_attach_max_bpc_property);
1642
1643/**
1603 * drm_connector_init_panel_orientation_property - 1644 * drm_connector_init_panel_orientation_property -
1604 * initialize the connecters panel_orientation property 1645 * initialize the connecters panel_orientation property
1605 * @connector: connector for which to init the panel-orientation property. 1646 * @connector: connector for which to init the panel-orientation property.
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index 37c01b6076ec..6d483487f2b4 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -1352,3 +1352,93 @@ int drm_dp_read_desc(struct drm_dp_aux *aux, struct drm_dp_desc *desc,
1352 return 0; 1352 return 0;
1353} 1353}
1354EXPORT_SYMBOL(drm_dp_read_desc); 1354EXPORT_SYMBOL(drm_dp_read_desc);
1355
1356/**
1357 * DRM DP Helpers for DSC
1358 */
1359u8 drm_dp_dsc_sink_max_slice_count(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE],
1360 bool is_edp)
1361{
1362 u8 slice_cap1 = dsc_dpcd[DP_DSC_SLICE_CAP_1 - DP_DSC_SUPPORT];
1363
1364 if (is_edp) {
1365 /* For eDP, register DSC_SLICE_CAPABILITIES_1 gives slice count */
1366 if (slice_cap1 & DP_DSC_4_PER_DP_DSC_SINK)
1367 return 4;
1368 if (slice_cap1 & DP_DSC_2_PER_DP_DSC_SINK)
1369 return 2;
1370 if (slice_cap1 & DP_DSC_1_PER_DP_DSC_SINK)
1371 return 1;
1372 } else {
1373 /* For DP, use values from DSC_SLICE_CAP_1 and DSC_SLICE_CAP2 */
1374 u8 slice_cap2 = dsc_dpcd[DP_DSC_SLICE_CAP_2 - DP_DSC_SUPPORT];
1375
1376 if (slice_cap2 & DP_DSC_24_PER_DP_DSC_SINK)
1377 return 24;
1378 if (slice_cap2 & DP_DSC_20_PER_DP_DSC_SINK)
1379 return 20;
1380 if (slice_cap2 & DP_DSC_16_PER_DP_DSC_SINK)
1381 return 16;
1382 if (slice_cap1 & DP_DSC_12_PER_DP_DSC_SINK)
1383 return 12;
1384 if (slice_cap1 & DP_DSC_10_PER_DP_DSC_SINK)
1385 return 10;
1386 if (slice_cap1 & DP_DSC_8_PER_DP_DSC_SINK)
1387 return 8;
1388 if (slice_cap1 & DP_DSC_6_PER_DP_DSC_SINK)
1389 return 6;
1390 if (slice_cap1 & DP_DSC_4_PER_DP_DSC_SINK)
1391 return 4;
1392 if (slice_cap1 & DP_DSC_2_PER_DP_DSC_SINK)
1393 return 2;
1394 if (slice_cap1 & DP_DSC_1_PER_DP_DSC_SINK)
1395 return 1;
1396 }
1397
1398 return 0;
1399}
1400EXPORT_SYMBOL(drm_dp_dsc_sink_max_slice_count);
1401
1402u8 drm_dp_dsc_sink_line_buf_depth(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
1403{
1404 u8 line_buf_depth = dsc_dpcd[DP_DSC_LINE_BUF_BIT_DEPTH - DP_DSC_SUPPORT];
1405
1406 switch (line_buf_depth & DP_DSC_LINE_BUF_BIT_DEPTH_MASK) {
1407 case DP_DSC_LINE_BUF_BIT_DEPTH_9:
1408 return 9;
1409 case DP_DSC_LINE_BUF_BIT_DEPTH_10:
1410 return 10;
1411 case DP_DSC_LINE_BUF_BIT_DEPTH_11:
1412 return 11;
1413 case DP_DSC_LINE_BUF_BIT_DEPTH_12:
1414 return 12;
1415 case DP_DSC_LINE_BUF_BIT_DEPTH_13:
1416 return 13;
1417 case DP_DSC_LINE_BUF_BIT_DEPTH_14:
1418 return 14;
1419 case DP_DSC_LINE_BUF_BIT_DEPTH_15:
1420 return 15;
1421 case DP_DSC_LINE_BUF_BIT_DEPTH_16:
1422 return 16;
1423 case DP_DSC_LINE_BUF_BIT_DEPTH_8:
1424 return 8;
1425 }
1426
1427 return 0;
1428}
1429EXPORT_SYMBOL(drm_dp_dsc_sink_line_buf_depth);
1430
1431u8 drm_dp_dsc_sink_max_color_depth(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
1432{
1433 u8 color_depth = dsc_dpcd[DP_DSC_DEC_COLOR_DEPTH_CAP - DP_DSC_SUPPORT];
1434
1435 if (color_depth & DP_DSC_12_BPC)
1436 return 12;
1437 if (color_depth & DP_DSC_10_BPC)
1438 return 10;
1439 if (color_depth & DP_DSC_8_BPC)
1440 return 8;
1441
1442 return 0;
1443}
1444EXPORT_SYMBOL(drm_dp_dsc_sink_max_color_depth);
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
index 8c3cfac437f4..529414556962 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -1275,6 +1275,9 @@ static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device(struct drm_dp_mst_
1275 mutex_lock(&mgr->lock); 1275 mutex_lock(&mgr->lock);
1276 mstb = mgr->mst_primary; 1276 mstb = mgr->mst_primary;
1277 1277
1278 if (!mstb)
1279 goto out;
1280
1278 for (i = 0; i < lct - 1; i++) { 1281 for (i = 0; i < lct - 1; i++) {
1279 int shift = (i % 2) ? 0 : 4; 1282 int shift = (i % 2) ? 0 : 4;
1280 int port_num = (rad[i / 2] >> shift) & 0xf; 1283 int port_num = (rad[i / 2] >> shift) & 0xf;
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 5f7e99bf4fa4..12e5e2be7890 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -960,14 +960,12 @@ static void drm_core_exit(void)
960 drm_sysfs_destroy(); 960 drm_sysfs_destroy();
961 idr_destroy(&drm_minors_idr); 961 idr_destroy(&drm_minors_idr);
962 drm_connector_ida_destroy(); 962 drm_connector_ida_destroy();
963 drm_global_release();
964} 963}
965 964
966static int __init drm_core_init(void) 965static int __init drm_core_init(void)
967{ 966{
968 int ret; 967 int ret;
969 968
970 drm_global_init();
971 drm_connector_ida_init(); 969 drm_connector_ida_init();
972 idr_init(&drm_minors_idr); 970 idr_init(&drm_minors_idr);
973 971
diff --git a/drivers/gpu/drm/drm_global.c b/drivers/gpu/drm/drm_global.c
deleted file mode 100644
index 5799e2782dd1..000000000000
--- a/drivers/gpu/drm/drm_global.c
+++ /dev/null
@@ -1,137 +0,0 @@
1// SPDX-License-Identifier: GPL-2.0 OR MIT
2/**************************************************************************
3 *
4 * Copyright 2008-2009 VMware, Inc., Palo Alto, CA., USA
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24 * USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27/*
28 * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
29 */
30
31#include <linux/mutex.h>
32#include <linux/slab.h>
33#include <linux/module.h>
34#include <drm/drm_global.h>
35
36struct drm_global_item {
37 struct mutex mutex;
38 void *object;
39 int refcount;
40};
41
42static struct drm_global_item glob[DRM_GLOBAL_NUM];
43
44void drm_global_init(void)
45{
46 int i;
47
48 for (i = 0; i < DRM_GLOBAL_NUM; ++i) {
49 struct drm_global_item *item = &glob[i];
50 mutex_init(&item->mutex);
51 item->object = NULL;
52 item->refcount = 0;
53 }
54}
55
56void drm_global_release(void)
57{
58 int i;
59 for (i = 0; i < DRM_GLOBAL_NUM; ++i) {
60 struct drm_global_item *item = &glob[i];
61 BUG_ON(item->object != NULL);
62 BUG_ON(item->refcount != 0);
63 }
64}
65
66/**
67 * drm_global_item_ref - Initialize and acquire reference to memory
68 * object
69 * @ref: Object for initialization
70 *
71 * This initializes a memory object, allocating memory and calling the
72 * .init() hook. Further calls will increase the reference count for
73 * that item.
74 *
75 * Returns:
76 * Zero on success, non-zero otherwise.
77 */
78int drm_global_item_ref(struct drm_global_reference *ref)
79{
80 int ret = 0;
81 struct drm_global_item *item = &glob[ref->global_type];
82
83 mutex_lock(&item->mutex);
84 if (item->refcount == 0) {
85 ref->object = kzalloc(ref->size, GFP_KERNEL);
86 if (unlikely(ref->object == NULL)) {
87 ret = -ENOMEM;
88 goto error_unlock;
89 }
90 ret = ref->init(ref);
91 if (unlikely(ret != 0))
92 goto error_free;
93
94 item->object = ref->object;
95 } else {
96 ref->object = item->object;
97 }
98
99 ++item->refcount;
100 mutex_unlock(&item->mutex);
101 return 0;
102
103error_free:
104 kfree(ref->object);
105 ref->object = NULL;
106error_unlock:
107 mutex_unlock(&item->mutex);
108 return ret;
109}
110EXPORT_SYMBOL(drm_global_item_ref);
111
112/**
113 * drm_global_item_unref - Drop reference to memory
114 * object
115 * @ref: Object being removed
116 *
117 * Drop a reference to the memory object and eventually call the
118 * release() hook. The allocated object should be dropped in the
119 * release() hook or before calling this function
120 *
121 */
122
123void drm_global_item_unref(struct drm_global_reference *ref)
124{
125 struct drm_global_item *item = &glob[ref->global_type];
126
127 mutex_lock(&item->mutex);
128 BUG_ON(item->refcount == 0);
129 BUG_ON(ref->object != item->object);
130 if (--item->refcount == 0) {
131 ref->release(ref);
132 item->object = NULL;
133 }
134 mutex_unlock(&item->mutex);
135}
136EXPORT_SYMBOL(drm_global_item_unref);
137
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_sched.c b/drivers/gpu/drm/etnaviv/etnaviv_sched.c
index e7c3ed6c9a2e..49a6763693f1 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_sched.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_sched.c
@@ -93,7 +93,7 @@ static void etnaviv_sched_timedout_job(struct drm_sched_job *sched_job)
93 * If the GPU managed to complete this jobs fence, the timout is 93 * If the GPU managed to complete this jobs fence, the timout is
94 * spurious. Bail out. 94 * spurious. Bail out.
95 */ 95 */
96 if (fence_completed(gpu, submit->out_fence->seqno)) 96 if (dma_fence_is_signaled(submit->out_fence))
97 return; 97 return;
98 98
99 /* 99 /*
@@ -105,8 +105,6 @@ static void etnaviv_sched_timedout_job(struct drm_sched_job *sched_job)
105 change = dma_addr - gpu->hangcheck_dma_addr; 105 change = dma_addr - gpu->hangcheck_dma_addr;
106 if (change < 0 || change > 16) { 106 if (change < 0 || change > 16) {
107 gpu->hangcheck_dma_addr = dma_addr; 107 gpu->hangcheck_dma_addr = dma_addr;
108 schedule_delayed_work(&sched_job->sched->work_tdr,
109 sched_job->sched->timeout);
110 return; 108 return;
111 } 109 }
112 110
@@ -127,6 +125,8 @@ static void etnaviv_sched_free_job(struct drm_sched_job *sched_job)
127{ 125{
128 struct etnaviv_gem_submit *submit = to_etnaviv_submit(sched_job); 126 struct etnaviv_gem_submit *submit = to_etnaviv_submit(sched_job);
129 127
128 drm_sched_job_cleanup(sched_job);
129
130 etnaviv_submit_put(submit); 130 etnaviv_submit_put(submit);
131} 131}
132 132
@@ -159,6 +159,7 @@ int etnaviv_sched_push_job(struct drm_sched_entity *sched_entity,
159 submit->out_fence, 0, 159 submit->out_fence, 0,
160 INT_MAX, GFP_KERNEL); 160 INT_MAX, GFP_KERNEL);
161 if (submit->out_fence_id < 0) { 161 if (submit->out_fence_id < 0) {
162 drm_sched_job_cleanup(&submit->sched_job);
162 ret = -ENOMEM; 163 ret = -ENOMEM;
163 goto out_unlock; 164 goto out_unlock;
164 } 165 }
diff --git a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
index 94529aa82339..aef487dd8731 100644
--- a/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
+++ b/drivers/gpu/drm/exynos/exynos5433_drm_decon.c
@@ -164,13 +164,6 @@ static u32 decon_get_frame_count(struct decon_context *ctx, bool end)
164 return frm; 164 return frm;
165} 165}
166 166
167static u32 decon_get_vblank_counter(struct exynos_drm_crtc *crtc)
168{
169 struct decon_context *ctx = crtc->ctx;
170
171 return decon_get_frame_count(ctx, false);
172}
173
174static void decon_setup_trigger(struct decon_context *ctx) 167static void decon_setup_trigger(struct decon_context *ctx)
175{ 168{
176 if (!ctx->crtc->i80_mode && !(ctx->out_type & I80_HW_TRG)) 169 if (!ctx->crtc->i80_mode && !(ctx->out_type & I80_HW_TRG))
@@ -536,7 +529,6 @@ static const struct exynos_drm_crtc_ops decon_crtc_ops = {
536 .disable = decon_disable, 529 .disable = decon_disable,
537 .enable_vblank = decon_enable_vblank, 530 .enable_vblank = decon_enable_vblank,
538 .disable_vblank = decon_disable_vblank, 531 .disable_vblank = decon_disable_vblank,
539 .get_vblank_counter = decon_get_vblank_counter,
540 .atomic_begin = decon_atomic_begin, 532 .atomic_begin = decon_atomic_begin,
541 .update_plane = decon_update_plane, 533 .update_plane = decon_update_plane,
542 .disable_plane = decon_disable_plane, 534 .disable_plane = decon_disable_plane,
@@ -554,7 +546,6 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
554 int ret; 546 int ret;
555 547
556 ctx->drm_dev = drm_dev; 548 ctx->drm_dev = drm_dev;
557 drm_dev->max_vblank_count = 0xffffffff;
558 549
559 for (win = ctx->first_win; win < WINDOWS_NR; win++) { 550 for (win = ctx->first_win; win < WINDOWS_NR; win++) {
560 ctx->configs[win].pixel_formats = decon_formats; 551 ctx->configs[win].pixel_formats = decon_formats;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
index eea90251808f..2696289ecc78 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
@@ -162,16 +162,6 @@ static void exynos_drm_crtc_disable_vblank(struct drm_crtc *crtc)
162 exynos_crtc->ops->disable_vblank(exynos_crtc); 162 exynos_crtc->ops->disable_vblank(exynos_crtc);
163} 163}
164 164
165static u32 exynos_drm_crtc_get_vblank_counter(struct drm_crtc *crtc)
166{
167 struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
168
169 if (exynos_crtc->ops->get_vblank_counter)
170 return exynos_crtc->ops->get_vblank_counter(exynos_crtc);
171
172 return 0;
173}
174
175static const struct drm_crtc_funcs exynos_crtc_funcs = { 165static const struct drm_crtc_funcs exynos_crtc_funcs = {
176 .set_config = drm_atomic_helper_set_config, 166 .set_config = drm_atomic_helper_set_config,
177 .page_flip = drm_atomic_helper_page_flip, 167 .page_flip = drm_atomic_helper_page_flip,
@@ -181,7 +171,6 @@ static const struct drm_crtc_funcs exynos_crtc_funcs = {
181 .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, 171 .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
182 .enable_vblank = exynos_drm_crtc_enable_vblank, 172 .enable_vblank = exynos_drm_crtc_enable_vblank,
183 .disable_vblank = exynos_drm_crtc_disable_vblank, 173 .disable_vblank = exynos_drm_crtc_disable_vblank,
184 .get_vblank_counter = exynos_drm_crtc_get_vblank_counter,
185}; 174};
186 175
187struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev, 176struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev,
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
index ec9604f1272b..5e61e707f955 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
@@ -135,7 +135,6 @@ struct exynos_drm_crtc_ops {
135 void (*disable)(struct exynos_drm_crtc *crtc); 135 void (*disable)(struct exynos_drm_crtc *crtc);
136 int (*enable_vblank)(struct exynos_drm_crtc *crtc); 136 int (*enable_vblank)(struct exynos_drm_crtc *crtc);
137 void (*disable_vblank)(struct exynos_drm_crtc *crtc); 137 void (*disable_vblank)(struct exynos_drm_crtc *crtc);
138 u32 (*get_vblank_counter)(struct exynos_drm_crtc *crtc);
139 enum drm_mode_status (*mode_valid)(struct exynos_drm_crtc *crtc, 138 enum drm_mode_status (*mode_valid)(struct exynos_drm_crtc *crtc,
140 const struct drm_display_mode *mode); 139 const struct drm_display_mode *mode);
141 bool (*mode_fixup)(struct exynos_drm_crtc *crtc, 140 bool (*mode_fixup)(struct exynos_drm_crtc *crtc,
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
index 07af7758066d..d81e62ae286a 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
@@ -14,6 +14,7 @@
14 14
15#include <drm/drmP.h> 15#include <drm/drmP.h>
16#include <drm/drm_crtc_helper.h> 16#include <drm/drm_crtc_helper.h>
17#include <drm/drm_fb_helper.h>
17#include <drm/drm_mipi_dsi.h> 18#include <drm/drm_mipi_dsi.h>
18#include <drm/drm_panel.h> 19#include <drm/drm_panel.h>
19#include <drm/drm_atomic_helper.h> 20#include <drm/drm_atomic_helper.h>
@@ -1474,12 +1475,12 @@ static int exynos_dsi_create_connector(struct drm_encoder *encoder)
1474{ 1475{
1475 struct exynos_dsi *dsi = encoder_to_dsi(encoder); 1476 struct exynos_dsi *dsi = encoder_to_dsi(encoder);
1476 struct drm_connector *connector = &dsi->connector; 1477 struct drm_connector *connector = &dsi->connector;
1478 struct drm_device *drm = encoder->dev;
1477 int ret; 1479 int ret;
1478 1480
1479 connector->polled = DRM_CONNECTOR_POLL_HPD; 1481 connector->polled = DRM_CONNECTOR_POLL_HPD;
1480 1482
1481 ret = drm_connector_init(encoder->dev, connector, 1483 ret = drm_connector_init(drm, connector, &exynos_dsi_connector_funcs,
1482 &exynos_dsi_connector_funcs,
1483 DRM_MODE_CONNECTOR_DSI); 1484 DRM_MODE_CONNECTOR_DSI);
1484 if (ret) { 1485 if (ret) {
1485 DRM_ERROR("Failed to initialize connector with drm\n"); 1486 DRM_ERROR("Failed to initialize connector with drm\n");
@@ -1489,7 +1490,12 @@ static int exynos_dsi_create_connector(struct drm_encoder *encoder)
1489 connector->status = connector_status_disconnected; 1490 connector->status = connector_status_disconnected;
1490 drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs); 1491 drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs);
1491 drm_connector_attach_encoder(connector, encoder); 1492 drm_connector_attach_encoder(connector, encoder);
1493 if (!drm->registered)
1494 return 0;
1492 1495
1496 connector->funcs->reset(connector);
1497 drm_fb_helper_add_one_connector(drm->fb_helper, connector);
1498 drm_connector_register(connector);
1493 return 0; 1499 return 0;
1494} 1500}
1495 1501
@@ -1527,7 +1533,9 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host,
1527 } 1533 }
1528 1534
1529 dsi->panel = of_drm_find_panel(device->dev.of_node); 1535 dsi->panel = of_drm_find_panel(device->dev.of_node);
1530 if (dsi->panel) { 1536 if (IS_ERR(dsi->panel)) {
1537 dsi->panel = NULL;
1538 } else {
1531 drm_panel_attach(dsi->panel, &dsi->connector); 1539 drm_panel_attach(dsi->panel, &dsi->connector);
1532 dsi->connector.status = connector_status_connected; 1540 dsi->connector.status = connector_status_connected;
1533 } 1541 }
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
index 918dd2c82209..01d182289efa 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
@@ -192,7 +192,7 @@ int exynos_drm_fbdev_init(struct drm_device *dev)
192 struct drm_fb_helper *helper; 192 struct drm_fb_helper *helper;
193 int ret; 193 int ret;
194 194
195 if (!dev->mode_config.num_crtc || !dev->mode_config.num_connector) 195 if (!dev->mode_config.num_crtc)
196 return 0; 196 return 0;
197 197
198 fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL); 198 fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL);
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
index 45c25a488f42..3c168ae77b0c 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
@@ -49,8 +49,6 @@ struct hibmc_drm_private {
49 bool mode_config_initialized; 49 bool mode_config_initialized;
50 50
51 /* ttm */ 51 /* ttm */
52 struct drm_global_reference mem_global_ref;
53 struct ttm_bo_global_ref bo_global_ref;
54 struct ttm_bo_device bdev; 52 struct ttm_bo_device bdev;
55 bool initialized; 53 bool initialized;
56 54
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
index 2e3e0bdb8932..dd383267884c 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
@@ -29,55 +29,6 @@ hibmc_bdev(struct ttm_bo_device *bd)
29 return container_of(bd, struct hibmc_drm_private, bdev); 29 return container_of(bd, struct hibmc_drm_private, bdev);
30} 30}
31 31
32static int
33hibmc_ttm_mem_global_init(struct drm_global_reference *ref)
34{
35 return ttm_mem_global_init(ref->object);
36}
37
38static void
39hibmc_ttm_mem_global_release(struct drm_global_reference *ref)
40{
41 ttm_mem_global_release(ref->object);
42}
43
44static int hibmc_ttm_global_init(struct hibmc_drm_private *hibmc)
45{
46 int ret;
47
48 hibmc->mem_global_ref.global_type = DRM_GLOBAL_TTM_MEM;
49 hibmc->mem_global_ref.size = sizeof(struct ttm_mem_global);
50 hibmc->mem_global_ref.init = &hibmc_ttm_mem_global_init;
51 hibmc->mem_global_ref.release = &hibmc_ttm_mem_global_release;
52 ret = drm_global_item_ref(&hibmc->mem_global_ref);
53 if (ret) {
54 DRM_ERROR("could not get ref on ttm global: %d\n", ret);
55 return ret;
56 }
57
58 hibmc->bo_global_ref.mem_glob =
59 hibmc->mem_global_ref.object;
60 hibmc->bo_global_ref.ref.global_type = DRM_GLOBAL_TTM_BO;
61 hibmc->bo_global_ref.ref.size = sizeof(struct ttm_bo_global);
62 hibmc->bo_global_ref.ref.init = &ttm_bo_global_init;
63 hibmc->bo_global_ref.ref.release = &ttm_bo_global_release;
64 ret = drm_global_item_ref(&hibmc->bo_global_ref.ref);
65 if (ret) {
66 DRM_ERROR("failed setting up TTM BO subsystem: %d\n", ret);
67 drm_global_item_unref(&hibmc->mem_global_ref);
68 return ret;
69 }
70 return 0;
71}
72
73static void
74hibmc_ttm_global_release(struct hibmc_drm_private *hibmc)
75{
76 drm_global_item_unref(&hibmc->bo_global_ref.ref);
77 drm_global_item_unref(&hibmc->mem_global_ref);
78 hibmc->mem_global_ref.release = NULL;
79}
80
81static void hibmc_bo_ttm_destroy(struct ttm_buffer_object *tbo) 32static void hibmc_bo_ttm_destroy(struct ttm_buffer_object *tbo)
82{ 33{
83 struct hibmc_bo *bo = container_of(tbo, struct hibmc_bo, bo); 34 struct hibmc_bo *bo = container_of(tbo, struct hibmc_bo, bo);
@@ -237,18 +188,12 @@ int hibmc_mm_init(struct hibmc_drm_private *hibmc)
237 struct drm_device *dev = hibmc->dev; 188 struct drm_device *dev = hibmc->dev;
238 struct ttm_bo_device *bdev = &hibmc->bdev; 189 struct ttm_bo_device *bdev = &hibmc->bdev;
239 190
240 ret = hibmc_ttm_global_init(hibmc);
241 if (ret)
242 return ret;
243
244 ret = ttm_bo_device_init(&hibmc->bdev, 191 ret = ttm_bo_device_init(&hibmc->bdev,
245 hibmc->bo_global_ref.ref.object,
246 &hibmc_bo_driver, 192 &hibmc_bo_driver,
247 dev->anon_inode->i_mapping, 193 dev->anon_inode->i_mapping,
248 DRM_FILE_PAGE_OFFSET, 194 DRM_FILE_PAGE_OFFSET,
249 true); 195 true);
250 if (ret) { 196 if (ret) {
251 hibmc_ttm_global_release(hibmc);
252 DRM_ERROR("error initializing bo driver: %d\n", ret); 197 DRM_ERROR("error initializing bo driver: %d\n", ret);
253 return ret; 198 return ret;
254 } 199 }
@@ -256,7 +201,6 @@ int hibmc_mm_init(struct hibmc_drm_private *hibmc)
256 ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM, 201 ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM,
257 hibmc->fb_size >> PAGE_SHIFT); 202 hibmc->fb_size >> PAGE_SHIFT);
258 if (ret) { 203 if (ret) {
259 hibmc_ttm_global_release(hibmc);
260 DRM_ERROR("failed ttm VRAM init: %d\n", ret); 204 DRM_ERROR("failed ttm VRAM init: %d\n", ret);
261 return ret; 205 return ret;
262 } 206 }
@@ -271,7 +215,6 @@ void hibmc_mm_fini(struct hibmc_drm_private *hibmc)
271 return; 215 return;
272 216
273 ttm_bo_device_release(&hibmc->bdev); 217 ttm_bo_device_release(&hibmc->bdev);
274 hibmc_ttm_global_release(hibmc);
275 hibmc->mm_inited = false; 218 hibmc->mm_inited = false;
276} 219}
277 220
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 1c2857f13ad4..0ff878c994e2 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -75,6 +75,7 @@ i915-y += i915_cmd_parser.o \
75 i915_gemfs.o \ 75 i915_gemfs.o \
76 i915_query.o \ 76 i915_query.o \
77 i915_request.o \ 77 i915_request.o \
78 i915_scheduler.o \
78 i915_timeline.o \ 79 i915_timeline.o \
79 i915_trace_points.o \ 80 i915_trace_points.o \
80 i915_vma.o \ 81 i915_vma.o \
@@ -112,6 +113,8 @@ i915-y += intel_audio.o \
112 intel_bios.o \ 113 intel_bios.o \
113 intel_cdclk.o \ 114 intel_cdclk.o \
114 intel_color.o \ 115 intel_color.o \
116 intel_combo_phy.o \
117 intel_connector.o \
115 intel_display.o \ 118 intel_display.o \
116 intel_dpio_phy.o \ 119 intel_dpio_phy.o \
117 intel_dpll_mgr.o \ 120 intel_dpll_mgr.o \
@@ -120,9 +123,9 @@ i915-y += intel_audio.o \
120 intel_frontbuffer.o \ 123 intel_frontbuffer.o \
121 intel_hdcp.o \ 124 intel_hdcp.o \
122 intel_hotplug.o \ 125 intel_hotplug.o \
123 intel_modes.o \
124 intel_overlay.o \ 126 intel_overlay.o \
125 intel_psr.o \ 127 intel_psr.o \
128 intel_quirks.o \
126 intel_sideband.o \ 129 intel_sideband.o \
127 intel_sprite.o 130 intel_sprite.o
128i915-$(CONFIG_ACPI) += intel_acpi.o intel_opregion.o 131i915-$(CONFIG_ACPI) += intel_acpi.o intel_opregion.o
@@ -142,6 +145,7 @@ i915-y += dvo_ch7017.o \
142 intel_dp_link_training.o \ 145 intel_dp_link_training.o \
143 intel_dp_mst.o \ 146 intel_dp_mst.o \
144 intel_dp.o \ 147 intel_dp.o \
148 intel_dsi.o \
145 intel_dsi_dcs_backlight.o \ 149 intel_dsi_dcs_backlight.o \
146 intel_dsi_vbt.o \ 150 intel_dsi_vbt.o \
147 intel_dvo.o \ 151 intel_dvo.o \
diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c
index 2402395a068d..58e166effa45 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.c
+++ b/drivers/gpu/drm/i915/gvt/gtt.c
@@ -1905,7 +1905,6 @@ static struct intel_vgpu_mm *intel_vgpu_create_ggtt_mm(struct intel_vgpu *vgpu)
1905 vgpu_free_mm(mm); 1905 vgpu_free_mm(mm);
1906 return ERR_PTR(-ENOMEM); 1906 return ERR_PTR(-ENOMEM);
1907 } 1907 }
1908 mm->ggtt_mm.last_partial_off = -1UL;
1909 1908
1910 return mm; 1909 return mm;
1911} 1910}
@@ -1930,7 +1929,6 @@ void _intel_vgpu_mm_release(struct kref *mm_ref)
1930 invalidate_ppgtt_mm(mm); 1929 invalidate_ppgtt_mm(mm);
1931 } else { 1930 } else {
1932 vfree(mm->ggtt_mm.virtual_ggtt); 1931 vfree(mm->ggtt_mm.virtual_ggtt);
1933 mm->ggtt_mm.last_partial_off = -1UL;
1934 } 1932 }
1935 1933
1936 vgpu_free_mm(mm); 1934 vgpu_free_mm(mm);
@@ -2168,6 +2166,8 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
2168 struct intel_gvt_gtt_entry e, m; 2166 struct intel_gvt_gtt_entry e, m;
2169 dma_addr_t dma_addr; 2167 dma_addr_t dma_addr;
2170 int ret; 2168 int ret;
2169 struct intel_gvt_partial_pte *partial_pte, *pos, *n;
2170 bool partial_update = false;
2171 2171
2172 if (bytes != 4 && bytes != 8) 2172 if (bytes != 4 && bytes != 8)
2173 return -EINVAL; 2173 return -EINVAL;
@@ -2178,68 +2178,57 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
2178 if (!vgpu_gmadr_is_valid(vgpu, gma)) 2178 if (!vgpu_gmadr_is_valid(vgpu, gma))
2179 return 0; 2179 return 0;
2180 2180
2181 ggtt_get_guest_entry(ggtt_mm, &e, g_gtt_index); 2181 e.type = GTT_TYPE_GGTT_PTE;
2182
2183 memcpy((void *)&e.val64 + (off & (info->gtt_entry_size - 1)), p_data, 2182 memcpy((void *)&e.val64 + (off & (info->gtt_entry_size - 1)), p_data,
2184 bytes); 2183 bytes);
2185 2184
2186 /* If ggtt entry size is 8 bytes, and it's split into two 4 bytes 2185 /* If ggtt entry size is 8 bytes, and it's split into two 4 bytes
2187 * write, we assume the two 4 bytes writes are consecutive. 2186 * write, save the first 4 bytes in a list and update virtual
2188 * Otherwise, we abort and report error 2187 * PTE. Only update shadow PTE when the second 4 bytes comes.
2189 */ 2188 */
2190 if (bytes < info->gtt_entry_size) { 2189 if (bytes < info->gtt_entry_size) {
2191 if (ggtt_mm->ggtt_mm.last_partial_off == -1UL) { 2190 bool found = false;
2192 /* the first partial part*/ 2191
2193 ggtt_mm->ggtt_mm.last_partial_off = off; 2192 list_for_each_entry_safe(pos, n,
2194 ggtt_mm->ggtt_mm.last_partial_data = e.val64; 2193 &ggtt_mm->ggtt_mm.partial_pte_list, list) {
2195 return 0; 2194 if (g_gtt_index == pos->offset >>
2196 } else if ((g_gtt_index == 2195 info->gtt_entry_size_shift) {
2197 (ggtt_mm->ggtt_mm.last_partial_off >> 2196 if (off != pos->offset) {
2198 info->gtt_entry_size_shift)) && 2197 /* the second partial part*/
2199 (off != ggtt_mm->ggtt_mm.last_partial_off)) { 2198 int last_off = pos->offset &
2200 /* the second partial part */ 2199 (info->gtt_entry_size - 1);
2201 2200
2202 int last_off = ggtt_mm->ggtt_mm.last_partial_off & 2201 memcpy((void *)&e.val64 + last_off,
2203 (info->gtt_entry_size - 1); 2202 (void *)&pos->data + last_off,
2204 2203 bytes);
2205 memcpy((void *)&e.val64 + last_off, 2204
2206 (void *)&ggtt_mm->ggtt_mm.last_partial_data + 2205 list_del(&pos->list);
2207 last_off, bytes); 2206 kfree(pos);
2208 2207 found = true;
2209 ggtt_mm->ggtt_mm.last_partial_off = -1UL; 2208 break;
2210 } else { 2209 }
2211 int last_offset; 2210
2212 2211 /* update of the first partial part */
2213 gvt_vgpu_err("failed to populate guest ggtt entry: abnormal ggtt entry write sequence, last_partial_off=%lx, offset=%x, bytes=%d, ggtt entry size=%d\n", 2212 pos->data = e.val64;
2214 ggtt_mm->ggtt_mm.last_partial_off, off, 2213 ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
2215 bytes, info->gtt_entry_size); 2214 return 0;
2216 2215 }
2217 /* set host ggtt entry to scratch page and clear 2216 }
2218 * virtual ggtt entry as not present for last
2219 * partially write offset
2220 */
2221 last_offset = ggtt_mm->ggtt_mm.last_partial_off &
2222 (~(info->gtt_entry_size - 1));
2223
2224 ggtt_get_host_entry(ggtt_mm, &m, last_offset);
2225 ggtt_invalidate_pte(vgpu, &m);
2226 ops->set_pfn(&m, gvt->gtt.scratch_mfn);
2227 ops->clear_present(&m);
2228 ggtt_set_host_entry(ggtt_mm, &m, last_offset);
2229 ggtt_invalidate(gvt->dev_priv);
2230
2231 ggtt_get_guest_entry(ggtt_mm, &e, last_offset);
2232 ops->clear_present(&e);
2233 ggtt_set_guest_entry(ggtt_mm, &e, last_offset);
2234
2235 ggtt_mm->ggtt_mm.last_partial_off = off;
2236 ggtt_mm->ggtt_mm.last_partial_data = e.val64;
2237 2217
2238 return 0; 2218 if (!found) {
2219 /* the first partial part */
2220 partial_pte = kzalloc(sizeof(*partial_pte), GFP_KERNEL);
2221 if (!partial_pte)
2222 return -ENOMEM;
2223 partial_pte->offset = off;
2224 partial_pte->data = e.val64;
2225 list_add_tail(&partial_pte->list,
2226 &ggtt_mm->ggtt_mm.partial_pte_list);
2227 partial_update = true;
2239 } 2228 }
2240 } 2229 }
2241 2230
2242 if (ops->test_present(&e)) { 2231 if (!partial_update && (ops->test_present(&e))) {
2243 gfn = ops->get_pfn(&e); 2232 gfn = ops->get_pfn(&e);
2244 m = e; 2233 m = e;
2245 2234
@@ -2263,16 +2252,18 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
2263 } else 2252 } else
2264 ops->set_pfn(&m, dma_addr >> PAGE_SHIFT); 2253 ops->set_pfn(&m, dma_addr >> PAGE_SHIFT);
2265 } else { 2254 } else {
2266 ggtt_get_host_entry(ggtt_mm, &m, g_gtt_index);
2267 ggtt_invalidate_pte(vgpu, &m);
2268 ops->set_pfn(&m, gvt->gtt.scratch_mfn); 2255 ops->set_pfn(&m, gvt->gtt.scratch_mfn);
2269 ops->clear_present(&m); 2256 ops->clear_present(&m);
2270 } 2257 }
2271 2258
2272out: 2259out:
2260 ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
2261
2262 ggtt_get_host_entry(ggtt_mm, &e, g_gtt_index);
2263 ggtt_invalidate_pte(vgpu, &e);
2264
2273 ggtt_set_host_entry(ggtt_mm, &m, g_gtt_index); 2265 ggtt_set_host_entry(ggtt_mm, &m, g_gtt_index);
2274 ggtt_invalidate(gvt->dev_priv); 2266 ggtt_invalidate(gvt->dev_priv);
2275 ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
2276 return 0; 2267 return 0;
2277} 2268}
2278 2269
@@ -2430,6 +2421,8 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
2430 2421
2431 intel_vgpu_reset_ggtt(vgpu, false); 2422 intel_vgpu_reset_ggtt(vgpu, false);
2432 2423
2424 INIT_LIST_HEAD(&gtt->ggtt_mm->ggtt_mm.partial_pte_list);
2425
2433 return create_scratch_page_tree(vgpu); 2426 return create_scratch_page_tree(vgpu);
2434} 2427}
2435 2428
@@ -2454,6 +2447,14 @@ static void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu)
2454 2447
2455static void intel_vgpu_destroy_ggtt_mm(struct intel_vgpu *vgpu) 2448static void intel_vgpu_destroy_ggtt_mm(struct intel_vgpu *vgpu)
2456{ 2449{
2450 struct intel_gvt_partial_pte *pos;
2451
2452 list_for_each_entry(pos,
2453 &vgpu->gtt.ggtt_mm->ggtt_mm.partial_pte_list, list) {
2454 gvt_dbg_mm("partial PTE update on hold 0x%lx : 0x%llx\n",
2455 pos->offset, pos->data);
2456 kfree(pos);
2457 }
2457 intel_vgpu_destroy_mm(vgpu->gtt.ggtt_mm); 2458 intel_vgpu_destroy_mm(vgpu->gtt.ggtt_mm);
2458 vgpu->gtt.ggtt_mm = NULL; 2459 vgpu->gtt.ggtt_mm = NULL;
2459} 2460}
diff --git a/drivers/gpu/drm/i915/gvt/gtt.h b/drivers/gpu/drm/i915/gvt/gtt.h
index 7a9b36176efb..d8cb04cc946d 100644
--- a/drivers/gpu/drm/i915/gvt/gtt.h
+++ b/drivers/gpu/drm/i915/gvt/gtt.h
@@ -35,7 +35,6 @@
35#define _GVT_GTT_H_ 35#define _GVT_GTT_H_
36 36
37#define I915_GTT_PAGE_SHIFT 12 37#define I915_GTT_PAGE_SHIFT 12
38#define I915_GTT_PAGE_MASK (~(I915_GTT_PAGE_SIZE - 1))
39 38
40struct intel_vgpu_mm; 39struct intel_vgpu_mm;
41 40
@@ -133,6 +132,12 @@ enum intel_gvt_mm_type {
133 132
134#define GVT_RING_CTX_NR_PDPS GEN8_3LVL_PDPES 133#define GVT_RING_CTX_NR_PDPS GEN8_3LVL_PDPES
135 134
135struct intel_gvt_partial_pte {
136 unsigned long offset;
137 u64 data;
138 struct list_head list;
139};
140
136struct intel_vgpu_mm { 141struct intel_vgpu_mm {
137 enum intel_gvt_mm_type type; 142 enum intel_gvt_mm_type type;
138 struct intel_vgpu *vgpu; 143 struct intel_vgpu *vgpu;
@@ -157,8 +162,7 @@ struct intel_vgpu_mm {
157 } ppgtt_mm; 162 } ppgtt_mm;
158 struct { 163 struct {
159 void *virtual_ggtt; 164 void *virtual_ggtt;
160 unsigned long last_partial_off; 165 struct list_head partial_pte_list;
161 u64 last_partial_data;
162 } ggtt_mm; 166 } ggtt_mm;
163 }; 167 };
164}; 168};
diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c
index 90f50f67909a..aa280bb07125 100644
--- a/drivers/gpu/drm/i915/gvt/handlers.c
+++ b/drivers/gpu/drm/i915/gvt/handlers.c
@@ -1609,7 +1609,7 @@ static int bxt_gt_disp_pwron_write(struct intel_vgpu *vgpu,
1609 return 0; 1609 return 0;
1610} 1610}
1611 1611
1612static int bxt_edp_psr_imr_iir_write(struct intel_vgpu *vgpu, 1612static int edp_psr_imr_iir_write(struct intel_vgpu *vgpu,
1613 unsigned int offset, void *p_data, unsigned int bytes) 1613 unsigned int offset, void *p_data, unsigned int bytes)
1614{ 1614{
1615 vgpu_vreg(vgpu, offset) = 0; 1615 vgpu_vreg(vgpu, offset) = 0;
@@ -2607,6 +2607,9 @@ static int init_generic_mmio_info(struct intel_gvt *gvt)
2607 MMIO_DFH(_MMIO(0x1a178), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL); 2607 MMIO_DFH(_MMIO(0x1a178), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
2608 MMIO_DFH(_MMIO(0x1a17c), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL); 2608 MMIO_DFH(_MMIO(0x1a17c), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
2609 MMIO_DFH(_MMIO(0x2217c), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL); 2609 MMIO_DFH(_MMIO(0x2217c), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
2610
2611 MMIO_DH(EDP_PSR_IMR, D_BDW_PLUS, NULL, edp_psr_imr_iir_write);
2612 MMIO_DH(EDP_PSR_IIR, D_BDW_PLUS, NULL, edp_psr_imr_iir_write);
2610 return 0; 2613 return 0;
2611} 2614}
2612 2615
@@ -3205,9 +3208,6 @@ static int init_bxt_mmio_info(struct intel_gvt *gvt)
3205 MMIO_D(HSW_TVIDEO_DIP_GCP(TRANSCODER_B), D_BXT); 3208 MMIO_D(HSW_TVIDEO_DIP_GCP(TRANSCODER_B), D_BXT);
3206 MMIO_D(HSW_TVIDEO_DIP_GCP(TRANSCODER_C), D_BXT); 3209 MMIO_D(HSW_TVIDEO_DIP_GCP(TRANSCODER_C), D_BXT);
3207 3210
3208 MMIO_DH(EDP_PSR_IMR, D_BXT, NULL, bxt_edp_psr_imr_iir_write);
3209 MMIO_DH(EDP_PSR_IIR, D_BXT, NULL, bxt_edp_psr_imr_iir_write);
3210
3211 MMIO_D(RC6_CTX_BASE, D_BXT); 3211 MMIO_D(RC6_CTX_BASE, D_BXT);
3212 3212
3213 MMIO_D(GEN8_PUSHBUS_CONTROL, D_BXT); 3213 MMIO_D(GEN8_PUSHBUS_CONTROL, D_BXT);
diff --git a/drivers/gpu/drm/i915/gvt/mmio_context.c b/drivers/gpu/drm/i915/gvt/mmio_context.c
index 10e63eea5492..36a5147cd01e 100644
--- a/drivers/gpu/drm/i915/gvt/mmio_context.c
+++ b/drivers/gpu/drm/i915/gvt/mmio_context.c
@@ -131,7 +131,7 @@ static struct engine_mmio gen9_engine_mmio_list[] __cacheline_aligned = {
131 {RCS, GAMT_CHKN_BIT_REG, 0x0, false}, /* 0x4ab8 */ 131 {RCS, GAMT_CHKN_BIT_REG, 0x0, false}, /* 0x4ab8 */
132 132
133 {RCS, GEN9_GAMT_ECO_REG_RW_IA, 0x0, false}, /* 0x4ab0 */ 133 {RCS, GEN9_GAMT_ECO_REG_RW_IA, 0x0, false}, /* 0x4ab0 */
134 {RCS, GEN9_CSFE_CHICKEN1_RCS, 0x0, false}, /* 0x20d4 */ 134 {RCS, GEN9_CSFE_CHICKEN1_RCS, 0xffff, false}, /* 0x20d4 */
135 135
136 {RCS, GEN8_GARBCNTL, 0x0, false}, /* 0xb004 */ 136 {RCS, GEN8_GARBCNTL, 0x0, false}, /* 0xb004 */
137 {RCS, GEN7_FF_THREAD_MODE, 0x0, false}, /* 0x20a0 */ 137 {RCS, GEN7_FF_THREAD_MODE, 0x0, false}, /* 0x20a0 */
diff --git a/drivers/gpu/drm/i915/gvt/scheduler.c b/drivers/gpu/drm/i915/gvt/scheduler.c
index ea34003d6dd2..b8fbe3fabea3 100644
--- a/drivers/gpu/drm/i915/gvt/scheduler.c
+++ b/drivers/gpu/drm/i915/gvt/scheduler.c
@@ -334,6 +334,28 @@ static void release_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx)
334 i915_gem_object_put(wa_ctx->indirect_ctx.obj); 334 i915_gem_object_put(wa_ctx->indirect_ctx.obj);
335} 335}
336 336
337static int set_context_ppgtt_from_shadow(struct intel_vgpu_workload *workload,
338 struct i915_gem_context *ctx)
339{
340 struct intel_vgpu_mm *mm = workload->shadow_mm;
341 struct i915_hw_ppgtt *ppgtt = ctx->ppgtt;
342 int i = 0;
343
344 if (mm->type != INTEL_GVT_MM_PPGTT || !mm->ppgtt_mm.shadowed)
345 return -1;
346
347 if (mm->ppgtt_mm.root_entry_type == GTT_TYPE_PPGTT_ROOT_L4_ENTRY) {
348 px_dma(&ppgtt->pml4) = mm->ppgtt_mm.shadow_pdps[0];
349 } else {
350 for (i = 0; i < GVT_RING_CTX_NR_PDPS; i++) {
351 px_dma(ppgtt->pdp.page_directory[i]) =
352 mm->ppgtt_mm.shadow_pdps[i];
353 }
354 }
355
356 return 0;
357}
358
337/** 359/**
338 * intel_gvt_scan_and_shadow_workload - audit the workload by scanning and 360 * intel_gvt_scan_and_shadow_workload - audit the workload by scanning and
339 * shadow it as well, include ringbuffer,wa_ctx and ctx. 361 * shadow it as well, include ringbuffer,wa_ctx and ctx.
@@ -358,6 +380,12 @@ int intel_gvt_scan_and_shadow_workload(struct intel_vgpu_workload *workload)
358 if (workload->req) 380 if (workload->req)
359 return 0; 381 return 0;
360 382
383 ret = set_context_ppgtt_from_shadow(workload, shadow_ctx);
384 if (ret < 0) {
385 gvt_vgpu_err("workload shadow ppgtt isn't ready\n");
386 return ret;
387 }
388
361 /* pin shadow context by gvt even the shadow context will be pinned 389 /* pin shadow context by gvt even the shadow context will be pinned
362 * when i915 alloc request. That is because gvt will update the guest 390 * when i915 alloc request. That is because gvt will update the guest
363 * context from shadow context when workload is completed, and at that 391 * context from shadow context when workload is completed, and at that
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 4f3ac0a12889..7f455bca528e 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1788,6 +1788,8 @@ static int i915_emon_status(struct seq_file *m, void *unused)
1788 if (!IS_GEN5(dev_priv)) 1788 if (!IS_GEN5(dev_priv))
1789 return -ENODEV; 1789 return -ENODEV;
1790 1790
1791 intel_runtime_pm_get(dev_priv);
1792
1791 ret = mutex_lock_interruptible(&dev->struct_mutex); 1793 ret = mutex_lock_interruptible(&dev->struct_mutex);
1792 if (ret) 1794 if (ret)
1793 return ret; 1795 return ret;
@@ -1802,6 +1804,8 @@ static int i915_emon_status(struct seq_file *m, void *unused)
1802 seq_printf(m, "GFX power: %ld\n", gfx); 1804 seq_printf(m, "GFX power: %ld\n", gfx);
1803 seq_printf(m, "Total power: %ld\n", chipset + gfx); 1805 seq_printf(m, "Total power: %ld\n", chipset + gfx);
1804 1806
1807 intel_runtime_pm_put(dev_priv);
1808
1805 return 0; 1809 return 0;
1806} 1810}
1807 1811
@@ -2215,8 +2219,23 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
2215 struct drm_i915_private *dev_priv = node_to_i915(m->private); 2219 struct drm_i915_private *dev_priv = node_to_i915(m->private);
2216 struct drm_device *dev = &dev_priv->drm; 2220 struct drm_device *dev = &dev_priv->drm;
2217 struct intel_rps *rps = &dev_priv->gt_pm.rps; 2221 struct intel_rps *rps = &dev_priv->gt_pm.rps;
2222 u32 act_freq = rps->cur_freq;
2218 struct drm_file *file; 2223 struct drm_file *file;
2219 2224
2225 if (intel_runtime_pm_get_if_in_use(dev_priv)) {
2226 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
2227 mutex_lock(&dev_priv->pcu_lock);
2228 act_freq = vlv_punit_read(dev_priv,
2229 PUNIT_REG_GPU_FREQ_STS);
2230 act_freq = (act_freq >> 8) & 0xff;
2231 mutex_unlock(&dev_priv->pcu_lock);
2232 } else {
2233 act_freq = intel_get_cagf(dev_priv,
2234 I915_READ(GEN6_RPSTAT1));
2235 }
2236 intel_runtime_pm_put(dev_priv);
2237 }
2238
2220 seq_printf(m, "RPS enabled? %d\n", rps->enabled); 2239 seq_printf(m, "RPS enabled? %d\n", rps->enabled);
2221 seq_printf(m, "GPU busy? %s [%d requests]\n", 2240 seq_printf(m, "GPU busy? %s [%d requests]\n",
2222 yesno(dev_priv->gt.awake), dev_priv->gt.active_requests); 2241 yesno(dev_priv->gt.awake), dev_priv->gt.active_requests);
@@ -2224,8 +2243,9 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
2224 seq_printf(m, "Boosts outstanding? %d\n", 2243 seq_printf(m, "Boosts outstanding? %d\n",
2225 atomic_read(&rps->num_waiters)); 2244 atomic_read(&rps->num_waiters));
2226 seq_printf(m, "Interactive? %d\n", READ_ONCE(rps->power.interactive)); 2245 seq_printf(m, "Interactive? %d\n", READ_ONCE(rps->power.interactive));
2227 seq_printf(m, "Frequency requested %d\n", 2246 seq_printf(m, "Frequency requested %d, actual %d\n",
2228 intel_gpu_freq(dev_priv, rps->cur_freq)); 2247 intel_gpu_freq(dev_priv, rps->cur_freq),
2248 intel_gpu_freq(dev_priv, act_freq));
2229 seq_printf(m, " min hard:%d, soft:%d; max soft:%d, hard:%d\n", 2249 seq_printf(m, " min hard:%d, soft:%d; max soft:%d, hard:%d\n",
2230 intel_gpu_freq(dev_priv, rps->min_freq), 2250 intel_gpu_freq(dev_priv, rps->min_freq),
2231 intel_gpu_freq(dev_priv, rps->min_freq_softlimit), 2251 intel_gpu_freq(dev_priv, rps->min_freq_softlimit),
@@ -2900,16 +2920,15 @@ static int i915_dmc_info(struct seq_file *m, void *unused)
2900 seq_printf(m, "version: %d.%d\n", CSR_VERSION_MAJOR(csr->version), 2920 seq_printf(m, "version: %d.%d\n", CSR_VERSION_MAJOR(csr->version),
2901 CSR_VERSION_MINOR(csr->version)); 2921 CSR_VERSION_MINOR(csr->version));
2902 2922
2903 if (IS_KABYLAKE(dev_priv) || 2923 if (WARN_ON(INTEL_GEN(dev_priv) > 11))
2904 (IS_SKYLAKE(dev_priv) && csr->version >= CSR_VERSION(1, 6))) { 2924 goto out;
2905 seq_printf(m, "DC3 -> DC5 count: %d\n", 2925
2906 I915_READ(SKL_CSR_DC3_DC5_COUNT)); 2926 seq_printf(m, "DC3 -> DC5 count: %d\n",
2927 I915_READ(IS_BROXTON(dev_priv) ? BXT_CSR_DC3_DC5_COUNT :
2928 SKL_CSR_DC3_DC5_COUNT));
2929 if (!IS_GEN9_LP(dev_priv))
2907 seq_printf(m, "DC5 -> DC6 count: %d\n", 2930 seq_printf(m, "DC5 -> DC6 count: %d\n",
2908 I915_READ(SKL_CSR_DC5_DC6_COUNT)); 2931 I915_READ(SKL_CSR_DC5_DC6_COUNT));
2909 } else if (IS_BROXTON(dev_priv) && csr->version >= CSR_VERSION(1, 4)) {
2910 seq_printf(m, "DC3 -> DC5 count: %d\n",
2911 I915_READ(BXT_CSR_DC3_DC5_COUNT));
2912 }
2913 2932
2914out: 2933out:
2915 seq_printf(m, "program base: 0x%08x\n", I915_READ(CSR_PROGRAM(0))); 2934 seq_printf(m, "program base: 0x%08x\n", I915_READ(CSR_PROGRAM(0)));
@@ -3049,16 +3068,17 @@ static void intel_connector_info(struct seq_file *m,
3049 seq_printf(m, "connector %d: type %s, status: %s\n", 3068 seq_printf(m, "connector %d: type %s, status: %s\n",
3050 connector->base.id, connector->name, 3069 connector->base.id, connector->name,
3051 drm_get_connector_status_name(connector->status)); 3070 drm_get_connector_status_name(connector->status));
3052 if (connector->status == connector_status_connected) { 3071
3053 seq_printf(m, "\tname: %s\n", connector->display_info.name); 3072 if (connector->status == connector_status_disconnected)
3054 seq_printf(m, "\tphysical dimensions: %dx%dmm\n", 3073 return;
3055 connector->display_info.width_mm, 3074
3056 connector->display_info.height_mm); 3075 seq_printf(m, "\tname: %s\n", connector->display_info.name);
3057 seq_printf(m, "\tsubpixel order: %s\n", 3076 seq_printf(m, "\tphysical dimensions: %dx%dmm\n",
3058 drm_get_subpixel_order_name(connector->display_info.subpixel_order)); 3077 connector->display_info.width_mm,
3059 seq_printf(m, "\tCEA rev: %d\n", 3078 connector->display_info.height_mm);
3060 connector->display_info.cea_rev); 3079 seq_printf(m, "\tsubpixel order: %s\n",
3061 } 3080 drm_get_subpixel_order_name(connector->display_info.subpixel_order));
3081 seq_printf(m, "\tCEA rev: %d\n", connector->display_info.cea_rev);
3062 3082
3063 if (!intel_encoder) 3083 if (!intel_encoder)
3064 return; 3084 return;
@@ -4172,6 +4192,7 @@ i915_drop_caches_set(void *data, u64 val)
4172 4192
4173 DRM_DEBUG("Dropping caches: 0x%08llx [0x%08llx]\n", 4193 DRM_DEBUG("Dropping caches: 0x%08llx [0x%08llx]\n",
4174 val, val & DROP_ALL); 4194 val, val & DROP_ALL);
4195 intel_runtime_pm_get(i915);
4175 4196
4176 if (val & DROP_RESET_ACTIVE && !intel_engines_are_idle(i915)) 4197 if (val & DROP_RESET_ACTIVE && !intel_engines_are_idle(i915))
4177 i915_gem_set_wedged(i915); 4198 i915_gem_set_wedged(i915);
@@ -4181,7 +4202,7 @@ i915_drop_caches_set(void *data, u64 val)
4181 if (val & (DROP_ACTIVE | DROP_RETIRE | DROP_RESET_SEQNO)) { 4202 if (val & (DROP_ACTIVE | DROP_RETIRE | DROP_RESET_SEQNO)) {
4182 ret = mutex_lock_interruptible(&i915->drm.struct_mutex); 4203 ret = mutex_lock_interruptible(&i915->drm.struct_mutex);
4183 if (ret) 4204 if (ret)
4184 return ret; 4205 goto out;
4185 4206
4186 if (val & DROP_ACTIVE) 4207 if (val & DROP_ACTIVE)
4187 ret = i915_gem_wait_for_idle(i915, 4208 ret = i915_gem_wait_for_idle(i915,
@@ -4189,11 +4210,8 @@ i915_drop_caches_set(void *data, u64 val)
4189 I915_WAIT_LOCKED, 4210 I915_WAIT_LOCKED,
4190 MAX_SCHEDULE_TIMEOUT); 4211 MAX_SCHEDULE_TIMEOUT);
4191 4212
4192 if (ret == 0 && val & DROP_RESET_SEQNO) { 4213 if (ret == 0 && val & DROP_RESET_SEQNO)
4193 intel_runtime_pm_get(i915);
4194 ret = i915_gem_set_global_seqno(&i915->drm, 1); 4214 ret = i915_gem_set_global_seqno(&i915->drm, 1);
4195 intel_runtime_pm_put(i915);
4196 }
4197 4215
4198 if (val & DROP_RETIRE) 4216 if (val & DROP_RETIRE)
4199 i915_retire_requests(i915); 4217 i915_retire_requests(i915);
@@ -4231,6 +4249,9 @@ i915_drop_caches_set(void *data, u64 val)
4231 if (val & DROP_FREED) 4249 if (val & DROP_FREED)
4232 i915_gem_drain_freed_objects(i915); 4250 i915_gem_drain_freed_objects(i915);
4233 4251
4252out:
4253 intel_runtime_pm_put(i915);
4254
4234 return ret; 4255 return ret;
4235} 4256}
4236 4257
@@ -4331,7 +4352,7 @@ static void gen10_sseu_device_status(struct drm_i915_private *dev_priv,
4331 for (s = 0; s < info->sseu.max_slices; s++) { 4352 for (s = 0; s < info->sseu.max_slices; s++) {
4332 /* 4353 /*
4333 * FIXME: Valid SS Mask respects the spec and read 4354 * FIXME: Valid SS Mask respects the spec and read
4334 * only valid bits for those registers, excluding reserverd 4355 * only valid bits for those registers, excluding reserved
4335 * although this seems wrong because it would leave many 4356 * although this seems wrong because it would leave many
4336 * subslices without ACK. 4357 * subslices without ACK.
4337 */ 4358 */
@@ -4641,24 +4662,122 @@ static const struct file_operations i915_hpd_storm_ctl_fops = {
4641 .write = i915_hpd_storm_ctl_write 4662 .write = i915_hpd_storm_ctl_write
4642}; 4663};
4643 4664
4665static int i915_hpd_short_storm_ctl_show(struct seq_file *m, void *data)
4666{
4667 struct drm_i915_private *dev_priv = m->private;
4668
4669 seq_printf(m, "Enabled: %s\n",
4670 yesno(dev_priv->hotplug.hpd_short_storm_enabled));
4671
4672 return 0;
4673}
4674
4675static int
4676i915_hpd_short_storm_ctl_open(struct inode *inode, struct file *file)
4677{
4678 return single_open(file, i915_hpd_short_storm_ctl_show,
4679 inode->i_private);
4680}
4681
4682static ssize_t i915_hpd_short_storm_ctl_write(struct file *file,
4683 const char __user *ubuf,
4684 size_t len, loff_t *offp)
4685{
4686 struct seq_file *m = file->private_data;
4687 struct drm_i915_private *dev_priv = m->private;
4688 struct i915_hotplug *hotplug = &dev_priv->hotplug;
4689 char *newline;
4690 char tmp[16];
4691 int i;
4692 bool new_state;
4693
4694 if (len >= sizeof(tmp))
4695 return -EINVAL;
4696
4697 if (copy_from_user(tmp, ubuf, len))
4698 return -EFAULT;
4699
4700 tmp[len] = '\0';
4701
4702 /* Strip newline, if any */
4703 newline = strchr(tmp, '\n');
4704 if (newline)
4705 *newline = '\0';
4706
4707 /* Reset to the "default" state for this system */
4708 if (strcmp(tmp, "reset") == 0)
4709 new_state = !HAS_DP_MST(dev_priv);
4710 else if (kstrtobool(tmp, &new_state) != 0)
4711 return -EINVAL;
4712
4713 DRM_DEBUG_KMS("%sabling HPD short storm detection\n",
4714 new_state ? "En" : "Dis");
4715
4716 spin_lock_irq(&dev_priv->irq_lock);
4717 hotplug->hpd_short_storm_enabled = new_state;
4718 /* Reset the HPD storm stats so we don't accidentally trigger a storm */
4719 for_each_hpd_pin(i)
4720 hotplug->stats[i].count = 0;
4721 spin_unlock_irq(&dev_priv->irq_lock);
4722
4723 /* Re-enable hpd immediately if we were in an irq storm */
4724 flush_delayed_work(&dev_priv->hotplug.reenable_work);
4725
4726 return len;
4727}
4728
4729static const struct file_operations i915_hpd_short_storm_ctl_fops = {
4730 .owner = THIS_MODULE,
4731 .open = i915_hpd_short_storm_ctl_open,
4732 .read = seq_read,
4733 .llseek = seq_lseek,
4734 .release = single_release,
4735 .write = i915_hpd_short_storm_ctl_write,
4736};
4737
4644static int i915_drrs_ctl_set(void *data, u64 val) 4738static int i915_drrs_ctl_set(void *data, u64 val)
4645{ 4739{
4646 struct drm_i915_private *dev_priv = data; 4740 struct drm_i915_private *dev_priv = data;
4647 struct drm_device *dev = &dev_priv->drm; 4741 struct drm_device *dev = &dev_priv->drm;
4648 struct intel_crtc *intel_crtc; 4742 struct intel_crtc *crtc;
4649 struct intel_encoder *encoder;
4650 struct intel_dp *intel_dp;
4651 4743
4652 if (INTEL_GEN(dev_priv) < 7) 4744 if (INTEL_GEN(dev_priv) < 7)
4653 return -ENODEV; 4745 return -ENODEV;
4654 4746
4655 drm_modeset_lock_all(dev); 4747 for_each_intel_crtc(dev, crtc) {
4656 for_each_intel_crtc(dev, intel_crtc) { 4748 struct drm_connector_list_iter conn_iter;
4657 if (!intel_crtc->base.state->active || 4749 struct intel_crtc_state *crtc_state;
4658 !intel_crtc->config->has_drrs) 4750 struct drm_connector *connector;
4659 continue; 4751 struct drm_crtc_commit *commit;
4752 int ret;
4753
4754 ret = drm_modeset_lock_single_interruptible(&crtc->base.mutex);
4755 if (ret)
4756 return ret;
4757
4758 crtc_state = to_intel_crtc_state(crtc->base.state);
4759
4760 if (!crtc_state->base.active ||
4761 !crtc_state->has_drrs)
4762 goto out;
4660 4763
4661 for_each_encoder_on_crtc(dev, &intel_crtc->base, encoder) { 4764 commit = crtc_state->base.commit;
4765 if (commit) {
4766 ret = wait_for_completion_interruptible(&commit->hw_done);
4767 if (ret)
4768 goto out;
4769 }
4770
4771 drm_connector_list_iter_begin(dev, &conn_iter);
4772 drm_for_each_connector_iter(connector, &conn_iter) {
4773 struct intel_encoder *encoder;
4774 struct intel_dp *intel_dp;
4775
4776 if (!(crtc_state->base.connector_mask &
4777 drm_connector_mask(connector)))
4778 continue;
4779
4780 encoder = intel_attached_encoder(connector);
4662 if (encoder->type != INTEL_OUTPUT_EDP) 4781 if (encoder->type != INTEL_OUTPUT_EDP)
4663 continue; 4782 continue;
4664 4783
@@ -4668,13 +4787,18 @@ static int i915_drrs_ctl_set(void *data, u64 val)
4668 intel_dp = enc_to_intel_dp(&encoder->base); 4787 intel_dp = enc_to_intel_dp(&encoder->base);
4669 if (val) 4788 if (val)
4670 intel_edp_drrs_enable(intel_dp, 4789 intel_edp_drrs_enable(intel_dp,
4671 intel_crtc->config); 4790 crtc_state);
4672 else 4791 else
4673 intel_edp_drrs_disable(intel_dp, 4792 intel_edp_drrs_disable(intel_dp,
4674 intel_crtc->config); 4793 crtc_state);
4675 } 4794 }
4795 drm_connector_list_iter_end(&conn_iter);
4796
4797out:
4798 drm_modeset_unlock(&crtc->base.mutex);
4799 if (ret)
4800 return ret;
4676 } 4801 }
4677 drm_modeset_unlock_all(dev);
4678 4802
4679 return 0; 4803 return 0;
4680} 4804}
@@ -4818,6 +4942,7 @@ static const struct i915_debugfs_files {
4818 {"i915_guc_log_level", &i915_guc_log_level_fops}, 4942 {"i915_guc_log_level", &i915_guc_log_level_fops},
4819 {"i915_guc_log_relay", &i915_guc_log_relay_fops}, 4943 {"i915_guc_log_relay", &i915_guc_log_relay_fops},
4820 {"i915_hpd_storm_ctl", &i915_hpd_storm_ctl_fops}, 4944 {"i915_hpd_storm_ctl", &i915_hpd_storm_ctl_fops},
4945 {"i915_hpd_short_storm_ctl", &i915_hpd_short_storm_ctl_fops},
4821 {"i915_ipc_status", &i915_ipc_status_fops}, 4946 {"i915_ipc_status", &i915_ipc_status_fops},
4822 {"i915_drrs_ctl", &i915_drrs_ctl_fops}, 4947 {"i915_drrs_ctl", &i915_drrs_ctl_fops},
4823 {"i915_edp_psr_debug", &i915_edp_psr_debug_fops} 4948 {"i915_edp_psr_debug", &i915_edp_psr_debug_fops}
@@ -4899,13 +5024,10 @@ static int i915_dpcd_show(struct seq_file *m, void *data)
4899 continue; 5024 continue;
4900 5025
4901 err = drm_dp_dpcd_read(&intel_dp->aux, b->offset, buf, size); 5026 err = drm_dp_dpcd_read(&intel_dp->aux, b->offset, buf, size);
4902 if (err <= 0) { 5027 if (err < 0)
4903 DRM_ERROR("dpcd read (%zu bytes at %u) failed (%zd)\n", 5028 seq_printf(m, "%04x: ERROR %d\n", b->offset, (int)err);
4904 size, b->offset, err); 5029 else
4905 continue; 5030 seq_printf(m, "%04x: %*ph\n", b->offset, (int)err, buf);
4906 }
4907
4908 seq_printf(m, "%04x: %*ph\n", b->offset, (int) size, buf);
4909 } 5031 }
4910 5032
4911 return 0; 5033 return 0;
@@ -4934,6 +5056,28 @@ static int i915_panel_show(struct seq_file *m, void *data)
4934} 5056}
4935DEFINE_SHOW_ATTRIBUTE(i915_panel); 5057DEFINE_SHOW_ATTRIBUTE(i915_panel);
4936 5058
5059static int i915_hdcp_sink_capability_show(struct seq_file *m, void *data)
5060{
5061 struct drm_connector *connector = m->private;
5062 struct intel_connector *intel_connector = to_intel_connector(connector);
5063
5064 if (connector->status != connector_status_connected)
5065 return -ENODEV;
5066
5067 /* HDCP is supported by connector */
5068 if (!intel_connector->hdcp.shim)
5069 return -EINVAL;
5070
5071 seq_printf(m, "%s:%d HDCP version: ", connector->name,
5072 connector->base.id);
5073 seq_printf(m, "%s ", !intel_hdcp_capable(intel_connector) ?
5074 "None" : "HDCP1.4");
5075 seq_puts(m, "\n");
5076
5077 return 0;
5078}
5079DEFINE_SHOW_ATTRIBUTE(i915_hdcp_sink_capability);
5080
4937/** 5081/**
4938 * i915_debugfs_connector_add - add i915 specific connector debugfs files 5082 * i915_debugfs_connector_add - add i915 specific connector debugfs files
4939 * @connector: pointer to a registered drm_connector 5083 * @connector: pointer to a registered drm_connector
@@ -4963,5 +5107,12 @@ int i915_debugfs_connector_add(struct drm_connector *connector)
4963 connector, &i915_psr_sink_status_fops); 5107 connector, &i915_psr_sink_status_fops);
4964 } 5108 }
4965 5109
5110 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
5111 connector->connector_type == DRM_MODE_CONNECTOR_HDMIA ||
5112 connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) {
5113 debugfs_create_file("i915_hdcp_sink_capability", S_IRUGO, root,
5114 connector, &i915_hdcp_sink_capability_fops);
5115 }
5116
4966 return 0; 5117 return 0;
4967} 5118}
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 44e2c0f5ec50..b1d23c73c147 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -345,7 +345,7 @@ static int i915_getparam_ioctl(struct drm_device *dev, void *data,
345 value = HAS_WT(dev_priv); 345 value = HAS_WT(dev_priv);
346 break; 346 break;
347 case I915_PARAM_HAS_ALIASING_PPGTT: 347 case I915_PARAM_HAS_ALIASING_PPGTT:
348 value = USES_PPGTT(dev_priv); 348 value = min_t(int, INTEL_PPGTT(dev_priv), I915_GEM_PPGTT_FULL);
349 break; 349 break;
350 case I915_PARAM_HAS_SEMAPHORES: 350 case I915_PARAM_HAS_SEMAPHORES:
351 value = HAS_LEGACY_SEMAPHORES(dev_priv); 351 value = HAS_LEGACY_SEMAPHORES(dev_priv);
@@ -645,6 +645,13 @@ static int i915_load_modeset_init(struct drm_device *dev)
645 if (i915_inject_load_failure()) 645 if (i915_inject_load_failure())
646 return -ENODEV; 646 return -ENODEV;
647 647
648 if (INTEL_INFO(dev_priv)->num_pipes) {
649 ret = drm_vblank_init(&dev_priv->drm,
650 INTEL_INFO(dev_priv)->num_pipes);
651 if (ret)
652 goto out;
653 }
654
648 intel_bios_init(dev_priv); 655 intel_bios_init(dev_priv);
649 656
650 /* If we have > 1 VGA cards, then we need to arbitrate access 657 /* If we have > 1 VGA cards, then we need to arbitrate access
@@ -687,7 +694,7 @@ static int i915_load_modeset_init(struct drm_device *dev)
687 if (ret) 694 if (ret)
688 goto cleanup_modeset; 695 goto cleanup_modeset;
689 696
690 intel_setup_overlay(dev_priv); 697 intel_overlay_setup(dev_priv);
691 698
692 if (INTEL_INFO(dev_priv)->num_pipes == 0) 699 if (INTEL_INFO(dev_priv)->num_pipes == 0)
693 return 0; 700 return 0;
@@ -699,6 +706,8 @@ static int i915_load_modeset_init(struct drm_device *dev)
699 /* Only enable hotplug handling once the fbdev is fully set up. */ 706 /* Only enable hotplug handling once the fbdev is fully set up. */
700 intel_hpd_init(dev_priv); 707 intel_hpd_init(dev_priv);
701 708
709 intel_init_ipc(dev_priv);
710
702 return 0; 711 return 0;
703 712
704cleanup_gem: 713cleanup_gem:
@@ -1030,6 +1039,7 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
1030 1039
1031err_uncore: 1040err_uncore:
1032 intel_uncore_fini(dev_priv); 1041 intel_uncore_fini(dev_priv);
1042 i915_mmio_cleanup(dev_priv);
1033err_bridge: 1043err_bridge:
1034 pci_dev_put(dev_priv->bridge_dev); 1044 pci_dev_put(dev_priv->bridge_dev);
1035 1045
@@ -1049,17 +1059,6 @@ static void i915_driver_cleanup_mmio(struct drm_i915_private *dev_priv)
1049 1059
1050static void intel_sanitize_options(struct drm_i915_private *dev_priv) 1060static void intel_sanitize_options(struct drm_i915_private *dev_priv)
1051{ 1061{
1052 /*
1053 * i915.enable_ppgtt is read-only, so do an early pass to validate the
1054 * user's requested state against the hardware/driver capabilities. We
1055 * do this now so that we can print out any log messages once rather
1056 * than every time we check intel_enable_ppgtt().
1057 */
1058 i915_modparams.enable_ppgtt =
1059 intel_sanitize_enable_ppgtt(dev_priv,
1060 i915_modparams.enable_ppgtt);
1061 DRM_DEBUG_DRIVER("ppgtt mode: %i\n", i915_modparams.enable_ppgtt);
1062
1063 intel_gvt_sanitize_options(dev_priv); 1062 intel_gvt_sanitize_options(dev_priv);
1064} 1063}
1065 1064
@@ -1175,8 +1174,6 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv)
1175 return -EINVAL; 1174 return -EINVAL;
1176 } 1175 }
1177 1176
1178 dram_info->valid_dimm = true;
1179
1180 /* 1177 /*
1181 * If any of the channel is single rank channel, worst case output 1178 * If any of the channel is single rank channel, worst case output
1182 * will be same as if single rank memory, so consider single rank 1179 * will be same as if single rank memory, so consider single rank
@@ -1193,8 +1190,7 @@ skl_dram_get_channels_info(struct drm_i915_private *dev_priv)
1193 return -EINVAL; 1190 return -EINVAL;
1194 } 1191 }
1195 1192
1196 if (ch0.is_16gb_dimm || ch1.is_16gb_dimm) 1193 dram_info->is_16gb_dimm = ch0.is_16gb_dimm || ch1.is_16gb_dimm;
1197 dram_info->is_16gb_dimm = true;
1198 1194
1199 dev_priv->dram_info.symmetric_memory = intel_is_dram_symmetric(val_ch0, 1195 dev_priv->dram_info.symmetric_memory = intel_is_dram_symmetric(val_ch0,
1200 val_ch1, 1196 val_ch1,
@@ -1314,7 +1310,6 @@ bxt_get_dram_info(struct drm_i915_private *dev_priv)
1314 return -EINVAL; 1310 return -EINVAL;
1315 } 1311 }
1316 1312
1317 dram_info->valid_dimm = true;
1318 dram_info->valid = true; 1313 dram_info->valid = true;
1319 return 0; 1314 return 0;
1320} 1315}
@@ -1327,19 +1322,24 @@ intel_get_dram_info(struct drm_i915_private *dev_priv)
1327 int ret; 1322 int ret;
1328 1323
1329 dram_info->valid = false; 1324 dram_info->valid = false;
1330 dram_info->valid_dimm = false;
1331 dram_info->is_16gb_dimm = false;
1332 dram_info->rank = I915_DRAM_RANK_INVALID; 1325 dram_info->rank = I915_DRAM_RANK_INVALID;
1333 dram_info->bandwidth_kbps = 0; 1326 dram_info->bandwidth_kbps = 0;
1334 dram_info->num_channels = 0; 1327 dram_info->num_channels = 0;
1335 1328
1329 /*
1330 * Assume 16Gb DIMMs are present until proven otherwise.
1331 * This is only used for the level 0 watermark latency
1332 * w/a which does not apply to bxt/glk.
1333 */
1334 dram_info->is_16gb_dimm = !IS_GEN9_LP(dev_priv);
1335
1336 if (INTEL_GEN(dev_priv) < 9 || IS_GEMINILAKE(dev_priv)) 1336 if (INTEL_GEN(dev_priv) < 9 || IS_GEMINILAKE(dev_priv))
1337 return; 1337 return;
1338 1338
1339 /* Need to calculate bandwidth only for Gen9 */ 1339 /* Need to calculate bandwidth only for Gen9 */
1340 if (IS_BROXTON(dev_priv)) 1340 if (IS_BROXTON(dev_priv))
1341 ret = bxt_get_dram_info(dev_priv); 1341 ret = bxt_get_dram_info(dev_priv);
1342 else if (INTEL_GEN(dev_priv) == 9) 1342 else if (IS_GEN9(dev_priv))
1343 ret = skl_get_dram_info(dev_priv); 1343 ret = skl_get_dram_info(dev_priv);
1344 else 1344 else
1345 ret = skl_dram_get_channels_info(dev_priv); 1345 ret = skl_dram_get_channels_info(dev_priv);
@@ -1374,6 +1374,15 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
1374 1374
1375 intel_device_info_runtime_init(mkwrite_device_info(dev_priv)); 1375 intel_device_info_runtime_init(mkwrite_device_info(dev_priv));
1376 1376
1377 if (HAS_PPGTT(dev_priv)) {
1378 if (intel_vgpu_active(dev_priv) &&
1379 !intel_vgpu_has_full_48bit_ppgtt(dev_priv)) {
1380 i915_report_error(dev_priv,
1381 "incompatible vGPU found, support for isolated ppGTT required\n");
1382 return -ENXIO;
1383 }
1384 }
1385
1377 intel_sanitize_options(dev_priv); 1386 intel_sanitize_options(dev_priv);
1378 1387
1379 i915_perf_init(dev_priv); 1388 i915_perf_init(dev_priv);
@@ -1629,14 +1638,16 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
1629 (struct intel_device_info *)ent->driver_data; 1638 (struct intel_device_info *)ent->driver_data;
1630 struct intel_device_info *device_info; 1639 struct intel_device_info *device_info;
1631 struct drm_i915_private *i915; 1640 struct drm_i915_private *i915;
1641 int err;
1632 1642
1633 i915 = kzalloc(sizeof(*i915), GFP_KERNEL); 1643 i915 = kzalloc(sizeof(*i915), GFP_KERNEL);
1634 if (!i915) 1644 if (!i915)
1635 return NULL; 1645 return ERR_PTR(-ENOMEM);
1636 1646
1637 if (drm_dev_init(&i915->drm, &driver, &pdev->dev)) { 1647 err = drm_dev_init(&i915->drm, &driver, &pdev->dev);
1648 if (err) {
1638 kfree(i915); 1649 kfree(i915);
1639 return NULL; 1650 return ERR_PTR(err);
1640 } 1651 }
1641 1652
1642 i915->drm.pdev = pdev; 1653 i915->drm.pdev = pdev;
@@ -1649,8 +1660,8 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
1649 device_info->device_id = pdev->device; 1660 device_info->device_id = pdev->device;
1650 1661
1651 BUILD_BUG_ON(INTEL_MAX_PLATFORMS > 1662 BUILD_BUG_ON(INTEL_MAX_PLATFORMS >
1652 sizeof(device_info->platform_mask) * BITS_PER_BYTE); 1663 BITS_PER_TYPE(device_info->platform_mask));
1653 BUG_ON(device_info->gen > sizeof(device_info->gen_mask) * BITS_PER_BYTE); 1664 BUG_ON(device_info->gen > BITS_PER_TYPE(device_info->gen_mask));
1654 1665
1655 return i915; 1666 return i915;
1656} 1667}
@@ -1685,8 +1696,8 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
1685 int ret; 1696 int ret;
1686 1697
1687 dev_priv = i915_driver_create(pdev, ent); 1698 dev_priv = i915_driver_create(pdev, ent);
1688 if (!dev_priv) 1699 if (IS_ERR(dev_priv))
1689 return -ENOMEM; 1700 return PTR_ERR(dev_priv);
1690 1701
1691 /* Disable nuclear pageflip by default on pre-ILK */ 1702 /* Disable nuclear pageflip by default on pre-ILK */
1692 if (!i915_modparams.nuclear_pageflip && match_info->gen < 5) 1703 if (!i915_modparams.nuclear_pageflip && match_info->gen < 5)
@@ -1710,26 +1721,12 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
1710 if (ret < 0) 1721 if (ret < 0)
1711 goto out_cleanup_mmio; 1722 goto out_cleanup_mmio;
1712 1723
1713 /*
1714 * TODO: move the vblank init and parts of modeset init steps into one
1715 * of the i915_driver_init_/i915_driver_register functions according
1716 * to the role/effect of the given init step.
1717 */
1718 if (INTEL_INFO(dev_priv)->num_pipes) {
1719 ret = drm_vblank_init(&dev_priv->drm,
1720 INTEL_INFO(dev_priv)->num_pipes);
1721 if (ret)
1722 goto out_cleanup_hw;
1723 }
1724
1725 ret = i915_load_modeset_init(&dev_priv->drm); 1724 ret = i915_load_modeset_init(&dev_priv->drm);
1726 if (ret < 0) 1725 if (ret < 0)
1727 goto out_cleanup_hw; 1726 goto out_cleanup_hw;
1728 1727
1729 i915_driver_register(dev_priv); 1728 i915_driver_register(dev_priv);
1730 1729
1731 intel_init_ipc(dev_priv);
1732
1733 enable_rpm_wakeref_asserts(dev_priv); 1730 enable_rpm_wakeref_asserts(dev_priv);
1734 1731
1735 i915_welcome_messages(dev_priv); 1732 i915_welcome_messages(dev_priv);
@@ -1781,7 +1778,6 @@ void i915_driver_unload(struct drm_device *dev)
1781 i915_reset_error_state(dev_priv); 1778 i915_reset_error_state(dev_priv);
1782 1779
1783 i915_gem_fini(dev_priv); 1780 i915_gem_fini(dev_priv);
1784 intel_fbc_cleanup_cfb(dev_priv);
1785 1781
1786 intel_power_domains_fini_hw(dev_priv); 1782 intel_power_domains_fini_hw(dev_priv);
1787 1783
@@ -1919,9 +1915,7 @@ static int i915_drm_suspend(struct drm_device *dev)
1919 i915_save_state(dev_priv); 1915 i915_save_state(dev_priv);
1920 1916
1921 opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold; 1917 opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold;
1922 intel_opregion_notify_adapter(dev_priv, opregion_target_state); 1918 intel_opregion_suspend(dev_priv, opregion_target_state);
1923
1924 intel_opregion_unregister(dev_priv);
1925 1919
1926 intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED, true); 1920 intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED, true);
1927 1921
@@ -1962,7 +1956,7 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
1962 get_suspend_mode(dev_priv, hibernation)); 1956 get_suspend_mode(dev_priv, hibernation));
1963 1957
1964 ret = 0; 1958 ret = 0;
1965 if (IS_GEN9_LP(dev_priv)) 1959 if (INTEL_GEN(dev_priv) >= 11 || IS_GEN9_LP(dev_priv))
1966 bxt_enable_dc9(dev_priv); 1960 bxt_enable_dc9(dev_priv);
1967 else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 1961 else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
1968 hsw_enable_pc8(dev_priv); 1962 hsw_enable_pc8(dev_priv);
@@ -2040,7 +2034,6 @@ static int i915_drm_resume(struct drm_device *dev)
2040 2034
2041 i915_restore_state(dev_priv); 2035 i915_restore_state(dev_priv);
2042 intel_pps_unlock_regs_wa(dev_priv); 2036 intel_pps_unlock_regs_wa(dev_priv);
2043 intel_opregion_setup(dev_priv);
2044 2037
2045 intel_init_pch_refclk(dev_priv); 2038 intel_init_pch_refclk(dev_priv);
2046 2039
@@ -2082,12 +2075,10 @@ static int i915_drm_resume(struct drm_device *dev)
2082 * */ 2075 * */
2083 intel_hpd_init(dev_priv); 2076 intel_hpd_init(dev_priv);
2084 2077
2085 intel_opregion_register(dev_priv); 2078 intel_opregion_resume(dev_priv);
2086 2079
2087 intel_fbdev_set_suspend(dev, FBINFO_STATE_RUNNING, false); 2080 intel_fbdev_set_suspend(dev, FBINFO_STATE_RUNNING, false);
2088 2081
2089 intel_opregion_notify_adapter(dev_priv, PCI_D0);
2090
2091 intel_power_domains_enable(dev_priv); 2082 intel_power_domains_enable(dev_priv);
2092 2083
2093 enable_rpm_wakeref_asserts(dev_priv); 2084 enable_rpm_wakeref_asserts(dev_priv);
@@ -2155,7 +2146,7 @@ static int i915_drm_resume_early(struct drm_device *dev)
2155 2146
2156 intel_uncore_resume_early(dev_priv); 2147 intel_uncore_resume_early(dev_priv);
2157 2148
2158 if (IS_GEN9_LP(dev_priv)) { 2149 if (INTEL_GEN(dev_priv) >= 11 || IS_GEN9_LP(dev_priv)) {
2159 gen9_sanitize_dc_state(dev_priv); 2150 gen9_sanitize_dc_state(dev_priv);
2160 bxt_disable_dc9(dev_priv); 2151 bxt_disable_dc9(dev_priv);
2161 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { 2152 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
@@ -2922,7 +2913,10 @@ static int intel_runtime_suspend(struct device *kdev)
2922 intel_uncore_suspend(dev_priv); 2913 intel_uncore_suspend(dev_priv);
2923 2914
2924 ret = 0; 2915 ret = 0;
2925 if (IS_GEN9_LP(dev_priv)) { 2916 if (INTEL_GEN(dev_priv) >= 11) {
2917 icl_display_core_uninit(dev_priv);
2918 bxt_enable_dc9(dev_priv);
2919 } else if (IS_GEN9_LP(dev_priv)) {
2926 bxt_display_core_uninit(dev_priv); 2920 bxt_display_core_uninit(dev_priv);
2927 bxt_enable_dc9(dev_priv); 2921 bxt_enable_dc9(dev_priv);
2928 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { 2922 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
@@ -3007,7 +3001,18 @@ static int intel_runtime_resume(struct device *kdev)
3007 if (intel_uncore_unclaimed_mmio(dev_priv)) 3001 if (intel_uncore_unclaimed_mmio(dev_priv))
3008 DRM_DEBUG_DRIVER("Unclaimed access during suspend, bios?\n"); 3002 DRM_DEBUG_DRIVER("Unclaimed access during suspend, bios?\n");
3009 3003
3010 if (IS_GEN9_LP(dev_priv)) { 3004 if (INTEL_GEN(dev_priv) >= 11) {
3005 bxt_disable_dc9(dev_priv);
3006 icl_display_core_init(dev_priv, true);
3007 if (dev_priv->csr.dmc_payload) {
3008 if (dev_priv->csr.allowed_dc_mask &
3009 DC_STATE_EN_UPTO_DC6)
3010 skl_enable_dc6(dev_priv);
3011 else if (dev_priv->csr.allowed_dc_mask &
3012 DC_STATE_EN_UPTO_DC5)
3013 gen9_enable_dc5(dev_priv);
3014 }
3015 } else if (IS_GEN9_LP(dev_priv)) {
3011 bxt_disable_dc9(dev_priv); 3016 bxt_disable_dc9(dev_priv);
3012 bxt_display_core_init(dev_priv, true); 3017 bxt_display_core_init(dev_priv, true);
3013 if (dev_priv->csr.dmc_payload && 3018 if (dev_priv->csr.dmc_payload &&
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8624b4bdc242..4064e49dbf70 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -54,6 +54,7 @@
54#include <drm/drm_cache.h> 54#include <drm/drm_cache.h>
55#include <drm/drm_util.h> 55#include <drm/drm_util.h>
56 56
57#include "i915_fixed.h"
57#include "i915_params.h" 58#include "i915_params.h"
58#include "i915_reg.h" 59#include "i915_reg.h"
59#include "i915_utils.h" 60#include "i915_utils.h"
@@ -87,8 +88,8 @@
87 88
88#define DRIVER_NAME "i915" 89#define DRIVER_NAME "i915"
89#define DRIVER_DESC "Intel Graphics" 90#define DRIVER_DESC "Intel Graphics"
90#define DRIVER_DATE "20180921" 91#define DRIVER_DATE "20181122"
91#define DRIVER_TIMESTAMP 1537521997 92#define DRIVER_TIMESTAMP 1542898187
92 93
93/* Use I915_STATE_WARN(x) and I915_STATE_WARN_ON() (rather than WARN() and 94/* Use I915_STATE_WARN(x) and I915_STATE_WARN_ON() (rather than WARN() and
94 * WARN_ON()) for hw state sanity checks to check for unexpected conditions 95 * WARN_ON()) for hw state sanity checks to check for unexpected conditions
@@ -127,144 +128,6 @@ bool i915_error_injected(void);
127 __i915_printk(i915, i915_error_injected() ? KERN_DEBUG : KERN_ERR, \ 128 __i915_printk(i915, i915_error_injected() ? KERN_DEBUG : KERN_ERR, \
128 fmt, ##__VA_ARGS__) 129 fmt, ##__VA_ARGS__)
129 130
130typedef struct {
131 uint32_t val;
132} uint_fixed_16_16_t;
133
134#define FP_16_16_MAX ({ \
135 uint_fixed_16_16_t fp; \
136 fp.val = UINT_MAX; \
137 fp; \
138})
139
140static inline bool is_fixed16_zero(uint_fixed_16_16_t val)
141{
142 if (val.val == 0)
143 return true;
144 return false;
145}
146
147static inline uint_fixed_16_16_t u32_to_fixed16(uint32_t val)
148{
149 uint_fixed_16_16_t fp;
150
151 WARN_ON(val > U16_MAX);
152
153 fp.val = val << 16;
154 return fp;
155}
156
157static inline uint32_t fixed16_to_u32_round_up(uint_fixed_16_16_t fp)
158{
159 return DIV_ROUND_UP(fp.val, 1 << 16);
160}
161
162static inline uint32_t fixed16_to_u32(uint_fixed_16_16_t fp)
163{
164 return fp.val >> 16;
165}
166
167static inline uint_fixed_16_16_t min_fixed16(uint_fixed_16_16_t min1,
168 uint_fixed_16_16_t min2)
169{
170 uint_fixed_16_16_t min;
171
172 min.val = min(min1.val, min2.val);
173 return min;
174}
175
176static inline uint_fixed_16_16_t max_fixed16(uint_fixed_16_16_t max1,
177 uint_fixed_16_16_t max2)
178{
179 uint_fixed_16_16_t max;
180
181 max.val = max(max1.val, max2.val);
182 return max;
183}
184
185static inline uint_fixed_16_16_t clamp_u64_to_fixed16(uint64_t val)
186{
187 uint_fixed_16_16_t fp;
188 WARN_ON(val > U32_MAX);
189 fp.val = (uint32_t) val;
190 return fp;
191}
192
193static inline uint32_t div_round_up_fixed16(uint_fixed_16_16_t val,
194 uint_fixed_16_16_t d)
195{
196 return DIV_ROUND_UP(val.val, d.val);
197}
198
199static inline uint32_t mul_round_up_u32_fixed16(uint32_t val,
200 uint_fixed_16_16_t mul)
201{
202 uint64_t intermediate_val;
203
204 intermediate_val = (uint64_t) val * mul.val;
205 intermediate_val = DIV_ROUND_UP_ULL(intermediate_val, 1 << 16);
206 WARN_ON(intermediate_val > U32_MAX);
207 return (uint32_t) intermediate_val;
208}
209
210static inline uint_fixed_16_16_t mul_fixed16(uint_fixed_16_16_t val,
211 uint_fixed_16_16_t mul)
212{
213 uint64_t intermediate_val;
214
215 intermediate_val = (uint64_t) val.val * mul.val;
216 intermediate_val = intermediate_val >> 16;
217 return clamp_u64_to_fixed16(intermediate_val);
218}
219
220static inline uint_fixed_16_16_t div_fixed16(uint32_t val, uint32_t d)
221{
222 uint64_t interm_val;
223
224 interm_val = (uint64_t)val << 16;
225 interm_val = DIV_ROUND_UP_ULL(interm_val, d);
226 return clamp_u64_to_fixed16(interm_val);
227}
228
229static inline uint32_t div_round_up_u32_fixed16(uint32_t val,
230 uint_fixed_16_16_t d)
231{
232 uint64_t interm_val;
233
234 interm_val = (uint64_t)val << 16;
235 interm_val = DIV_ROUND_UP_ULL(interm_val, d.val);
236 WARN_ON(interm_val > U32_MAX);
237 return (uint32_t) interm_val;
238}
239
240static inline uint_fixed_16_16_t mul_u32_fixed16(uint32_t val,
241 uint_fixed_16_16_t mul)
242{
243 uint64_t intermediate_val;
244
245 intermediate_val = (uint64_t) val * mul.val;
246 return clamp_u64_to_fixed16(intermediate_val);
247}
248
249static inline uint_fixed_16_16_t add_fixed16(uint_fixed_16_16_t add1,
250 uint_fixed_16_16_t add2)
251{
252 uint64_t interm_sum;
253
254 interm_sum = (uint64_t) add1.val + add2.val;
255 return clamp_u64_to_fixed16(interm_sum);
256}
257
258static inline uint_fixed_16_16_t add_fixed16_u32(uint_fixed_16_16_t add1,
259 uint32_t add2)
260{
261 uint64_t interm_sum;
262 uint_fixed_16_16_t interm_add2 = u32_to_fixed16(add2);
263
264 interm_sum = (uint64_t) add1.val + interm_add2.val;
265 return clamp_u64_to_fixed16(interm_sum);
266}
267
268enum hpd_pin { 131enum hpd_pin {
269 HPD_NONE = 0, 132 HPD_NONE = 0,
270 HPD_TV = HPD_NONE, /* TV is known to be unreliable */ 133 HPD_TV = HPD_NONE, /* TV is known to be unreliable */
@@ -283,7 +146,8 @@ enum hpd_pin {
283#define for_each_hpd_pin(__pin) \ 146#define for_each_hpd_pin(__pin) \
284 for ((__pin) = (HPD_NONE + 1); (__pin) < HPD_NUM_PINS; (__pin)++) 147 for ((__pin) = (HPD_NONE + 1); (__pin) < HPD_NUM_PINS; (__pin)++)
285 148
286#define HPD_STORM_DEFAULT_THRESHOLD 5 149/* Threshold == 5 for long IRQs, 50 for short */
150#define HPD_STORM_DEFAULT_THRESHOLD 50
287 151
288struct i915_hotplug { 152struct i915_hotplug {
289 struct work_struct hotplug_work; 153 struct work_struct hotplug_work;
@@ -308,6 +172,8 @@ struct i915_hotplug {
308 bool poll_enabled; 172 bool poll_enabled;
309 173
310 unsigned int hpd_storm_threshold; 174 unsigned int hpd_storm_threshold;
175 /* Whether or not to count short HPD IRQs in HPD storms */
176 u8 hpd_short_storm_enabled;
311 177
312 /* 178 /*
313 * if we get a HPD irq from DP and a HPD irq from non-DP 179 * if we get a HPD irq from DP and a HPD irq from non-DP
@@ -465,8 +331,10 @@ struct drm_i915_display_funcs {
465struct intel_csr { 331struct intel_csr {
466 struct work_struct work; 332 struct work_struct work;
467 const char *fw_path; 333 const char *fw_path;
334 uint32_t required_version;
335 uint32_t max_fw_size; /* bytes */
468 uint32_t *dmc_payload; 336 uint32_t *dmc_payload;
469 uint32_t dmc_fw_size; 337 uint32_t dmc_fw_size; /* dwords */
470 uint32_t version; 338 uint32_t version;
471 uint32_t mmio_count; 339 uint32_t mmio_count;
472 i915_reg_t mmioaddr[8]; 340 i915_reg_t mmioaddr[8];
@@ -546,6 +414,8 @@ struct intel_fbc {
546 int adjusted_y; 414 int adjusted_y;
547 415
548 int y; 416 int y;
417
418 uint16_t pixel_blend_mode;
549 } plane; 419 } plane;
550 420
551 struct { 421 struct {
@@ -630,7 +500,6 @@ struct i915_psr {
630 bool sink_psr2_support; 500 bool sink_psr2_support;
631 bool link_standby; 501 bool link_standby;
632 bool colorimetry_support; 502 bool colorimetry_support;
633 bool alpm;
634 bool psr2_enabled; 503 bool psr2_enabled;
635 u8 sink_sync_latency; 504 u8 sink_sync_latency;
636 ktime_t last_entry_attempt; 505 ktime_t last_entry_attempt;
@@ -918,6 +787,11 @@ struct i915_power_well_desc {
918 /* The pw is backing the VGA functionality */ 787 /* The pw is backing the VGA functionality */
919 bool has_vga:1; 788 bool has_vga:1;
920 bool has_fuses:1; 789 bool has_fuses:1;
790 /*
791 * The pw is for an ICL+ TypeC PHY port in
792 * Thunderbolt mode.
793 */
794 bool is_tc_tbt:1;
921 } hsw; 795 } hsw;
922 }; 796 };
923 const struct i915_power_well_ops *ops; 797 const struct i915_power_well_ops *ops;
@@ -1042,17 +916,6 @@ struct i915_gem_mm {
1042 916
1043#define I915_ENGINE_WEDGED_TIMEOUT (60 * HZ) /* Reset but no recovery? */ 917#define I915_ENGINE_WEDGED_TIMEOUT (60 * HZ) /* Reset but no recovery? */
1044 918
1045#define DP_AUX_A 0x40
1046#define DP_AUX_B 0x10
1047#define DP_AUX_C 0x20
1048#define DP_AUX_D 0x30
1049#define DP_AUX_E 0x50
1050#define DP_AUX_F 0x60
1051
1052#define DDC_PIN_B 0x05
1053#define DDC_PIN_C 0x04
1054#define DDC_PIN_D 0x06
1055
1056struct ddi_vbt_port_info { 919struct ddi_vbt_port_info {
1057 int max_tmds_clock; 920 int max_tmds_clock;
1058 921
@@ -1099,6 +962,7 @@ struct intel_vbt_data {
1099 unsigned int panel_type:4; 962 unsigned int panel_type:4;
1100 int lvds_ssc_freq; 963 int lvds_ssc_freq;
1101 unsigned int bios_lvds_val; /* initial [PCH_]LVDS reg val in VBIOS */ 964 unsigned int bios_lvds_val; /* initial [PCH_]LVDS reg val in VBIOS */
965 enum drm_panel_orientation orientation;
1102 966
1103 enum drrs_support_type drrs_type; 967 enum drrs_support_type drrs_type;
1104 968
@@ -1144,6 +1008,7 @@ struct intel_vbt_data {
1144 u8 *data; 1008 u8 *data;
1145 const u8 *sequence[MIPI_SEQ_MAX]; 1009 const u8 *sequence[MIPI_SEQ_MAX];
1146 u8 *deassert_seq; /* Used by fixup_mipi_sequences() */ 1010 u8 *deassert_seq; /* Used by fixup_mipi_sequences() */
1011 enum drm_panel_orientation orientation;
1147 } dsi; 1012 } dsi;
1148 1013
1149 int crt_ddc_pin; 1014 int crt_ddc_pin;
@@ -1240,9 +1105,9 @@ struct skl_ddb_values {
1240}; 1105};
1241 1106
1242struct skl_wm_level { 1107struct skl_wm_level {
1243 bool plane_en;
1244 uint16_t plane_res_b; 1108 uint16_t plane_res_b;
1245 uint8_t plane_res_l; 1109 uint8_t plane_res_l;
1110 bool plane_en;
1246}; 1111};
1247 1112
1248/* Stores plane specific WM parameters */ 1113/* Stores plane specific WM parameters */
@@ -1520,30 +1385,12 @@ struct i915_oa_ops {
1520 bool (*is_valid_flex_reg)(struct drm_i915_private *dev_priv, u32 addr); 1385 bool (*is_valid_flex_reg)(struct drm_i915_private *dev_priv, u32 addr);
1521 1386
1522 /** 1387 /**
1523 * @init_oa_buffer: Resets the head and tail pointers of the
1524 * circular buffer for periodic OA reports.
1525 *
1526 * Called when first opening a stream for OA metrics, but also may be
1527 * called in response to an OA buffer overflow or other error
1528 * condition.
1529 *
1530 * Note it may be necessary to clear the full OA buffer here as part of
1531 * maintaining the invariable that new reports must be written to
1532 * zeroed memory for us to be able to reliable detect if an expected
1533 * report has not yet landed in memory. (At least on Haswell the OA
1534 * buffer tail pointer is not synchronized with reports being visible
1535 * to the CPU)
1536 */
1537 void (*init_oa_buffer)(struct drm_i915_private *dev_priv);
1538
1539 /**
1540 * @enable_metric_set: Selects and applies any MUX configuration to set 1388 * @enable_metric_set: Selects and applies any MUX configuration to set
1541 * up the Boolean and Custom (B/C) counters that are part of the 1389 * up the Boolean and Custom (B/C) counters that are part of the
1542 * counter reports being sampled. May apply system constraints such as 1390 * counter reports being sampled. May apply system constraints such as
1543 * disabling EU clock gating as required. 1391 * disabling EU clock gating as required.
1544 */ 1392 */
1545 int (*enable_metric_set)(struct drm_i915_private *dev_priv, 1393 int (*enable_metric_set)(struct i915_perf_stream *stream);
1546 const struct i915_oa_config *oa_config);
1547 1394
1548 /** 1395 /**
1549 * @disable_metric_set: Remove system constraints associated with using 1396 * @disable_metric_set: Remove system constraints associated with using
@@ -1554,12 +1401,12 @@ struct i915_oa_ops {
1554 /** 1401 /**
1555 * @oa_enable: Enable periodic sampling 1402 * @oa_enable: Enable periodic sampling
1556 */ 1403 */
1557 void (*oa_enable)(struct drm_i915_private *dev_priv); 1404 void (*oa_enable)(struct i915_perf_stream *stream);
1558 1405
1559 /** 1406 /**
1560 * @oa_disable: Disable periodic sampling 1407 * @oa_disable: Disable periodic sampling
1561 */ 1408 */
1562 void (*oa_disable)(struct drm_i915_private *dev_priv); 1409 void (*oa_disable)(struct i915_perf_stream *stream);
1563 1410
1564 /** 1411 /**
1565 * @read: Copy data from the circular OA buffer into a given userspace 1412 * @read: Copy data from the circular OA buffer into a given userspace
@@ -1948,7 +1795,6 @@ struct drm_i915_private {
1948 1795
1949 struct dram_info { 1796 struct dram_info {
1950 bool valid; 1797 bool valid;
1951 bool valid_dimm;
1952 bool is_16gb_dimm; 1798 bool is_16gb_dimm;
1953 u8 num_channels; 1799 u8 num_channels;
1954 enum dram_rank { 1800 enum dram_rank {
@@ -2323,6 +2169,8 @@ static inline struct scatterlist *__sg_next(struct scatterlist *sg)
2323 (((__iter).curr += PAGE_SIZE) >= (__iter).max) ? \ 2169 (((__iter).curr += PAGE_SIZE) >= (__iter).max) ? \
2324 (__iter) = __sgt_iter(__sg_next((__iter).sgp), false), 0 : 0) 2170 (__iter) = __sgt_iter(__sg_next((__iter).sgp), false), 0 : 0)
2325 2171
2172bool i915_sg_trim(struct sg_table *orig_st);
2173
2326static inline unsigned int i915_sg_page_sizes(struct scatterlist *sg) 2174static inline unsigned int i915_sg_page_sizes(struct scatterlist *sg)
2327{ 2175{
2328 unsigned int page_sizes; 2176 unsigned int page_sizes;
@@ -2368,20 +2216,12 @@ intel_info(const struct drm_i915_private *dev_priv)
2368#define REVID_FOREVER 0xff 2216#define REVID_FOREVER 0xff
2369#define INTEL_REVID(dev_priv) ((dev_priv)->drm.pdev->revision) 2217#define INTEL_REVID(dev_priv) ((dev_priv)->drm.pdev->revision)
2370 2218
2371#define GEN_FOREVER (0)
2372
2373#define INTEL_GEN_MASK(s, e) ( \ 2219#define INTEL_GEN_MASK(s, e) ( \
2374 BUILD_BUG_ON_ZERO(!__builtin_constant_p(s)) + \ 2220 BUILD_BUG_ON_ZERO(!__builtin_constant_p(s)) + \
2375 BUILD_BUG_ON_ZERO(!__builtin_constant_p(e)) + \ 2221 BUILD_BUG_ON_ZERO(!__builtin_constant_p(e)) + \
2376 GENMASK((e) != GEN_FOREVER ? (e) - 1 : BITS_PER_LONG - 1, \ 2222 GENMASK((e) - 1, (s) - 1))
2377 (s) != GEN_FOREVER ? (s) - 1 : 0) \
2378)
2379 2223
2380/* 2224/* Returns true if Gen is in inclusive range [Start, End] */
2381 * Returns true if Gen is in inclusive range [Start, End].
2382 *
2383 * Use GEN_FOREVER for unbound start and or end.
2384 */
2385#define IS_GEN(dev_priv, s, e) \ 2225#define IS_GEN(dev_priv, s, e) \
2386 (!!((dev_priv)->info.gen_mask & INTEL_GEN_MASK((s), (e)))) 2226 (!!((dev_priv)->info.gen_mask & INTEL_GEN_MASK((s), (e))))
2387 2227
@@ -2462,6 +2302,8 @@ intel_info(const struct drm_i915_private *dev_priv)
2462#define IS_KBL_ULX(dev_priv) (INTEL_DEVID(dev_priv) == 0x590E || \ 2302#define IS_KBL_ULX(dev_priv) (INTEL_DEVID(dev_priv) == 0x590E || \
2463 INTEL_DEVID(dev_priv) == 0x5915 || \ 2303 INTEL_DEVID(dev_priv) == 0x5915 || \
2464 INTEL_DEVID(dev_priv) == 0x591E) 2304 INTEL_DEVID(dev_priv) == 0x591E)
2305#define IS_AML_ULX(dev_priv) (INTEL_DEVID(dev_priv) == 0x591C || \
2306 INTEL_DEVID(dev_priv) == 0x87C0)
2465#define IS_SKL_GT2(dev_priv) (IS_SKYLAKE(dev_priv) && \ 2307#define IS_SKL_GT2(dev_priv) (IS_SKYLAKE(dev_priv) && \
2466 (dev_priv)->info.gt == 2) 2308 (dev_priv)->info.gt == 2)
2467#define IS_SKL_GT3(dev_priv) (IS_SKYLAKE(dev_priv) && \ 2309#define IS_SKL_GT3(dev_priv) (IS_SKYLAKE(dev_priv) && \
@@ -2593,9 +2435,14 @@ intel_info(const struct drm_i915_private *dev_priv)
2593 2435
2594#define HAS_EXECLISTS(dev_priv) HAS_LOGICAL_RING_CONTEXTS(dev_priv) 2436#define HAS_EXECLISTS(dev_priv) HAS_LOGICAL_RING_CONTEXTS(dev_priv)
2595 2437
2596#define USES_PPGTT(dev_priv) (i915_modparams.enable_ppgtt) 2438#define INTEL_PPGTT(dev_priv) (INTEL_INFO(dev_priv)->ppgtt)
2597#define USES_FULL_PPGTT(dev_priv) (i915_modparams.enable_ppgtt >= 2) 2439#define HAS_PPGTT(dev_priv) \
2598#define USES_FULL_48BIT_PPGTT(dev_priv) (i915_modparams.enable_ppgtt == 3) 2440 (INTEL_PPGTT(dev_priv) != INTEL_PPGTT_NONE)
2441#define HAS_FULL_PPGTT(dev_priv) \
2442 (INTEL_PPGTT(dev_priv) >= INTEL_PPGTT_FULL)
2443#define HAS_FULL_48BIT_PPGTT(dev_priv) \
2444 (INTEL_PPGTT(dev_priv) >= INTEL_PPGTT_FULL_4LVL)
2445
2599#define HAS_PAGE_SIZES(dev_priv, sizes) ({ \ 2446#define HAS_PAGE_SIZES(dev_priv, sizes) ({ \
2600 GEM_BUG_ON((sizes) == 0); \ 2447 GEM_BUG_ON((sizes) == 0); \
2601 ((sizes) & ~(dev_priv)->info.page_sizes) == 0; \ 2448 ((sizes) & ~(dev_priv)->info.page_sizes) == 0; \
@@ -2743,9 +2590,6 @@ intel_ggtt_update_needs_vtd_wa(struct drm_i915_private *dev_priv)
2743 return IS_BROXTON(dev_priv) && intel_vtd_active(); 2590 return IS_BROXTON(dev_priv) && intel_vtd_active();
2744} 2591}
2745 2592
2746int intel_sanitize_enable_ppgtt(struct drm_i915_private *dev_priv,
2747 int enable_ppgtt);
2748
2749/* i915_drv.c */ 2593/* i915_drv.c */
2750void __printf(3, 4) 2594void __printf(3, 4)
2751__i915_printk(struct drm_i915_private *dev_priv, const char *level, 2595__i915_printk(struct drm_i915_private *dev_priv, const char *level,
@@ -3230,7 +3074,7 @@ int i915_gem_object_wait(struct drm_i915_gem_object *obj,
3230int i915_gem_object_wait_priority(struct drm_i915_gem_object *obj, 3074int i915_gem_object_wait_priority(struct drm_i915_gem_object *obj,
3231 unsigned int flags, 3075 unsigned int flags,
3232 const struct i915_sched_attr *attr); 3076 const struct i915_sched_attr *attr);
3233#define I915_PRIORITY_DISPLAY I915_PRIORITY_MAX 3077#define I915_PRIORITY_DISPLAY I915_USER_PRIORITY(I915_PRIORITY_MAX)
3234 3078
3235int __must_check 3079int __must_check
3236i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj, bool write); 3080i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj, bool write);
@@ -3462,6 +3306,7 @@ bool intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv,
3462 enum port port); 3306 enum port port);
3463bool intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv, 3307bool intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv,
3464 enum port port); 3308 enum port port);
3309enum aux_ch intel_bios_port_aux_ch(struct drm_i915_private *dev_priv, enum port port);
3465 3310
3466/* intel_acpi.c */ 3311/* intel_acpi.c */
3467#ifdef CONFIG_ACPI 3312#ifdef CONFIG_ACPI
@@ -3483,8 +3328,6 @@ mkwrite_device_info(struct drm_i915_private *dev_priv)
3483extern void intel_modeset_init_hw(struct drm_device *dev); 3328extern void intel_modeset_init_hw(struct drm_device *dev);
3484extern int intel_modeset_init(struct drm_device *dev); 3329extern int intel_modeset_init(struct drm_device *dev);
3485extern void intel_modeset_cleanup(struct drm_device *dev); 3330extern void intel_modeset_cleanup(struct drm_device *dev);
3486extern int intel_connector_register(struct drm_connector *);
3487extern void intel_connector_unregister(struct drm_connector *);
3488extern int intel_modeset_vga_set_state(struct drm_i915_private *dev_priv, 3331extern int intel_modeset_vga_set_state(struct drm_i915_private *dev_priv,
3489 bool state); 3332 bool state);
3490extern void intel_display_resume(struct drm_device *dev); 3333extern void intel_display_resume(struct drm_device *dev);
@@ -3584,6 +3427,12 @@ void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder,
3584void vlv_phy_reset_lanes(struct intel_encoder *encoder, 3427void vlv_phy_reset_lanes(struct intel_encoder *encoder,
3585 const struct intel_crtc_state *old_crtc_state); 3428 const struct intel_crtc_state *old_crtc_state);
3586 3429
3430/* intel_combo_phy.c */
3431void icl_combo_phys_init(struct drm_i915_private *dev_priv);
3432void icl_combo_phys_uninit(struct drm_i915_private *dev_priv);
3433void cnl_combo_phys_init(struct drm_i915_private *dev_priv);
3434void cnl_combo_phys_uninit(struct drm_i915_private *dev_priv);
3435
3587int intel_gpu_freq(struct drm_i915_private *dev_priv, int val); 3436int intel_gpu_freq(struct drm_i915_private *dev_priv, int val);
3588int intel_freq_opcode(struct drm_i915_private *dev_priv, int val); 3437int intel_freq_opcode(struct drm_i915_private *dev_priv, int val);
3589u64 intel_rc6_residency_ns(struct drm_i915_private *dev_priv, 3438u64 intel_rc6_residency_ns(struct drm_i915_private *dev_priv,
diff --git a/drivers/gpu/drm/i915/i915_fixed.h b/drivers/gpu/drm/i915/i915_fixed.h
new file mode 100644
index 000000000000..591dd89ba7af
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_fixed.h
@@ -0,0 +1,143 @@
1/* SPDX-License-Identifier: MIT */
2/*
3 * Copyright © 2018 Intel Corporation
4 */
5
6#ifndef _I915_FIXED_H_
7#define _I915_FIXED_H_
8
9typedef struct {
10 u32 val;
11} uint_fixed_16_16_t;
12
13#define FP_16_16_MAX ((uint_fixed_16_16_t){ .val = UINT_MAX })
14
15static inline bool is_fixed16_zero(uint_fixed_16_16_t val)
16{
17 return val.val == 0;
18}
19
20static inline uint_fixed_16_16_t u32_to_fixed16(u32 val)
21{
22 uint_fixed_16_16_t fp = { .val = val << 16 };
23
24 WARN_ON(val > U16_MAX);
25
26 return fp;
27}
28
29static inline u32 fixed16_to_u32_round_up(uint_fixed_16_16_t fp)
30{
31 return DIV_ROUND_UP(fp.val, 1 << 16);
32}
33
34static inline u32 fixed16_to_u32(uint_fixed_16_16_t fp)
35{
36 return fp.val >> 16;
37}
38
39static inline uint_fixed_16_16_t min_fixed16(uint_fixed_16_16_t min1,
40 uint_fixed_16_16_t min2)
41{
42 uint_fixed_16_16_t min = { .val = min(min1.val, min2.val) };
43
44 return min;
45}
46
47static inline uint_fixed_16_16_t max_fixed16(uint_fixed_16_16_t max1,
48 uint_fixed_16_16_t max2)
49{
50 uint_fixed_16_16_t max = { .val = max(max1.val, max2.val) };
51
52 return max;
53}
54
55static inline uint_fixed_16_16_t clamp_u64_to_fixed16(u64 val)
56{
57 uint_fixed_16_16_t fp = { .val = (u32)val };
58
59 WARN_ON(val > U32_MAX);
60
61 return fp;
62}
63
64static inline u32 div_round_up_fixed16(uint_fixed_16_16_t val,
65 uint_fixed_16_16_t d)
66{
67 return DIV_ROUND_UP(val.val, d.val);
68}
69
70static inline u32 mul_round_up_u32_fixed16(u32 val, uint_fixed_16_16_t mul)
71{
72 u64 tmp;
73
74 tmp = (u64)val * mul.val;
75 tmp = DIV_ROUND_UP_ULL(tmp, 1 << 16);
76 WARN_ON(tmp > U32_MAX);
77
78 return (u32)tmp;
79}
80
81static inline uint_fixed_16_16_t mul_fixed16(uint_fixed_16_16_t val,
82 uint_fixed_16_16_t mul)
83{
84 u64 tmp;
85
86 tmp = (u64)val.val * mul.val;
87 tmp = tmp >> 16;
88
89 return clamp_u64_to_fixed16(tmp);
90}
91
92static inline uint_fixed_16_16_t div_fixed16(u32 val, u32 d)
93{
94 u64 tmp;
95
96 tmp = (u64)val << 16;
97 tmp = DIV_ROUND_UP_ULL(tmp, d);
98
99 return clamp_u64_to_fixed16(tmp);
100}
101
102static inline u32 div_round_up_u32_fixed16(u32 val, uint_fixed_16_16_t d)
103{
104 u64 tmp;
105
106 tmp = (u64)val << 16;
107 tmp = DIV_ROUND_UP_ULL(tmp, d.val);
108 WARN_ON(tmp > U32_MAX);
109
110 return (u32)tmp;
111}
112
113static inline uint_fixed_16_16_t mul_u32_fixed16(u32 val, uint_fixed_16_16_t mul)
114{
115 u64 tmp;
116
117 tmp = (u64)val * mul.val;
118
119 return clamp_u64_to_fixed16(tmp);
120}
121
122static inline uint_fixed_16_16_t add_fixed16(uint_fixed_16_16_t add1,
123 uint_fixed_16_16_t add2)
124{
125 u64 tmp;
126
127 tmp = (u64)add1.val + add2.val;
128
129 return clamp_u64_to_fixed16(tmp);
130}
131
132static inline uint_fixed_16_16_t add_fixed16_u32(uint_fixed_16_16_t add1,
133 u32 add2)
134{
135 uint_fixed_16_16_t tmp_add2 = u32_to_fixed16(add2);
136 u64 tmp;
137
138 tmp = (u64)add1.val + tmp_add2.val;
139
140 return clamp_u64_to_fixed16(tmp);
141}
142
143#endif /* _I915_FIXED_H_ */
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 0c8aa57ce83b..c55b1f75c980 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1740,6 +1740,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
1740 */ 1740 */
1741 err = i915_gem_object_wait(obj, 1741 err = i915_gem_object_wait(obj,
1742 I915_WAIT_INTERRUPTIBLE | 1742 I915_WAIT_INTERRUPTIBLE |
1743 I915_WAIT_PRIORITY |
1743 (write_domain ? I915_WAIT_ALL : 0), 1744 (write_domain ? I915_WAIT_ALL : 0),
1744 MAX_SCHEDULE_TIMEOUT, 1745 MAX_SCHEDULE_TIMEOUT,
1745 to_rps_client(file)); 1746 to_rps_client(file));
@@ -2381,11 +2382,23 @@ void __i915_gem_object_invalidate(struct drm_i915_gem_object *obj)
2381 invalidate_mapping_pages(mapping, 0, (loff_t)-1); 2382 invalidate_mapping_pages(mapping, 0, (loff_t)-1);
2382} 2383}
2383 2384
2385/*
2386 * Move pages to appropriate lru and release the pagevec, decrementing the
2387 * ref count of those pages.
2388 */
2389static void check_release_pagevec(struct pagevec *pvec)
2390{
2391 check_move_unevictable_pages(pvec);
2392 __pagevec_release(pvec);
2393 cond_resched();
2394}
2395
2384static void 2396static void
2385i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj, 2397i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj,
2386 struct sg_table *pages) 2398 struct sg_table *pages)
2387{ 2399{
2388 struct sgt_iter sgt_iter; 2400 struct sgt_iter sgt_iter;
2401 struct pagevec pvec;
2389 struct page *page; 2402 struct page *page;
2390 2403
2391 __i915_gem_object_release_shmem(obj, pages, true); 2404 __i915_gem_object_release_shmem(obj, pages, true);
@@ -2395,6 +2408,9 @@ i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj,
2395 if (i915_gem_object_needs_bit17_swizzle(obj)) 2408 if (i915_gem_object_needs_bit17_swizzle(obj))
2396 i915_gem_object_save_bit_17_swizzle(obj, pages); 2409 i915_gem_object_save_bit_17_swizzle(obj, pages);
2397 2410
2411 mapping_clear_unevictable(file_inode(obj->base.filp)->i_mapping);
2412
2413 pagevec_init(&pvec);
2398 for_each_sgt_page(page, sgt_iter, pages) { 2414 for_each_sgt_page(page, sgt_iter, pages) {
2399 if (obj->mm.dirty) 2415 if (obj->mm.dirty)
2400 set_page_dirty(page); 2416 set_page_dirty(page);
@@ -2402,8 +2418,11 @@ i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj,
2402 if (obj->mm.madv == I915_MADV_WILLNEED) 2418 if (obj->mm.madv == I915_MADV_WILLNEED)
2403 mark_page_accessed(page); 2419 mark_page_accessed(page);
2404 2420
2405 put_page(page); 2421 if (!pagevec_add(&pvec, page))
2422 check_release_pagevec(&pvec);
2406 } 2423 }
2424 if (pagevec_count(&pvec))
2425 check_release_pagevec(&pvec);
2407 obj->mm.dirty = false; 2426 obj->mm.dirty = false;
2408 2427
2409 sg_free_table(pages); 2428 sg_free_table(pages);
@@ -2483,7 +2502,7 @@ unlock:
2483 mutex_unlock(&obj->mm.lock); 2502 mutex_unlock(&obj->mm.lock);
2484} 2503}
2485 2504
2486static bool i915_sg_trim(struct sg_table *orig_st) 2505bool i915_sg_trim(struct sg_table *orig_st)
2487{ 2506{
2488 struct sg_table new_st; 2507 struct sg_table new_st;
2489 struct scatterlist *sg, *new_sg; 2508 struct scatterlist *sg, *new_sg;
@@ -2524,6 +2543,7 @@ static int i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
2524 unsigned long last_pfn = 0; /* suppress gcc warning */ 2543 unsigned long last_pfn = 0; /* suppress gcc warning */
2525 unsigned int max_segment = i915_sg_segment_size(); 2544 unsigned int max_segment = i915_sg_segment_size();
2526 unsigned int sg_page_sizes; 2545 unsigned int sg_page_sizes;
2546 struct pagevec pvec;
2527 gfp_t noreclaim; 2547 gfp_t noreclaim;
2528 int ret; 2548 int ret;
2529 2549
@@ -2559,6 +2579,7 @@ rebuild_st:
2559 * Fail silently without starting the shrinker 2579 * Fail silently without starting the shrinker
2560 */ 2580 */
2561 mapping = obj->base.filp->f_mapping; 2581 mapping = obj->base.filp->f_mapping;
2582 mapping_set_unevictable(mapping);
2562 noreclaim = mapping_gfp_constraint(mapping, ~__GFP_RECLAIM); 2583 noreclaim = mapping_gfp_constraint(mapping, ~__GFP_RECLAIM);
2563 noreclaim |= __GFP_NORETRY | __GFP_NOWARN; 2584 noreclaim |= __GFP_NORETRY | __GFP_NOWARN;
2564 2585
@@ -2573,6 +2594,7 @@ rebuild_st:
2573 gfp_t gfp = noreclaim; 2594 gfp_t gfp = noreclaim;
2574 2595
2575 do { 2596 do {
2597 cond_resched();
2576 page = shmem_read_mapping_page_gfp(mapping, i, gfp); 2598 page = shmem_read_mapping_page_gfp(mapping, i, gfp);
2577 if (likely(!IS_ERR(page))) 2599 if (likely(!IS_ERR(page)))
2578 break; 2600 break;
@@ -2583,7 +2605,6 @@ rebuild_st:
2583 } 2605 }
2584 2606
2585 i915_gem_shrink(dev_priv, 2 * page_count, NULL, *s++); 2607 i915_gem_shrink(dev_priv, 2 * page_count, NULL, *s++);
2586 cond_resched();
2587 2608
2588 /* 2609 /*
2589 * We've tried hard to allocate the memory by reaping 2610 * We've tried hard to allocate the memory by reaping
@@ -2673,8 +2694,14 @@ rebuild_st:
2673err_sg: 2694err_sg:
2674 sg_mark_end(sg); 2695 sg_mark_end(sg);
2675err_pages: 2696err_pages:
2676 for_each_sgt_page(page, sgt_iter, st) 2697 mapping_clear_unevictable(mapping);
2677 put_page(page); 2698 pagevec_init(&pvec);
2699 for_each_sgt_page(page, sgt_iter, st) {
2700 if (!pagevec_add(&pvec, page))
2701 check_release_pagevec(&pvec);
2702 }
2703 if (pagevec_count(&pvec))
2704 check_release_pagevec(&pvec);
2678 sg_free_table(st); 2705 sg_free_table(st);
2679 kfree(st); 2706 kfree(st);
2680 2707
@@ -3530,6 +3557,8 @@ static void __sleep_rcu(struct rcu_head *rcu)
3530 struct sleep_rcu_work *s = container_of(rcu, typeof(*s), rcu); 3557 struct sleep_rcu_work *s = container_of(rcu, typeof(*s), rcu);
3531 struct drm_i915_private *i915 = s->i915; 3558 struct drm_i915_private *i915 = s->i915;
3532 3559
3560 destroy_rcu_head(&s->rcu);
3561
3533 if (same_epoch(i915, s->epoch)) { 3562 if (same_epoch(i915, s->epoch)) {
3534 INIT_WORK(&s->work, __sleep_work); 3563 INIT_WORK(&s->work, __sleep_work);
3535 queue_work(i915->wq, &s->work); 3564 queue_work(i915->wq, &s->work);
@@ -3646,6 +3675,7 @@ out_rearm:
3646 if (same_epoch(dev_priv, epoch)) { 3675 if (same_epoch(dev_priv, epoch)) {
3647 struct sleep_rcu_work *s = kmalloc(sizeof(*s), GFP_KERNEL); 3676 struct sleep_rcu_work *s = kmalloc(sizeof(*s), GFP_KERNEL);
3648 if (s) { 3677 if (s) {
3678 init_rcu_head(&s->rcu);
3649 s->i915 = dev_priv; 3679 s->i915 = dev_priv;
3650 s->epoch = epoch; 3680 s->epoch = epoch;
3651 call_rcu(&s->rcu, __sleep_rcu); 3681 call_rcu(&s->rcu, __sleep_rcu);
@@ -3743,7 +3773,9 @@ i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
3743 start = ktime_get(); 3773 start = ktime_get();
3744 3774
3745 ret = i915_gem_object_wait(obj, 3775 ret = i915_gem_object_wait(obj,
3746 I915_WAIT_INTERRUPTIBLE | I915_WAIT_ALL, 3776 I915_WAIT_INTERRUPTIBLE |
3777 I915_WAIT_PRIORITY |
3778 I915_WAIT_ALL,
3747 to_wait_timeout(args->timeout_ns), 3779 to_wait_timeout(args->timeout_ns),
3748 to_rps_client(file)); 3780 to_rps_client(file));
3749 3781
@@ -4710,6 +4742,8 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj,
4710 INIT_LIST_HEAD(&obj->lut_list); 4742 INIT_LIST_HEAD(&obj->lut_list);
4711 INIT_LIST_HEAD(&obj->batch_pool_link); 4743 INIT_LIST_HEAD(&obj->batch_pool_link);
4712 4744
4745 init_rcu_head(&obj->rcu);
4746
4713 obj->ops = ops; 4747 obj->ops = ops;
4714 4748
4715 reservation_object_init(&obj->__builtin_resv); 4749 reservation_object_init(&obj->__builtin_resv);
@@ -4977,6 +5011,13 @@ static void __i915_gem_free_object_rcu(struct rcu_head *head)
4977 struct drm_i915_private *i915 = to_i915(obj->base.dev); 5011 struct drm_i915_private *i915 = to_i915(obj->base.dev);
4978 5012
4979 /* 5013 /*
5014 * We reuse obj->rcu for the freed list, so we had better not treat
5015 * it like a rcu_head from this point forwards. And we expect all
5016 * objects to be freed via this path.
5017 */
5018 destroy_rcu_head(&obj->rcu);
5019
5020 /*
4980 * Since we require blocking on struct_mutex to unbind the freed 5021 * Since we require blocking on struct_mutex to unbind the freed
4981 * object from the GPU before releasing resources back to the 5022 * object from the GPU before releasing resources back to the
4982 * system, we can not do that directly from the RCU callback (which may 5023 * system, we can not do that directly from the RCU callback (which may
@@ -5293,18 +5334,6 @@ int i915_gem_init_hw(struct drm_i915_private *dev_priv)
5293 I915_WRITE(MI_PREDICATE_RESULT_2, IS_HSW_GT3(dev_priv) ? 5334 I915_WRITE(MI_PREDICATE_RESULT_2, IS_HSW_GT3(dev_priv) ?
5294 LOWER_SLICE_ENABLED : LOWER_SLICE_DISABLED); 5335 LOWER_SLICE_ENABLED : LOWER_SLICE_DISABLED);
5295 5336
5296 if (HAS_PCH_NOP(dev_priv)) {
5297 if (IS_IVYBRIDGE(dev_priv)) {
5298 u32 temp = I915_READ(GEN7_MSG_CTL);
5299 temp &= ~(WAIT_FOR_PCH_FLR_ACK | WAIT_FOR_PCH_RESET_ACK);
5300 I915_WRITE(GEN7_MSG_CTL, temp);
5301 } else if (INTEL_GEN(dev_priv) >= 7) {
5302 u32 temp = I915_READ(HSW_NDE_RSTWRN_OPT);
5303 temp &= ~RESET_PCH_HANDSHAKE_ENABLE;
5304 I915_WRITE(HSW_NDE_RSTWRN_OPT, temp);
5305 }
5306 }
5307
5308 intel_gt_workarounds_apply(dev_priv); 5337 intel_gt_workarounds_apply(dev_priv);
5309 5338
5310 i915_gem_init_swizzling(dev_priv); 5339 i915_gem_init_swizzling(dev_priv);
@@ -5951,7 +5980,7 @@ void i915_gem_track_fb(struct drm_i915_gem_object *old,
5951 * the bits. 5980 * the bits.
5952 */ 5981 */
5953 BUILD_BUG_ON(INTEL_FRONTBUFFER_BITS_PER_PIPE * I915_MAX_PIPES > 5982 BUILD_BUG_ON(INTEL_FRONTBUFFER_BITS_PER_PIPE * I915_MAX_PIPES >
5954 sizeof(atomic_t) * BITS_PER_BYTE); 5983 BITS_PER_TYPE(atomic_t));
5955 5984
5956 if (old) { 5985 if (old) {
5957 WARN_ON(!(atomic_read(&old->frontbuffer_bits) & frontbuffer_bits)); 5986 WARN_ON(!(atomic_read(&old->frontbuffer_bits) & frontbuffer_bits));
diff --git a/drivers/gpu/drm/i915/i915_gem.h b/drivers/gpu/drm/i915/i915_gem.h
index 599c4f6eb1ea..b0e4b976880c 100644
--- a/drivers/gpu/drm/i915/i915_gem.h
+++ b/drivers/gpu/drm/i915/i915_gem.h
@@ -47,17 +47,19 @@ struct drm_i915_private;
47#define GEM_DEBUG_DECL(var) var 47#define GEM_DEBUG_DECL(var) var
48#define GEM_DEBUG_EXEC(expr) expr 48#define GEM_DEBUG_EXEC(expr) expr
49#define GEM_DEBUG_BUG_ON(expr) GEM_BUG_ON(expr) 49#define GEM_DEBUG_BUG_ON(expr) GEM_BUG_ON(expr)
50#define GEM_DEBUG_WARN_ON(expr) GEM_WARN_ON(expr)
50 51
51#else 52#else
52 53
53#define GEM_SHOW_DEBUG() (0) 54#define GEM_SHOW_DEBUG() (0)
54 55
55#define GEM_BUG_ON(expr) BUILD_BUG_ON_INVALID(expr) 56#define GEM_BUG_ON(expr) BUILD_BUG_ON_INVALID(expr)
56#define GEM_WARN_ON(expr) (BUILD_BUG_ON_INVALID(expr), 0) 57#define GEM_WARN_ON(expr) ({ unlikely(!!(expr)); })
57 58
58#define GEM_DEBUG_DECL(var) 59#define GEM_DEBUG_DECL(var)
59#define GEM_DEBUG_EXEC(expr) do { } while (0) 60#define GEM_DEBUG_EXEC(expr) do { } while (0)
60#define GEM_DEBUG_BUG_ON(expr) 61#define GEM_DEBUG_BUG_ON(expr)
62#define GEM_DEBUG_WARN_ON(expr) ({ BUILD_BUG_ON_INVALID(expr); 0; })
61#endif 63#endif
62 64
63#if IS_ENABLED(CONFIG_DRM_I915_TRACE_GEM) 65#if IS_ENABLED(CONFIG_DRM_I915_TRACE_GEM)
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index f772593b99ab..b97963db0287 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -337,7 +337,7 @@ __create_hw_context(struct drm_i915_private *dev_priv,
337 kref_init(&ctx->ref); 337 kref_init(&ctx->ref);
338 list_add_tail(&ctx->link, &dev_priv->contexts.list); 338 list_add_tail(&ctx->link, &dev_priv->contexts.list);
339 ctx->i915 = dev_priv; 339 ctx->i915 = dev_priv;
340 ctx->sched.priority = I915_PRIORITY_NORMAL; 340 ctx->sched.priority = I915_USER_PRIORITY(I915_PRIORITY_NORMAL);
341 341
342 for (n = 0; n < ARRAY_SIZE(ctx->__engine); n++) { 342 for (n = 0; n < ARRAY_SIZE(ctx->__engine); n++) {
343 struct intel_context *ce = &ctx->__engine[n]; 343 struct intel_context *ce = &ctx->__engine[n];
@@ -414,7 +414,7 @@ i915_gem_create_context(struct drm_i915_private *dev_priv,
414 if (IS_ERR(ctx)) 414 if (IS_ERR(ctx))
415 return ctx; 415 return ctx;
416 416
417 if (USES_FULL_PPGTT(dev_priv)) { 417 if (HAS_FULL_PPGTT(dev_priv)) {
418 struct i915_hw_ppgtt *ppgtt; 418 struct i915_hw_ppgtt *ppgtt;
419 419
420 ppgtt = i915_ppgtt_create(dev_priv, file_priv); 420 ppgtt = i915_ppgtt_create(dev_priv, file_priv);
@@ -457,7 +457,7 @@ i915_gem_context_create_gvt(struct drm_device *dev)
457 if (ret) 457 if (ret)
458 return ERR_PTR(ret); 458 return ERR_PTR(ret);
459 459
460 ctx = __create_hw_context(to_i915(dev), NULL); 460 ctx = i915_gem_create_context(to_i915(dev), NULL);
461 if (IS_ERR(ctx)) 461 if (IS_ERR(ctx))
462 goto out; 462 goto out;
463 463
@@ -504,7 +504,7 @@ i915_gem_context_create_kernel(struct drm_i915_private *i915, int prio)
504 } 504 }
505 505
506 i915_gem_context_clear_bannable(ctx); 506 i915_gem_context_clear_bannable(ctx);
507 ctx->sched.priority = prio; 507 ctx->sched.priority = I915_USER_PRIORITY(prio);
508 ctx->ring_size = PAGE_SIZE; 508 ctx->ring_size = PAGE_SIZE;
509 509
510 GEM_BUG_ON(!i915_gem_context_is_kernel(ctx)); 510 GEM_BUG_ON(!i915_gem_context_is_kernel(ctx));
@@ -879,7 +879,7 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
879 args->value = i915_gem_context_is_bannable(ctx); 879 args->value = i915_gem_context_is_bannable(ctx);
880 break; 880 break;
881 case I915_CONTEXT_PARAM_PRIORITY: 881 case I915_CONTEXT_PARAM_PRIORITY:
882 args->value = ctx->sched.priority; 882 args->value = ctx->sched.priority >> I915_USER_PRIORITY_SHIFT;
883 break; 883 break;
884 default: 884 default:
885 ret = -EINVAL; 885 ret = -EINVAL;
@@ -948,7 +948,8 @@ int i915_gem_context_setparam_ioctl(struct drm_device *dev, void *data,
948 !capable(CAP_SYS_NICE)) 948 !capable(CAP_SYS_NICE))
949 ret = -EPERM; 949 ret = -EPERM;
950 else 950 else
951 ctx->sched.priority = priority; 951 ctx->sched.priority =
952 I915_USER_PRIORITY(priority);
952 } 953 }
953 break; 954 break;
954 955
diff --git a/drivers/gpu/drm/i915/i915_gem_context.h b/drivers/gpu/drm/i915/i915_gem_context.h
index 08165f6a0a84..f6d870b1f73e 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.h
+++ b/drivers/gpu/drm/i915/i915_gem_context.h
@@ -163,6 +163,7 @@ struct i915_gem_context {
163 /** engine: per-engine logical HW state */ 163 /** engine: per-engine logical HW state */
164 struct intel_context { 164 struct intel_context {
165 struct i915_gem_context *gem_context; 165 struct i915_gem_context *gem_context;
166 struct intel_engine_cs *active;
166 struct i915_vma *state; 167 struct i915_vma *state;
167 struct intel_ring *ring; 168 struct intel_ring *ring;
168 u32 *lrc_reg_state; 169 u32 *lrc_reg_state;
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 09187286d346..d4fac09095f8 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -460,7 +460,7 @@ eb_validate_vma(struct i915_execbuffer *eb,
460 * any non-page-aligned or non-canonical addresses. 460 * any non-page-aligned or non-canonical addresses.
461 */ 461 */
462 if (unlikely(entry->flags & EXEC_OBJECT_PINNED && 462 if (unlikely(entry->flags & EXEC_OBJECT_PINNED &&
463 entry->offset != gen8_canonical_addr(entry->offset & PAGE_MASK))) 463 entry->offset != gen8_canonical_addr(entry->offset & I915_GTT_PAGE_MASK)))
464 return -EINVAL; 464 return -EINVAL;
465 465
466 /* pad_to_size was once a reserved field, so sanitize it */ 466 /* pad_to_size was once a reserved field, so sanitize it */
@@ -1268,7 +1268,7 @@ relocate_entry(struct i915_vma *vma,
1268 else if (gen >= 4) 1268 else if (gen >= 4)
1269 len = 4; 1269 len = 4;
1270 else 1270 else
1271 len = 3; 1271 len = 6;
1272 1272
1273 batch = reloc_gpu(eb, vma, len); 1273 batch = reloc_gpu(eb, vma, len);
1274 if (IS_ERR(batch)) 1274 if (IS_ERR(batch))
@@ -1309,6 +1309,11 @@ relocate_entry(struct i915_vma *vma,
1309 *batch++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL; 1309 *batch++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL;
1310 *batch++ = addr; 1310 *batch++ = addr;
1311 *batch++ = target_offset; 1311 *batch++ = target_offset;
1312
1313 /* And again for good measure (blb/pnv) */
1314 *batch++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL;
1315 *batch++ = addr;
1316 *batch++ = target_offset;
1312 } 1317 }
1313 1318
1314 goto out; 1319 goto out;
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 56c7f8637311..add1fe7aeb93 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -133,55 +133,6 @@ static inline void i915_ggtt_invalidate(struct drm_i915_private *i915)
133 i915->ggtt.invalidate(i915); 133 i915->ggtt.invalidate(i915);
134} 134}
135 135
136int intel_sanitize_enable_ppgtt(struct drm_i915_private *dev_priv,
137 int enable_ppgtt)
138{
139 bool has_full_ppgtt;
140 bool has_full_48bit_ppgtt;
141
142 if (!dev_priv->info.has_aliasing_ppgtt)
143 return 0;
144
145 has_full_ppgtt = dev_priv->info.has_full_ppgtt;
146 has_full_48bit_ppgtt = dev_priv->info.has_full_48bit_ppgtt;
147
148 if (intel_vgpu_active(dev_priv)) {
149 /* GVT-g has no support for 32bit ppgtt */
150 has_full_ppgtt = false;
151 has_full_48bit_ppgtt = intel_vgpu_has_full_48bit_ppgtt(dev_priv);
152 }
153
154 /*
155 * We don't allow disabling PPGTT for gen9+ as it's a requirement for
156 * execlists, the sole mechanism available to submit work.
157 */
158 if (enable_ppgtt == 0 && INTEL_GEN(dev_priv) < 9)
159 return 0;
160
161 if (enable_ppgtt == 1)
162 return 1;
163
164 if (enable_ppgtt == 2 && has_full_ppgtt)
165 return 2;
166
167 if (enable_ppgtt == 3 && has_full_48bit_ppgtt)
168 return 3;
169
170 /* Disable ppgtt on SNB if VT-d is on. */
171 if (IS_GEN6(dev_priv) && intel_vtd_active()) {
172 DRM_INFO("Disabling PPGTT because VT-d is on\n");
173 return 0;
174 }
175
176 if (has_full_48bit_ppgtt)
177 return 3;
178
179 if (has_full_ppgtt)
180 return 2;
181
182 return 1;
183}
184
185static int ppgtt_bind_vma(struct i915_vma *vma, 136static int ppgtt_bind_vma(struct i915_vma *vma,
186 enum i915_cache_level cache_level, 137 enum i915_cache_level cache_level,
187 u32 unused) 138 u32 unused)
@@ -235,9 +186,9 @@ static void clear_pages(struct i915_vma *vma)
235 memset(&vma->page_sizes, 0, sizeof(vma->page_sizes)); 186 memset(&vma->page_sizes, 0, sizeof(vma->page_sizes));
236} 187}
237 188
238static gen8_pte_t gen8_pte_encode(dma_addr_t addr, 189static u64 gen8_pte_encode(dma_addr_t addr,
239 enum i915_cache_level level, 190 enum i915_cache_level level,
240 u32 flags) 191 u32 flags)
241{ 192{
242 gen8_pte_t pte = addr | _PAGE_PRESENT | _PAGE_RW; 193 gen8_pte_t pte = addr | _PAGE_PRESENT | _PAGE_RW;
243 194
@@ -274,9 +225,9 @@ static gen8_pde_t gen8_pde_encode(const dma_addr_t addr,
274#define gen8_pdpe_encode gen8_pde_encode 225#define gen8_pdpe_encode gen8_pde_encode
275#define gen8_pml4e_encode gen8_pde_encode 226#define gen8_pml4e_encode gen8_pde_encode
276 227
277static gen6_pte_t snb_pte_encode(dma_addr_t addr, 228static u64 snb_pte_encode(dma_addr_t addr,
278 enum i915_cache_level level, 229 enum i915_cache_level level,
279 u32 unused) 230 u32 flags)
280{ 231{
281 gen6_pte_t pte = GEN6_PTE_VALID; 232 gen6_pte_t pte = GEN6_PTE_VALID;
282 pte |= GEN6_PTE_ADDR_ENCODE(addr); 233 pte |= GEN6_PTE_ADDR_ENCODE(addr);
@@ -296,9 +247,9 @@ static gen6_pte_t snb_pte_encode(dma_addr_t addr,
296 return pte; 247 return pte;
297} 248}
298 249
299static gen6_pte_t ivb_pte_encode(dma_addr_t addr, 250static u64 ivb_pte_encode(dma_addr_t addr,
300 enum i915_cache_level level, 251 enum i915_cache_level level,
301 u32 unused) 252 u32 flags)
302{ 253{
303 gen6_pte_t pte = GEN6_PTE_VALID; 254 gen6_pte_t pte = GEN6_PTE_VALID;
304 pte |= GEN6_PTE_ADDR_ENCODE(addr); 255 pte |= GEN6_PTE_ADDR_ENCODE(addr);
@@ -320,9 +271,9 @@ static gen6_pte_t ivb_pte_encode(dma_addr_t addr,
320 return pte; 271 return pte;
321} 272}
322 273
323static gen6_pte_t byt_pte_encode(dma_addr_t addr, 274static u64 byt_pte_encode(dma_addr_t addr,
324 enum i915_cache_level level, 275 enum i915_cache_level level,
325 u32 flags) 276 u32 flags)
326{ 277{
327 gen6_pte_t pte = GEN6_PTE_VALID; 278 gen6_pte_t pte = GEN6_PTE_VALID;
328 pte |= GEN6_PTE_ADDR_ENCODE(addr); 279 pte |= GEN6_PTE_ADDR_ENCODE(addr);
@@ -336,9 +287,9 @@ static gen6_pte_t byt_pte_encode(dma_addr_t addr,
336 return pte; 287 return pte;
337} 288}
338 289
339static gen6_pte_t hsw_pte_encode(dma_addr_t addr, 290static u64 hsw_pte_encode(dma_addr_t addr,
340 enum i915_cache_level level, 291 enum i915_cache_level level,
341 u32 unused) 292 u32 flags)
342{ 293{
343 gen6_pte_t pte = GEN6_PTE_VALID; 294 gen6_pte_t pte = GEN6_PTE_VALID;
344 pte |= HSW_PTE_ADDR_ENCODE(addr); 295 pte |= HSW_PTE_ADDR_ENCODE(addr);
@@ -349,9 +300,9 @@ static gen6_pte_t hsw_pte_encode(dma_addr_t addr,
349 return pte; 300 return pte;
350} 301}
351 302
352static gen6_pte_t iris_pte_encode(dma_addr_t addr, 303static u64 iris_pte_encode(dma_addr_t addr,
353 enum i915_cache_level level, 304 enum i915_cache_level level,
354 u32 unused) 305 u32 flags)
355{ 306{
356 gen6_pte_t pte = GEN6_PTE_VALID; 307 gen6_pte_t pte = GEN6_PTE_VALID;
357 pte |= HSW_PTE_ADDR_ENCODE(addr); 308 pte |= HSW_PTE_ADDR_ENCODE(addr);
@@ -629,10 +580,9 @@ setup_scratch_page(struct i915_address_space *vm, gfp_t gfp)
629 * region, including any PTEs which happen to point to scratch. 580 * region, including any PTEs which happen to point to scratch.
630 * 581 *
631 * This is only relevant for the 48b PPGTT where we support 582 * This is only relevant for the 48b PPGTT where we support
632 * huge-gtt-pages, see also i915_vma_insert(). 583 * huge-gtt-pages, see also i915_vma_insert(). However, as we share the
633 * 584 * scratch (read-only) between all vm, we create one 64k scratch page
634 * TODO: we should really consider write-protecting the scratch-page and 585 * for all.
635 * sharing between ppgtt
636 */ 586 */
637 size = I915_GTT_PAGE_SIZE_4K; 587 size = I915_GTT_PAGE_SIZE_4K;
638 if (i915_vm_is_48bit(vm) && 588 if (i915_vm_is_48bit(vm) &&
@@ -715,14 +665,13 @@ static void free_pt(struct i915_address_space *vm, struct i915_page_table *pt)
715static void gen8_initialize_pt(struct i915_address_space *vm, 665static void gen8_initialize_pt(struct i915_address_space *vm,
716 struct i915_page_table *pt) 666 struct i915_page_table *pt)
717{ 667{
718 fill_px(vm, pt, 668 fill_px(vm, pt, vm->scratch_pte);
719 gen8_pte_encode(vm->scratch_page.daddr, I915_CACHE_LLC, 0));
720} 669}
721 670
722static void gen6_initialize_pt(struct gen6_hw_ppgtt *ppgtt, 671static void gen6_initialize_pt(struct i915_address_space *vm,
723 struct i915_page_table *pt) 672 struct i915_page_table *pt)
724{ 673{
725 fill32_px(&ppgtt->base.vm, pt, ppgtt->scratch_pte); 674 fill32_px(vm, pt, vm->scratch_pte);
726} 675}
727 676
728static struct i915_page_directory *alloc_pd(struct i915_address_space *vm) 677static struct i915_page_directory *alloc_pd(struct i915_address_space *vm)
@@ -856,15 +805,13 @@ static void mark_tlbs_dirty(struct i915_hw_ppgtt *ppgtt)
856/* Removes entries from a single page table, releasing it if it's empty. 805/* Removes entries from a single page table, releasing it if it's empty.
857 * Caller can use the return value to update higher-level entries. 806 * Caller can use the return value to update higher-level entries.
858 */ 807 */
859static bool gen8_ppgtt_clear_pt(struct i915_address_space *vm, 808static bool gen8_ppgtt_clear_pt(const struct i915_address_space *vm,
860 struct i915_page_table *pt, 809 struct i915_page_table *pt,
861 u64 start, u64 length) 810 u64 start, u64 length)
862{ 811{
863 unsigned int num_entries = gen8_pte_count(start, length); 812 unsigned int num_entries = gen8_pte_count(start, length);
864 unsigned int pte = gen8_pte_index(start); 813 unsigned int pte = gen8_pte_index(start);
865 unsigned int pte_end = pte + num_entries; 814 unsigned int pte_end = pte + num_entries;
866 const gen8_pte_t scratch_pte =
867 gen8_pte_encode(vm->scratch_page.daddr, I915_CACHE_LLC, 0);
868 gen8_pte_t *vaddr; 815 gen8_pte_t *vaddr;
869 816
870 GEM_BUG_ON(num_entries > pt->used_ptes); 817 GEM_BUG_ON(num_entries > pt->used_ptes);
@@ -875,7 +822,7 @@ static bool gen8_ppgtt_clear_pt(struct i915_address_space *vm,
875 822
876 vaddr = kmap_atomic_px(pt); 823 vaddr = kmap_atomic_px(pt);
877 while (pte < pte_end) 824 while (pte < pte_end)
878 vaddr[pte++] = scratch_pte; 825 vaddr[pte++] = vm->scratch_pte;
879 kunmap_atomic(vaddr); 826 kunmap_atomic(vaddr);
880 827
881 return false; 828 return false;
@@ -1208,7 +1155,7 @@ static void gen8_ppgtt_insert_huge_entries(struct i915_vma *vma,
1208 if (I915_SELFTEST_ONLY(vma->vm->scrub_64K)) { 1155 if (I915_SELFTEST_ONLY(vma->vm->scrub_64K)) {
1209 u16 i; 1156 u16 i;
1210 1157
1211 encode = pte_encode | vma->vm->scratch_page.daddr; 1158 encode = vma->vm->scratch_pte;
1212 vaddr = kmap_atomic_px(pd->page_table[idx.pde]); 1159 vaddr = kmap_atomic_px(pd->page_table[idx.pde]);
1213 1160
1214 for (i = 1; i < index; i += 16) 1161 for (i = 1; i < index; i += 16)
@@ -1261,10 +1208,35 @@ static int gen8_init_scratch(struct i915_address_space *vm)
1261{ 1208{
1262 int ret; 1209 int ret;
1263 1210
1211 /*
1212 * If everybody agrees to not to write into the scratch page,
1213 * we can reuse it for all vm, keeping contexts and processes separate.
1214 */
1215 if (vm->has_read_only &&
1216 vm->i915->kernel_context &&
1217 vm->i915->kernel_context->ppgtt) {
1218 struct i915_address_space *clone =
1219 &vm->i915->kernel_context->ppgtt->vm;
1220
1221 GEM_BUG_ON(!clone->has_read_only);
1222
1223 vm->scratch_page.order = clone->scratch_page.order;
1224 vm->scratch_pte = clone->scratch_pte;
1225 vm->scratch_pt = clone->scratch_pt;
1226 vm->scratch_pd = clone->scratch_pd;
1227 vm->scratch_pdp = clone->scratch_pdp;
1228 return 0;
1229 }
1230
1264 ret = setup_scratch_page(vm, __GFP_HIGHMEM); 1231 ret = setup_scratch_page(vm, __GFP_HIGHMEM);
1265 if (ret) 1232 if (ret)
1266 return ret; 1233 return ret;
1267 1234
1235 vm->scratch_pte =
1236 gen8_pte_encode(vm->scratch_page.daddr,
1237 I915_CACHE_LLC,
1238 PTE_READ_ONLY);
1239
1268 vm->scratch_pt = alloc_pt(vm); 1240 vm->scratch_pt = alloc_pt(vm);
1269 if (IS_ERR(vm->scratch_pt)) { 1241 if (IS_ERR(vm->scratch_pt)) {
1270 ret = PTR_ERR(vm->scratch_pt); 1242 ret = PTR_ERR(vm->scratch_pt);
@@ -1336,6 +1308,9 @@ static int gen8_ppgtt_notify_vgt(struct i915_hw_ppgtt *ppgtt, bool create)
1336 1308
1337static void gen8_free_scratch(struct i915_address_space *vm) 1309static void gen8_free_scratch(struct i915_address_space *vm)
1338{ 1310{
1311 if (!vm->scratch_page.daddr)
1312 return;
1313
1339 if (use_4lvl(vm)) 1314 if (use_4lvl(vm))
1340 free_pdp(vm, vm->scratch_pdp); 1315 free_pdp(vm, vm->scratch_pdp);
1341 free_pd(vm, vm->scratch_pd); 1316 free_pd(vm, vm->scratch_pd);
@@ -1573,8 +1548,7 @@ static void gen8_dump_pdp(struct i915_hw_ppgtt *ppgtt,
1573static void gen8_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m) 1548static void gen8_dump_ppgtt(struct i915_hw_ppgtt *ppgtt, struct seq_file *m)
1574{ 1549{
1575 struct i915_address_space *vm = &ppgtt->vm; 1550 struct i915_address_space *vm = &ppgtt->vm;
1576 const gen8_pte_t scratch_pte = 1551 const gen8_pte_t scratch_pte = vm->scratch_pte;
1577 gen8_pte_encode(vm->scratch_page.daddr, I915_CACHE_LLC, 0);
1578 u64 start = 0, length = ppgtt->vm.total; 1552 u64 start = 0, length = ppgtt->vm.total;
1579 1553
1580 if (use_4lvl(vm)) { 1554 if (use_4lvl(vm)) {
@@ -1647,16 +1621,12 @@ static struct i915_hw_ppgtt *gen8_ppgtt_create(struct drm_i915_private *i915)
1647 ppgtt->vm.i915 = i915; 1621 ppgtt->vm.i915 = i915;
1648 ppgtt->vm.dma = &i915->drm.pdev->dev; 1622 ppgtt->vm.dma = &i915->drm.pdev->dev;
1649 1623
1650 ppgtt->vm.total = USES_FULL_48BIT_PPGTT(i915) ? 1624 ppgtt->vm.total = HAS_FULL_48BIT_PPGTT(i915) ?
1651 1ULL << 48 : 1625 1ULL << 48 :
1652 1ULL << 32; 1626 1ULL << 32;
1653 1627
1654 /* 1628 /* From bdw, there is support for read-only pages in the PPGTT. */
1655 * From bdw, there is support for read-only pages in the PPGTT. 1629 ppgtt->vm.has_read_only = true;
1656 *
1657 * XXX GVT is not honouring the lack of RW in the PTE bits.
1658 */
1659 ppgtt->vm.has_read_only = !intel_vgpu_active(i915);
1660 1630
1661 i915_address_space_init(&ppgtt->vm, i915); 1631 i915_address_space_init(&ppgtt->vm, i915);
1662 1632
@@ -1721,7 +1691,7 @@ err_free:
1721static void gen6_dump_ppgtt(struct i915_hw_ppgtt *base, struct seq_file *m) 1691static void gen6_dump_ppgtt(struct i915_hw_ppgtt *base, struct seq_file *m)
1722{ 1692{
1723 struct gen6_hw_ppgtt *ppgtt = to_gen6_ppgtt(base); 1693 struct gen6_hw_ppgtt *ppgtt = to_gen6_ppgtt(base);
1724 const gen6_pte_t scratch_pte = ppgtt->scratch_pte; 1694 const gen6_pte_t scratch_pte = base->vm.scratch_pte;
1725 struct i915_page_table *pt; 1695 struct i915_page_table *pt;
1726 u32 pte, pde; 1696 u32 pte, pde;
1727 1697
@@ -1757,7 +1727,7 @@ static void gen6_dump_ppgtt(struct i915_hw_ppgtt *base, struct seq_file *m)
1757 if (i == 4) 1727 if (i == 4)
1758 continue; 1728 continue;
1759 1729
1760 seq_printf(m, "\t\t(%03d, %04d) %08lx: ", 1730 seq_printf(m, "\t\t(%03d, %04d) %08llx: ",
1761 pde, pte, 1731 pde, pte,
1762 (pde * GEN6_PTES + pte) * I915_GTT_PAGE_SIZE); 1732 (pde * GEN6_PTES + pte) * I915_GTT_PAGE_SIZE);
1763 for (i = 0; i < 4; i++) { 1733 for (i = 0; i < 4; i++) {
@@ -1782,19 +1752,6 @@ static inline void gen6_write_pde(const struct gen6_hw_ppgtt *ppgtt,
1782 ppgtt->pd_addr + pde); 1752 ppgtt->pd_addr + pde);
1783} 1753}
1784 1754
1785static void gen8_ppgtt_enable(struct drm_i915_private *dev_priv)
1786{
1787 struct intel_engine_cs *engine;
1788 enum intel_engine_id id;
1789
1790 for_each_engine(engine, dev_priv, id) {
1791 u32 four_level = USES_FULL_48BIT_PPGTT(dev_priv) ?
1792 GEN8_GFX_PPGTT_48B : 0;
1793 I915_WRITE(RING_MODE_GEN7(engine),
1794 _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE | four_level));
1795 }
1796}
1797
1798static void gen7_ppgtt_enable(struct drm_i915_private *dev_priv) 1755static void gen7_ppgtt_enable(struct drm_i915_private *dev_priv)
1799{ 1756{
1800 struct intel_engine_cs *engine; 1757 struct intel_engine_cs *engine;
@@ -1834,7 +1791,8 @@ static void gen6_ppgtt_enable(struct drm_i915_private *dev_priv)
1834 ecochk = I915_READ(GAM_ECOCHK); 1791 ecochk = I915_READ(GAM_ECOCHK);
1835 I915_WRITE(GAM_ECOCHK, ecochk | ECOCHK_SNB_BIT | ECOCHK_PPGTT_CACHE64B); 1792 I915_WRITE(GAM_ECOCHK, ecochk | ECOCHK_SNB_BIT | ECOCHK_PPGTT_CACHE64B);
1836 1793
1837 I915_WRITE(GFX_MODE, _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE)); 1794 if (HAS_PPGTT(dev_priv)) /* may be disabled for VT-d */
1795 I915_WRITE(GFX_MODE, _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE));
1838} 1796}
1839 1797
1840/* PPGTT support for Sandybdrige/Gen6 and later */ 1798/* PPGTT support for Sandybdrige/Gen6 and later */
@@ -1846,7 +1804,7 @@ static void gen6_ppgtt_clear_range(struct i915_address_space *vm,
1846 unsigned int pde = first_entry / GEN6_PTES; 1804 unsigned int pde = first_entry / GEN6_PTES;
1847 unsigned int pte = first_entry % GEN6_PTES; 1805 unsigned int pte = first_entry % GEN6_PTES;
1848 unsigned int num_entries = length / I915_GTT_PAGE_SIZE; 1806 unsigned int num_entries = length / I915_GTT_PAGE_SIZE;
1849 const gen6_pte_t scratch_pte = ppgtt->scratch_pte; 1807 const gen6_pte_t scratch_pte = vm->scratch_pte;
1850 1808
1851 while (num_entries) { 1809 while (num_entries) {
1852 struct i915_page_table *pt = ppgtt->base.pd.page_table[pde++]; 1810 struct i915_page_table *pt = ppgtt->base.pd.page_table[pde++];
@@ -1937,7 +1895,7 @@ static int gen6_alloc_va_range(struct i915_address_space *vm,
1937 if (IS_ERR(pt)) 1895 if (IS_ERR(pt))
1938 goto unwind_out; 1896 goto unwind_out;
1939 1897
1940 gen6_initialize_pt(ppgtt, pt); 1898 gen6_initialize_pt(vm, pt);
1941 ppgtt->base.pd.page_table[pde] = pt; 1899 ppgtt->base.pd.page_table[pde] = pt;
1942 1900
1943 if (i915_vma_is_bound(ppgtt->vma, 1901 if (i915_vma_is_bound(ppgtt->vma,
@@ -1975,9 +1933,9 @@ static int gen6_ppgtt_init_scratch(struct gen6_hw_ppgtt *ppgtt)
1975 if (ret) 1933 if (ret)
1976 return ret; 1934 return ret;
1977 1935
1978 ppgtt->scratch_pte = 1936 vm->scratch_pte = vm->pte_encode(vm->scratch_page.daddr,
1979 vm->pte_encode(vm->scratch_page.daddr, 1937 I915_CACHE_NONE,
1980 I915_CACHE_NONE, PTE_READ_ONLY); 1938 PTE_READ_ONLY);
1981 1939
1982 vm->scratch_pt = alloc_pt(vm); 1940 vm->scratch_pt = alloc_pt(vm);
1983 if (IS_ERR(vm->scratch_pt)) { 1941 if (IS_ERR(vm->scratch_pt)) {
@@ -1985,7 +1943,7 @@ static int gen6_ppgtt_init_scratch(struct gen6_hw_ppgtt *ppgtt)
1985 return PTR_ERR(vm->scratch_pt); 1943 return PTR_ERR(vm->scratch_pt);
1986 } 1944 }
1987 1945
1988 gen6_initialize_pt(ppgtt, vm->scratch_pt); 1946 gen6_initialize_pt(vm, vm->scratch_pt);
1989 gen6_for_all_pdes(unused, &ppgtt->base.pd, pde) 1947 gen6_for_all_pdes(unused, &ppgtt->base.pd, pde)
1990 ppgtt->base.pd.page_table[pde] = vm->scratch_pt; 1948 ppgtt->base.pd.page_table[pde] = vm->scratch_pt;
1991 1949
@@ -2237,23 +2195,10 @@ int i915_ppgtt_init_hw(struct drm_i915_private *dev_priv)
2237{ 2195{
2238 gtt_write_workarounds(dev_priv); 2196 gtt_write_workarounds(dev_priv);
2239 2197
2240 /* In the case of execlists, PPGTT is enabled by the context descriptor
2241 * and the PDPs are contained within the context itself. We don't
2242 * need to do anything here. */
2243 if (HAS_LOGICAL_RING_CONTEXTS(dev_priv))
2244 return 0;
2245
2246 if (!USES_PPGTT(dev_priv))
2247 return 0;
2248
2249 if (IS_GEN6(dev_priv)) 2198 if (IS_GEN6(dev_priv))
2250 gen6_ppgtt_enable(dev_priv); 2199 gen6_ppgtt_enable(dev_priv);
2251 else if (IS_GEN7(dev_priv)) 2200 else if (IS_GEN7(dev_priv))
2252 gen7_ppgtt_enable(dev_priv); 2201 gen7_ppgtt_enable(dev_priv);
2253 else if (INTEL_GEN(dev_priv) >= 8)
2254 gen8_ppgtt_enable(dev_priv);
2255 else
2256 MISSING_CASE(INTEL_GEN(dev_priv));
2257 2202
2258 return 0; 2203 return 0;
2259} 2204}
@@ -2543,8 +2488,7 @@ static void gen8_ggtt_clear_range(struct i915_address_space *vm,
2543 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm); 2488 struct i915_ggtt *ggtt = i915_vm_to_ggtt(vm);
2544 unsigned first_entry = start / I915_GTT_PAGE_SIZE; 2489 unsigned first_entry = start / I915_GTT_PAGE_SIZE;
2545 unsigned num_entries = length / I915_GTT_PAGE_SIZE; 2490 unsigned num_entries = length / I915_GTT_PAGE_SIZE;
2546 const gen8_pte_t scratch_pte = 2491 const gen8_pte_t scratch_pte = vm->scratch_pte;
2547 gen8_pte_encode(vm->scratch_page.daddr, I915_CACHE_LLC, 0);
2548 gen8_pte_t __iomem *gtt_base = 2492 gen8_pte_t __iomem *gtt_base =
2549 (gen8_pte_t __iomem *)ggtt->gsm + first_entry; 2493 (gen8_pte_t __iomem *)ggtt->gsm + first_entry;
2550 const int max_entries = ggtt_total_entries(ggtt) - first_entry; 2494 const int max_entries = ggtt_total_entries(ggtt) - first_entry;
@@ -2669,8 +2613,7 @@ static void gen6_ggtt_clear_range(struct i915_address_space *vm,
2669 first_entry, num_entries, max_entries)) 2613 first_entry, num_entries, max_entries))
2670 num_entries = max_entries; 2614 num_entries = max_entries;
2671 2615
2672 scratch_pte = vm->pte_encode(vm->scratch_page.daddr, 2616 scratch_pte = vm->scratch_pte;
2673 I915_CACHE_LLC, 0);
2674 2617
2675 for (i = 0; i < num_entries; i++) 2618 for (i = 0; i < num_entries; i++)
2676 iowrite32(scratch_pte, &gtt_base[i]); 2619 iowrite32(scratch_pte, &gtt_base[i]);
@@ -2952,7 +2895,7 @@ int i915_gem_init_ggtt(struct drm_i915_private *dev_priv)
2952 /* And finally clear the reserved guard page */ 2895 /* And finally clear the reserved guard page */
2953 ggtt->vm.clear_range(&ggtt->vm, ggtt->vm.total - PAGE_SIZE, PAGE_SIZE); 2896 ggtt->vm.clear_range(&ggtt->vm, ggtt->vm.total - PAGE_SIZE, PAGE_SIZE);
2954 2897
2955 if (USES_PPGTT(dev_priv) && !USES_FULL_PPGTT(dev_priv)) { 2898 if (INTEL_PPGTT(dev_priv) == INTEL_PPGTT_ALIASING) {
2956 ret = i915_gem_init_aliasing_ppgtt(dev_priv); 2899 ret = i915_gem_init_aliasing_ppgtt(dev_priv);
2957 if (ret) 2900 if (ret)
2958 goto err; 2901 goto err;
@@ -3076,6 +3019,10 @@ static int ggtt_probe_common(struct i915_ggtt *ggtt, u64 size)
3076 return ret; 3019 return ret;
3077 } 3020 }
3078 3021
3022 ggtt->vm.scratch_pte =
3023 ggtt->vm.pte_encode(ggtt->vm.scratch_page.daddr,
3024 I915_CACHE_NONE, 0);
3025
3079 return 0; 3026 return 0;
3080} 3027}
3081 3028
@@ -3275,7 +3222,7 @@ static void bdw_setup_private_ppat(struct intel_ppat *ppat)
3275 ppat->match = bdw_private_pat_match; 3222 ppat->match = bdw_private_pat_match;
3276 ppat->clear_value = GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3); 3223 ppat->clear_value = GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3);
3277 3224
3278 if (!USES_PPGTT(ppat->i915)) { 3225 if (!HAS_PPGTT(ppat->i915)) {
3279 /* Spec: "For GGTT, there is NO pat_sel[2:0] from the entry, 3226 /* Spec: "For GGTT, there is NO pat_sel[2:0] from the entry,
3280 * so RTL will always use the value corresponding to 3227 * so RTL will always use the value corresponding to
3281 * pat_sel = 000". 3228 * pat_sel = 000".
@@ -3402,7 +3349,7 @@ static int gen8_gmch_probe(struct i915_ggtt *ggtt)
3402 ggtt->vm.cleanup = gen6_gmch_remove; 3349 ggtt->vm.cleanup = gen6_gmch_remove;
3403 ggtt->vm.insert_page = gen8_ggtt_insert_page; 3350 ggtt->vm.insert_page = gen8_ggtt_insert_page;
3404 ggtt->vm.clear_range = nop_clear_range; 3351 ggtt->vm.clear_range = nop_clear_range;
3405 if (!USES_FULL_PPGTT(dev_priv) || intel_scanout_needs_vtd_wa(dev_priv)) 3352 if (intel_scanout_needs_vtd_wa(dev_priv))
3406 ggtt->vm.clear_range = gen8_ggtt_clear_range; 3353 ggtt->vm.clear_range = gen8_ggtt_clear_range;
3407 3354
3408 ggtt->vm.insert_entries = gen8_ggtt_insert_entries; 3355 ggtt->vm.insert_entries = gen8_ggtt_insert_entries;
@@ -3413,6 +3360,11 @@ static int gen8_gmch_probe(struct i915_ggtt *ggtt)
3413 ggtt->vm.insert_page = bxt_vtd_ggtt_insert_page__BKL; 3360 ggtt->vm.insert_page = bxt_vtd_ggtt_insert_page__BKL;
3414 if (ggtt->vm.clear_range != nop_clear_range) 3361 if (ggtt->vm.clear_range != nop_clear_range)
3415 ggtt->vm.clear_range = bxt_vtd_ggtt_clear_range__BKL; 3362 ggtt->vm.clear_range = bxt_vtd_ggtt_clear_range__BKL;
3363
3364 /* Prevent recursively calling stop_machine() and deadlocks. */
3365 dev_info(dev_priv->drm.dev,
3366 "Disabling error capture for VT-d workaround\n");
3367 i915_disable_error_state(dev_priv, -ENODEV);
3416 } 3368 }
3417 3369
3418 ggtt->invalidate = gen6_ggtt_invalidate; 3370 ggtt->invalidate = gen6_ggtt_invalidate;
@@ -3422,6 +3374,8 @@ static int gen8_gmch_probe(struct i915_ggtt *ggtt)
3422 ggtt->vm.vma_ops.set_pages = ggtt_set_pages; 3374 ggtt->vm.vma_ops.set_pages = ggtt_set_pages;
3423 ggtt->vm.vma_ops.clear_pages = clear_pages; 3375 ggtt->vm.vma_ops.clear_pages = clear_pages;
3424 3376
3377 ggtt->vm.pte_encode = gen8_pte_encode;
3378
3425 setup_private_pat(dev_priv); 3379 setup_private_pat(dev_priv);
3426 3380
3427 return ggtt_probe_common(ggtt, size); 3381 return ggtt_probe_common(ggtt, size);
@@ -3609,7 +3563,7 @@ int i915_ggtt_init_hw(struct drm_i915_private *dev_priv)
3609 /* Only VLV supports read-only GGTT mappings */ 3563 /* Only VLV supports read-only GGTT mappings */
3610 ggtt->vm.has_read_only = IS_VALLEYVIEW(dev_priv); 3564 ggtt->vm.has_read_only = IS_VALLEYVIEW(dev_priv);
3611 3565
3612 if (!HAS_LLC(dev_priv) && !USES_PPGTT(dev_priv)) 3566 if (!HAS_LLC(dev_priv) && !HAS_PPGTT(dev_priv))
3613 ggtt->vm.mm.color_adjust = i915_gtt_color_adjust; 3567 ggtt->vm.mm.color_adjust = i915_gtt_color_adjust;
3614 mutex_unlock(&dev_priv->drm.struct_mutex); 3568 mutex_unlock(&dev_priv->drm.struct_mutex);
3615 3569
@@ -3711,7 +3665,7 @@ void i915_gem_restore_gtt_mappings(struct drm_i915_private *dev_priv)
3711} 3665}
3712 3666
3713static struct scatterlist * 3667static struct scatterlist *
3714rotate_pages(const dma_addr_t *in, unsigned int offset, 3668rotate_pages(struct drm_i915_gem_object *obj, unsigned int offset,
3715 unsigned int width, unsigned int height, 3669 unsigned int width, unsigned int height,
3716 unsigned int stride, 3670 unsigned int stride,
3717 struct sg_table *st, struct scatterlist *sg) 3671 struct sg_table *st, struct scatterlist *sg)
@@ -3720,7 +3674,7 @@ rotate_pages(const dma_addr_t *in, unsigned int offset,
3720 unsigned int src_idx; 3674 unsigned int src_idx;
3721 3675
3722 for (column = 0; column < width; column++) { 3676 for (column = 0; column < width; column++) {
3723 src_idx = stride * (height - 1) + column; 3677 src_idx = stride * (height - 1) + column + offset;
3724 for (row = 0; row < height; row++) { 3678 for (row = 0; row < height; row++) {
3725 st->nents++; 3679 st->nents++;
3726 /* We don't need the pages, but need to initialize 3680 /* We don't need the pages, but need to initialize
@@ -3728,7 +3682,8 @@ rotate_pages(const dma_addr_t *in, unsigned int offset,
3728 * The only thing we need are DMA addresses. 3682 * The only thing we need are DMA addresses.
3729 */ 3683 */
3730 sg_set_page(sg, NULL, I915_GTT_PAGE_SIZE, 0); 3684 sg_set_page(sg, NULL, I915_GTT_PAGE_SIZE, 0);
3731 sg_dma_address(sg) = in[offset + src_idx]; 3685 sg_dma_address(sg) =
3686 i915_gem_object_get_dma_address(obj, src_idx);
3732 sg_dma_len(sg) = I915_GTT_PAGE_SIZE; 3687 sg_dma_len(sg) = I915_GTT_PAGE_SIZE;
3733 sg = sg_next(sg); 3688 sg = sg_next(sg);
3734 src_idx -= stride; 3689 src_idx -= stride;
@@ -3742,22 +3697,11 @@ static noinline struct sg_table *
3742intel_rotate_pages(struct intel_rotation_info *rot_info, 3697intel_rotate_pages(struct intel_rotation_info *rot_info,
3743 struct drm_i915_gem_object *obj) 3698 struct drm_i915_gem_object *obj)
3744{ 3699{
3745 const unsigned long n_pages = obj->base.size / I915_GTT_PAGE_SIZE;
3746 unsigned int size = intel_rotation_info_size(rot_info); 3700 unsigned int size = intel_rotation_info_size(rot_info);
3747 struct sgt_iter sgt_iter;
3748 dma_addr_t dma_addr;
3749 unsigned long i;
3750 dma_addr_t *page_addr_list;
3751 struct sg_table *st; 3701 struct sg_table *st;
3752 struct scatterlist *sg; 3702 struct scatterlist *sg;
3753 int ret = -ENOMEM; 3703 int ret = -ENOMEM;
3754 3704 int i;
3755 /* Allocate a temporary list of source pages for random access. */
3756 page_addr_list = kvmalloc_array(n_pages,
3757 sizeof(dma_addr_t),
3758 GFP_KERNEL);
3759 if (!page_addr_list)
3760 return ERR_PTR(ret);
3761 3705
3762 /* Allocate target SG list. */ 3706 /* Allocate target SG list. */
3763 st = kmalloc(sizeof(*st), GFP_KERNEL); 3707 st = kmalloc(sizeof(*st), GFP_KERNEL);
@@ -3768,29 +3712,20 @@ intel_rotate_pages(struct intel_rotation_info *rot_info,
3768 if (ret) 3712 if (ret)
3769 goto err_sg_alloc; 3713 goto err_sg_alloc;
3770 3714
3771 /* Populate source page list from the object. */
3772 i = 0;
3773 for_each_sgt_dma(dma_addr, sgt_iter, obj->mm.pages)
3774 page_addr_list[i++] = dma_addr;
3775
3776 GEM_BUG_ON(i != n_pages);
3777 st->nents = 0; 3715 st->nents = 0;
3778 sg = st->sgl; 3716 sg = st->sgl;
3779 3717
3780 for (i = 0 ; i < ARRAY_SIZE(rot_info->plane); i++) { 3718 for (i = 0 ; i < ARRAY_SIZE(rot_info->plane); i++) {
3781 sg = rotate_pages(page_addr_list, rot_info->plane[i].offset, 3719 sg = rotate_pages(obj, rot_info->plane[i].offset,
3782 rot_info->plane[i].width, rot_info->plane[i].height, 3720 rot_info->plane[i].width, rot_info->plane[i].height,
3783 rot_info->plane[i].stride, st, sg); 3721 rot_info->plane[i].stride, st, sg);
3784 } 3722 }
3785 3723
3786 kvfree(page_addr_list);
3787
3788 return st; 3724 return st;
3789 3725
3790err_sg_alloc: 3726err_sg_alloc:
3791 kfree(st); 3727 kfree(st);
3792err_st_alloc: 3728err_st_alloc:
3793 kvfree(page_addr_list);
3794 3729
3795 DRM_DEBUG_DRIVER("Failed to create rotated mapping for object size %zu! (%ux%u tiles, %u pages)\n", 3730 DRM_DEBUG_DRIVER("Failed to create rotated mapping for object size %zu! (%ux%u tiles, %u pages)\n",
3796 obj->base.size, rot_info->plane[0].width, rot_info->plane[0].height, size); 3731 obj->base.size, rot_info->plane[0].width, rot_info->plane[0].height, size);
@@ -3835,6 +3770,8 @@ intel_partial_pages(const struct i915_ggtt_view *view,
3835 count -= len >> PAGE_SHIFT; 3770 count -= len >> PAGE_SHIFT;
3836 if (count == 0) { 3771 if (count == 0) {
3837 sg_mark_end(sg); 3772 sg_mark_end(sg);
3773 i915_sg_trim(st); /* Drop any unused tail entries. */
3774
3838 return st; 3775 return st;
3839 } 3776 }
3840 3777
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
index 7e2af5f4f39b..4874da09a3c4 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.h
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
@@ -42,13 +42,15 @@
42#include "i915_selftest.h" 42#include "i915_selftest.h"
43#include "i915_timeline.h" 43#include "i915_timeline.h"
44 44
45#define I915_GTT_PAGE_SIZE_4K BIT(12) 45#define I915_GTT_PAGE_SIZE_4K BIT_ULL(12)
46#define I915_GTT_PAGE_SIZE_64K BIT(16) 46#define I915_GTT_PAGE_SIZE_64K BIT_ULL(16)
47#define I915_GTT_PAGE_SIZE_2M BIT(21) 47#define I915_GTT_PAGE_SIZE_2M BIT_ULL(21)
48 48
49#define I915_GTT_PAGE_SIZE I915_GTT_PAGE_SIZE_4K 49#define I915_GTT_PAGE_SIZE I915_GTT_PAGE_SIZE_4K
50#define I915_GTT_MAX_PAGE_SIZE I915_GTT_PAGE_SIZE_2M 50#define I915_GTT_MAX_PAGE_SIZE I915_GTT_PAGE_SIZE_2M
51 51
52#define I915_GTT_PAGE_MASK -I915_GTT_PAGE_SIZE
53
52#define I915_GTT_MIN_ALIGNMENT I915_GTT_PAGE_SIZE 54#define I915_GTT_MIN_ALIGNMENT I915_GTT_PAGE_SIZE
53 55
54#define I915_FENCE_REG_NONE -1 56#define I915_FENCE_REG_NONE -1
@@ -287,6 +289,7 @@ struct i915_address_space {
287 289
288 struct mutex mutex; /* protects vma and our lists */ 290 struct mutex mutex; /* protects vma and our lists */
289 291
292 u64 scratch_pte;
290 struct i915_page_dma scratch_page; 293 struct i915_page_dma scratch_page;
291 struct i915_page_table *scratch_pt; 294 struct i915_page_table *scratch_pt;
292 struct i915_page_directory *scratch_pd; 295 struct i915_page_directory *scratch_pd;
@@ -333,12 +336,11 @@ struct i915_address_space {
333 /* Some systems support read-only mappings for GGTT and/or PPGTT */ 336 /* Some systems support read-only mappings for GGTT and/or PPGTT */
334 bool has_read_only:1; 337 bool has_read_only:1;
335 338
336 /* FIXME: Need a more generic return type */ 339 u64 (*pte_encode)(dma_addr_t addr,
337 gen6_pte_t (*pte_encode)(dma_addr_t addr, 340 enum i915_cache_level level,
338 enum i915_cache_level level, 341 u32 flags); /* Create a valid PTE */
339 u32 flags); /* Create a valid PTE */
340 /* flags for pte_encode */
341#define PTE_READ_ONLY (1<<0) 342#define PTE_READ_ONLY (1<<0)
343
342 int (*allocate_va_range)(struct i915_address_space *vm, 344 int (*allocate_va_range)(struct i915_address_space *vm,
343 u64 start, u64 length); 345 u64 start, u64 length);
344 void (*clear_range)(struct i915_address_space *vm, 346 void (*clear_range)(struct i915_address_space *vm,
@@ -420,7 +422,6 @@ struct gen6_hw_ppgtt {
420 422
421 struct i915_vma *vma; 423 struct i915_vma *vma;
422 gen6_pte_t __iomem *pd_addr; 424 gen6_pte_t __iomem *pd_addr;
423 gen6_pte_t scratch_pte;
424 425
425 unsigned int pin_count; 426 unsigned int pin_count;
426 bool scan_for_unused_pt; 427 bool scan_for_unused_pt;
@@ -659,20 +660,20 @@ int i915_gem_gtt_insert(struct i915_address_space *vm,
659 u64 start, u64 end, unsigned int flags); 660 u64 start, u64 end, unsigned int flags);
660 661
661/* Flags used by pin/bind&friends. */ 662/* Flags used by pin/bind&friends. */
662#define PIN_NONBLOCK BIT(0) 663#define PIN_NONBLOCK BIT_ULL(0)
663#define PIN_MAPPABLE BIT(1) 664#define PIN_MAPPABLE BIT_ULL(1)
664#define PIN_ZONE_4G BIT(2) 665#define PIN_ZONE_4G BIT_ULL(2)
665#define PIN_NONFAULT BIT(3) 666#define PIN_NONFAULT BIT_ULL(3)
666#define PIN_NOEVICT BIT(4) 667#define PIN_NOEVICT BIT_ULL(4)
667 668
668#define PIN_MBZ BIT(5) /* I915_VMA_PIN_OVERFLOW */ 669#define PIN_MBZ BIT_ULL(5) /* I915_VMA_PIN_OVERFLOW */
669#define PIN_GLOBAL BIT(6) /* I915_VMA_GLOBAL_BIND */ 670#define PIN_GLOBAL BIT_ULL(6) /* I915_VMA_GLOBAL_BIND */
670#define PIN_USER BIT(7) /* I915_VMA_LOCAL_BIND */ 671#define PIN_USER BIT_ULL(7) /* I915_VMA_LOCAL_BIND */
671#define PIN_UPDATE BIT(8) 672#define PIN_UPDATE BIT_ULL(8)
672 673
673#define PIN_HIGH BIT(9) 674#define PIN_HIGH BIT_ULL(9)
674#define PIN_OFFSET_BIAS BIT(10) 675#define PIN_OFFSET_BIAS BIT_ULL(10)
675#define PIN_OFFSET_FIXED BIT(11) 676#define PIN_OFFSET_FIXED BIT_ULL(11)
676#define PIN_OFFSET_MASK (-I915_GTT_PAGE_SIZE) 677#define PIN_OFFSET_MASK (-I915_GTT_PAGE_SIZE)
677 678
678#endif 679#endif
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index 8762d17b6659..8123bf0e4807 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -27,7 +27,7 @@
27 * 27 *
28 */ 28 */
29 29
30#include <generated/utsrelease.h> 30#include <linux/utsname.h>
31#include <linux/stop_machine.h> 31#include <linux/stop_machine.h>
32#include <linux/zlib.h> 32#include <linux/zlib.h>
33#include <drm/drm_print.h> 33#include <drm/drm_print.h>
@@ -512,7 +512,7 @@ static void error_print_engine(struct drm_i915_error_state_buf *m,
512 err_printf(m, " SYNC_2: 0x%08x\n", 512 err_printf(m, " SYNC_2: 0x%08x\n",
513 ee->semaphore_mboxes[2]); 513 ee->semaphore_mboxes[2]);
514 } 514 }
515 if (USES_PPGTT(m->i915)) { 515 if (HAS_PPGTT(m->i915)) {
516 err_printf(m, " GFX_MODE: 0x%08x\n", ee->vm_info.gfx_mode); 516 err_printf(m, " GFX_MODE: 0x%08x\n", ee->vm_info.gfx_mode);
517 517
518 if (INTEL_GEN(m->i915) >= 8) { 518 if (INTEL_GEN(m->i915) >= 8) {
@@ -648,9 +648,12 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
648 return 0; 648 return 0;
649 } 649 }
650 650
651 if (IS_ERR(error))
652 return PTR_ERR(error);
653
651 if (*error->error_msg) 654 if (*error->error_msg)
652 err_printf(m, "%s\n", error->error_msg); 655 err_printf(m, "%s\n", error->error_msg);
653 err_printf(m, "Kernel: " UTS_RELEASE "\n"); 656 err_printf(m, "Kernel: %s\n", init_utsname()->release);
654 ts = ktime_to_timespec64(error->time); 657 ts = ktime_to_timespec64(error->time);
655 err_printf(m, "Time: %lld s %ld us\n", 658 err_printf(m, "Time: %lld s %ld us\n",
656 (s64)ts.tv_sec, ts.tv_nsec / NSEC_PER_USEC); 659 (s64)ts.tv_sec, ts.tv_nsec / NSEC_PER_USEC);
@@ -999,7 +1002,6 @@ i915_error_object_create(struct drm_i915_private *i915,
999 } 1002 }
1000 1003
1001 compress_fini(&compress, dst); 1004 compress_fini(&compress, dst);
1002 ggtt->vm.clear_range(&ggtt->vm, slot, PAGE_SIZE);
1003 return dst; 1005 return dst;
1004} 1006}
1005 1007
@@ -1268,7 +1270,7 @@ static void error_record_engine_registers(struct i915_gpu_state *error,
1268 ee->reset_count = i915_reset_engine_count(&dev_priv->gpu_error, 1270 ee->reset_count = i915_reset_engine_count(&dev_priv->gpu_error,
1269 engine); 1271 engine);
1270 1272
1271 if (USES_PPGTT(dev_priv)) { 1273 if (HAS_PPGTT(dev_priv)) {
1272 int i; 1274 int i;
1273 1275
1274 ee->vm_info.gfx_mode = I915_READ(RING_MODE_GEN7(engine)); 1276 ee->vm_info.gfx_mode = I915_READ(RING_MODE_GEN7(engine));
@@ -1785,6 +1787,14 @@ static unsigned long capture_find_epoch(const struct i915_gpu_state *error)
1785 return epoch; 1787 return epoch;
1786} 1788}
1787 1789
1790static void capture_finish(struct i915_gpu_state *error)
1791{
1792 struct i915_ggtt *ggtt = &error->i915->ggtt;
1793 const u64 slot = ggtt->error_capture.start;
1794
1795 ggtt->vm.clear_range(&ggtt->vm, slot, PAGE_SIZE);
1796}
1797
1788static int capture(void *data) 1798static int capture(void *data)
1789{ 1799{
1790 struct i915_gpu_state *error = data; 1800 struct i915_gpu_state *error = data;
@@ -1809,6 +1819,7 @@ static int capture(void *data)
1809 1819
1810 error->epoch = capture_find_epoch(error); 1820 error->epoch = capture_find_epoch(error);
1811 1821
1822 capture_finish(error);
1812 return 0; 1823 return 0;
1813} 1824}
1814 1825
@@ -1859,6 +1870,7 @@ void i915_capture_error_state(struct drm_i915_private *i915,
1859 error = i915_capture_gpu_state(i915); 1870 error = i915_capture_gpu_state(i915);
1860 if (!error) { 1871 if (!error) {
1861 DRM_DEBUG_DRIVER("out of memory, not capturing error state\n"); 1872 DRM_DEBUG_DRIVER("out of memory, not capturing error state\n");
1873 i915_disable_error_state(i915, -ENOMEM);
1862 return; 1874 return;
1863 } 1875 }
1864 1876
@@ -1914,5 +1926,14 @@ void i915_reset_error_state(struct drm_i915_private *i915)
1914 i915->gpu_error.first_error = NULL; 1926 i915->gpu_error.first_error = NULL;
1915 spin_unlock_irq(&i915->gpu_error.lock); 1927 spin_unlock_irq(&i915->gpu_error.lock);
1916 1928
1917 i915_gpu_state_put(error); 1929 if (!IS_ERR(error))
1930 i915_gpu_state_put(error);
1931}
1932
1933void i915_disable_error_state(struct drm_i915_private *i915, int err)
1934{
1935 spin_lock_irq(&i915->gpu_error.lock);
1936 if (!i915->gpu_error.first_error)
1937 i915->gpu_error.first_error = ERR_PTR(err);
1938 spin_unlock_irq(&i915->gpu_error.lock);
1918} 1939}
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.h b/drivers/gpu/drm/i915/i915_gpu_error.h
index 8710fb18ed74..3ec89a504de5 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.h
+++ b/drivers/gpu/drm/i915/i915_gpu_error.h
@@ -343,6 +343,7 @@ static inline void i915_gpu_state_put(struct i915_gpu_state *gpu)
343 343
344struct i915_gpu_state *i915_first_error_state(struct drm_i915_private *i915); 344struct i915_gpu_state *i915_first_error_state(struct drm_i915_private *i915);
345void i915_reset_error_state(struct drm_i915_private *i915); 345void i915_reset_error_state(struct drm_i915_private *i915);
346void i915_disable_error_state(struct drm_i915_private *i915, int err);
346 347
347#else 348#else
348 349
@@ -355,13 +356,18 @@ static inline void i915_capture_error_state(struct drm_i915_private *dev_priv,
355static inline struct i915_gpu_state * 356static inline struct i915_gpu_state *
356i915_first_error_state(struct drm_i915_private *i915) 357i915_first_error_state(struct drm_i915_private *i915)
357{ 358{
358 return NULL; 359 return ERR_PTR(-ENODEV);
359} 360}
360 361
361static inline void i915_reset_error_state(struct drm_i915_private *i915) 362static inline void i915_reset_error_state(struct drm_i915_private *i915)
362{ 363{
363} 364}
364 365
366static inline void i915_disable_error_state(struct drm_i915_private *i915,
367 int err)
368{
369}
370
365#endif /* IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR) */ 371#endif /* IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR) */
366 372
367#endif /* _I915_GPU_ERROR_H_ */ 373#endif /* _I915_GPU_ERROR_H_ */
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 2e242270e270..d447d7d508f4 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -2887,21 +2887,39 @@ gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
2887 return ret; 2887 return ret;
2888} 2888}
2889 2889
2890static inline u32 gen8_master_intr_disable(void __iomem * const regs)
2891{
2892 raw_reg_write(regs, GEN8_MASTER_IRQ, 0);
2893
2894 /*
2895 * Now with master disabled, get a sample of level indications
2896 * for this interrupt. Indications will be cleared on related acks.
2897 * New indications can and will light up during processing,
2898 * and will generate new interrupt after enabling master.
2899 */
2900 return raw_reg_read(regs, GEN8_MASTER_IRQ);
2901}
2902
2903static inline void gen8_master_intr_enable(void __iomem * const regs)
2904{
2905 raw_reg_write(regs, GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
2906}
2907
2890static irqreturn_t gen8_irq_handler(int irq, void *arg) 2908static irqreturn_t gen8_irq_handler(int irq, void *arg)
2891{ 2909{
2892 struct drm_i915_private *dev_priv = to_i915(arg); 2910 struct drm_i915_private *dev_priv = to_i915(arg);
2911 void __iomem * const regs = dev_priv->regs;
2893 u32 master_ctl; 2912 u32 master_ctl;
2894 u32 gt_iir[4]; 2913 u32 gt_iir[4];
2895 2914
2896 if (!intel_irqs_enabled(dev_priv)) 2915 if (!intel_irqs_enabled(dev_priv))
2897 return IRQ_NONE; 2916 return IRQ_NONE;
2898 2917
2899 master_ctl = I915_READ_FW(GEN8_MASTER_IRQ); 2918 master_ctl = gen8_master_intr_disable(regs);
2900 master_ctl &= ~GEN8_MASTER_IRQ_CONTROL; 2919 if (!master_ctl) {
2901 if (!master_ctl) 2920 gen8_master_intr_enable(regs);
2902 return IRQ_NONE; 2921 return IRQ_NONE;
2903 2922 }
2904 I915_WRITE_FW(GEN8_MASTER_IRQ, 0);
2905 2923
2906 /* Find, clear, then process each source of interrupt */ 2924 /* Find, clear, then process each source of interrupt */
2907 gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir); 2925 gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir);
@@ -2913,7 +2931,7 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
2913 enable_rpm_wakeref_asserts(dev_priv); 2931 enable_rpm_wakeref_asserts(dev_priv);
2914 } 2932 }
2915 2933
2916 I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL); 2934 gen8_master_intr_enable(regs);
2917 2935
2918 gen8_gt_irq_handler(dev_priv, master_ctl, gt_iir); 2936 gen8_gt_irq_handler(dev_priv, master_ctl, gt_iir);
2919 2937
@@ -3111,6 +3129,24 @@ gen11_gu_misc_irq_handler(struct drm_i915_private *dev_priv, const u32 iir)
3111 intel_opregion_asle_intr(dev_priv); 3129 intel_opregion_asle_intr(dev_priv);
3112} 3130}
3113 3131
3132static inline u32 gen11_master_intr_disable(void __iomem * const regs)
3133{
3134 raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, 0);
3135
3136 /*
3137 * Now with master disabled, get a sample of level indications
3138 * for this interrupt. Indications will be cleared on related acks.
3139 * New indications can and will light up during processing,
3140 * and will generate new interrupt after enabling master.
3141 */
3142 return raw_reg_read(regs, GEN11_GFX_MSTR_IRQ);
3143}
3144
3145static inline void gen11_master_intr_enable(void __iomem * const regs)
3146{
3147 raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, GEN11_MASTER_IRQ);
3148}
3149
3114static irqreturn_t gen11_irq_handler(int irq, void *arg) 3150static irqreturn_t gen11_irq_handler(int irq, void *arg)
3115{ 3151{
3116 struct drm_i915_private * const i915 = to_i915(arg); 3152 struct drm_i915_private * const i915 = to_i915(arg);
@@ -3121,13 +3157,11 @@ static irqreturn_t gen11_irq_handler(int irq, void *arg)
3121 if (!intel_irqs_enabled(i915)) 3157 if (!intel_irqs_enabled(i915))
3122 return IRQ_NONE; 3158 return IRQ_NONE;
3123 3159
3124 master_ctl = raw_reg_read(regs, GEN11_GFX_MSTR_IRQ); 3160 master_ctl = gen11_master_intr_disable(regs);
3125 master_ctl &= ~GEN11_MASTER_IRQ; 3161 if (!master_ctl) {
3126 if (!master_ctl) 3162 gen11_master_intr_enable(regs);
3127 return IRQ_NONE; 3163 return IRQ_NONE;
3128 3164 }
3129 /* Disable interrupts. */
3130 raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, 0);
3131 3165
3132 /* Find, clear, then process each source of interrupt. */ 3166 /* Find, clear, then process each source of interrupt. */
3133 gen11_gt_irq_handler(i915, master_ctl); 3167 gen11_gt_irq_handler(i915, master_ctl);
@@ -3147,8 +3181,7 @@ static irqreturn_t gen11_irq_handler(int irq, void *arg)
3147 3181
3148 gu_misc_iir = gen11_gu_misc_irq_ack(i915, master_ctl); 3182 gu_misc_iir = gen11_gu_misc_irq_ack(i915, master_ctl);
3149 3183
3150 /* Acknowledge and enable interrupts. */ 3184 gen11_master_intr_enable(regs);
3151 raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, GEN11_MASTER_IRQ | master_ctl);
3152 3185
3153 gen11_gu_misc_irq_handler(i915, gu_misc_iir); 3186 gen11_gu_misc_irq_handler(i915, gu_misc_iir);
3154 3187
@@ -3598,8 +3631,7 @@ static void gen8_irq_reset(struct drm_device *dev)
3598 struct drm_i915_private *dev_priv = to_i915(dev); 3631 struct drm_i915_private *dev_priv = to_i915(dev);
3599 int pipe; 3632 int pipe;
3600 3633
3601 I915_WRITE(GEN8_MASTER_IRQ, 0); 3634 gen8_master_intr_disable(dev_priv->regs);
3602 POSTING_READ(GEN8_MASTER_IRQ);
3603 3635
3604 gen8_gt_irq_reset(dev_priv); 3636 gen8_gt_irq_reset(dev_priv);
3605 3637
@@ -3641,13 +3673,15 @@ static void gen11_irq_reset(struct drm_device *dev)
3641 struct drm_i915_private *dev_priv = dev->dev_private; 3673 struct drm_i915_private *dev_priv = dev->dev_private;
3642 int pipe; 3674 int pipe;
3643 3675
3644 I915_WRITE(GEN11_GFX_MSTR_IRQ, 0); 3676 gen11_master_intr_disable(dev_priv->regs);
3645 POSTING_READ(GEN11_GFX_MSTR_IRQ);
3646 3677
3647 gen11_gt_irq_reset(dev_priv); 3678 gen11_gt_irq_reset(dev_priv);
3648 3679
3649 I915_WRITE(GEN11_DISPLAY_INT_CTL, 0); 3680 I915_WRITE(GEN11_DISPLAY_INT_CTL, 0);
3650 3681
3682 I915_WRITE(EDP_PSR_IMR, 0xffffffff);
3683 I915_WRITE(EDP_PSR_IIR, 0xffffffff);
3684
3651 for_each_pipe(dev_priv, pipe) 3685 for_each_pipe(dev_priv, pipe)
3652 if (intel_display_power_is_enabled(dev_priv, 3686 if (intel_display_power_is_enabled(dev_priv,
3653 POWER_DOMAIN_PIPE(pipe))) 3687 POWER_DOMAIN_PIPE(pipe)))
@@ -4244,8 +4278,7 @@ static int gen8_irq_postinstall(struct drm_device *dev)
4244 if (HAS_PCH_SPLIT(dev_priv)) 4278 if (HAS_PCH_SPLIT(dev_priv))
4245 ibx_irq_postinstall(dev); 4279 ibx_irq_postinstall(dev);
4246 4280
4247 I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL); 4281 gen8_master_intr_enable(dev_priv->regs);
4248 POSTING_READ(GEN8_MASTER_IRQ);
4249 4282
4250 return 0; 4283 return 0;
4251} 4284}
@@ -4307,8 +4340,7 @@ static int gen11_irq_postinstall(struct drm_device *dev)
4307 4340
4308 I915_WRITE(GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE); 4341 I915_WRITE(GEN11_DISPLAY_INT_CTL, GEN11_DISPLAY_IRQ_ENABLE);
4309 4342
4310 I915_WRITE(GEN11_GFX_MSTR_IRQ, GEN11_MASTER_IRQ); 4343 gen11_master_intr_enable(dev_priv->regs);
4311 POSTING_READ(GEN11_GFX_MSTR_IRQ);
4312 4344
4313 return 0; 4345 return 0;
4314} 4346}
@@ -4834,6 +4866,13 @@ void intel_irq_init(struct drm_i915_private *dev_priv)
4834 dev_priv->display_irqs_enabled = false; 4866 dev_priv->display_irqs_enabled = false;
4835 4867
4836 dev_priv->hotplug.hpd_storm_threshold = HPD_STORM_DEFAULT_THRESHOLD; 4868 dev_priv->hotplug.hpd_storm_threshold = HPD_STORM_DEFAULT_THRESHOLD;
4869 /* If we have MST support, we want to avoid doing short HPD IRQ storm
4870 * detection, as short HPD storms will occur as a natural part of
4871 * sideband messaging with MST.
4872 * On older platforms however, IRQ storms can occur with both long and
4873 * short pulses, as seen on some G4x systems.
4874 */
4875 dev_priv->hotplug.hpd_short_storm_enabled = !HAS_DP_MST(dev_priv);
4837 4876
4838 dev->driver->get_vblank_timestamp = drm_calc_vbltimestamp_from_scanoutpos; 4877 dev->driver->get_vblank_timestamp = drm_calc_vbltimestamp_from_scanoutpos;
4839 dev->driver->get_scanout_position = i915_get_crtc_scanoutpos; 4878 dev->driver->get_scanout_position = i915_get_crtc_scanoutpos;
diff --git a/drivers/gpu/drm/i915/i915_oa_bdw.c b/drivers/gpu/drm/i915/i915_oa_bdw.c
index 4abd2e8b5083..4acdb94555b7 100644
--- a/drivers/gpu/drm/i915/i915_oa_bdw.c
+++ b/drivers/gpu/drm/i915/i915_oa_bdw.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_bdw.h b/drivers/gpu/drm/i915/i915_oa_bdw.h
index b812d16162ac..0e667f1a8aa1 100644
--- a/drivers/gpu/drm/i915/i915_oa_bdw.h
+++ b/drivers/gpu/drm/i915/i915_oa_bdw.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_BDW_H__ 10#ifndef __I915_OA_BDW_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_bxt.c b/drivers/gpu/drm/i915/i915_oa_bxt.c
index cb6f304ec16a..a44195c39923 100644
--- a/drivers/gpu/drm/i915/i915_oa_bxt.c
+++ b/drivers/gpu/drm/i915/i915_oa_bxt.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_bxt.h b/drivers/gpu/drm/i915/i915_oa_bxt.h
index 690b963a2383..679e92cf4f1d 100644
--- a/drivers/gpu/drm/i915/i915_oa_bxt.h
+++ b/drivers/gpu/drm/i915/i915_oa_bxt.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_BXT_H__ 10#ifndef __I915_OA_BXT_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_cflgt2.c b/drivers/gpu/drm/i915/i915_oa_cflgt2.c
index 8641ae30e343..7f60d51b8761 100644
--- a/drivers/gpu/drm/i915/i915_oa_cflgt2.c
+++ b/drivers/gpu/drm/i915/i915_oa_cflgt2.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_cflgt2.h b/drivers/gpu/drm/i915/i915_oa_cflgt2.h
index 1f3268ef2ea2..4d6025559bbe 100644
--- a/drivers/gpu/drm/i915/i915_oa_cflgt2.h
+++ b/drivers/gpu/drm/i915/i915_oa_cflgt2.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_CFLGT2_H__ 10#ifndef __I915_OA_CFLGT2_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_cflgt3.c b/drivers/gpu/drm/i915/i915_oa_cflgt3.c
index 792facdb6702..a92c38e3a0ce 100644
--- a/drivers/gpu/drm/i915/i915_oa_cflgt3.c
+++ b/drivers/gpu/drm/i915/i915_oa_cflgt3.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_cflgt3.h b/drivers/gpu/drm/i915/i915_oa_cflgt3.h
index c13b5aac01b9..0697f4077402 100644
--- a/drivers/gpu/drm/i915/i915_oa_cflgt3.h
+++ b/drivers/gpu/drm/i915/i915_oa_cflgt3.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_CFLGT3_H__ 10#ifndef __I915_OA_CFLGT3_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_chv.c b/drivers/gpu/drm/i915/i915_oa_chv.c
index 556febb2c3c8..71ec889a0114 100644
--- a/drivers/gpu/drm/i915/i915_oa_chv.c
+++ b/drivers/gpu/drm/i915/i915_oa_chv.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_chv.h b/drivers/gpu/drm/i915/i915_oa_chv.h
index b9622496979e..0986eae3135f 100644
--- a/drivers/gpu/drm/i915/i915_oa_chv.h
+++ b/drivers/gpu/drm/i915/i915_oa_chv.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_CHV_H__ 10#ifndef __I915_OA_CHV_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_cnl.c b/drivers/gpu/drm/i915/i915_oa_cnl.c
index ba9140c87cc0..5c23d883d6c9 100644
--- a/drivers/gpu/drm/i915/i915_oa_cnl.c
+++ b/drivers/gpu/drm/i915/i915_oa_cnl.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_cnl.h b/drivers/gpu/drm/i915/i915_oa_cnl.h
index fb918b131105..e830a406aff2 100644
--- a/drivers/gpu/drm/i915/i915_oa_cnl.h
+++ b/drivers/gpu/drm/i915/i915_oa_cnl.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_CNL_H__ 10#ifndef __I915_OA_CNL_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_glk.c b/drivers/gpu/drm/i915/i915_oa_glk.c
index 971db587957c..4bdda66df7d2 100644
--- a/drivers/gpu/drm/i915/i915_oa_glk.c
+++ b/drivers/gpu/drm/i915/i915_oa_glk.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_glk.h b/drivers/gpu/drm/i915/i915_oa_glk.h
index 63bd113f4bc9..06dedf991edb 100644
--- a/drivers/gpu/drm/i915/i915_oa_glk.h
+++ b/drivers/gpu/drm/i915/i915_oa_glk.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_GLK_H__ 10#ifndef __I915_OA_GLK_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_hsw.c b/drivers/gpu/drm/i915/i915_oa_hsw.c
index 434a9b96d7ab..cc6526fdd2bd 100644
--- a/drivers/gpu/drm/i915/i915_oa_hsw.c
+++ b/drivers/gpu/drm/i915/i915_oa_hsw.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_hsw.h b/drivers/gpu/drm/i915/i915_oa_hsw.h
index 74d03439c157..3d0c870cd0bd 100644
--- a/drivers/gpu/drm/i915/i915_oa_hsw.h
+++ b/drivers/gpu/drm/i915/i915_oa_hsw.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_HSW_H__ 10#ifndef __I915_OA_HSW_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_icl.c b/drivers/gpu/drm/i915/i915_oa_icl.c
index a5667926e3de..baa51427a543 100644
--- a/drivers/gpu/drm/i915/i915_oa_icl.c
+++ b/drivers/gpu/drm/i915/i915_oa_icl.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_icl.h b/drivers/gpu/drm/i915/i915_oa_icl.h
index ae1c24aafe4f..24eaa97d61ba 100644
--- a/drivers/gpu/drm/i915/i915_oa_icl.h
+++ b/drivers/gpu/drm/i915/i915_oa_icl.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_ICL_H__ 10#ifndef __I915_OA_ICL_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_kblgt2.c b/drivers/gpu/drm/i915/i915_oa_kblgt2.c
index 2fa98a40bbc8..168e49ab0d4d 100644
--- a/drivers/gpu/drm/i915/i915_oa_kblgt2.c
+++ b/drivers/gpu/drm/i915/i915_oa_kblgt2.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_kblgt2.h b/drivers/gpu/drm/i915/i915_oa_kblgt2.h
index 25b803546dc1..a55398a904de 100644
--- a/drivers/gpu/drm/i915/i915_oa_kblgt2.h
+++ b/drivers/gpu/drm/i915/i915_oa_kblgt2.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_KBLGT2_H__ 10#ifndef __I915_OA_KBLGT2_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_kblgt3.c b/drivers/gpu/drm/i915/i915_oa_kblgt3.c
index f3cb6679a1bc..6ffa553c388e 100644
--- a/drivers/gpu/drm/i915/i915_oa_kblgt3.c
+++ b/drivers/gpu/drm/i915/i915_oa_kblgt3.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_kblgt3.h b/drivers/gpu/drm/i915/i915_oa_kblgt3.h
index d5b5b5c1923e..3ddd3483b7cc 100644
--- a/drivers/gpu/drm/i915/i915_oa_kblgt3.h
+++ b/drivers/gpu/drm/i915/i915_oa_kblgt3.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_KBLGT3_H__ 10#ifndef __I915_OA_KBLGT3_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_sklgt2.c b/drivers/gpu/drm/i915/i915_oa_sklgt2.c
index bf8b8cd8a50d..7ce6ee851d43 100644
--- a/drivers/gpu/drm/i915/i915_oa_sklgt2.c
+++ b/drivers/gpu/drm/i915/i915_oa_sklgt2.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_sklgt2.h b/drivers/gpu/drm/i915/i915_oa_sklgt2.h
index fe1aa2c03958..be6256037239 100644
--- a/drivers/gpu/drm/i915/i915_oa_sklgt2.h
+++ b/drivers/gpu/drm/i915/i915_oa_sklgt2.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_SKLGT2_H__ 10#ifndef __I915_OA_SKLGT2_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_sklgt3.c b/drivers/gpu/drm/i915/i915_oa_sklgt3.c
index ae534c7c8135..086ca2631e1c 100644
--- a/drivers/gpu/drm/i915/i915_oa_sklgt3.c
+++ b/drivers/gpu/drm/i915/i915_oa_sklgt3.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_sklgt3.h b/drivers/gpu/drm/i915/i915_oa_sklgt3.h
index 06746b2616c8..650beb068e56 100644
--- a/drivers/gpu/drm/i915/i915_oa_sklgt3.h
+++ b/drivers/gpu/drm/i915/i915_oa_sklgt3.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_SKLGT3_H__ 10#ifndef __I915_OA_SKLGT3_H__
diff --git a/drivers/gpu/drm/i915/i915_oa_sklgt4.c b/drivers/gpu/drm/i915/i915_oa_sklgt4.c
index 817fba2d82df..b291a6eb8a87 100644
--- a/drivers/gpu/drm/i915/i915_oa_sklgt4.c
+++ b/drivers/gpu/drm/i915/i915_oa_sklgt4.c
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#include <linux/sysfs.h> 10#include <linux/sysfs.h>
diff --git a/drivers/gpu/drm/i915/i915_oa_sklgt4.h b/drivers/gpu/drm/i915/i915_oa_sklgt4.h
index 944fd525c8b1..8dcf849d131e 100644
--- a/drivers/gpu/drm/i915/i915_oa_sklgt4.h
+++ b/drivers/gpu/drm/i915/i915_oa_sklgt4.h
@@ -1,29 +1,10 @@
1/* 1/*
2 * Autogenerated file by GPU Top : https://github.com/rib/gputop 2 * SPDX-License-Identifier: MIT
3 * DO NOT EDIT manually!
4 *
5 *
6 * Copyright (c) 2015 Intel Corporation
7 * 3 *
8 * Permission is hereby granted, free of charge, to any person obtaining a 4 * Copyright © 2018 Intel Corporation
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice (including the next
16 * paragraph) shall be included in all copies or substantial portions of the
17 * Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
25 * IN THE SOFTWARE.
26 * 5 *
6 * Autogenerated file by GPU Top : https://github.com/rib/gputop
7 * DO NOT EDIT manually!
27 */ 8 */
28 9
29#ifndef __I915_OA_SKLGT4_H__ 10#ifndef __I915_OA_SKLGT4_H__
diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
index 295e981e4a39..2e0356561839 100644
--- a/drivers/gpu/drm/i915/i915_params.c
+++ b/drivers/gpu/drm/i915/i915_params.c
@@ -82,10 +82,6 @@ i915_param_named_unsafe(enable_hangcheck, bool, 0644,
82 "WARNING: Disabling this can cause system wide hangs. " 82 "WARNING: Disabling this can cause system wide hangs. "
83 "(default: true)"); 83 "(default: true)");
84 84
85i915_param_named_unsafe(enable_ppgtt, int, 0400,
86 "Override PPGTT usage. "
87 "(-1=auto [default], 0=disabled, 1=aliasing, 2=full, 3=full with extended address space)");
88
89i915_param_named_unsafe(enable_psr, int, 0600, 85i915_param_named_unsafe(enable_psr, int, 0600,
90 "Enable PSR " 86 "Enable PSR "
91 "(0=disabled, 1=enabled) " 87 "(0=disabled, 1=enabled) "
@@ -171,8 +167,10 @@ i915_param_named_unsafe(inject_load_failure, uint, 0400,
171i915_param_named(enable_dpcd_backlight, bool, 0600, 167i915_param_named(enable_dpcd_backlight, bool, 0600,
172 "Enable support for DPCD backlight control (default:false)"); 168 "Enable support for DPCD backlight control (default:false)");
173 169
170#if IS_ENABLED(CONFIG_DRM_I915_GVT)
174i915_param_named(enable_gvt, bool, 0400, 171i915_param_named(enable_gvt, bool, 0400,
175 "Enable support for Intel GVT-g graphics virtualization host support(default:false)"); 172 "Enable support for Intel GVT-g graphics virtualization host support(default:false)");
173#endif
176 174
177static __always_inline void _print_param(struct drm_printer *p, 175static __always_inline void _print_param(struct drm_printer *p,
178 const char *name, 176 const char *name,
@@ -188,7 +186,8 @@ static __always_inline void _print_param(struct drm_printer *p,
188 else if (!__builtin_strcmp(type, "char *")) 186 else if (!__builtin_strcmp(type, "char *"))
189 drm_printf(p, "i915.%s=%s\n", name, *(const char **)x); 187 drm_printf(p, "i915.%s=%s\n", name, *(const char **)x);
190 else 188 else
191 BUILD_BUG(); 189 WARN_ONCE(1, "no printer defined for param type %s (i915.%s)\n",
190 type, name);
192} 191}
193 192
194/** 193/**
diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h
index 6c4d4a21474b..7e56c516c815 100644
--- a/drivers/gpu/drm/i915/i915_params.h
+++ b/drivers/gpu/drm/i915/i915_params.h
@@ -41,7 +41,6 @@ struct drm_printer;
41 param(int, vbt_sdvo_panel_type, -1) \ 41 param(int, vbt_sdvo_panel_type, -1) \
42 param(int, enable_dc, -1) \ 42 param(int, enable_dc, -1) \
43 param(int, enable_fbc, -1) \ 43 param(int, enable_fbc, -1) \
44 param(int, enable_ppgtt, -1) \
45 param(int, enable_psr, -1) \ 44 param(int, enable_psr, -1) \
46 param(int, disable_power_well, -1) \ 45 param(int, disable_power_well, -1) \
47 param(int, enable_ips, 1) \ 46 param(int, enable_ips, 1) \
diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c
index d6f7b9fe1d26..1b81d7cb209e 100644
--- a/drivers/gpu/drm/i915/i915_pci.c
+++ b/drivers/gpu/drm/i915/i915_pci.c
@@ -33,19 +33,30 @@
33#define GEN(x) .gen = (x), .gen_mask = BIT((x) - 1) 33#define GEN(x) .gen = (x), .gen_mask = BIT((x) - 1)
34 34
35#define GEN_DEFAULT_PIPEOFFSETS \ 35#define GEN_DEFAULT_PIPEOFFSETS \
36 .pipe_offsets = { PIPE_A_OFFSET, PIPE_B_OFFSET, \ 36 .pipe_offsets = { \
37 PIPE_C_OFFSET, PIPE_EDP_OFFSET }, \ 37 [TRANSCODER_A] = PIPE_A_OFFSET, \
38 .trans_offsets = { TRANSCODER_A_OFFSET, TRANSCODER_B_OFFSET, \ 38 [TRANSCODER_B] = PIPE_B_OFFSET, \
39 TRANSCODER_C_OFFSET, TRANSCODER_EDP_OFFSET }, \ 39 [TRANSCODER_C] = PIPE_C_OFFSET, \
40 .palette_offsets = { PALETTE_A_OFFSET, PALETTE_B_OFFSET } 40 [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
41 }, \
42 .trans_offsets = { \
43 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
44 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
45 [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
46 [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
47 }
41 48
42#define GEN_CHV_PIPEOFFSETS \ 49#define GEN_CHV_PIPEOFFSETS \
43 .pipe_offsets = { PIPE_A_OFFSET, PIPE_B_OFFSET, \ 50 .pipe_offsets = { \
44 CHV_PIPE_C_OFFSET }, \ 51 [TRANSCODER_A] = PIPE_A_OFFSET, \
45 .trans_offsets = { TRANSCODER_A_OFFSET, TRANSCODER_B_OFFSET, \ 52 [TRANSCODER_B] = PIPE_B_OFFSET, \
46 CHV_TRANSCODER_C_OFFSET, }, \ 53 [TRANSCODER_C] = CHV_PIPE_C_OFFSET, \
47 .palette_offsets = { PALETTE_A_OFFSET, PALETTE_B_OFFSET, \ 54 }, \
48 CHV_PALETTE_C_OFFSET } 55 .trans_offsets = { \
56 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
57 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
58 [TRANSCODER_C] = CHV_TRANSCODER_C_OFFSET, \
59 }
49 60
50#define CURSOR_OFFSETS \ 61#define CURSOR_OFFSETS \
51 .cursor_offsets = { CURSOR_A_OFFSET, CURSOR_B_OFFSET, CHV_CURSOR_C_OFFSET } 62 .cursor_offsets = { CURSOR_A_OFFSET, CURSOR_B_OFFSET, CHV_CURSOR_C_OFFSET }
@@ -252,7 +263,7 @@ static const struct intel_device_info intel_ironlake_m_info = {
252 .has_llc = 1, \ 263 .has_llc = 1, \
253 .has_rc6 = 1, \ 264 .has_rc6 = 1, \
254 .has_rc6p = 1, \ 265 .has_rc6p = 1, \
255 .has_aliasing_ppgtt = 1, \ 266 .ppgtt = INTEL_PPGTT_ALIASING, \
256 GEN_DEFAULT_PIPEOFFSETS, \ 267 GEN_DEFAULT_PIPEOFFSETS, \
257 GEN_DEFAULT_PAGE_SIZES, \ 268 GEN_DEFAULT_PAGE_SIZES, \
258 CURSOR_OFFSETS 269 CURSOR_OFFSETS
@@ -297,8 +308,7 @@ static const struct intel_device_info intel_sandybridge_m_gt2_info = {
297 .has_llc = 1, \ 308 .has_llc = 1, \
298 .has_rc6 = 1, \ 309 .has_rc6 = 1, \
299 .has_rc6p = 1, \ 310 .has_rc6p = 1, \
300 .has_aliasing_ppgtt = 1, \ 311 .ppgtt = INTEL_PPGTT_FULL, \
301 .has_full_ppgtt = 1, \
302 GEN_DEFAULT_PIPEOFFSETS, \ 312 GEN_DEFAULT_PIPEOFFSETS, \
303 GEN_DEFAULT_PAGE_SIZES, \ 313 GEN_DEFAULT_PAGE_SIZES, \
304 IVB_CURSOR_OFFSETS 314 IVB_CURSOR_OFFSETS
@@ -351,8 +361,7 @@ static const struct intel_device_info intel_valleyview_info = {
351 .has_rc6 = 1, 361 .has_rc6 = 1,
352 .has_gmch_display = 1, 362 .has_gmch_display = 1,
353 .has_hotplug = 1, 363 .has_hotplug = 1,
354 .has_aliasing_ppgtt = 1, 364 .ppgtt = INTEL_PPGTT_FULL,
355 .has_full_ppgtt = 1,
356 .has_snoop = true, 365 .has_snoop = true,
357 .has_coherent_ggtt = false, 366 .has_coherent_ggtt = false,
358 .ring_mask = RENDER_RING | BSD_RING | BLT_RING, 367 .ring_mask = RENDER_RING | BSD_RING | BLT_RING,
@@ -399,7 +408,7 @@ static const struct intel_device_info intel_haswell_gt3_info = {
399 .page_sizes = I915_GTT_PAGE_SIZE_4K | \ 408 .page_sizes = I915_GTT_PAGE_SIZE_4K | \
400 I915_GTT_PAGE_SIZE_2M, \ 409 I915_GTT_PAGE_SIZE_2M, \
401 .has_logical_ring_contexts = 1, \ 410 .has_logical_ring_contexts = 1, \
402 .has_full_48bit_ppgtt = 1, \ 411 .ppgtt = INTEL_PPGTT_FULL_4LVL, \
403 .has_64bit_reloc = 1, \ 412 .has_64bit_reloc = 1, \
404 .has_reset_engine = 1 413 .has_reset_engine = 1
405 414
@@ -443,8 +452,7 @@ static const struct intel_device_info intel_cherryview_info = {
443 .has_rc6 = 1, 452 .has_rc6 = 1,
444 .has_logical_ring_contexts = 1, 453 .has_logical_ring_contexts = 1,
445 .has_gmch_display = 1, 454 .has_gmch_display = 1,
446 .has_aliasing_ppgtt = 1, 455 .ppgtt = INTEL_PPGTT_FULL,
447 .has_full_ppgtt = 1,
448 .has_reset_engine = 1, 456 .has_reset_engine = 1,
449 .has_snoop = true, 457 .has_snoop = true,
450 .has_coherent_ggtt = false, 458 .has_coherent_ggtt = false,
@@ -472,6 +480,8 @@ static const struct intel_device_info intel_cherryview_info = {
472 480
473#define SKL_PLATFORM \ 481#define SKL_PLATFORM \
474 GEN9_FEATURES, \ 482 GEN9_FEATURES, \
483 /* Display WA #0477 WaDisableIPC: skl */ \
484 .has_ipc = 0, \
475 PLATFORM(INTEL_SKYLAKE) 485 PLATFORM(INTEL_SKYLAKE)
476 486
477static const struct intel_device_info intel_skylake_gt1_info = { 487static const struct intel_device_info intel_skylake_gt1_info = {
@@ -518,9 +528,7 @@ static const struct intel_device_info intel_skylake_gt4_info = {
518 .has_logical_ring_contexts = 1, \ 528 .has_logical_ring_contexts = 1, \
519 .has_logical_ring_preemption = 1, \ 529 .has_logical_ring_preemption = 1, \
520 .has_guc = 1, \ 530 .has_guc = 1, \
521 .has_aliasing_ppgtt = 1, \ 531 .ppgtt = INTEL_PPGTT_FULL_4LVL, \
522 .has_full_ppgtt = 1, \
523 .has_full_48bit_ppgtt = 1, \
524 .has_reset_engine = 1, \ 532 .has_reset_engine = 1, \
525 .has_snoop = true, \ 533 .has_snoop = true, \
526 .has_coherent_ggtt = false, \ 534 .has_coherent_ggtt = false, \
@@ -598,6 +606,22 @@ static const struct intel_device_info intel_cannonlake_info = {
598 606
599#define GEN11_FEATURES \ 607#define GEN11_FEATURES \
600 GEN10_FEATURES, \ 608 GEN10_FEATURES, \
609 .pipe_offsets = { \
610 [TRANSCODER_A] = PIPE_A_OFFSET, \
611 [TRANSCODER_B] = PIPE_B_OFFSET, \
612 [TRANSCODER_C] = PIPE_C_OFFSET, \
613 [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
614 [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
615 [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
616 }, \
617 .trans_offsets = { \
618 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
619 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
620 [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
621 [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
622 [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
623 [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
624 }, \
601 GEN(11), \ 625 GEN(11), \
602 .ddb_size = 2048, \ 626 .ddb_size = 2048, \
603 .has_logical_ring_elsq = 1 627 .has_logical_ring_elsq = 1
@@ -663,7 +687,7 @@ static const struct pci_device_id pciidlist[] = {
663 INTEL_KBL_GT2_IDS(&intel_kabylake_gt2_info), 687 INTEL_KBL_GT2_IDS(&intel_kabylake_gt2_info),
664 INTEL_KBL_GT3_IDS(&intel_kabylake_gt3_info), 688 INTEL_KBL_GT3_IDS(&intel_kabylake_gt3_info),
665 INTEL_KBL_GT4_IDS(&intel_kabylake_gt3_info), 689 INTEL_KBL_GT4_IDS(&intel_kabylake_gt3_info),
666 INTEL_AML_GT2_IDS(&intel_kabylake_gt2_info), 690 INTEL_AML_KBL_GT2_IDS(&intel_kabylake_gt2_info),
667 INTEL_CFL_S_GT1_IDS(&intel_coffeelake_gt1_info), 691 INTEL_CFL_S_GT1_IDS(&intel_coffeelake_gt1_info),
668 INTEL_CFL_S_GT2_IDS(&intel_coffeelake_gt2_info), 692 INTEL_CFL_S_GT2_IDS(&intel_coffeelake_gt2_info),
669 INTEL_CFL_H_GT2_IDS(&intel_coffeelake_gt2_info), 693 INTEL_CFL_H_GT2_IDS(&intel_coffeelake_gt2_info),
@@ -671,6 +695,7 @@ static const struct pci_device_id pciidlist[] = {
671 INTEL_CFL_U_GT3_IDS(&intel_coffeelake_gt3_info), 695 INTEL_CFL_U_GT3_IDS(&intel_coffeelake_gt3_info),
672 INTEL_WHL_U_GT1_IDS(&intel_coffeelake_gt1_info), 696 INTEL_WHL_U_GT1_IDS(&intel_coffeelake_gt1_info),
673 INTEL_WHL_U_GT2_IDS(&intel_coffeelake_gt2_info), 697 INTEL_WHL_U_GT2_IDS(&intel_coffeelake_gt2_info),
698 INTEL_AML_CFL_GT2_IDS(&intel_coffeelake_gt2_info),
674 INTEL_WHL_U_GT3_IDS(&intel_coffeelake_gt3_info), 699 INTEL_WHL_U_GT3_IDS(&intel_coffeelake_gt3_info),
675 INTEL_CNL_IDS(&intel_cannonlake_info), 700 INTEL_CNL_IDS(&intel_cannonlake_info),
676 INTEL_ICL_11_IDS(&intel_icelake_11_info), 701 INTEL_ICL_11_IDS(&intel_icelake_11_info),
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 664b96bb65a3..4529edfdcfc8 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -890,8 +890,8 @@ static int gen8_oa_read(struct i915_perf_stream *stream,
890 DRM_DEBUG("OA buffer overflow (exponent = %d): force restart\n", 890 DRM_DEBUG("OA buffer overflow (exponent = %d): force restart\n",
891 dev_priv->perf.oa.period_exponent); 891 dev_priv->perf.oa.period_exponent);
892 892
893 dev_priv->perf.oa.ops.oa_disable(dev_priv); 893 dev_priv->perf.oa.ops.oa_disable(stream);
894 dev_priv->perf.oa.ops.oa_enable(dev_priv); 894 dev_priv->perf.oa.ops.oa_enable(stream);
895 895
896 /* 896 /*
897 * Note: .oa_enable() is expected to re-init the oabuffer and 897 * Note: .oa_enable() is expected to re-init the oabuffer and
@@ -1114,8 +1114,8 @@ static int gen7_oa_read(struct i915_perf_stream *stream,
1114 DRM_DEBUG("OA buffer overflow (exponent = %d): force restart\n", 1114 DRM_DEBUG("OA buffer overflow (exponent = %d): force restart\n",
1115 dev_priv->perf.oa.period_exponent); 1115 dev_priv->perf.oa.period_exponent);
1116 1116
1117 dev_priv->perf.oa.ops.oa_disable(dev_priv); 1117 dev_priv->perf.oa.ops.oa_disable(stream);
1118 dev_priv->perf.oa.ops.oa_enable(dev_priv); 1118 dev_priv->perf.oa.ops.oa_enable(stream);
1119 1119
1120 oastatus1 = I915_READ(GEN7_OASTATUS1); 1120 oastatus1 = I915_READ(GEN7_OASTATUS1);
1121 } 1121 }
@@ -1528,8 +1528,6 @@ static int alloc_oa_buffer(struct drm_i915_private *dev_priv)
1528 goto err_unpin; 1528 goto err_unpin;
1529 } 1529 }
1530 1530
1531 dev_priv->perf.oa.ops.init_oa_buffer(dev_priv);
1532
1533 DRM_DEBUG_DRIVER("OA Buffer initialized, gtt offset = 0x%x, vaddr = %p\n", 1531 DRM_DEBUG_DRIVER("OA Buffer initialized, gtt offset = 0x%x, vaddr = %p\n",
1534 i915_ggtt_offset(dev_priv->perf.oa.oa_buffer.vma), 1532 i915_ggtt_offset(dev_priv->perf.oa.oa_buffer.vma),
1535 dev_priv->perf.oa.oa_buffer.vaddr); 1533 dev_priv->perf.oa.oa_buffer.vaddr);
@@ -1563,9 +1561,11 @@ static void config_oa_regs(struct drm_i915_private *dev_priv,
1563 } 1561 }
1564} 1562}
1565 1563
1566static int hsw_enable_metric_set(struct drm_i915_private *dev_priv, 1564static int hsw_enable_metric_set(struct i915_perf_stream *stream)
1567 const struct i915_oa_config *oa_config)
1568{ 1565{
1566 struct drm_i915_private *dev_priv = stream->dev_priv;
1567 const struct i915_oa_config *oa_config = stream->oa_config;
1568
1569 /* PRM: 1569 /* PRM:
1570 * 1570 *
1571 * OA unit is using “crclk” for its functionality. When trunk 1571 * OA unit is using “crclk” for its functionality. When trunk
@@ -1767,9 +1767,10 @@ static int gen8_configure_all_contexts(struct drm_i915_private *dev_priv,
1767 return 0; 1767 return 0;
1768} 1768}
1769 1769
1770static int gen8_enable_metric_set(struct drm_i915_private *dev_priv, 1770static int gen8_enable_metric_set(struct i915_perf_stream *stream)
1771 const struct i915_oa_config *oa_config)
1772{ 1771{
1772 struct drm_i915_private *dev_priv = stream->dev_priv;
1773 const struct i915_oa_config *oa_config = stream->oa_config;
1773 int ret; 1774 int ret;
1774 1775
1775 /* 1776 /*
@@ -1837,10 +1838,10 @@ static void gen10_disable_metric_set(struct drm_i915_private *dev_priv)
1837 I915_READ(RPM_CONFIG1) & ~GEN10_GT_NOA_ENABLE); 1838 I915_READ(RPM_CONFIG1) & ~GEN10_GT_NOA_ENABLE);
1838} 1839}
1839 1840
1840static void gen7_oa_enable(struct drm_i915_private *dev_priv) 1841static void gen7_oa_enable(struct i915_perf_stream *stream)
1841{ 1842{
1842 struct i915_gem_context *ctx = 1843 struct drm_i915_private *dev_priv = stream->dev_priv;
1843 dev_priv->perf.oa.exclusive_stream->ctx; 1844 struct i915_gem_context *ctx = stream->ctx;
1844 u32 ctx_id = dev_priv->perf.oa.specific_ctx_id; 1845 u32 ctx_id = dev_priv->perf.oa.specific_ctx_id;
1845 bool periodic = dev_priv->perf.oa.periodic; 1846 bool periodic = dev_priv->perf.oa.periodic;
1846 u32 period_exponent = dev_priv->perf.oa.period_exponent; 1847 u32 period_exponent = dev_priv->perf.oa.period_exponent;
@@ -1867,8 +1868,9 @@ static void gen7_oa_enable(struct drm_i915_private *dev_priv)
1867 GEN7_OACONTROL_ENABLE); 1868 GEN7_OACONTROL_ENABLE);
1868} 1869}
1869 1870
1870static void gen8_oa_enable(struct drm_i915_private *dev_priv) 1871static void gen8_oa_enable(struct i915_perf_stream *stream)
1871{ 1872{
1873 struct drm_i915_private *dev_priv = stream->dev_priv;
1872 u32 report_format = dev_priv->perf.oa.oa_buffer.format; 1874 u32 report_format = dev_priv->perf.oa.oa_buffer.format;
1873 1875
1874 /* 1876 /*
@@ -1905,7 +1907,7 @@ static void i915_oa_stream_enable(struct i915_perf_stream *stream)
1905{ 1907{
1906 struct drm_i915_private *dev_priv = stream->dev_priv; 1908 struct drm_i915_private *dev_priv = stream->dev_priv;
1907 1909
1908 dev_priv->perf.oa.ops.oa_enable(dev_priv); 1910 dev_priv->perf.oa.ops.oa_enable(stream);
1909 1911
1910 if (dev_priv->perf.oa.periodic) 1912 if (dev_priv->perf.oa.periodic)
1911 hrtimer_start(&dev_priv->perf.oa.poll_check_timer, 1913 hrtimer_start(&dev_priv->perf.oa.poll_check_timer,
@@ -1913,8 +1915,10 @@ static void i915_oa_stream_enable(struct i915_perf_stream *stream)
1913 HRTIMER_MODE_REL_PINNED); 1915 HRTIMER_MODE_REL_PINNED);
1914} 1916}
1915 1917
1916static void gen7_oa_disable(struct drm_i915_private *dev_priv) 1918static void gen7_oa_disable(struct i915_perf_stream *stream)
1917{ 1919{
1920 struct drm_i915_private *dev_priv = stream->dev_priv;
1921
1918 I915_WRITE(GEN7_OACONTROL, 0); 1922 I915_WRITE(GEN7_OACONTROL, 0);
1919 if (intel_wait_for_register(dev_priv, 1923 if (intel_wait_for_register(dev_priv,
1920 GEN7_OACONTROL, GEN7_OACONTROL_ENABLE, 0, 1924 GEN7_OACONTROL, GEN7_OACONTROL_ENABLE, 0,
@@ -1922,8 +1926,10 @@ static void gen7_oa_disable(struct drm_i915_private *dev_priv)
1922 DRM_ERROR("wait for OA to be disabled timed out\n"); 1926 DRM_ERROR("wait for OA to be disabled timed out\n");
1923} 1927}
1924 1928
1925static void gen8_oa_disable(struct drm_i915_private *dev_priv) 1929static void gen8_oa_disable(struct i915_perf_stream *stream)
1926{ 1930{
1931 struct drm_i915_private *dev_priv = stream->dev_priv;
1932
1927 I915_WRITE(GEN8_OACONTROL, 0); 1933 I915_WRITE(GEN8_OACONTROL, 0);
1928 if (intel_wait_for_register(dev_priv, 1934 if (intel_wait_for_register(dev_priv,
1929 GEN8_OACONTROL, GEN8_OA_COUNTER_ENABLE, 0, 1935 GEN8_OACONTROL, GEN8_OA_COUNTER_ENABLE, 0,
@@ -1943,7 +1949,7 @@ static void i915_oa_stream_disable(struct i915_perf_stream *stream)
1943{ 1949{
1944 struct drm_i915_private *dev_priv = stream->dev_priv; 1950 struct drm_i915_private *dev_priv = stream->dev_priv;
1945 1951
1946 dev_priv->perf.oa.ops.oa_disable(dev_priv); 1952 dev_priv->perf.oa.ops.oa_disable(stream);
1947 1953
1948 if (dev_priv->perf.oa.periodic) 1954 if (dev_priv->perf.oa.periodic)
1949 hrtimer_cancel(&dev_priv->perf.oa.poll_check_timer); 1955 hrtimer_cancel(&dev_priv->perf.oa.poll_check_timer);
@@ -1998,7 +2004,7 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
1998 return -EINVAL; 2004 return -EINVAL;
1999 } 2005 }
2000 2006
2001 if (!dev_priv->perf.oa.ops.init_oa_buffer) { 2007 if (!dev_priv->perf.oa.ops.enable_metric_set) {
2002 DRM_DEBUG("OA unit not supported\n"); 2008 DRM_DEBUG("OA unit not supported\n");
2003 return -ENODEV; 2009 return -ENODEV;
2004 } 2010 }
@@ -2092,8 +2098,7 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
2092 if (ret) 2098 if (ret)
2093 goto err_lock; 2099 goto err_lock;
2094 2100
2095 ret = dev_priv->perf.oa.ops.enable_metric_set(dev_priv, 2101 ret = dev_priv->perf.oa.ops.enable_metric_set(stream);
2096 stream->oa_config);
2097 if (ret) { 2102 if (ret) {
2098 DRM_DEBUG("Unable to enable metric set\n"); 2103 DRM_DEBUG("Unable to enable metric set\n");
2099 goto err_enable; 2104 goto err_enable;
@@ -3387,7 +3392,6 @@ void i915_perf_init(struct drm_i915_private *dev_priv)
3387 dev_priv->perf.oa.ops.is_valid_mux_reg = 3392 dev_priv->perf.oa.ops.is_valid_mux_reg =
3388 hsw_is_valid_mux_addr; 3393 hsw_is_valid_mux_addr;
3389 dev_priv->perf.oa.ops.is_valid_flex_reg = NULL; 3394 dev_priv->perf.oa.ops.is_valid_flex_reg = NULL;
3390 dev_priv->perf.oa.ops.init_oa_buffer = gen7_init_oa_buffer;
3391 dev_priv->perf.oa.ops.enable_metric_set = hsw_enable_metric_set; 3395 dev_priv->perf.oa.ops.enable_metric_set = hsw_enable_metric_set;
3392 dev_priv->perf.oa.ops.disable_metric_set = hsw_disable_metric_set; 3396 dev_priv->perf.oa.ops.disable_metric_set = hsw_disable_metric_set;
3393 dev_priv->perf.oa.ops.oa_enable = gen7_oa_enable; 3397 dev_priv->perf.oa.ops.oa_enable = gen7_oa_enable;
@@ -3406,7 +3410,6 @@ void i915_perf_init(struct drm_i915_private *dev_priv)
3406 */ 3410 */
3407 dev_priv->perf.oa.oa_formats = gen8_plus_oa_formats; 3411 dev_priv->perf.oa.oa_formats = gen8_plus_oa_formats;
3408 3412
3409 dev_priv->perf.oa.ops.init_oa_buffer = gen8_init_oa_buffer;
3410 dev_priv->perf.oa.ops.oa_enable = gen8_oa_enable; 3413 dev_priv->perf.oa.ops.oa_enable = gen8_oa_enable;
3411 dev_priv->perf.oa.ops.oa_disable = gen8_oa_disable; 3414 dev_priv->perf.oa.ops.oa_disable = gen8_oa_disable;
3412 dev_priv->perf.oa.ops.read = gen8_oa_read; 3415 dev_priv->perf.oa.ops.read = gen8_oa_read;
diff --git a/drivers/gpu/drm/i915/i915_query.c b/drivers/gpu/drm/i915/i915_query.c
index 3f502eef2431..6fc4b8eeab42 100644
--- a/drivers/gpu/drm/i915/i915_query.c
+++ b/drivers/gpu/drm/i915/i915_query.c
@@ -27,8 +27,7 @@ static int query_topology_info(struct drm_i915_private *dev_priv,
27 27
28 slice_length = sizeof(sseu->slice_mask); 28 slice_length = sizeof(sseu->slice_mask);
29 subslice_length = sseu->max_slices * 29 subslice_length = sseu->max_slices *
30 DIV_ROUND_UP(sseu->max_subslices, 30 DIV_ROUND_UP(sseu->max_subslices, BITS_PER_BYTE);
31 sizeof(sseu->subslice_mask[0]) * BITS_PER_BYTE);
32 eu_length = sseu->max_slices * sseu->max_subslices * 31 eu_length = sseu->max_slices * sseu->max_subslices *
33 DIV_ROUND_UP(sseu->max_eus_per_subslice, BITS_PER_BYTE); 32 DIV_ROUND_UP(sseu->max_eus_per_subslice, BITS_PER_BYTE);
34 33
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 7c491ea3d052..47baf2fe8f71 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -157,20 +157,37 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
157/* 157/*
158 * Named helper wrappers around _PICK_EVEN() and _PICK(). 158 * Named helper wrappers around _PICK_EVEN() and _PICK().
159 */ 159 */
160#define _PIPE(pipe, a, b) _PICK_EVEN(pipe, a, b) 160#define _PIPE(pipe, a, b) _PICK_EVEN(pipe, a, b)
161#define _MMIO_PIPE(pipe, a, b) _MMIO(_PIPE(pipe, a, b)) 161#define _PLANE(plane, a, b) _PICK_EVEN(plane, a, b)
162#define _PLANE(plane, a, b) _PICK_EVEN(plane, a, b) 162#define _TRANS(tran, a, b) _PICK_EVEN(tran, a, b)
163#define _MMIO_PLANE(plane, a, b) _MMIO_PIPE(plane, a, b) 163#define _PORT(port, a, b) _PICK_EVEN(port, a, b)
164#define _TRANS(tran, a, b) _PICK_EVEN(tran, a, b) 164#define _PLL(pll, a, b) _PICK_EVEN(pll, a, b)
165#define _MMIO_TRANS(tran, a, b) _MMIO(_TRANS(tran, a, b)) 165
166#define _PORT(port, a, b) _PICK_EVEN(port, a, b) 166#define _MMIO_PIPE(pipe, a, b) _MMIO(_PIPE(pipe, a, b))
167#define _MMIO_PORT(port, a, b) _MMIO(_PORT(port, a, b)) 167#define _MMIO_PLANE(plane, a, b) _MMIO(_PLANE(plane, a, b))
168#define _MMIO_PIPE3(pipe, a, b, c) _MMIO(_PICK(pipe, a, b, c)) 168#define _MMIO_TRANS(tran, a, b) _MMIO(_TRANS(tran, a, b))
169#define _MMIO_PORT3(pipe, a, b, c) _MMIO(_PICK(pipe, a, b, c)) 169#define _MMIO_PORT(port, a, b) _MMIO(_PORT(port, a, b))
170#define _PLL(pll, a, b) _PICK_EVEN(pll, a, b) 170#define _MMIO_PLL(pll, a, b) _MMIO(_PLL(pll, a, b))
171#define _MMIO_PLL(pll, a, b) _MMIO(_PLL(pll, a, b)) 171
172#define _PHY3(phy, ...) _PICK(phy, __VA_ARGS__) 172#define _PHY3(phy, ...) _PICK(phy, __VA_ARGS__)
173#define _MMIO_PHY3(phy, a, b, c) _MMIO(_PHY3(phy, a, b, c)) 173
174#define _MMIO_PIPE3(pipe, a, b, c) _MMIO(_PICK(pipe, a, b, c))
175#define _MMIO_PORT3(pipe, a, b, c) _MMIO(_PICK(pipe, a, b, c))
176#define _MMIO_PHY3(phy, a, b, c) _MMIO(_PHY3(phy, a, b, c))
177
178/*
179 * Device info offset array based helpers for groups of registers with unevenly
180 * spaced base offsets.
181 */
182#define _MMIO_PIPE2(pipe, reg) _MMIO(dev_priv->info.pipe_offsets[pipe] - \
183 dev_priv->info.pipe_offsets[PIPE_A] + (reg) + \
184 dev_priv->info.display_mmio_offset)
185#define _MMIO_TRANS2(pipe, reg) _MMIO(dev_priv->info.trans_offsets[(pipe)] - \
186 dev_priv->info.trans_offsets[TRANSCODER_A] + (reg) + \
187 dev_priv->info.display_mmio_offset)
188#define _CURSOR2(pipe, reg) _MMIO(dev_priv->info.cursor_offsets[(pipe)] - \
189 dev_priv->info.cursor_offsets[PIPE_A] + (reg) + \
190 dev_priv->info.display_mmio_offset)
174 191
175#define __MASKED_FIELD(mask, value) ((mask) << 16 | (value)) 192#define __MASKED_FIELD(mask, value) ((mask) << 16 | (value))
176#define _MASKED_FIELD(mask, value) ({ \ 193#define _MASKED_FIELD(mask, value) ({ \
@@ -1631,35 +1648,6 @@ enum i915_power_well_id {
1631#define PHY_RESERVED (1 << 7) 1648#define PHY_RESERVED (1 << 7)
1632#define BXT_PORT_CL1CM_DW0(phy) _BXT_PHY((phy), _PORT_CL1CM_DW0_BC) 1649#define BXT_PORT_CL1CM_DW0(phy) _BXT_PHY((phy), _PORT_CL1CM_DW0_BC)
1633 1650
1634#define CNL_PORT_CL1CM_DW5 _MMIO(0x162014)
1635#define CL_POWER_DOWN_ENABLE (1 << 4)
1636#define SUS_CLOCK_CONFIG (3 << 0)
1637
1638#define _ICL_PORT_CL_DW5_A 0x162014
1639#define _ICL_PORT_CL_DW5_B 0x6C014
1640#define ICL_PORT_CL_DW5(port) _MMIO_PORT(port, _ICL_PORT_CL_DW5_A, \
1641 _ICL_PORT_CL_DW5_B)
1642
1643#define _CNL_PORT_CL_DW10_A 0x162028
1644#define _ICL_PORT_CL_DW10_B 0x6c028
1645#define ICL_PORT_CL_DW10(port) _MMIO_PORT(port, \
1646 _CNL_PORT_CL_DW10_A, \
1647 _ICL_PORT_CL_DW10_B)
1648#define PG_SEQ_DELAY_OVERRIDE_MASK (3 << 25)
1649#define PG_SEQ_DELAY_OVERRIDE_SHIFT 25
1650#define PG_SEQ_DELAY_OVERRIDE_ENABLE (1 << 24)
1651#define PWR_UP_ALL_LANES (0x0 << 4)
1652#define PWR_DOWN_LN_3_2_1 (0xe << 4)
1653#define PWR_DOWN_LN_3_2 (0xc << 4)
1654#define PWR_DOWN_LN_3 (0x8 << 4)
1655#define PWR_DOWN_LN_2_1_0 (0x7 << 4)
1656#define PWR_DOWN_LN_1_0 (0x3 << 4)
1657#define PWR_DOWN_LN_1 (0x2 << 4)
1658#define PWR_DOWN_LN_3_1 (0xa << 4)
1659#define PWR_DOWN_LN_3_1_0 (0xb << 4)
1660#define PWR_DOWN_LN_MASK (0xf << 4)
1661#define PWR_DOWN_LN_SHIFT 4
1662
1663#define _PORT_CL1CM_DW9_A 0x162024 1651#define _PORT_CL1CM_DW9_A 0x162024
1664#define _PORT_CL1CM_DW9_BC 0x6C024 1652#define _PORT_CL1CM_DW9_BC 0x6C024
1665#define IREF0RC_OFFSET_SHIFT 8 1653#define IREF0RC_OFFSET_SHIFT 8
@@ -1672,13 +1660,6 @@ enum i915_power_well_id {
1672#define IREF1RC_OFFSET_MASK (0xFF << IREF1RC_OFFSET_SHIFT) 1660#define IREF1RC_OFFSET_MASK (0xFF << IREF1RC_OFFSET_SHIFT)
1673#define BXT_PORT_CL1CM_DW10(phy) _BXT_PHY((phy), _PORT_CL1CM_DW10_BC) 1661#define BXT_PORT_CL1CM_DW10(phy) _BXT_PHY((phy), _PORT_CL1CM_DW10_BC)
1674 1662
1675#define _ICL_PORT_CL_DW12_A 0x162030
1676#define _ICL_PORT_CL_DW12_B 0x6C030
1677#define ICL_LANE_ENABLE_AUX (1 << 0)
1678#define ICL_PORT_CL_DW12(port) _MMIO_PORT((port), \
1679 _ICL_PORT_CL_DW12_A, \
1680 _ICL_PORT_CL_DW12_B)
1681
1682#define _PORT_CL1CM_DW28_A 0x162070 1663#define _PORT_CL1CM_DW28_A 0x162070
1683#define _PORT_CL1CM_DW28_BC 0x6C070 1664#define _PORT_CL1CM_DW28_BC 0x6C070
1684#define OCL1_POWER_DOWN_EN (1 << 23) 1665#define OCL1_POWER_DOWN_EN (1 << 23)
@@ -1691,6 +1672,74 @@ enum i915_power_well_id {
1691#define OCL2_LDOFUSE_PWR_DIS (1 << 6) 1672#define OCL2_LDOFUSE_PWR_DIS (1 << 6)
1692#define BXT_PORT_CL1CM_DW30(phy) _BXT_PHY((phy), _PORT_CL1CM_DW30_BC) 1673#define BXT_PORT_CL1CM_DW30(phy) _BXT_PHY((phy), _PORT_CL1CM_DW30_BC)
1693 1674
1675/*
1676 * CNL/ICL Port/COMBO-PHY Registers
1677 */
1678#define _ICL_COMBOPHY_A 0x162000
1679#define _ICL_COMBOPHY_B 0x6C000
1680#define _ICL_COMBOPHY(port) _PICK(port, _ICL_COMBOPHY_A, \
1681 _ICL_COMBOPHY_B)
1682
1683/* CNL/ICL Port CL_DW registers */
1684#define _ICL_PORT_CL_DW(dw, port) (_ICL_COMBOPHY(port) + \
1685 4 * (dw))
1686
1687#define CNL_PORT_CL1CM_DW5 _MMIO(0x162014)
1688#define ICL_PORT_CL_DW5(port) _MMIO(_ICL_PORT_CL_DW(5, port))
1689#define CL_POWER_DOWN_ENABLE (1 << 4)
1690#define SUS_CLOCK_CONFIG (3 << 0)
1691
1692#define ICL_PORT_CL_DW10(port) _MMIO(_ICL_PORT_CL_DW(10, port))
1693#define PG_SEQ_DELAY_OVERRIDE_MASK (3 << 25)
1694#define PG_SEQ_DELAY_OVERRIDE_SHIFT 25
1695#define PG_SEQ_DELAY_OVERRIDE_ENABLE (1 << 24)
1696#define PWR_UP_ALL_LANES (0x0 << 4)
1697#define PWR_DOWN_LN_3_2_1 (0xe << 4)
1698#define PWR_DOWN_LN_3_2 (0xc << 4)
1699#define PWR_DOWN_LN_3 (0x8 << 4)
1700#define PWR_DOWN_LN_2_1_0 (0x7 << 4)
1701#define PWR_DOWN_LN_1_0 (0x3 << 4)
1702#define PWR_DOWN_LN_1 (0x2 << 4)
1703#define PWR_DOWN_LN_3_1 (0xa << 4)
1704#define PWR_DOWN_LN_3_1_0 (0xb << 4)
1705#define PWR_DOWN_LN_MASK (0xf << 4)
1706#define PWR_DOWN_LN_SHIFT 4
1707
1708#define ICL_PORT_CL_DW12(port) _MMIO(_ICL_PORT_CL_DW(12, port))
1709#define ICL_LANE_ENABLE_AUX (1 << 0)
1710
1711/* CNL/ICL Port COMP_DW registers */
1712#define _ICL_PORT_COMP 0x100
1713#define _ICL_PORT_COMP_DW(dw, port) (_ICL_COMBOPHY(port) + \
1714 _ICL_PORT_COMP + 4 * (dw))
1715
1716#define CNL_PORT_COMP_DW0 _MMIO(0x162100)
1717#define ICL_PORT_COMP_DW0(port) _MMIO(_ICL_PORT_COMP_DW(0, port))
1718#define COMP_INIT (1 << 31)
1719
1720#define CNL_PORT_COMP_DW1 _MMIO(0x162104)
1721#define ICL_PORT_COMP_DW1(port) _MMIO(_ICL_PORT_COMP_DW(1, port))
1722
1723#define CNL_PORT_COMP_DW3 _MMIO(0x16210c)
1724#define ICL_PORT_COMP_DW3(port) _MMIO(_ICL_PORT_COMP_DW(3, port))
1725#define PROCESS_INFO_DOT_0 (0 << 26)
1726#define PROCESS_INFO_DOT_1 (1 << 26)
1727#define PROCESS_INFO_DOT_4 (2 << 26)
1728#define PROCESS_INFO_MASK (7 << 26)
1729#define PROCESS_INFO_SHIFT 26
1730#define VOLTAGE_INFO_0_85V (0 << 24)
1731#define VOLTAGE_INFO_0_95V (1 << 24)
1732#define VOLTAGE_INFO_1_05V (2 << 24)
1733#define VOLTAGE_INFO_MASK (3 << 24)
1734#define VOLTAGE_INFO_SHIFT 24
1735
1736#define CNL_PORT_COMP_DW9 _MMIO(0x162124)
1737#define ICL_PORT_COMP_DW9(port) _MMIO(_ICL_PORT_COMP_DW(9, port))
1738
1739#define CNL_PORT_COMP_DW10 _MMIO(0x162128)
1740#define ICL_PORT_COMP_DW10(port) _MMIO(_ICL_PORT_COMP_DW(10, port))
1741
1742/* CNL/ICL Port PCS registers */
1694#define _CNL_PORT_PCS_DW1_GRP_AE 0x162304 1743#define _CNL_PORT_PCS_DW1_GRP_AE 0x162304
1695#define _CNL_PORT_PCS_DW1_GRP_B 0x162384 1744#define _CNL_PORT_PCS_DW1_GRP_B 0x162384
1696#define _CNL_PORT_PCS_DW1_GRP_C 0x162B04 1745#define _CNL_PORT_PCS_DW1_GRP_C 0x162B04
@@ -1708,7 +1757,6 @@ enum i915_power_well_id {
1708 _CNL_PORT_PCS_DW1_GRP_D, \ 1757 _CNL_PORT_PCS_DW1_GRP_D, \
1709 _CNL_PORT_PCS_DW1_GRP_AE, \ 1758 _CNL_PORT_PCS_DW1_GRP_AE, \
1710 _CNL_PORT_PCS_DW1_GRP_F)) 1759 _CNL_PORT_PCS_DW1_GRP_F))
1711
1712#define CNL_PORT_PCS_DW1_LN0(port) _MMIO(_PICK(port, \ 1760#define CNL_PORT_PCS_DW1_LN0(port) _MMIO(_PICK(port, \
1713 _CNL_PORT_PCS_DW1_LN0_AE, \ 1761 _CNL_PORT_PCS_DW1_LN0_AE, \
1714 _CNL_PORT_PCS_DW1_LN0_B, \ 1762 _CNL_PORT_PCS_DW1_LN0_B, \
@@ -1717,24 +1765,21 @@ enum i915_power_well_id {
1717 _CNL_PORT_PCS_DW1_LN0_AE, \ 1765 _CNL_PORT_PCS_DW1_LN0_AE, \
1718 _CNL_PORT_PCS_DW1_LN0_F)) 1766 _CNL_PORT_PCS_DW1_LN0_F))
1719 1767
1720#define _ICL_PORT_PCS_DW1_GRP_A 0x162604 1768#define _ICL_PORT_PCS_AUX 0x300
1721#define _ICL_PORT_PCS_DW1_GRP_B 0x6C604 1769#define _ICL_PORT_PCS_GRP 0x600
1722#define _ICL_PORT_PCS_DW1_LN0_A 0x162804 1770#define _ICL_PORT_PCS_LN(ln) (0x800 + (ln) * 0x100)
1723#define _ICL_PORT_PCS_DW1_LN0_B 0x6C804 1771#define _ICL_PORT_PCS_DW_AUX(dw, port) (_ICL_COMBOPHY(port) + \
1724#define _ICL_PORT_PCS_DW1_AUX_A 0x162304 1772 _ICL_PORT_PCS_AUX + 4 * (dw))
1725#define _ICL_PORT_PCS_DW1_AUX_B 0x6c304 1773#define _ICL_PORT_PCS_DW_GRP(dw, port) (_ICL_COMBOPHY(port) + \
1726#define ICL_PORT_PCS_DW1_GRP(port) _MMIO_PORT(port,\ 1774 _ICL_PORT_PCS_GRP + 4 * (dw))
1727 _ICL_PORT_PCS_DW1_GRP_A, \ 1775#define _ICL_PORT_PCS_DW_LN(dw, ln, port) (_ICL_COMBOPHY(port) + \
1728 _ICL_PORT_PCS_DW1_GRP_B) 1776 _ICL_PORT_PCS_LN(ln) + 4 * (dw))
1729#define ICL_PORT_PCS_DW1_LN0(port) _MMIO_PORT(port, \ 1777#define ICL_PORT_PCS_DW1_AUX(port) _MMIO(_ICL_PORT_PCS_DW_AUX(1, port))
1730 _ICL_PORT_PCS_DW1_LN0_A, \ 1778#define ICL_PORT_PCS_DW1_GRP(port) _MMIO(_ICL_PORT_PCS_DW_GRP(1, port))
1731 _ICL_PORT_PCS_DW1_LN0_B) 1779#define ICL_PORT_PCS_DW1_LN0(port) _MMIO(_ICL_PORT_PCS_DW_LN(1, 0, port))
1732#define ICL_PORT_PCS_DW1_AUX(port) _MMIO_PORT(port, \
1733 _ICL_PORT_PCS_DW1_AUX_A, \
1734 _ICL_PORT_PCS_DW1_AUX_B)
1735#define COMMON_KEEPER_EN (1 << 26) 1780#define COMMON_KEEPER_EN (1 << 26)
1736 1781
1737/* CNL Port TX registers */ 1782/* CNL/ICL Port TX registers */
1738#define _CNL_PORT_TX_AE_GRP_OFFSET 0x162340 1783#define _CNL_PORT_TX_AE_GRP_OFFSET 0x162340
1739#define _CNL_PORT_TX_B_GRP_OFFSET 0x1623C0 1784#define _CNL_PORT_TX_B_GRP_OFFSET 0x1623C0
1740#define _CNL_PORT_TX_C_GRP_OFFSET 0x162B40 1785#define _CNL_PORT_TX_C_GRP_OFFSET 0x162B40
@@ -1762,23 +1807,22 @@ enum i915_power_well_id {
1762 _CNL_PORT_TX_F_LN0_OFFSET) + \ 1807 _CNL_PORT_TX_F_LN0_OFFSET) + \
1763 4 * (dw)) 1808 4 * (dw))
1764 1809
1765#define CNL_PORT_TX_DW2_GRP(port) _MMIO(_CNL_PORT_TX_DW_GRP((port), 2)) 1810#define _ICL_PORT_TX_AUX 0x380
1766#define CNL_PORT_TX_DW2_LN0(port) _MMIO(_CNL_PORT_TX_DW_LN0((port), 2)) 1811#define _ICL_PORT_TX_GRP 0x680
1767#define _ICL_PORT_TX_DW2_GRP_A 0x162688 1812#define _ICL_PORT_TX_LN(ln) (0x880 + (ln) * 0x100)
1768#define _ICL_PORT_TX_DW2_GRP_B 0x6C688 1813
1769#define _ICL_PORT_TX_DW2_LN0_A 0x162888 1814#define _ICL_PORT_TX_DW_AUX(dw, port) (_ICL_COMBOPHY(port) + \
1770#define _ICL_PORT_TX_DW2_LN0_B 0x6C888 1815 _ICL_PORT_TX_AUX + 4 * (dw))
1771#define _ICL_PORT_TX_DW2_AUX_A 0x162388 1816#define _ICL_PORT_TX_DW_GRP(dw, port) (_ICL_COMBOPHY(port) + \
1772#define _ICL_PORT_TX_DW2_AUX_B 0x6c388 1817 _ICL_PORT_TX_GRP + 4 * (dw))
1773#define ICL_PORT_TX_DW2_GRP(port) _MMIO_PORT(port, \ 1818#define _ICL_PORT_TX_DW_LN(dw, ln, port) (_ICL_COMBOPHY(port) + \
1774 _ICL_PORT_TX_DW2_GRP_A, \ 1819 _ICL_PORT_TX_LN(ln) + 4 * (dw))
1775 _ICL_PORT_TX_DW2_GRP_B) 1820
1776#define ICL_PORT_TX_DW2_LN0(port) _MMIO_PORT(port, \ 1821#define CNL_PORT_TX_DW2_GRP(port) _MMIO(_CNL_PORT_TX_DW_GRP(2, port))
1777 _ICL_PORT_TX_DW2_LN0_A, \ 1822#define CNL_PORT_TX_DW2_LN0(port) _MMIO(_CNL_PORT_TX_DW_LN0(2, port))
1778 _ICL_PORT_TX_DW2_LN0_B) 1823#define ICL_PORT_TX_DW2_AUX(port) _MMIO(_ICL_PORT_TX_DW_AUX(2, port))
1779#define ICL_PORT_TX_DW2_AUX(port) _MMIO_PORT(port, \ 1824#define ICL_PORT_TX_DW2_GRP(port) _MMIO(_ICL_PORT_TX_DW_GRP(2, port))
1780 _ICL_PORT_TX_DW2_AUX_A, \ 1825#define ICL_PORT_TX_DW2_LN0(port) _MMIO(_ICL_PORT_TX_DW_LN(2, 0, port))
1781 _ICL_PORT_TX_DW2_AUX_B)
1782#define SWING_SEL_UPPER(x) (((x) >> 3) << 15) 1826#define SWING_SEL_UPPER(x) (((x) >> 3) << 15)
1783#define SWING_SEL_UPPER_MASK (1 << 15) 1827#define SWING_SEL_UPPER_MASK (1 << 15)
1784#define SWING_SEL_LOWER(x) (((x) & 0x7) << 11) 1828#define SWING_SEL_LOWER(x) (((x) & 0x7) << 11)
@@ -1795,24 +1839,10 @@ enum i915_power_well_id {
1795#define CNL_PORT_TX_DW4_LN(port, ln) _MMIO(_CNL_PORT_TX_DW_LN0((port), 4) + \ 1839#define CNL_PORT_TX_DW4_LN(port, ln) _MMIO(_CNL_PORT_TX_DW_LN0((port), 4) + \
1796 ((ln) * (_CNL_PORT_TX_DW4_LN1_AE - \ 1840 ((ln) * (_CNL_PORT_TX_DW4_LN1_AE - \
1797 _CNL_PORT_TX_DW4_LN0_AE))) 1841 _CNL_PORT_TX_DW4_LN0_AE)))
1798#define _ICL_PORT_TX_DW4_GRP_A 0x162690 1842#define ICL_PORT_TX_DW4_AUX(port) _MMIO(_ICL_PORT_TX_DW_AUX(4, port))
1799#define _ICL_PORT_TX_DW4_GRP_B 0x6C690 1843#define ICL_PORT_TX_DW4_GRP(port) _MMIO(_ICL_PORT_TX_DW_GRP(4, port))
1800#define _ICL_PORT_TX_DW4_LN0_A 0x162890 1844#define ICL_PORT_TX_DW4_LN0(port) _MMIO(_ICL_PORT_TX_DW_LN(4, 0, port))
1801#define _ICL_PORT_TX_DW4_LN1_A 0x162990 1845#define ICL_PORT_TX_DW4_LN(port, ln) _MMIO(_ICL_PORT_TX_DW_LN(4, ln, port))
1802#define _ICL_PORT_TX_DW4_LN0_B 0x6C890
1803#define _ICL_PORT_TX_DW4_AUX_A 0x162390
1804#define _ICL_PORT_TX_DW4_AUX_B 0x6c390
1805#define ICL_PORT_TX_DW4_GRP(port) _MMIO_PORT(port, \
1806 _ICL_PORT_TX_DW4_GRP_A, \
1807 _ICL_PORT_TX_DW4_GRP_B)
1808#define ICL_PORT_TX_DW4_LN(port, ln) _MMIO(_PORT(port, \
1809 _ICL_PORT_TX_DW4_LN0_A, \
1810 _ICL_PORT_TX_DW4_LN0_B) + \
1811 ((ln) * (_ICL_PORT_TX_DW4_LN1_A - \
1812 _ICL_PORT_TX_DW4_LN0_A)))
1813#define ICL_PORT_TX_DW4_AUX(port) _MMIO_PORT(port, \
1814 _ICL_PORT_TX_DW4_AUX_A, \
1815 _ICL_PORT_TX_DW4_AUX_B)
1816#define LOADGEN_SELECT (1 << 31) 1846#define LOADGEN_SELECT (1 << 31)
1817#define POST_CURSOR_1(x) ((x) << 12) 1847#define POST_CURSOR_1(x) ((x) << 12)
1818#define POST_CURSOR_1_MASK (0x3F << 12) 1848#define POST_CURSOR_1_MASK (0x3F << 12)
@@ -1821,23 +1851,11 @@ enum i915_power_well_id {
1821#define CURSOR_COEFF(x) ((x) << 0) 1851#define CURSOR_COEFF(x) ((x) << 0)
1822#define CURSOR_COEFF_MASK (0x3F << 0) 1852#define CURSOR_COEFF_MASK (0x3F << 0)
1823 1853
1824#define CNL_PORT_TX_DW5_GRP(port) _MMIO(_CNL_PORT_TX_DW_GRP((port), 5)) 1854#define CNL_PORT_TX_DW5_GRP(port) _MMIO(_CNL_PORT_TX_DW_GRP(5, port))
1825#define CNL_PORT_TX_DW5_LN0(port) _MMIO(_CNL_PORT_TX_DW_LN0((port), 5)) 1855#define CNL_PORT_TX_DW5_LN0(port) _MMIO(_CNL_PORT_TX_DW_LN0(5, port))
1826#define _ICL_PORT_TX_DW5_GRP_A 0x162694 1856#define ICL_PORT_TX_DW5_AUX(port) _MMIO(_ICL_PORT_TX_DW_AUX(5, port))
1827#define _ICL_PORT_TX_DW5_GRP_B 0x6C694 1857#define ICL_PORT_TX_DW5_GRP(port) _MMIO(_ICL_PORT_TX_DW_GRP(5, port))
1828#define _ICL_PORT_TX_DW5_LN0_A 0x162894 1858#define ICL_PORT_TX_DW5_LN0(port) _MMIO(_ICL_PORT_TX_DW_LN(5, 0, port))
1829#define _ICL_PORT_TX_DW5_LN0_B 0x6C894
1830#define _ICL_PORT_TX_DW5_AUX_A 0x162394
1831#define _ICL_PORT_TX_DW5_AUX_B 0x6c394
1832#define ICL_PORT_TX_DW5_GRP(port) _MMIO_PORT(port, \
1833 _ICL_PORT_TX_DW5_GRP_A, \
1834 _ICL_PORT_TX_DW5_GRP_B)
1835#define ICL_PORT_TX_DW5_LN0(port) _MMIO_PORT(port, \
1836 _ICL_PORT_TX_DW5_LN0_A, \
1837 _ICL_PORT_TX_DW5_LN0_B)
1838#define ICL_PORT_TX_DW5_AUX(port) _MMIO_PORT(port, \
1839 _ICL_PORT_TX_DW5_AUX_A, \
1840 _ICL_PORT_TX_DW5_AUX_B)
1841#define TX_TRAINING_EN (1 << 31) 1859#define TX_TRAINING_EN (1 << 31)
1842#define TAP2_DISABLE (1 << 30) 1860#define TAP2_DISABLE (1 << 30)
1843#define TAP3_DISABLE (1 << 29) 1861#define TAP3_DISABLE (1 << 29)
@@ -2054,49 +2072,16 @@ enum i915_power_well_id {
2054#define BXT_PORT_CL2CM_DW6(phy) _BXT_PHY((phy), _PORT_CL2CM_DW6_BC) 2072#define BXT_PORT_CL2CM_DW6(phy) _BXT_PHY((phy), _PORT_CL2CM_DW6_BC)
2055#define DW6_OLDO_DYN_PWR_DOWN_EN (1 << 28) 2073#define DW6_OLDO_DYN_PWR_DOWN_EN (1 << 28)
2056 2074
2057#define CNL_PORT_COMP_DW0 _MMIO(0x162100) 2075#define FIA1_BASE 0x163000
2058#define COMP_INIT (1 << 31)
2059#define CNL_PORT_COMP_DW1 _MMIO(0x162104)
2060#define CNL_PORT_COMP_DW3 _MMIO(0x16210c)
2061#define PROCESS_INFO_DOT_0 (0 << 26)
2062#define PROCESS_INFO_DOT_1 (1 << 26)
2063#define PROCESS_INFO_DOT_4 (2 << 26)
2064#define PROCESS_INFO_MASK (7 << 26)
2065#define PROCESS_INFO_SHIFT 26
2066#define VOLTAGE_INFO_0_85V (0 << 24)
2067#define VOLTAGE_INFO_0_95V (1 << 24)
2068#define VOLTAGE_INFO_1_05V (2 << 24)
2069#define VOLTAGE_INFO_MASK (3 << 24)
2070#define VOLTAGE_INFO_SHIFT 24
2071#define CNL_PORT_COMP_DW9 _MMIO(0x162124)
2072#define CNL_PORT_COMP_DW10 _MMIO(0x162128)
2073
2074#define _ICL_PORT_COMP_DW0_A 0x162100
2075#define _ICL_PORT_COMP_DW0_B 0x6C100
2076#define ICL_PORT_COMP_DW0(port) _MMIO_PORT(port, _ICL_PORT_COMP_DW0_A, \
2077 _ICL_PORT_COMP_DW0_B)
2078#define _ICL_PORT_COMP_DW1_A 0x162104
2079#define _ICL_PORT_COMP_DW1_B 0x6C104
2080#define ICL_PORT_COMP_DW1(port) _MMIO_PORT(port, _ICL_PORT_COMP_DW1_A, \
2081 _ICL_PORT_COMP_DW1_B)
2082#define _ICL_PORT_COMP_DW3_A 0x16210C
2083#define _ICL_PORT_COMP_DW3_B 0x6C10C
2084#define ICL_PORT_COMP_DW3(port) _MMIO_PORT(port, _ICL_PORT_COMP_DW3_A, \
2085 _ICL_PORT_COMP_DW3_B)
2086#define _ICL_PORT_COMP_DW9_A 0x162124
2087#define _ICL_PORT_COMP_DW9_B 0x6C124
2088#define ICL_PORT_COMP_DW9(port) _MMIO_PORT(port, _ICL_PORT_COMP_DW9_A, \
2089 _ICL_PORT_COMP_DW9_B)
2090#define _ICL_PORT_COMP_DW10_A 0x162128
2091#define _ICL_PORT_COMP_DW10_B 0x6C128
2092#define ICL_PORT_COMP_DW10(port) _MMIO_PORT(port, \
2093 _ICL_PORT_COMP_DW10_A, \
2094 _ICL_PORT_COMP_DW10_B)
2095 2076
2096/* ICL PHY DFLEX registers */ 2077/* ICL PHY DFLEX registers */
2097#define PORT_TX_DFLEXDPMLE1 _MMIO(0x1638C0) 2078#define PORT_TX_DFLEXDPMLE1 _MMIO(FIA1_BASE + 0x008C0)
2098#define DFLEXDPMLE1_DPMLETC_MASK(n) (0xf << (4 * (n))) 2079#define DFLEXDPMLE1_DPMLETC_MASK(tc_port) (0xf << (4 * (tc_port)))
2099#define DFLEXDPMLE1_DPMLETC(n, x) ((x) << (4 * (n))) 2080#define DFLEXDPMLE1_DPMLETC_ML0(tc_port) (1 << (4 * (tc_port)))
2081#define DFLEXDPMLE1_DPMLETC_ML1_0(tc_port) (3 << (4 * (tc_port)))
2082#define DFLEXDPMLE1_DPMLETC_ML3(tc_port) (8 << (4 * (tc_port)))
2083#define DFLEXDPMLE1_DPMLETC_ML3_2(tc_port) (12 << (4 * (tc_port)))
2084#define DFLEXDPMLE1_DPMLETC_ML3_0(tc_port) (15 << (4 * (tc_port)))
2100 2085
2101/* BXT PHY Ref registers */ 2086/* BXT PHY Ref registers */
2102#define _PORT_REF_DW3_A 0x16218C 2087#define _PORT_REF_DW3_A 0x16218C
@@ -2413,6 +2398,7 @@ enum i915_power_well_id {
2413 2398
2414#define GEN8_GAMW_ECO_DEV_RW_IA _MMIO(0x4080) 2399#define GEN8_GAMW_ECO_DEV_RW_IA _MMIO(0x4080)
2415#define GAMW_ECO_ENABLE_64K_IPS_FIELD 0xF 2400#define GAMW_ECO_ENABLE_64K_IPS_FIELD 0xF
2401#define GAMW_ECO_DEV_CTX_RELOAD_DISABLE (1 << 7)
2416 2402
2417#define GAMT_CHKN_BIT_REG _MMIO(0x4ab8) 2403#define GAMT_CHKN_BIT_REG _MMIO(0x4ab8)
2418#define GAMT_CHKN_DISABLE_L3_COH_PIPE (1 << 31) 2404#define GAMT_CHKN_DISABLE_L3_COH_PIPE (1 << 31)
@@ -2573,6 +2559,7 @@ enum i915_power_well_id {
2573/* chicken reg for WaConextSwitchWithConcurrentTLBInvalidate */ 2559/* chicken reg for WaConextSwitchWithConcurrentTLBInvalidate */
2574#define GEN9_CSFE_CHICKEN1_RCS _MMIO(0x20D4) 2560#define GEN9_CSFE_CHICKEN1_RCS _MMIO(0x20D4)
2575#define GEN9_PREEMPT_GPGPU_SYNC_SWITCH_DISABLE (1 << 2) 2561#define GEN9_PREEMPT_GPGPU_SYNC_SWITCH_DISABLE (1 << 2)
2562#define GEN11_ENABLE_32_PLANE_MODE (1 << 7)
2576 2563
2577/* WaClearTdlStateAckDirtyBits */ 2564/* WaClearTdlStateAckDirtyBits */
2578#define GEN8_STATE_ACK _MMIO(0x20F0) 2565#define GEN8_STATE_ACK _MMIO(0x20F0)
@@ -3475,11 +3462,13 @@ enum i915_power_well_id {
3475/* 3462/*
3476 * Palette regs 3463 * Palette regs
3477 */ 3464 */
3478#define PALETTE_A_OFFSET 0xa000 3465#define _PALETTE_A 0xa000
3479#define PALETTE_B_OFFSET 0xa800 3466#define _PALETTE_B 0xa800
3480#define CHV_PALETTE_C_OFFSET 0xc000 3467#define _CHV_PALETTE_C 0xc000
3481#define PALETTE(pipe, i) _MMIO(dev_priv->info.palette_offsets[pipe] + \ 3468#define PALETTE(pipe, i) _MMIO(dev_priv->info.display_mmio_offset + \
3482 dev_priv->info.display_mmio_offset + (i) * 4) 3469 _PICK((pipe), _PALETTE_A, \
3470 _PALETTE_B, _CHV_PALETTE_C) + \
3471 (i) * 4)
3483 3472
3484/* MCH MMIO space */ 3473/* MCH MMIO space */
3485 3474
@@ -4061,15 +4050,27 @@ enum {
4061#define _VSYNCSHIFT_B 0x61028 4050#define _VSYNCSHIFT_B 0x61028
4062#define _PIPE_MULT_B 0x6102c 4051#define _PIPE_MULT_B 0x6102c
4063 4052
4053/* DSI 0 timing regs */
4054#define _HTOTAL_DSI0 0x6b000
4055#define _HSYNC_DSI0 0x6b008
4056#define _VTOTAL_DSI0 0x6b00c
4057#define _VSYNC_DSI0 0x6b014
4058#define _VSYNCSHIFT_DSI0 0x6b028
4059
4060/* DSI 1 timing regs */
4061#define _HTOTAL_DSI1 0x6b800
4062#define _HSYNC_DSI1 0x6b808
4063#define _VTOTAL_DSI1 0x6b80c
4064#define _VSYNC_DSI1 0x6b814
4065#define _VSYNCSHIFT_DSI1 0x6b828
4066
4064#define TRANSCODER_A_OFFSET 0x60000 4067#define TRANSCODER_A_OFFSET 0x60000
4065#define TRANSCODER_B_OFFSET 0x61000 4068#define TRANSCODER_B_OFFSET 0x61000
4066#define TRANSCODER_C_OFFSET 0x62000 4069#define TRANSCODER_C_OFFSET 0x62000
4067#define CHV_TRANSCODER_C_OFFSET 0x63000 4070#define CHV_TRANSCODER_C_OFFSET 0x63000
4068#define TRANSCODER_EDP_OFFSET 0x6f000 4071#define TRANSCODER_EDP_OFFSET 0x6f000
4069 4072#define TRANSCODER_DSI0_OFFSET 0x6b000
4070#define _MMIO_TRANS2(pipe, reg) _MMIO(dev_priv->info.trans_offsets[(pipe)] - \ 4073#define TRANSCODER_DSI1_OFFSET 0x6b800
4071 dev_priv->info.trans_offsets[TRANSCODER_A] + (reg) + \
4072 dev_priv->info.display_mmio_offset)
4073 4074
4074#define HTOTAL(trans) _MMIO_TRANS2(trans, _HTOTAL_A) 4075#define HTOTAL(trans) _MMIO_TRANS2(trans, _HTOTAL_A)
4075#define HBLANK(trans) _MMIO_TRANS2(trans, _HBLANK_A) 4076#define HBLANK(trans) _MMIO_TRANS2(trans, _HBLANK_A)
@@ -4149,9 +4150,13 @@ enum {
4149/* Bspec claims those aren't shifted but stay at 0x64800 */ 4150/* Bspec claims those aren't shifted but stay at 0x64800 */
4150#define EDP_PSR_IMR _MMIO(0x64834) 4151#define EDP_PSR_IMR _MMIO(0x64834)
4151#define EDP_PSR_IIR _MMIO(0x64838) 4152#define EDP_PSR_IIR _MMIO(0x64838)
4152#define EDP_PSR_ERROR(trans) (1 << (((trans) * 8 + 10) & 31)) 4153#define EDP_PSR_ERROR(shift) (1 << ((shift) + 2))
4153#define EDP_PSR_POST_EXIT(trans) (1 << (((trans) * 8 + 9) & 31)) 4154#define EDP_PSR_POST_EXIT(shift) (1 << ((shift) + 1))
4154#define EDP_PSR_PRE_ENTRY(trans) (1 << (((trans) * 8 + 8) & 31)) 4155#define EDP_PSR_PRE_ENTRY(shift) (1 << (shift))
4156#define EDP_PSR_TRANSCODER_C_SHIFT 24
4157#define EDP_PSR_TRANSCODER_B_SHIFT 16
4158#define EDP_PSR_TRANSCODER_A_SHIFT 8
4159#define EDP_PSR_TRANSCODER_EDP_SHIFT 0
4155 4160
4156#define EDP_PSR_AUX_CTL _MMIO(dev_priv->psr_mmio_base + 0x10) 4161#define EDP_PSR_AUX_CTL _MMIO(dev_priv->psr_mmio_base + 0x10)
4157#define EDP_PSR_AUX_CTL_TIME_OUT_MASK (3 << 26) 4162#define EDP_PSR_AUX_CTL_TIME_OUT_MASK (3 << 26)
@@ -4195,7 +4200,7 @@ enum {
4195#define EDP_PSR_DEBUG_MASK_LPSP (1 << 27) 4200#define EDP_PSR_DEBUG_MASK_LPSP (1 << 27)
4196#define EDP_PSR_DEBUG_MASK_MEMUP (1 << 26) 4201#define EDP_PSR_DEBUG_MASK_MEMUP (1 << 26)
4197#define EDP_PSR_DEBUG_MASK_HPD (1 << 25) 4202#define EDP_PSR_DEBUG_MASK_HPD (1 << 25)
4198#define EDP_PSR_DEBUG_MASK_DISP_REG_WRITE (1 << 16) 4203#define EDP_PSR_DEBUG_MASK_DISP_REG_WRITE (1 << 16) /* Reserved in ICL+ */
4199#define EDP_PSR_DEBUG_EXIT_ON_PIXEL_UNDERRUN (1 << 15) /* SKL+ */ 4204#define EDP_PSR_DEBUG_EXIT_ON_PIXEL_UNDERRUN (1 << 15) /* SKL+ */
4200 4205
4201#define EDP_PSR2_CTL _MMIO(0x6f900) 4206#define EDP_PSR2_CTL _MMIO(0x6f900)
@@ -4232,7 +4237,7 @@ enum {
4232#define PSR_EVENT_FRONT_BUFFER_MODIFY (1 << 9) 4237#define PSR_EVENT_FRONT_BUFFER_MODIFY (1 << 9)
4233#define PSR_EVENT_WD_TIMER_EXPIRE (1 << 8) 4238#define PSR_EVENT_WD_TIMER_EXPIRE (1 << 8)
4234#define PSR_EVENT_PIPE_REGISTERS_UPDATE (1 << 6) 4239#define PSR_EVENT_PIPE_REGISTERS_UPDATE (1 << 6)
4235#define PSR_EVENT_REGISTER_UPDATE (1 << 5) 4240#define PSR_EVENT_REGISTER_UPDATE (1 << 5) /* Reserved in ICL+ */
4236#define PSR_EVENT_HDCP_ENABLE (1 << 4) 4241#define PSR_EVENT_HDCP_ENABLE (1 << 4)
4237#define PSR_EVENT_KVMR_SESSION_ENABLE (1 << 3) 4242#define PSR_EVENT_KVMR_SESSION_ENABLE (1 << 3)
4238#define PSR_EVENT_VBI_ENABLE (1 << 2) 4243#define PSR_EVENT_VBI_ENABLE (1 << 2)
@@ -4584,6 +4589,15 @@ enum {
4584#define VIDEO_DIP_FREQ_2VSYNC (2 << 16) 4589#define VIDEO_DIP_FREQ_2VSYNC (2 << 16)
4585#define VIDEO_DIP_FREQ_MASK (3 << 16) 4590#define VIDEO_DIP_FREQ_MASK (3 << 16)
4586/* HSW and later: */ 4591/* HSW and later: */
4592#define DRM_DIP_ENABLE (1 << 28)
4593#define PSR_VSC_BIT_7_SET (1 << 27)
4594#define VSC_SELECT_MASK (0x3 << 25)
4595#define VSC_SELECT_SHIFT 25
4596#define VSC_DIP_HW_HEA_DATA (0 << 25)
4597#define VSC_DIP_HW_HEA_SW_DATA (1 << 25)
4598#define VSC_DIP_HW_DATA_SW_HEA (2 << 25)
4599#define VSC_DIP_SW_HEA_DATA (3 << 25)
4600#define VDIP_ENABLE_PPS (1 << 24)
4587#define VIDEO_DIP_ENABLE_VSC_HSW (1 << 20) 4601#define VIDEO_DIP_ENABLE_VSC_HSW (1 << 20)
4588#define VIDEO_DIP_ENABLE_GCP_HSW (1 << 16) 4602#define VIDEO_DIP_ENABLE_GCP_HSW (1 << 16)
4589#define VIDEO_DIP_ENABLE_AVI_HSW (1 << 12) 4603#define VIDEO_DIP_ENABLE_AVI_HSW (1 << 12)
@@ -4591,16 +4605,6 @@ enum {
4591#define VIDEO_DIP_ENABLE_GMP_HSW (1 << 4) 4605#define VIDEO_DIP_ENABLE_GMP_HSW (1 << 4)
4592#define VIDEO_DIP_ENABLE_SPD_HSW (1 << 0) 4606#define VIDEO_DIP_ENABLE_SPD_HSW (1 << 0)
4593 4607
4594#define DRM_DIP_ENABLE (1 << 28)
4595#define PSR_VSC_BIT_7_SET (1 << 27)
4596#define VSC_SELECT_MASK (0x3 << 26)
4597#define VSC_SELECT_SHIFT 26
4598#define VSC_DIP_HW_HEA_DATA (0 << 26)
4599#define VSC_DIP_HW_HEA_SW_DATA (1 << 26)
4600#define VSC_DIP_HW_DATA_SW_HEA (2 << 26)
4601#define VSC_DIP_SW_HEA_DATA (3 << 26)
4602#define VDIP_ENABLE_PPS (1 << 24)
4603
4604/* Panel power sequencing */ 4608/* Panel power sequencing */
4605#define PPS_BASE 0x61200 4609#define PPS_BASE 0x61200
4606#define VLV_PPS_BASE (VLV_DISPLAY_BASE + PPS_BASE) 4610#define VLV_PPS_BASE (VLV_DISPLAY_BASE + PPS_BASE)
@@ -5636,9 +5640,9 @@ enum {
5636 */ 5640 */
5637#define PIPE_EDP_OFFSET 0x7f000 5641#define PIPE_EDP_OFFSET 0x7f000
5638 5642
5639#define _MMIO_PIPE2(pipe, reg) _MMIO(dev_priv->info.pipe_offsets[pipe] - \ 5643/* ICL DSI 0 and 1 */
5640 dev_priv->info.pipe_offsets[PIPE_A] + (reg) + \ 5644#define PIPE_DSI0_OFFSET 0x7b000
5641 dev_priv->info.display_mmio_offset) 5645#define PIPE_DSI1_OFFSET 0x7b800
5642 5646
5643#define PIPECONF(pipe) _MMIO_PIPE2(pipe, _PIPEACONF) 5647#define PIPECONF(pipe) _MMIO_PIPE2(pipe, _PIPEACONF)
5644#define PIPEDSL(pipe) _MMIO_PIPE2(pipe, _PIPEADSL) 5648#define PIPEDSL(pipe) _MMIO_PIPE2(pipe, _PIPEADSL)
@@ -6087,10 +6091,6 @@ enum {
6087#define _CURBBASE_IVB 0x71084 6091#define _CURBBASE_IVB 0x71084
6088#define _CURBPOS_IVB 0x71088 6092#define _CURBPOS_IVB 0x71088
6089 6093
6090#define _CURSOR2(pipe, reg) _MMIO(dev_priv->info.cursor_offsets[(pipe)] - \
6091 dev_priv->info.cursor_offsets[PIPE_A] + (reg) + \
6092 dev_priv->info.display_mmio_offset)
6093
6094#define CURCNTR(pipe) _CURSOR2(pipe, _CURACNTR) 6094#define CURCNTR(pipe) _CURSOR2(pipe, _CURACNTR)
6095#define CURBASE(pipe) _CURSOR2(pipe, _CURABASE) 6095#define CURBASE(pipe) _CURSOR2(pipe, _CURABASE)
6096#define CURPOS(pipe) _CURSOR2(pipe, _CURAPOS) 6096#define CURPOS(pipe) _CURSOR2(pipe, _CURAPOS)
@@ -6224,6 +6224,10 @@ enum {
6224#define _DSPBOFFSET (dev_priv->info.display_mmio_offset + 0x711A4) 6224#define _DSPBOFFSET (dev_priv->info.display_mmio_offset + 0x711A4)
6225#define _DSPBSURFLIVE (dev_priv->info.display_mmio_offset + 0x711AC) 6225#define _DSPBSURFLIVE (dev_priv->info.display_mmio_offset + 0x711AC)
6226 6226
6227/* ICL DSI 0 and 1 */
6228#define _PIPEDSI0CONF 0x7b008
6229#define _PIPEDSI1CONF 0x7b808
6230
6227/* Sprite A control */ 6231/* Sprite A control */
6228#define _DVSACNTR 0x72180 6232#define _DVSACNTR 0x72180
6229#define DVS_ENABLE (1 << 31) 6233#define DVS_ENABLE (1 << 31)
@@ -6511,6 +6515,7 @@ enum {
6511#define PLANE_CTL_KEY_ENABLE_DESTINATION (2 << 21) 6515#define PLANE_CTL_KEY_ENABLE_DESTINATION (2 << 21)
6512#define PLANE_CTL_ORDER_BGRX (0 << 20) 6516#define PLANE_CTL_ORDER_BGRX (0 << 20)
6513#define PLANE_CTL_ORDER_RGBX (1 << 20) 6517#define PLANE_CTL_ORDER_RGBX (1 << 20)
6518#define PLANE_CTL_YUV420_Y_PLANE (1 << 19)
6514#define PLANE_CTL_YUV_TO_RGB_CSC_FORMAT_BT709 (1 << 18) 6519#define PLANE_CTL_YUV_TO_RGB_CSC_FORMAT_BT709 (1 << 18)
6515#define PLANE_CTL_YUV422_ORDER_MASK (0x3 << 16) 6520#define PLANE_CTL_YUV422_ORDER_MASK (0x3 << 16)
6516#define PLANE_CTL_YUV422_YUYV (0 << 16) 6521#define PLANE_CTL_YUV422_YUYV (0 << 16)
@@ -6554,17 +6559,33 @@ enum {
6554#define _PLANE_KEYVAL_2_A 0x70294 6559#define _PLANE_KEYVAL_2_A 0x70294
6555#define _PLANE_KEYMSK_1_A 0x70198 6560#define _PLANE_KEYMSK_1_A 0x70198
6556#define _PLANE_KEYMSK_2_A 0x70298 6561#define _PLANE_KEYMSK_2_A 0x70298
6562#define PLANE_KEYMSK_ALPHA_ENABLE (1 << 31)
6557#define _PLANE_KEYMAX_1_A 0x701a0 6563#define _PLANE_KEYMAX_1_A 0x701a0
6558#define _PLANE_KEYMAX_2_A 0x702a0 6564#define _PLANE_KEYMAX_2_A 0x702a0
6565#define PLANE_KEYMAX_ALPHA(a) ((a) << 24)
6559#define _PLANE_AUX_DIST_1_A 0x701c0 6566#define _PLANE_AUX_DIST_1_A 0x701c0
6560#define _PLANE_AUX_DIST_2_A 0x702c0 6567#define _PLANE_AUX_DIST_2_A 0x702c0
6561#define _PLANE_AUX_OFFSET_1_A 0x701c4 6568#define _PLANE_AUX_OFFSET_1_A 0x701c4
6562#define _PLANE_AUX_OFFSET_2_A 0x702c4 6569#define _PLANE_AUX_OFFSET_2_A 0x702c4
6570#define _PLANE_CUS_CTL_1_A 0x701c8
6571#define _PLANE_CUS_CTL_2_A 0x702c8
6572#define PLANE_CUS_ENABLE (1 << 31)
6573#define PLANE_CUS_PLANE_6 (0 << 30)
6574#define PLANE_CUS_PLANE_7 (1 << 30)
6575#define PLANE_CUS_HPHASE_SIGN_NEGATIVE (1 << 19)
6576#define PLANE_CUS_HPHASE_0 (0 << 16)
6577#define PLANE_CUS_HPHASE_0_25 (1 << 16)
6578#define PLANE_CUS_HPHASE_0_5 (2 << 16)
6579#define PLANE_CUS_VPHASE_SIGN_NEGATIVE (1 << 15)
6580#define PLANE_CUS_VPHASE_0 (0 << 12)
6581#define PLANE_CUS_VPHASE_0_25 (1 << 12)
6582#define PLANE_CUS_VPHASE_0_5 (2 << 12)
6563#define _PLANE_COLOR_CTL_1_A 0x701CC /* GLK+ */ 6583#define _PLANE_COLOR_CTL_1_A 0x701CC /* GLK+ */
6564#define _PLANE_COLOR_CTL_2_A 0x702CC /* GLK+ */ 6584#define _PLANE_COLOR_CTL_2_A 0x702CC /* GLK+ */
6565#define _PLANE_COLOR_CTL_3_A 0x703CC /* GLK+ */ 6585#define _PLANE_COLOR_CTL_3_A 0x703CC /* GLK+ */
6566#define PLANE_COLOR_PIPE_GAMMA_ENABLE (1 << 30) /* Pre-ICL */ 6586#define PLANE_COLOR_PIPE_GAMMA_ENABLE (1 << 30) /* Pre-ICL */
6567#define PLANE_COLOR_YUV_RANGE_CORRECTION_DISABLE (1 << 28) 6587#define PLANE_COLOR_YUV_RANGE_CORRECTION_DISABLE (1 << 28)
6588#define PLANE_COLOR_INPUT_CSC_ENABLE (1 << 20) /* ICL+ */
6568#define PLANE_COLOR_PIPE_CSC_ENABLE (1 << 23) /* Pre-ICL */ 6589#define PLANE_COLOR_PIPE_CSC_ENABLE (1 << 23) /* Pre-ICL */
6569#define PLANE_COLOR_CSC_MODE_BYPASS (0 << 17) 6590#define PLANE_COLOR_CSC_MODE_BYPASS (0 << 17)
6570#define PLANE_COLOR_CSC_MODE_YUV601_TO_RGB709 (1 << 17) 6591#define PLANE_COLOR_CSC_MODE_YUV601_TO_RGB709 (1 << 17)
@@ -6581,6 +6602,55 @@ enum {
6581#define _PLANE_NV12_BUF_CFG_1_A 0x70278 6602#define _PLANE_NV12_BUF_CFG_1_A 0x70278
6582#define _PLANE_NV12_BUF_CFG_2_A 0x70378 6603#define _PLANE_NV12_BUF_CFG_2_A 0x70378
6583 6604
6605/* Input CSC Register Definitions */
6606#define _PLANE_INPUT_CSC_RY_GY_1_A 0x701E0
6607#define _PLANE_INPUT_CSC_RY_GY_2_A 0x702E0
6608
6609#define _PLANE_INPUT_CSC_RY_GY_1_B 0x711E0
6610#define _PLANE_INPUT_CSC_RY_GY_2_B 0x712E0
6611
6612#define _PLANE_INPUT_CSC_RY_GY_1(pipe) \
6613 _PIPE(pipe, _PLANE_INPUT_CSC_RY_GY_1_A, \
6614 _PLANE_INPUT_CSC_RY_GY_1_B)
6615#define _PLANE_INPUT_CSC_RY_GY_2(pipe) \
6616 _PIPE(pipe, _PLANE_INPUT_CSC_RY_GY_2_A, \
6617 _PLANE_INPUT_CSC_RY_GY_2_B)
6618
6619#define PLANE_INPUT_CSC_COEFF(pipe, plane, index) \
6620 _MMIO_PLANE(plane, _PLANE_INPUT_CSC_RY_GY_1(pipe) + (index) * 4, \
6621 _PLANE_INPUT_CSC_RY_GY_2(pipe) + (index) * 4)
6622
6623#define _PLANE_INPUT_CSC_PREOFF_HI_1_A 0x701F8
6624#define _PLANE_INPUT_CSC_PREOFF_HI_2_A 0x702F8
6625
6626#define _PLANE_INPUT_CSC_PREOFF_HI_1_B 0x711F8
6627#define _PLANE_INPUT_CSC_PREOFF_HI_2_B 0x712F8
6628
6629#define _PLANE_INPUT_CSC_PREOFF_HI_1(pipe) \
6630 _PIPE(pipe, _PLANE_INPUT_CSC_PREOFF_HI_1_A, \
6631 _PLANE_INPUT_CSC_PREOFF_HI_1_B)
6632#define _PLANE_INPUT_CSC_PREOFF_HI_2(pipe) \
6633 _PIPE(pipe, _PLANE_INPUT_CSC_PREOFF_HI_2_A, \
6634 _PLANE_INPUT_CSC_PREOFF_HI_2_B)
6635#define PLANE_INPUT_CSC_PREOFF(pipe, plane, index) \
6636 _MMIO_PLANE(plane, _PLANE_INPUT_CSC_PREOFF_HI_1(pipe) + (index) * 4, \
6637 _PLANE_INPUT_CSC_PREOFF_HI_2(pipe) + (index) * 4)
6638
6639#define _PLANE_INPUT_CSC_POSTOFF_HI_1_A 0x70204
6640#define _PLANE_INPUT_CSC_POSTOFF_HI_2_A 0x70304
6641
6642#define _PLANE_INPUT_CSC_POSTOFF_HI_1_B 0x71204
6643#define _PLANE_INPUT_CSC_POSTOFF_HI_2_B 0x71304
6644
6645#define _PLANE_INPUT_CSC_POSTOFF_HI_1(pipe) \
6646 _PIPE(pipe, _PLANE_INPUT_CSC_POSTOFF_HI_1_A, \
6647 _PLANE_INPUT_CSC_POSTOFF_HI_1_B)
6648#define _PLANE_INPUT_CSC_POSTOFF_HI_2(pipe) \
6649 _PIPE(pipe, _PLANE_INPUT_CSC_POSTOFF_HI_2_A, \
6650 _PLANE_INPUT_CSC_POSTOFF_HI_2_B)
6651#define PLANE_INPUT_CSC_POSTOFF(pipe, plane, index) \
6652 _MMIO_PLANE(plane, _PLANE_INPUT_CSC_POSTOFF_HI_1(pipe) + (index) * 4, \
6653 _PLANE_INPUT_CSC_POSTOFF_HI_2(pipe) + (index) * 4)
6584 6654
6585#define _PLANE_CTL_1_B 0x71180 6655#define _PLANE_CTL_1_B 0x71180
6586#define _PLANE_CTL_2_B 0x71280 6656#define _PLANE_CTL_2_B 0x71280
@@ -6697,6 +6767,15 @@ enum {
6697#define PLANE_AUX_OFFSET(pipe, plane) \ 6767#define PLANE_AUX_OFFSET(pipe, plane) \
6698 _MMIO_PLANE(plane, _PLANE_AUX_OFFSET_1(pipe), _PLANE_AUX_OFFSET_2(pipe)) 6768 _MMIO_PLANE(plane, _PLANE_AUX_OFFSET_1(pipe), _PLANE_AUX_OFFSET_2(pipe))
6699 6769
6770#define _PLANE_CUS_CTL_1_B 0x711c8
6771#define _PLANE_CUS_CTL_2_B 0x712c8
6772#define _PLANE_CUS_CTL_1(pipe) \
6773 _PIPE(pipe, _PLANE_CUS_CTL_1_A, _PLANE_CUS_CTL_1_B)
6774#define _PLANE_CUS_CTL_2(pipe) \
6775 _PIPE(pipe, _PLANE_CUS_CTL_2_A, _PLANE_CUS_CTL_2_B)
6776#define PLANE_CUS_CTL(pipe, plane) \
6777 _MMIO_PLANE(plane, _PLANE_CUS_CTL_1(pipe), _PLANE_CUS_CTL_2(pipe))
6778
6700#define _PLANE_COLOR_CTL_1_B 0x711CC 6779#define _PLANE_COLOR_CTL_1_B 0x711CC
6701#define _PLANE_COLOR_CTL_2_B 0x712CC 6780#define _PLANE_COLOR_CTL_2_B 0x712CC
6702#define _PLANE_COLOR_CTL_3_B 0x713CC 6781#define _PLANE_COLOR_CTL_3_B 0x713CC
@@ -6850,11 +6929,12 @@ enum {
6850#define _PS_2B_CTRL 0x68A80 6929#define _PS_2B_CTRL 0x68A80
6851#define _PS_1C_CTRL 0x69180 6930#define _PS_1C_CTRL 0x69180
6852#define PS_SCALER_EN (1 << 31) 6931#define PS_SCALER_EN (1 << 31)
6853#define PS_SCALER_MODE_MASK (3 << 28) 6932#define SKL_PS_SCALER_MODE_MASK (3 << 28)
6854#define PS_SCALER_MODE_DYN (0 << 28) 6933#define SKL_PS_SCALER_MODE_DYN (0 << 28)
6855#define PS_SCALER_MODE_HQ (1 << 28) 6934#define SKL_PS_SCALER_MODE_HQ (1 << 28)
6856#define SKL_PS_SCALER_MODE_NV12 (2 << 28) 6935#define SKL_PS_SCALER_MODE_NV12 (2 << 28)
6857#define PS_SCALER_MODE_PLANAR (1 << 29) 6936#define PS_SCALER_MODE_PLANAR (1 << 29)
6937#define PS_SCALER_MODE_NORMAL (0 << 29)
6858#define PS_PLANE_SEL_MASK (7 << 25) 6938#define PS_PLANE_SEL_MASK (7 << 25)
6859#define PS_PLANE_SEL(plane) (((plane) + 1) << 25) 6939#define PS_PLANE_SEL(plane) (((plane) + 1) << 25)
6860#define PS_FILTER_MASK (3 << 23) 6940#define PS_FILTER_MASK (3 << 23)
@@ -6871,6 +6951,8 @@ enum {
6871#define PS_VADAPT_MODE_LEAST_ADAPT (0 << 5) 6951#define PS_VADAPT_MODE_LEAST_ADAPT (0 << 5)
6872#define PS_VADAPT_MODE_MOD_ADAPT (1 << 5) 6952#define PS_VADAPT_MODE_MOD_ADAPT (1 << 5)
6873#define PS_VADAPT_MODE_MOST_ADAPT (3 << 5) 6953#define PS_VADAPT_MODE_MOST_ADAPT (3 << 5)
6954#define PS_PLANE_Y_SEL_MASK (7 << 5)
6955#define PS_PLANE_Y_SEL(plane) (((plane) + 1) << 5)
6874 6956
6875#define _PS_PWR_GATE_1A 0x68160 6957#define _PS_PWR_GATE_1A 0x68160
6876#define _PS_PWR_GATE_2A 0x68260 6958#define _PS_PWR_GATE_2A 0x68260
@@ -7317,9 +7399,10 @@ enum {
7317#define BDW_DPRS_MASK_VBLANK_SRD (1 << 0) 7399#define BDW_DPRS_MASK_VBLANK_SRD (1 << 0)
7318#define CHICKEN_PIPESL_1(pipe) _MMIO_PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B) 7400#define CHICKEN_PIPESL_1(pipe) _MMIO_PIPE(pipe, _CHICKEN_PIPESL_1_A, _CHICKEN_PIPESL_1_B)
7319 7401
7320#define CHICKEN_TRANS_A 0x420c0 7402#define CHICKEN_TRANS_A _MMIO(0x420c0)
7321#define CHICKEN_TRANS_B 0x420c4 7403#define CHICKEN_TRANS_B _MMIO(0x420c4)
7322#define CHICKEN_TRANS(trans) _MMIO_TRANS(trans, CHICKEN_TRANS_A, CHICKEN_TRANS_B) 7404#define CHICKEN_TRANS_C _MMIO(0x420c8)
7405#define CHICKEN_TRANS_EDP _MMIO(0x420cc)
7323#define VSC_DATA_SEL_SOFTWARE_CONTROL (1 << 25) /* GLK and CNL+ */ 7406#define VSC_DATA_SEL_SOFTWARE_CONTROL (1 << 25) /* GLK and CNL+ */
7324#define DDI_TRAINING_OVERRIDE_ENABLE (1 << 19) 7407#define DDI_TRAINING_OVERRIDE_ENABLE (1 << 19)
7325#define DDI_TRAINING_OVERRIDE_VALUE (1 << 18) 7408#define DDI_TRAINING_OVERRIDE_VALUE (1 << 18)
@@ -7409,6 +7492,10 @@ enum {
7409#define GEN9_SLICE_COMMON_ECO_CHICKEN1 _MMIO(0x731c) 7492#define GEN9_SLICE_COMMON_ECO_CHICKEN1 _MMIO(0x731c)
7410#define GEN11_STATE_CACHE_REDIRECT_TO_CS (1 << 11) 7493#define GEN11_STATE_CACHE_REDIRECT_TO_CS (1 << 11)
7411 7494
7495#define GEN7_SARCHKMD _MMIO(0xB000)
7496#define GEN7_DISABLE_DEMAND_PREFETCH (1 << 31)
7497#define GEN7_DISABLE_SAMPLER_PREFETCH (1 << 30)
7498
7412#define GEN7_L3SQCREG1 _MMIO(0xB010) 7499#define GEN7_L3SQCREG1 _MMIO(0xB010)
7413#define VLV_B0_WA_L3SQCREG1_VALUE 0x00D30000 7500#define VLV_B0_WA_L3SQCREG1_VALUE 0x00D30000
7414 7501
@@ -7824,8 +7911,7 @@ enum {
7824#define CNP_RAWCLK_DIV_MASK (0x3ff << 16) 7911#define CNP_RAWCLK_DIV_MASK (0x3ff << 16)
7825#define CNP_RAWCLK_DIV(div) ((div) << 16) 7912#define CNP_RAWCLK_DIV(div) ((div) << 16)
7826#define CNP_RAWCLK_FRAC_MASK (0xf << 26) 7913#define CNP_RAWCLK_FRAC_MASK (0xf << 26)
7827#define CNP_RAWCLK_FRAC(frac) ((frac) << 26) 7914#define CNP_RAWCLK_DEN(den) ((den) << 26)
7828#define ICP_RAWCLK_DEN(den) ((den) << 26)
7829#define ICP_RAWCLK_NUM(num) ((num) << 11) 7915#define ICP_RAWCLK_NUM(num) ((num) << 11)
7830 7916
7831#define PCH_DPLL_TMR_CFG _MMIO(0xc6208) 7917#define PCH_DPLL_TMR_CFG _MMIO(0xc6208)
@@ -8625,8 +8711,7 @@ enum {
8625#define GEN11_LSN_UNSLCVC_GAFS_HALF_CL2_MAXALLOC (1 << 9) 8711#define GEN11_LSN_UNSLCVC_GAFS_HALF_CL2_MAXALLOC (1 << 9)
8626#define GEN11_LSN_UNSLCVC_GAFS_HALF_SF_MAXALLOC (1 << 7) 8712#define GEN11_LSN_UNSLCVC_GAFS_HALF_SF_MAXALLOC (1 << 7)
8627 8713
8628#define GAMW_ECO_DEV_RW_IA_REG _MMIO(0x4080) 8714#define GEN10_SAMPLER_MODE _MMIO(0xE18C)
8629#define GAMW_ECO_DEV_CTX_RELOAD_DISABLE (1 << 7)
8630 8715
8631/* IVYBRIDGE DPF */ 8716/* IVYBRIDGE DPF */
8632#define GEN7_L3CDERRST1(slice) _MMIO(0xB008 + (slice) * 0x200) /* L3CD Error Status 1 */ 8717#define GEN7_L3CDERRST1(slice) _MMIO(0xB008 + (slice) * 0x200) /* L3CD Error Status 1 */
@@ -8927,6 +9012,15 @@ enum skl_power_gate {
8927#define CNL_AUX_ANAOVRD1_ENABLE (1 << 16) 9012#define CNL_AUX_ANAOVRD1_ENABLE (1 << 16)
8928#define CNL_AUX_ANAOVRD1_LDO_BYPASS (1 << 23) 9013#define CNL_AUX_ANAOVRD1_LDO_BYPASS (1 << 23)
8929 9014
9015#define _ICL_AUX_REG_IDX(pw_idx) ((pw_idx) - ICL_PW_CTL_IDX_AUX_A)
9016#define _ICL_AUX_ANAOVRD1_A 0x162398
9017#define _ICL_AUX_ANAOVRD1_B 0x6C398
9018#define ICL_AUX_ANAOVRD1(pw_idx) _MMIO(_PICK(_ICL_AUX_REG_IDX(pw_idx), \
9019 _ICL_AUX_ANAOVRD1_A, \
9020 _ICL_AUX_ANAOVRD1_B))
9021#define ICL_AUX_ANAOVRD1_LDO_BYPASS (1 << 7)
9022#define ICL_AUX_ANAOVRD1_ENABLE (1 << 0)
9023
8930/* HDCP Key Registers */ 9024/* HDCP Key Registers */
8931#define HDCP_KEY_CONF _MMIO(0x66c00) 9025#define HDCP_KEY_CONF _MMIO(0x66c00)
8932#define HDCP_AKSV_SEND_TRIGGER BIT(31) 9026#define HDCP_AKSV_SEND_TRIGGER BIT(31)
@@ -9009,11 +9103,45 @@ enum skl_power_gate {
9009#define HDCP_STATUS_CIPHER BIT(16) 9103#define HDCP_STATUS_CIPHER BIT(16)
9010#define HDCP_STATUS_FRAME_CNT(x) (((x) >> 8) & 0xff) 9104#define HDCP_STATUS_FRAME_CNT(x) (((x) >> 8) & 0xff)
9011 9105
9106/* HDCP2.2 Registers */
9107#define _PORTA_HDCP2_BASE 0x66800
9108#define _PORTB_HDCP2_BASE 0x66500
9109#define _PORTC_HDCP2_BASE 0x66600
9110#define _PORTD_HDCP2_BASE 0x66700
9111#define _PORTE_HDCP2_BASE 0x66A00
9112#define _PORTF_HDCP2_BASE 0x66900
9113#define _PORT_HDCP2_BASE(port, x) _MMIO(_PICK((port), \
9114 _PORTA_HDCP2_BASE, \
9115 _PORTB_HDCP2_BASE, \
9116 _PORTC_HDCP2_BASE, \
9117 _PORTD_HDCP2_BASE, \
9118 _PORTE_HDCP2_BASE, \
9119 _PORTF_HDCP2_BASE) + (x))
9120
9121#define HDCP2_AUTH_DDI(port) _PORT_HDCP2_BASE(port, 0x98)
9122#define AUTH_LINK_AUTHENTICATED BIT(31)
9123#define AUTH_LINK_TYPE BIT(30)
9124#define AUTH_FORCE_CLR_INPUTCTR BIT(19)
9125#define AUTH_CLR_KEYS BIT(18)
9126
9127#define HDCP2_CTL_DDI(port) _PORT_HDCP2_BASE(port, 0xB0)
9128#define CTL_LINK_ENCRYPTION_REQ BIT(31)
9129
9130#define HDCP2_STATUS_DDI(port) _PORT_HDCP2_BASE(port, 0xB4)
9131#define STREAM_ENCRYPTION_STATUS_A BIT(31)
9132#define STREAM_ENCRYPTION_STATUS_B BIT(30)
9133#define STREAM_ENCRYPTION_STATUS_C BIT(29)
9134#define LINK_TYPE_STATUS BIT(22)
9135#define LINK_AUTH_STATUS BIT(21)
9136#define LINK_ENCRYPTION_STATUS BIT(20)
9137
9012/* Per-pipe DDI Function Control */ 9138/* Per-pipe DDI Function Control */
9013#define _TRANS_DDI_FUNC_CTL_A 0x60400 9139#define _TRANS_DDI_FUNC_CTL_A 0x60400
9014#define _TRANS_DDI_FUNC_CTL_B 0x61400 9140#define _TRANS_DDI_FUNC_CTL_B 0x61400
9015#define _TRANS_DDI_FUNC_CTL_C 0x62400 9141#define _TRANS_DDI_FUNC_CTL_C 0x62400
9016#define _TRANS_DDI_FUNC_CTL_EDP 0x6F400 9142#define _TRANS_DDI_FUNC_CTL_EDP 0x6F400
9143#define _TRANS_DDI_FUNC_CTL_DSI0 0x6b400
9144#define _TRANS_DDI_FUNC_CTL_DSI1 0x6bc00
9017#define TRANS_DDI_FUNC_CTL(tran) _MMIO_TRANS2(tran, _TRANS_DDI_FUNC_CTL_A) 9145#define TRANS_DDI_FUNC_CTL(tran) _MMIO_TRANS2(tran, _TRANS_DDI_FUNC_CTL_A)
9018 9146
9019#define TRANS_DDI_FUNC_ENABLE (1 << 31) 9147#define TRANS_DDI_FUNC_ENABLE (1 << 31)
@@ -9051,6 +9179,19 @@ enum skl_power_gate {
9051 | TRANS_DDI_HDMI_SCRAMBLER_RESET_FREQ \ 9179 | TRANS_DDI_HDMI_SCRAMBLER_RESET_FREQ \
9052 | TRANS_DDI_HDMI_SCRAMBLING) 9180 | TRANS_DDI_HDMI_SCRAMBLING)
9053 9181
9182#define _TRANS_DDI_FUNC_CTL2_A 0x60404
9183#define _TRANS_DDI_FUNC_CTL2_B 0x61404
9184#define _TRANS_DDI_FUNC_CTL2_C 0x62404
9185#define _TRANS_DDI_FUNC_CTL2_EDP 0x6f404
9186#define _TRANS_DDI_FUNC_CTL2_DSI0 0x6b404
9187#define _TRANS_DDI_FUNC_CTL2_DSI1 0x6bc04
9188#define TRANS_DDI_FUNC_CTL2(tran) _MMIO_TRANS2(tran, \
9189 _TRANS_DDI_FUNC_CTL2_A)
9190#define PORT_SYNC_MODE_ENABLE (1 << 4)
9191#define PORT_SYNC_MODE_MASTER_SELECT(x) ((x) < 0)
9192#define PORT_SYNC_MODE_MASTER_SELECT_MASK (0x7 << 0)
9193#define PORT_SYNC_MODE_MASTER_SELECT_SHIFT 0
9194
9054/* DisplayPort Transport Control */ 9195/* DisplayPort Transport Control */
9055#define _DP_TP_CTL_A 0x64040 9196#define _DP_TP_CTL_A 0x64040
9056#define _DP_TP_CTL_B 0x64140 9197#define _DP_TP_CTL_B 0x64140
@@ -9222,6 +9363,8 @@ enum skl_power_gate {
9222#define TRANS_MSA_MISC(tran) _MMIO_TRANS2(tran, _TRANSA_MSA_MISC) 9363#define TRANS_MSA_MISC(tran) _MMIO_TRANS2(tran, _TRANSA_MSA_MISC)
9223 9364
9224#define TRANS_MSA_SYNC_CLK (1 << 0) 9365#define TRANS_MSA_SYNC_CLK (1 << 0)
9366#define TRANS_MSA_SAMPLING_444 (2 << 1)
9367#define TRANS_MSA_CLRSP_YCBCR (2 << 3)
9225#define TRANS_MSA_6_BPC (0 << 5) 9368#define TRANS_MSA_6_BPC (0 << 5)
9226#define TRANS_MSA_8_BPC (1 << 5) 9369#define TRANS_MSA_8_BPC (1 << 5)
9227#define TRANS_MSA_10_BPC (2 << 5) 9370#define TRANS_MSA_10_BPC (2 << 5)
@@ -9789,6 +9932,10 @@ enum skl_power_gate {
9789#define _MIPI_PORT(port, a, c) (((port) == PORT_A) ? a : c) /* ports A and C only */ 9932#define _MIPI_PORT(port, a, c) (((port) == PORT_A) ? a : c) /* ports A and C only */
9790#define _MMIO_MIPI(port, a, c) _MMIO(_MIPI_PORT(port, a, c)) 9933#define _MMIO_MIPI(port, a, c) _MMIO(_MIPI_PORT(port, a, c))
9791 9934
9935/* Gen11 DSI */
9936#define _MMIO_DSI(tc, dsi0, dsi1) _MMIO_TRANS((tc) - TRANSCODER_DSI_0, \
9937 dsi0, dsi1)
9938
9792#define MIPIO_TXESC_CLK_DIV1 _MMIO(0x160004) 9939#define MIPIO_TXESC_CLK_DIV1 _MMIO(0x160004)
9793#define GLK_TX_ESC_CLK_DIV1_MASK 0x3FF 9940#define GLK_TX_ESC_CLK_DIV1_MASK 0x3FF
9794#define MIPIO_TXESC_CLK_DIV2 _MMIO(0x160008) 9941#define MIPIO_TXESC_CLK_DIV2 _MMIO(0x160008)
@@ -9952,6 +10099,39 @@ enum skl_power_gate {
9952 _ICL_DSI_IO_MODECTL_1) 10099 _ICL_DSI_IO_MODECTL_1)
9953#define COMBO_PHY_MODE_DSI (1 << 0) 10100#define COMBO_PHY_MODE_DSI (1 << 0)
9954 10101
10102/* Display Stream Splitter Control */
10103#define DSS_CTL1 _MMIO(0x67400)
10104#define SPLITTER_ENABLE (1 << 31)
10105#define JOINER_ENABLE (1 << 30)
10106#define DUAL_LINK_MODE_INTERLEAVE (1 << 24)
10107#define DUAL_LINK_MODE_FRONTBACK (0 << 24)
10108#define OVERLAP_PIXELS_MASK (0xf << 16)
10109#define OVERLAP_PIXELS(pixels) ((pixels) << 16)
10110#define LEFT_DL_BUF_TARGET_DEPTH_MASK (0xfff << 0)
10111#define LEFT_DL_BUF_TARGET_DEPTH(pixels) ((pixels) << 0)
10112#define MAX_DL_BUFFER_TARGET_DEPTH 0x5a0
10113
10114#define DSS_CTL2 _MMIO(0x67404)
10115#define LEFT_BRANCH_VDSC_ENABLE (1 << 31)
10116#define RIGHT_BRANCH_VDSC_ENABLE (1 << 15)
10117#define RIGHT_DL_BUF_TARGET_DEPTH_MASK (0xfff << 0)
10118#define RIGHT_DL_BUF_TARGET_DEPTH(pixels) ((pixels) << 0)
10119
10120#define _ICL_PIPE_DSS_CTL1_PB 0x78200
10121#define _ICL_PIPE_DSS_CTL1_PC 0x78400
10122#define ICL_PIPE_DSS_CTL1(pipe) _MMIO_PIPE((pipe) - PIPE_B, \
10123 _ICL_PIPE_DSS_CTL1_PB, \
10124 _ICL_PIPE_DSS_CTL1_PC)
10125#define BIG_JOINER_ENABLE (1 << 29)
10126#define MASTER_BIG_JOINER_ENABLE (1 << 28)
10127#define VGA_CENTERING_ENABLE (1 << 27)
10128
10129#define _ICL_PIPE_DSS_CTL2_PB 0x78204
10130#define _ICL_PIPE_DSS_CTL2_PC 0x78404
10131#define ICL_PIPE_DSS_CTL2(pipe) _MMIO_PIPE((pipe) - PIPE_B, \
10132 _ICL_PIPE_DSS_CTL2_PB, \
10133 _ICL_PIPE_DSS_CTL2_PC)
10134
9955#define BXT_P_DSI_REGULATOR_CFG _MMIO(0x160020) 10135#define BXT_P_DSI_REGULATOR_CFG _MMIO(0x160020)
9956#define STAP_SELECT (1 << 0) 10136#define STAP_SELECT (1 << 0)
9957 10137
@@ -10288,6 +10468,235 @@ enum skl_power_gate {
10288 _ICL_DSI_T_INIT_MASTER_0,\ 10468 _ICL_DSI_T_INIT_MASTER_0,\
10289 _ICL_DSI_T_INIT_MASTER_1) 10469 _ICL_DSI_T_INIT_MASTER_1)
10290 10470
10471#define _DPHY_CLK_TIMING_PARAM_0 0x162180
10472#define _DPHY_CLK_TIMING_PARAM_1 0x6c180
10473#define DPHY_CLK_TIMING_PARAM(port) _MMIO_PORT(port, \
10474 _DPHY_CLK_TIMING_PARAM_0,\
10475 _DPHY_CLK_TIMING_PARAM_1)
10476#define _DSI_CLK_TIMING_PARAM_0 0x6b080
10477#define _DSI_CLK_TIMING_PARAM_1 0x6b880
10478#define DSI_CLK_TIMING_PARAM(port) _MMIO_PORT(port, \
10479 _DSI_CLK_TIMING_PARAM_0,\
10480 _DSI_CLK_TIMING_PARAM_1)
10481#define CLK_PREPARE_OVERRIDE (1 << 31)
10482#define CLK_PREPARE(x) ((x) << 28)
10483#define CLK_PREPARE_MASK (0x7 << 28)
10484#define CLK_PREPARE_SHIFT 28
10485#define CLK_ZERO_OVERRIDE (1 << 27)
10486#define CLK_ZERO(x) ((x) << 20)
10487#define CLK_ZERO_MASK (0xf << 20)
10488#define CLK_ZERO_SHIFT 20
10489#define CLK_PRE_OVERRIDE (1 << 19)
10490#define CLK_PRE(x) ((x) << 16)
10491#define CLK_PRE_MASK (0x3 << 16)
10492#define CLK_PRE_SHIFT 16
10493#define CLK_POST_OVERRIDE (1 << 15)
10494#define CLK_POST(x) ((x) << 8)
10495#define CLK_POST_MASK (0x7 << 8)
10496#define CLK_POST_SHIFT 8
10497#define CLK_TRAIL_OVERRIDE (1 << 7)
10498#define CLK_TRAIL(x) ((x) << 0)
10499#define CLK_TRAIL_MASK (0xf << 0)
10500#define CLK_TRAIL_SHIFT 0
10501
10502#define _DPHY_DATA_TIMING_PARAM_0 0x162184
10503#define _DPHY_DATA_TIMING_PARAM_1 0x6c184
10504#define DPHY_DATA_TIMING_PARAM(port) _MMIO_PORT(port, \
10505 _DPHY_DATA_TIMING_PARAM_0,\
10506 _DPHY_DATA_TIMING_PARAM_1)
10507#define _DSI_DATA_TIMING_PARAM_0 0x6B084
10508#define _DSI_DATA_TIMING_PARAM_1 0x6B884
10509#define DSI_DATA_TIMING_PARAM(port) _MMIO_PORT(port, \
10510 _DSI_DATA_TIMING_PARAM_0,\
10511 _DSI_DATA_TIMING_PARAM_1)
10512#define HS_PREPARE_OVERRIDE (1 << 31)
10513#define HS_PREPARE(x) ((x) << 24)
10514#define HS_PREPARE_MASK (0x7 << 24)
10515#define HS_PREPARE_SHIFT 24
10516#define HS_ZERO_OVERRIDE (1 << 23)
10517#define HS_ZERO(x) ((x) << 16)
10518#define HS_ZERO_MASK (0xf << 16)
10519#define HS_ZERO_SHIFT 16
10520#define HS_TRAIL_OVERRIDE (1 << 15)
10521#define HS_TRAIL(x) ((x) << 8)
10522#define HS_TRAIL_MASK (0x7 << 8)
10523#define HS_TRAIL_SHIFT 8
10524#define HS_EXIT_OVERRIDE (1 << 7)
10525#define HS_EXIT(x) ((x) << 0)
10526#define HS_EXIT_MASK (0x7 << 0)
10527#define HS_EXIT_SHIFT 0
10528
10529#define _DPHY_TA_TIMING_PARAM_0 0x162188
10530#define _DPHY_TA_TIMING_PARAM_1 0x6c188
10531#define DPHY_TA_TIMING_PARAM(port) _MMIO_PORT(port, \
10532 _DPHY_TA_TIMING_PARAM_0,\
10533 _DPHY_TA_TIMING_PARAM_1)
10534#define _DSI_TA_TIMING_PARAM_0 0x6b098
10535#define _DSI_TA_TIMING_PARAM_1 0x6b898
10536#define DSI_TA_TIMING_PARAM(port) _MMIO_PORT(port, \
10537 _DSI_TA_TIMING_PARAM_0,\
10538 _DSI_TA_TIMING_PARAM_1)
10539#define TA_SURE_OVERRIDE (1 << 31)
10540#define TA_SURE(x) ((x) << 16)
10541#define TA_SURE_MASK (0x1f << 16)
10542#define TA_SURE_SHIFT 16
10543#define TA_GO_OVERRIDE (1 << 15)
10544#define TA_GO(x) ((x) << 8)
10545#define TA_GO_MASK (0xf << 8)
10546#define TA_GO_SHIFT 8
10547#define TA_GET_OVERRIDE (1 << 7)
10548#define TA_GET(x) ((x) << 0)
10549#define TA_GET_MASK (0xf << 0)
10550#define TA_GET_SHIFT 0
10551
10552/* DSI transcoder configuration */
10553#define _DSI_TRANS_FUNC_CONF_0 0x6b030
10554#define _DSI_TRANS_FUNC_CONF_1 0x6b830
10555#define DSI_TRANS_FUNC_CONF(tc) _MMIO_DSI(tc, \
10556 _DSI_TRANS_FUNC_CONF_0,\
10557 _DSI_TRANS_FUNC_CONF_1)
10558#define OP_MODE_MASK (0x3 << 28)
10559#define OP_MODE_SHIFT 28
10560#define CMD_MODE_NO_GATE (0x0 << 28)
10561#define CMD_MODE_TE_GATE (0x1 << 28)
10562#define VIDEO_MODE_SYNC_EVENT (0x2 << 28)
10563#define VIDEO_MODE_SYNC_PULSE (0x3 << 28)
10564#define LINK_READY (1 << 20)
10565#define PIX_FMT_MASK (0x3 << 16)
10566#define PIX_FMT_SHIFT 16
10567#define PIX_FMT_RGB565 (0x0 << 16)
10568#define PIX_FMT_RGB666_PACKED (0x1 << 16)
10569#define PIX_FMT_RGB666_LOOSE (0x2 << 16)
10570#define PIX_FMT_RGB888 (0x3 << 16)
10571#define PIX_FMT_RGB101010 (0x4 << 16)
10572#define PIX_FMT_RGB121212 (0x5 << 16)
10573#define PIX_FMT_COMPRESSED (0x6 << 16)
10574#define BGR_TRANSMISSION (1 << 15)
10575#define PIX_VIRT_CHAN(x) ((x) << 12)
10576#define PIX_VIRT_CHAN_MASK (0x3 << 12)
10577#define PIX_VIRT_CHAN_SHIFT 12
10578#define PIX_BUF_THRESHOLD_MASK (0x3 << 10)
10579#define PIX_BUF_THRESHOLD_SHIFT 10
10580#define PIX_BUF_THRESHOLD_1_4 (0x0 << 10)
10581#define PIX_BUF_THRESHOLD_1_2 (0x1 << 10)
10582#define PIX_BUF_THRESHOLD_3_4 (0x2 << 10)
10583#define PIX_BUF_THRESHOLD_FULL (0x3 << 10)
10584#define CONTINUOUS_CLK_MASK (0x3 << 8)
10585#define CONTINUOUS_CLK_SHIFT 8
10586#define CLK_ENTER_LP_AFTER_DATA (0x0 << 8)
10587#define CLK_HS_OR_LP (0x2 << 8)
10588#define CLK_HS_CONTINUOUS (0x3 << 8)
10589#define LINK_CALIBRATION_MASK (0x3 << 4)
10590#define LINK_CALIBRATION_SHIFT 4
10591#define CALIBRATION_DISABLED (0x0 << 4)
10592#define CALIBRATION_ENABLED_INITIAL_ONLY (0x2 << 4)
10593#define CALIBRATION_ENABLED_INITIAL_PERIODIC (0x3 << 4)
10594#define S3D_ORIENTATION_LANDSCAPE (1 << 1)
10595#define EOTP_DISABLED (1 << 0)
10596
10597#define _DSI_CMD_RXCTL_0 0x6b0d4
10598#define _DSI_CMD_RXCTL_1 0x6b8d4
10599#define DSI_CMD_RXCTL(tc) _MMIO_DSI(tc, \
10600 _DSI_CMD_RXCTL_0,\
10601 _DSI_CMD_RXCTL_1)
10602#define READ_UNLOADS_DW (1 << 16)
10603#define RECEIVED_UNASSIGNED_TRIGGER (1 << 15)
10604#define RECEIVED_ACKNOWLEDGE_TRIGGER (1 << 14)
10605#define RECEIVED_TEAR_EFFECT_TRIGGER (1 << 13)
10606#define RECEIVED_RESET_TRIGGER (1 << 12)
10607#define RECEIVED_PAYLOAD_WAS_LOST (1 << 11)
10608#define RECEIVED_CRC_WAS_LOST (1 << 10)
10609#define NUMBER_RX_PLOAD_DW_MASK (0xff << 0)
10610#define NUMBER_RX_PLOAD_DW_SHIFT 0
10611
10612#define _DSI_CMD_TXCTL_0 0x6b0d0
10613#define _DSI_CMD_TXCTL_1 0x6b8d0
10614#define DSI_CMD_TXCTL(tc) _MMIO_DSI(tc, \
10615 _DSI_CMD_TXCTL_0,\
10616 _DSI_CMD_TXCTL_1)
10617#define KEEP_LINK_IN_HS (1 << 24)
10618#define FREE_HEADER_CREDIT_MASK (0x1f << 8)
10619#define FREE_HEADER_CREDIT_SHIFT 0x8
10620#define FREE_PLOAD_CREDIT_MASK (0xff << 0)
10621#define FREE_PLOAD_CREDIT_SHIFT 0
10622#define MAX_HEADER_CREDIT 0x10
10623#define MAX_PLOAD_CREDIT 0x40
10624
10625#define _DSI_CMD_TXHDR_0 0x6b100
10626#define _DSI_CMD_TXHDR_1 0x6b900
10627#define DSI_CMD_TXHDR(tc) _MMIO_DSI(tc, \
10628 _DSI_CMD_TXHDR_0,\
10629 _DSI_CMD_TXHDR_1)
10630#define PAYLOAD_PRESENT (1 << 31)
10631#define LP_DATA_TRANSFER (1 << 30)
10632#define VBLANK_FENCE (1 << 29)
10633#define PARAM_WC_MASK (0xffff << 8)
10634#define PARAM_WC_LOWER_SHIFT 8
10635#define PARAM_WC_UPPER_SHIFT 16
10636#define VC_MASK (0x3 << 6)
10637#define VC_SHIFT 6
10638#define DT_MASK (0x3f << 0)
10639#define DT_SHIFT 0
10640
10641#define _DSI_CMD_TXPYLD_0 0x6b104
10642#define _DSI_CMD_TXPYLD_1 0x6b904
10643#define DSI_CMD_TXPYLD(tc) _MMIO_DSI(tc, \
10644 _DSI_CMD_TXPYLD_0,\
10645 _DSI_CMD_TXPYLD_1)
10646
10647#define _DSI_LP_MSG_0 0x6b0d8
10648#define _DSI_LP_MSG_1 0x6b8d8
10649#define DSI_LP_MSG(tc) _MMIO_DSI(tc, \
10650 _DSI_LP_MSG_0,\
10651 _DSI_LP_MSG_1)
10652#define LPTX_IN_PROGRESS (1 << 17)
10653#define LINK_IN_ULPS (1 << 16)
10654#define LINK_ULPS_TYPE_LP11 (1 << 8)
10655#define LINK_ENTER_ULPS (1 << 0)
10656
10657/* DSI timeout registers */
10658#define _DSI_HSTX_TO_0 0x6b044
10659#define _DSI_HSTX_TO_1 0x6b844
10660#define DSI_HSTX_TO(tc) _MMIO_DSI(tc, \
10661 _DSI_HSTX_TO_0,\
10662 _DSI_HSTX_TO_1)
10663#define HSTX_TIMEOUT_VALUE_MASK (0xffff << 16)
10664#define HSTX_TIMEOUT_VALUE_SHIFT 16
10665#define HSTX_TIMEOUT_VALUE(x) ((x) << 16)
10666#define HSTX_TIMED_OUT (1 << 0)
10667
10668#define _DSI_LPRX_HOST_TO_0 0x6b048
10669#define _DSI_LPRX_HOST_TO_1 0x6b848
10670#define DSI_LPRX_HOST_TO(tc) _MMIO_DSI(tc, \
10671 _DSI_LPRX_HOST_TO_0,\
10672 _DSI_LPRX_HOST_TO_1)
10673#define LPRX_TIMED_OUT (1 << 16)
10674#define LPRX_TIMEOUT_VALUE_MASK (0xffff << 0)
10675#define LPRX_TIMEOUT_VALUE_SHIFT 0
10676#define LPRX_TIMEOUT_VALUE(x) ((x) << 0)
10677
10678#define _DSI_PWAIT_TO_0 0x6b040
10679#define _DSI_PWAIT_TO_1 0x6b840
10680#define DSI_PWAIT_TO(tc) _MMIO_DSI(tc, \
10681 _DSI_PWAIT_TO_0,\
10682 _DSI_PWAIT_TO_1)
10683#define PRESET_TIMEOUT_VALUE_MASK (0xffff << 16)
10684#define PRESET_TIMEOUT_VALUE_SHIFT 16
10685#define PRESET_TIMEOUT_VALUE(x) ((x) << 16)
10686#define PRESPONSE_TIMEOUT_VALUE_MASK (0xffff << 0)
10687#define PRESPONSE_TIMEOUT_VALUE_SHIFT 0
10688#define PRESPONSE_TIMEOUT_VALUE(x) ((x) << 0)
10689
10690#define _DSI_TA_TO_0 0x6b04c
10691#define _DSI_TA_TO_1 0x6b84c
10692#define DSI_TA_TO(tc) _MMIO_DSI(tc, \
10693 _DSI_TA_TO_0,\
10694 _DSI_TA_TO_1)
10695#define TA_TIMED_OUT (1 << 16)
10696#define TA_TIMEOUT_VALUE_MASK (0xffff << 0)
10697#define TA_TIMEOUT_VALUE_SHIFT 0
10698#define TA_TIMEOUT_VALUE(x) ((x) << 0)
10699
10291/* bits 31:0 */ 10700/* bits 31:0 */
10292#define _MIPIA_DBI_BW_CTRL (dev_priv->mipi_mmio_base + 0xb084) 10701#define _MIPIA_DBI_BW_CTRL (dev_priv->mipi_mmio_base + 0xb084)
10293#define _MIPIC_DBI_BW_CTRL (dev_priv->mipi_mmio_base + 0xb884) 10702#define _MIPIC_DBI_BW_CTRL (dev_priv->mipi_mmio_base + 0xb884)
@@ -10400,10 +10809,6 @@ enum skl_power_gate {
10400#define MIPI_READ_DATA_VALID(port) _MMIO_MIPI(port, _MIPIA_READ_DATA_VALID, _MIPIC_READ_DATA_VALID) 10809#define MIPI_READ_DATA_VALID(port) _MMIO_MIPI(port, _MIPIA_READ_DATA_VALID, _MIPIC_READ_DATA_VALID)
10401#define READ_DATA_VALID(n) (1 << (n)) 10810#define READ_DATA_VALID(n) (1 << (n))
10402 10811
10403/* For UMS only (deprecated): */
10404#define _PALETTE_A (dev_priv->info.display_mmio_offset + 0xa000)
10405#define _PALETTE_B (dev_priv->info.display_mmio_offset + 0xa800)
10406
10407/* MOCS (Memory Object Control State) registers */ 10812/* MOCS (Memory Object Control State) registers */
10408#define GEN9_LNCFCMOCS(i) _MMIO(0xb020 + (i) * 4) /* L3 Cache Control */ 10813#define GEN9_LNCFCMOCS(i) _MMIO(0xb020 + (i) * 4) /* L3 Cache Control */
10409 10814
@@ -10689,6 +11094,7 @@ enum skl_power_gate {
10689#define ICL_DSC1_PICTURE_PARAMETER_SET_16(pipe) _MMIO_PIPE((pipe) - PIPE_B, \ 11094#define ICL_DSC1_PICTURE_PARAMETER_SET_16(pipe) _MMIO_PIPE((pipe) - PIPE_B, \
10690 _ICL_DSC1_PICTURE_PARAMETER_SET_16_PB, \ 11095 _ICL_DSC1_PICTURE_PARAMETER_SET_16_PB, \
10691 _ICL_DSC1_PICTURE_PARAMETER_SET_16_PC) 11096 _ICL_DSC1_PICTURE_PARAMETER_SET_16_PC)
11097#define DSC_SLICE_ROW_PER_FRAME(slice_row_per_frame) ((slice_row_per_frame) << 20)
10692#define DSC_SLICE_PER_LINE(slice_per_line) ((slice_per_line) << 16) 11098#define DSC_SLICE_PER_LINE(slice_per_line) ((slice_per_line) << 16)
10693#define DSC_SLICE_CHUNK_SIZE(slice_chunk_size) ((slice_chunk_size) << 0) 11099#define DSC_SLICE_CHUNK_SIZE(slice_chunk_size) ((slice_chunk_size) << 0)
10694 11100
@@ -10743,17 +11149,17 @@ enum skl_power_gate {
10743 _ICL_DSC1_RC_BUF_THRESH_1_UDW_PB, \ 11149 _ICL_DSC1_RC_BUF_THRESH_1_UDW_PB, \
10744 _ICL_DSC1_RC_BUF_THRESH_1_UDW_PC) 11150 _ICL_DSC1_RC_BUF_THRESH_1_UDW_PC)
10745 11151
10746#define PORT_TX_DFLEXDPSP _MMIO(0x1638A0) 11152#define PORT_TX_DFLEXDPSP _MMIO(FIA1_BASE + 0x008A0)
10747#define TC_LIVE_STATE_TBT(tc_port) (1 << ((tc_port) * 8 + 6)) 11153#define TC_LIVE_STATE_TBT(tc_port) (1 << ((tc_port) * 8 + 6))
10748#define TC_LIVE_STATE_TC(tc_port) (1 << ((tc_port) * 8 + 5)) 11154#define TC_LIVE_STATE_TC(tc_port) (1 << ((tc_port) * 8 + 5))
10749#define DP_LANE_ASSIGNMENT_SHIFT(tc_port) ((tc_port) * 8) 11155#define DP_LANE_ASSIGNMENT_SHIFT(tc_port) ((tc_port) * 8)
10750#define DP_LANE_ASSIGNMENT_MASK(tc_port) (0xf << ((tc_port) * 8)) 11156#define DP_LANE_ASSIGNMENT_MASK(tc_port) (0xf << ((tc_port) * 8))
10751#define DP_LANE_ASSIGNMENT(tc_port, x) ((x) << ((tc_port) * 8)) 11157#define DP_LANE_ASSIGNMENT(tc_port, x) ((x) << ((tc_port) * 8))
10752 11158
10753#define PORT_TX_DFLEXDPPMS _MMIO(0x163890) 11159#define PORT_TX_DFLEXDPPMS _MMIO(FIA1_BASE + 0x00890)
10754#define DP_PHY_MODE_STATUS_COMPLETED(tc_port) (1 << (tc_port)) 11160#define DP_PHY_MODE_STATUS_COMPLETED(tc_port) (1 << (tc_port))
10755 11161
10756#define PORT_TX_DFLEXDPCSSS _MMIO(0x163894) 11162#define PORT_TX_DFLEXDPCSSS _MMIO(FIA1_BASE + 0x00894)
10757#define DP_PHY_MODE_STATUS_NOT_SAFE(tc_port) (1 << (tc_port)) 11163#define DP_PHY_MODE_STATUS_NOT_SAFE(tc_port) (1 << (tc_port))
10758 11164
10759#endif /* _I915_REG_H_ */ 11165#endif /* _I915_REG_H_ */
diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
index a492385b2089..71107540581d 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -111,91 +111,6 @@ i915_request_remove_from_client(struct i915_request *request)
111 spin_unlock(&file_priv->mm.lock); 111 spin_unlock(&file_priv->mm.lock);
112} 112}
113 113
114static struct i915_dependency *
115i915_dependency_alloc(struct drm_i915_private *i915)
116{
117 return kmem_cache_alloc(i915->dependencies, GFP_KERNEL);
118}
119
120static void
121i915_dependency_free(struct drm_i915_private *i915,
122 struct i915_dependency *dep)
123{
124 kmem_cache_free(i915->dependencies, dep);
125}
126
127static void
128__i915_sched_node_add_dependency(struct i915_sched_node *node,
129 struct i915_sched_node *signal,
130 struct i915_dependency *dep,
131 unsigned long flags)
132{
133 INIT_LIST_HEAD(&dep->dfs_link);
134 list_add(&dep->wait_link, &signal->waiters_list);
135 list_add(&dep->signal_link, &node->signalers_list);
136 dep->signaler = signal;
137 dep->flags = flags;
138}
139
140static int
141i915_sched_node_add_dependency(struct drm_i915_private *i915,
142 struct i915_sched_node *node,
143 struct i915_sched_node *signal)
144{
145 struct i915_dependency *dep;
146
147 dep = i915_dependency_alloc(i915);
148 if (!dep)
149 return -ENOMEM;
150
151 __i915_sched_node_add_dependency(node, signal, dep,
152 I915_DEPENDENCY_ALLOC);
153 return 0;
154}
155
156static void
157i915_sched_node_fini(struct drm_i915_private *i915,
158 struct i915_sched_node *node)
159{
160 struct i915_dependency *dep, *tmp;
161
162 GEM_BUG_ON(!list_empty(&node->link));
163
164 /*
165 * Everyone we depended upon (the fences we wait to be signaled)
166 * should retire before us and remove themselves from our list.
167 * However, retirement is run independently on each timeline and
168 * so we may be called out-of-order.
169 */
170 list_for_each_entry_safe(dep, tmp, &node->signalers_list, signal_link) {
171 GEM_BUG_ON(!i915_sched_node_signaled(dep->signaler));
172 GEM_BUG_ON(!list_empty(&dep->dfs_link));
173
174 list_del(&dep->wait_link);
175 if (dep->flags & I915_DEPENDENCY_ALLOC)
176 i915_dependency_free(i915, dep);
177 }
178
179 /* Remove ourselves from everyone who depends upon us */
180 list_for_each_entry_safe(dep, tmp, &node->waiters_list, wait_link) {
181 GEM_BUG_ON(dep->signaler != node);
182 GEM_BUG_ON(!list_empty(&dep->dfs_link));
183
184 list_del(&dep->signal_link);
185 if (dep->flags & I915_DEPENDENCY_ALLOC)
186 i915_dependency_free(i915, dep);
187 }
188}
189
190static void
191i915_sched_node_init(struct i915_sched_node *node)
192{
193 INIT_LIST_HEAD(&node->signalers_list);
194 INIT_LIST_HEAD(&node->waiters_list);
195 INIT_LIST_HEAD(&node->link);
196 node->attr.priority = I915_PRIORITY_INVALID;
197}
198
199static int reset_all_global_seqno(struct drm_i915_private *i915, u32 seqno) 114static int reset_all_global_seqno(struct drm_i915_private *i915, u32 seqno)
200{ 115{
201 struct intel_engine_cs *engine; 116 struct intel_engine_cs *engine;
@@ -221,6 +136,8 @@ static int reset_all_global_seqno(struct drm_i915_private *i915, u32 seqno)
221 intel_engine_get_seqno(engine), 136 intel_engine_get_seqno(engine),
222 seqno); 137 seqno);
223 138
139 kthread_park(engine->breadcrumbs.signaler);
140
224 if (!i915_seqno_passed(seqno, engine->timeline.seqno)) { 141 if (!i915_seqno_passed(seqno, engine->timeline.seqno)) {
225 /* Flush any waiters before we reuse the seqno */ 142 /* Flush any waiters before we reuse the seqno */
226 intel_engine_disarm_breadcrumbs(engine); 143 intel_engine_disarm_breadcrumbs(engine);
@@ -235,6 +152,8 @@ static int reset_all_global_seqno(struct drm_i915_private *i915, u32 seqno)
235 /* Finally reset hw state */ 152 /* Finally reset hw state */
236 intel_engine_init_global_seqno(engine, seqno); 153 intel_engine_init_global_seqno(engine, seqno);
237 engine->timeline.seqno = seqno; 154 engine->timeline.seqno = seqno;
155
156 kthread_unpark(engine->breadcrumbs.signaler);
238 } 157 }
239 158
240 list_for_each_entry(timeline, &i915->gt.timelines, link) 159 list_for_each_entry(timeline, &i915->gt.timelines, link)
@@ -740,17 +659,6 @@ i915_request_alloc(struct intel_engine_cs *engine, struct i915_gem_context *ctx)
740 if (rq) 659 if (rq)
741 cond_synchronize_rcu(rq->rcustate); 660 cond_synchronize_rcu(rq->rcustate);
742 661
743 /*
744 * We've forced the client to stall and catch up with whatever
745 * backlog there might have been. As we are assuming that we
746 * caused the mempressure, now is an opportune time to
747 * recover as much memory from the request pool as is possible.
748 * Having already penalized the client to stall, we spend
749 * a little extra time to re-optimise page allocation.
750 */
751 kmem_cache_shrink(i915->requests);
752 rcu_barrier(); /* Recover the TYPESAFE_BY_RCU pages */
753
754 rq = kmem_cache_alloc(i915->requests, GFP_KERNEL); 662 rq = kmem_cache_alloc(i915->requests, GFP_KERNEL);
755 if (!rq) { 663 if (!rq) {
756 ret = -ENOMEM; 664 ret = -ENOMEM;
@@ -1127,8 +1035,20 @@ void i915_request_add(struct i915_request *request)
1127 */ 1035 */
1128 local_bh_disable(); 1036 local_bh_disable();
1129 rcu_read_lock(); /* RCU serialisation for set-wedged protection */ 1037 rcu_read_lock(); /* RCU serialisation for set-wedged protection */
1130 if (engine->schedule) 1038 if (engine->schedule) {
1131 engine->schedule(request, &request->gem_context->sched); 1039 struct i915_sched_attr attr = request->gem_context->sched;
1040
1041 /*
1042 * Boost priorities to new clients (new request flows).
1043 *
1044 * Allow interactive/synchronous clients to jump ahead of
1045 * the bulk clients. (FQ_CODEL)
1046 */
1047 if (!prev || i915_request_completed(prev))
1048 attr.priority |= I915_PRIORITY_NEWCLIENT;
1049
1050 engine->schedule(request, &attr);
1051 }
1132 rcu_read_unlock(); 1052 rcu_read_unlock();
1133 i915_sw_fence_commit(&request->submit); 1053 i915_sw_fence_commit(&request->submit);
1134 local_bh_enable(); /* Kick the execlists tasklet if just scheduled */ 1054 local_bh_enable(); /* Kick the execlists tasklet if just scheduled */
@@ -1310,6 +1230,8 @@ long i915_request_wait(struct i915_request *rq,
1310 add_wait_queue(errq, &reset); 1230 add_wait_queue(errq, &reset);
1311 1231
1312 intel_wait_init(&wait); 1232 intel_wait_init(&wait);
1233 if (flags & I915_WAIT_PRIORITY)
1234 i915_schedule_bump_priority(rq, I915_PRIORITY_WAIT);
1313 1235
1314restart: 1236restart:
1315 do { 1237 do {
diff --git a/drivers/gpu/drm/i915/i915_request.h b/drivers/gpu/drm/i915/i915_request.h
index 7fa94b024968..90e9d170a0cd 100644
--- a/drivers/gpu/drm/i915/i915_request.h
+++ b/drivers/gpu/drm/i915/i915_request.h
@@ -277,8 +277,9 @@ long i915_request_wait(struct i915_request *rq,
277 __attribute__((nonnull(1))); 277 __attribute__((nonnull(1)));
278#define I915_WAIT_INTERRUPTIBLE BIT(0) 278#define I915_WAIT_INTERRUPTIBLE BIT(0)
279#define I915_WAIT_LOCKED BIT(1) /* struct_mutex held, handle GPU reset */ 279#define I915_WAIT_LOCKED BIT(1) /* struct_mutex held, handle GPU reset */
280#define I915_WAIT_ALL BIT(2) /* used by i915_gem_object_wait() */ 280#define I915_WAIT_PRIORITY BIT(2) /* small priority bump for the request */
281#define I915_WAIT_FOR_IDLE_BOOST BIT(3) 281#define I915_WAIT_ALL BIT(3) /* used by i915_gem_object_wait() */
282#define I915_WAIT_FOR_IDLE_BOOST BIT(4)
282 283
283static inline bool intel_engine_has_started(struct intel_engine_cs *engine, 284static inline bool intel_engine_has_started(struct intel_engine_cs *engine,
284 u32 seqno); 285 u32 seqno);
@@ -332,14 +333,6 @@ static inline bool i915_request_completed(const struct i915_request *rq)
332 return __i915_request_completed(rq, seqno); 333 return __i915_request_completed(rq, seqno);
333} 334}
334 335
335static inline bool i915_sched_node_signaled(const struct i915_sched_node *node)
336{
337 const struct i915_request *rq =
338 container_of(node, const struct i915_request, sched);
339
340 return i915_request_completed(rq);
341}
342
343void i915_retire_requests(struct drm_i915_private *i915); 336void i915_retire_requests(struct drm_i915_private *i915);
344 337
345/* 338/*
diff --git a/drivers/gpu/drm/i915/i915_scheduler.c b/drivers/gpu/drm/i915/i915_scheduler.c
new file mode 100644
index 000000000000..340faea6c08a
--- /dev/null
+++ b/drivers/gpu/drm/i915/i915_scheduler.c
@@ -0,0 +1,399 @@
1/*
2 * SPDX-License-Identifier: MIT
3 *
4 * Copyright © 2018 Intel Corporation
5 */
6
7#include <linux/mutex.h>
8
9#include "i915_drv.h"
10#include "i915_request.h"
11#include "i915_scheduler.h"
12
13static DEFINE_SPINLOCK(schedule_lock);
14
15static const struct i915_request *
16node_to_request(const struct i915_sched_node *node)
17{
18 return container_of(node, const struct i915_request, sched);
19}
20
21static inline bool node_signaled(const struct i915_sched_node *node)
22{
23 return i915_request_completed(node_to_request(node));
24}
25
26void i915_sched_node_init(struct i915_sched_node *node)
27{
28 INIT_LIST_HEAD(&node->signalers_list);
29 INIT_LIST_HEAD(&node->waiters_list);
30 INIT_LIST_HEAD(&node->link);
31 node->attr.priority = I915_PRIORITY_INVALID;
32}
33
34static struct i915_dependency *
35i915_dependency_alloc(struct drm_i915_private *i915)
36{
37 return kmem_cache_alloc(i915->dependencies, GFP_KERNEL);
38}
39
40static void
41i915_dependency_free(struct drm_i915_private *i915,
42 struct i915_dependency *dep)
43{
44 kmem_cache_free(i915->dependencies, dep);
45}
46
47bool __i915_sched_node_add_dependency(struct i915_sched_node *node,
48 struct i915_sched_node *signal,
49 struct i915_dependency *dep,
50 unsigned long flags)
51{
52 bool ret = false;
53
54 spin_lock(&schedule_lock);
55
56 if (!node_signaled(signal)) {
57 INIT_LIST_HEAD(&dep->dfs_link);
58 list_add(&dep->wait_link, &signal->waiters_list);
59 list_add(&dep->signal_link, &node->signalers_list);
60 dep->signaler = signal;
61 dep->flags = flags;
62
63 ret = true;
64 }
65
66 spin_unlock(&schedule_lock);
67
68 return ret;
69}
70
71int i915_sched_node_add_dependency(struct drm_i915_private *i915,
72 struct i915_sched_node *node,
73 struct i915_sched_node *signal)
74{
75 struct i915_dependency *dep;
76
77 dep = i915_dependency_alloc(i915);
78 if (!dep)
79 return -ENOMEM;
80
81 if (!__i915_sched_node_add_dependency(node, signal, dep,
82 I915_DEPENDENCY_ALLOC))
83 i915_dependency_free(i915, dep);
84
85 return 0;
86}
87
88void i915_sched_node_fini(struct drm_i915_private *i915,
89 struct i915_sched_node *node)
90{
91 struct i915_dependency *dep, *tmp;
92
93 GEM_BUG_ON(!list_empty(&node->link));
94
95 spin_lock(&schedule_lock);
96
97 /*
98 * Everyone we depended upon (the fences we wait to be signaled)
99 * should retire before us and remove themselves from our list.
100 * However, retirement is run independently on each timeline and
101 * so we may be called out-of-order.
102 */
103 list_for_each_entry_safe(dep, tmp, &node->signalers_list, signal_link) {
104 GEM_BUG_ON(!node_signaled(dep->signaler));
105 GEM_BUG_ON(!list_empty(&dep->dfs_link));
106
107 list_del(&dep->wait_link);
108 if (dep->flags & I915_DEPENDENCY_ALLOC)
109 i915_dependency_free(i915, dep);
110 }
111
112 /* Remove ourselves from everyone who depends upon us */
113 list_for_each_entry_safe(dep, tmp, &node->waiters_list, wait_link) {
114 GEM_BUG_ON(dep->signaler != node);
115 GEM_BUG_ON(!list_empty(&dep->dfs_link));
116
117 list_del(&dep->signal_link);
118 if (dep->flags & I915_DEPENDENCY_ALLOC)
119 i915_dependency_free(i915, dep);
120 }
121
122 spin_unlock(&schedule_lock);
123}
124
125static inline struct i915_priolist *to_priolist(struct rb_node *rb)
126{
127 return rb_entry(rb, struct i915_priolist, node);
128}
129
130static void assert_priolists(struct intel_engine_execlists * const execlists,
131 long queue_priority)
132{
133 struct rb_node *rb;
134 long last_prio, i;
135
136 if (!IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
137 return;
138
139 GEM_BUG_ON(rb_first_cached(&execlists->queue) !=
140 rb_first(&execlists->queue.rb_root));
141
142 last_prio = (queue_priority >> I915_USER_PRIORITY_SHIFT) + 1;
143 for (rb = rb_first_cached(&execlists->queue); rb; rb = rb_next(rb)) {
144 const struct i915_priolist *p = to_priolist(rb);
145
146 GEM_BUG_ON(p->priority >= last_prio);
147 last_prio = p->priority;
148
149 GEM_BUG_ON(!p->used);
150 for (i = 0; i < ARRAY_SIZE(p->requests); i++) {
151 if (list_empty(&p->requests[i]))
152 continue;
153
154 GEM_BUG_ON(!(p->used & BIT(i)));
155 }
156 }
157}
158
159struct list_head *
160i915_sched_lookup_priolist(struct intel_engine_cs *engine, int prio)
161{
162 struct intel_engine_execlists * const execlists = &engine->execlists;
163 struct i915_priolist *p;
164 struct rb_node **parent, *rb;
165 bool first = true;
166 int idx, i;
167
168 lockdep_assert_held(&engine->timeline.lock);
169 assert_priolists(execlists, INT_MAX);
170
171 /* buckets sorted from highest [in slot 0] to lowest priority */
172 idx = I915_PRIORITY_COUNT - (prio & I915_PRIORITY_MASK) - 1;
173 prio >>= I915_USER_PRIORITY_SHIFT;
174 if (unlikely(execlists->no_priolist))
175 prio = I915_PRIORITY_NORMAL;
176
177find_priolist:
178 /* most positive priority is scheduled first, equal priorities fifo */
179 rb = NULL;
180 parent = &execlists->queue.rb_root.rb_node;
181 while (*parent) {
182 rb = *parent;
183 p = to_priolist(rb);
184 if (prio > p->priority) {
185 parent = &rb->rb_left;
186 } else if (prio < p->priority) {
187 parent = &rb->rb_right;
188 first = false;
189 } else {
190 goto out;
191 }
192 }
193
194 if (prio == I915_PRIORITY_NORMAL) {
195 p = &execlists->default_priolist;
196 } else {
197 p = kmem_cache_alloc(engine->i915->priorities, GFP_ATOMIC);
198 /* Convert an allocation failure to a priority bump */
199 if (unlikely(!p)) {
200 prio = I915_PRIORITY_NORMAL; /* recurses just once */
201
202 /* To maintain ordering with all rendering, after an
203 * allocation failure we have to disable all scheduling.
204 * Requests will then be executed in fifo, and schedule
205 * will ensure that dependencies are emitted in fifo.
206 * There will be still some reordering with existing
207 * requests, so if userspace lied about their
208 * dependencies that reordering may be visible.
209 */
210 execlists->no_priolist = true;
211 goto find_priolist;
212 }
213 }
214
215 p->priority = prio;
216 for (i = 0; i < ARRAY_SIZE(p->requests); i++)
217 INIT_LIST_HEAD(&p->requests[i]);
218 rb_link_node(&p->node, rb, parent);
219 rb_insert_color_cached(&p->node, &execlists->queue, first);
220 p->used = 0;
221
222out:
223 p->used |= BIT(idx);
224 return &p->requests[idx];
225}
226
227static struct intel_engine_cs *
228sched_lock_engine(struct i915_sched_node *node, struct intel_engine_cs *locked)
229{
230 struct intel_engine_cs *engine = node_to_request(node)->engine;
231
232 GEM_BUG_ON(!locked);
233
234 if (engine != locked) {
235 spin_unlock(&locked->timeline.lock);
236 spin_lock(&engine->timeline.lock);
237 }
238
239 return engine;
240}
241
242static void __i915_schedule(struct i915_request *rq,
243 const struct i915_sched_attr *attr)
244{
245 struct list_head *uninitialized_var(pl);
246 struct intel_engine_cs *engine, *last;
247 struct i915_dependency *dep, *p;
248 struct i915_dependency stack;
249 const int prio = attr->priority;
250 LIST_HEAD(dfs);
251
252 /* Needed in order to use the temporary link inside i915_dependency */
253 lockdep_assert_held(&schedule_lock);
254 GEM_BUG_ON(prio == I915_PRIORITY_INVALID);
255
256 if (i915_request_completed(rq))
257 return;
258
259 if (prio <= READ_ONCE(rq->sched.attr.priority))
260 return;
261
262 stack.signaler = &rq->sched;
263 list_add(&stack.dfs_link, &dfs);
264
265 /*
266 * Recursively bump all dependent priorities to match the new request.
267 *
268 * A naive approach would be to use recursion:
269 * static void update_priorities(struct i915_sched_node *node, prio) {
270 * list_for_each_entry(dep, &node->signalers_list, signal_link)
271 * update_priorities(dep->signal, prio)
272 * queue_request(node);
273 * }
274 * but that may have unlimited recursion depth and so runs a very
275 * real risk of overunning the kernel stack. Instead, we build
276 * a flat list of all dependencies starting with the current request.
277 * As we walk the list of dependencies, we add all of its dependencies
278 * to the end of the list (this may include an already visited
279 * request) and continue to walk onwards onto the new dependencies. The
280 * end result is a topological list of requests in reverse order, the
281 * last element in the list is the request we must execute first.
282 */
283 list_for_each_entry(dep, &dfs, dfs_link) {
284 struct i915_sched_node *node = dep->signaler;
285
286 /*
287 * Within an engine, there can be no cycle, but we may
288 * refer to the same dependency chain multiple times
289 * (redundant dependencies are not eliminated) and across
290 * engines.
291 */
292 list_for_each_entry(p, &node->signalers_list, signal_link) {
293 GEM_BUG_ON(p == dep); /* no cycles! */
294
295 if (node_signaled(p->signaler))
296 continue;
297
298 GEM_BUG_ON(p->signaler->attr.priority < node->attr.priority);
299 if (prio > READ_ONCE(p->signaler->attr.priority))
300 list_move_tail(&p->dfs_link, &dfs);
301 }
302 }
303
304 /*
305 * If we didn't need to bump any existing priorities, and we haven't
306 * yet submitted this request (i.e. there is no potential race with
307 * execlists_submit_request()), we can set our own priority and skip
308 * acquiring the engine locks.
309 */
310 if (rq->sched.attr.priority == I915_PRIORITY_INVALID) {
311 GEM_BUG_ON(!list_empty(&rq->sched.link));
312 rq->sched.attr = *attr;
313
314 if (stack.dfs_link.next == stack.dfs_link.prev)
315 return;
316
317 __list_del_entry(&stack.dfs_link);
318 }
319
320 last = NULL;
321 engine = rq->engine;
322 spin_lock_irq(&engine->timeline.lock);
323
324 /* Fifo and depth-first replacement ensure our deps execute before us */
325 list_for_each_entry_safe_reverse(dep, p, &dfs, dfs_link) {
326 struct i915_sched_node *node = dep->signaler;
327
328 INIT_LIST_HEAD(&dep->dfs_link);
329
330 engine = sched_lock_engine(node, engine);
331
332 /* Recheck after acquiring the engine->timeline.lock */
333 if (prio <= node->attr.priority || node_signaled(node))
334 continue;
335
336 node->attr.priority = prio;
337 if (!list_empty(&node->link)) {
338 if (last != engine) {
339 pl = i915_sched_lookup_priolist(engine, prio);
340 last = engine;
341 }
342 list_move_tail(&node->link, pl);
343 } else {
344 /*
345 * If the request is not in the priolist queue because
346 * it is not yet runnable, then it doesn't contribute
347 * to our preemption decisions. On the other hand,
348 * if the request is on the HW, it too is not in the
349 * queue; but in that case we may still need to reorder
350 * the inflight requests.
351 */
352 if (!i915_sw_fence_done(&node_to_request(node)->submit))
353 continue;
354 }
355
356 if (prio <= engine->execlists.queue_priority)
357 continue;
358
359 /*
360 * If we are already the currently executing context, don't
361 * bother evaluating if we should preempt ourselves.
362 */
363 if (node_to_request(node)->global_seqno &&
364 i915_seqno_passed(port_request(engine->execlists.port)->global_seqno,
365 node_to_request(node)->global_seqno))
366 continue;
367
368 /* Defer (tasklet) submission until after all of our updates. */
369 engine->execlists.queue_priority = prio;
370 tasklet_hi_schedule(&engine->execlists.tasklet);
371 }
372
373 spin_unlock_irq(&engine->timeline.lock);
374}
375
376void i915_schedule(struct i915_request *rq, const struct i915_sched_attr *attr)
377{
378 spin_lock(&schedule_lock);
379 __i915_schedule(rq, attr);
380 spin_unlock(&schedule_lock);
381}
382
383void i915_schedule_bump_priority(struct i915_request *rq, unsigned int bump)
384{
385 struct i915_sched_attr attr;
386
387 GEM_BUG_ON(bump & ~I915_PRIORITY_MASK);
388
389 if (READ_ONCE(rq->sched.attr.priority) == I915_PRIORITY_INVALID)
390 return;
391
392 spin_lock_bh(&schedule_lock);
393
394 attr = rq->sched.attr;
395 attr.priority |= bump;
396 __i915_schedule(rq, &attr);
397
398 spin_unlock_bh(&schedule_lock);
399}
diff --git a/drivers/gpu/drm/i915/i915_scheduler.h b/drivers/gpu/drm/i915/i915_scheduler.h
index 70a42220358d..dbe9cb7ecd82 100644
--- a/drivers/gpu/drm/i915/i915_scheduler.h
+++ b/drivers/gpu/drm/i915/i915_scheduler.h
@@ -8,9 +8,14 @@
8#define _I915_SCHEDULER_H_ 8#define _I915_SCHEDULER_H_
9 9
10#include <linux/bitops.h> 10#include <linux/bitops.h>
11#include <linux/kernel.h>
11 12
12#include <uapi/drm/i915_drm.h> 13#include <uapi/drm/i915_drm.h>
13 14
15struct drm_i915_private;
16struct i915_request;
17struct intel_engine_cs;
18
14enum { 19enum {
15 I915_PRIORITY_MIN = I915_CONTEXT_MIN_USER_PRIORITY - 1, 20 I915_PRIORITY_MIN = I915_CONTEXT_MIN_USER_PRIORITY - 1,
16 I915_PRIORITY_NORMAL = I915_CONTEXT_DEFAULT_PRIORITY, 21 I915_PRIORITY_NORMAL = I915_CONTEXT_DEFAULT_PRIORITY,
@@ -19,6 +24,15 @@ enum {
19 I915_PRIORITY_INVALID = INT_MIN 24 I915_PRIORITY_INVALID = INT_MIN
20}; 25};
21 26
27#define I915_USER_PRIORITY_SHIFT 2
28#define I915_USER_PRIORITY(x) ((x) << I915_USER_PRIORITY_SHIFT)
29
30#define I915_PRIORITY_COUNT BIT(I915_USER_PRIORITY_SHIFT)
31#define I915_PRIORITY_MASK (I915_PRIORITY_COUNT - 1)
32
33#define I915_PRIORITY_WAIT ((u8)BIT(0))
34#define I915_PRIORITY_NEWCLIENT ((u8)BIT(1))
35
22struct i915_sched_attr { 36struct i915_sched_attr {
23 /** 37 /**
24 * @priority: execution and service priority 38 * @priority: execution and service priority
@@ -69,4 +83,26 @@ struct i915_dependency {
69#define I915_DEPENDENCY_ALLOC BIT(0) 83#define I915_DEPENDENCY_ALLOC BIT(0)
70}; 84};
71 85
86void i915_sched_node_init(struct i915_sched_node *node);
87
88bool __i915_sched_node_add_dependency(struct i915_sched_node *node,
89 struct i915_sched_node *signal,
90 struct i915_dependency *dep,
91 unsigned long flags);
92
93int i915_sched_node_add_dependency(struct drm_i915_private *i915,
94 struct i915_sched_node *node,
95 struct i915_sched_node *signal);
96
97void i915_sched_node_fini(struct drm_i915_private *i915,
98 struct i915_sched_node *node);
99
100void i915_schedule(struct i915_request *request,
101 const struct i915_sched_attr *attr);
102
103void i915_schedule_bump_priority(struct i915_request *rq, unsigned int bump);
104
105struct list_head *
106i915_sched_lookup_priolist(struct intel_engine_cs *engine, int prio);
107
72#endif /* _I915_SCHEDULER_H_ */ 108#endif /* _I915_SCHEDULER_H_ */
diff --git a/drivers/gpu/drm/i915/i915_syncmap.c b/drivers/gpu/drm/i915/i915_syncmap.c
index 58f8d0cc125c..60404dbb2e9f 100644
--- a/drivers/gpu/drm/i915/i915_syncmap.c
+++ b/drivers/gpu/drm/i915/i915_syncmap.c
@@ -92,7 +92,7 @@ void i915_syncmap_init(struct i915_syncmap **root)
92{ 92{
93 BUILD_BUG_ON_NOT_POWER_OF_2(KSYNCMAP); 93 BUILD_BUG_ON_NOT_POWER_OF_2(KSYNCMAP);
94 BUILD_BUG_ON_NOT_POWER_OF_2(SHIFT); 94 BUILD_BUG_ON_NOT_POWER_OF_2(SHIFT);
95 BUILD_BUG_ON(KSYNCMAP > BITS_PER_BYTE * sizeof((*root)->bitmap)); 95 BUILD_BUG_ON(KSYNCMAP > BITS_PER_TYPE((*root)->bitmap));
96 *root = NULL; 96 *root = NULL;
97} 97}
98 98
diff --git a/drivers/gpu/drm/i915/i915_timeline.h b/drivers/gpu/drm/i915/i915_timeline.h
index a2c2c3ab5fb0..ebd71b487220 100644
--- a/drivers/gpu/drm/i915/i915_timeline.h
+++ b/drivers/gpu/drm/i915/i915_timeline.h
@@ -83,6 +83,25 @@ void i915_timeline_init(struct drm_i915_private *i915,
83 const char *name); 83 const char *name);
84void i915_timeline_fini(struct i915_timeline *tl); 84void i915_timeline_fini(struct i915_timeline *tl);
85 85
86static inline void
87i915_timeline_set_subclass(struct i915_timeline *timeline,
88 unsigned int subclass)
89{
90 lockdep_set_subclass(&timeline->lock, subclass);
91
92 /*
93 * Due to an interesting quirk in lockdep's internal debug tracking,
94 * after setting a subclass we must ensure the lock is used. Otherwise,
95 * nr_unused_locks is incremented once too often.
96 */
97#ifdef CONFIG_DEBUG_LOCK_ALLOC
98 local_irq_disable();
99 lock_map_acquire(&timeline->lock.dep_map);
100 lock_map_release(&timeline->lock.dep_map);
101 local_irq_enable();
102#endif
103}
104
86struct i915_timeline * 105struct i915_timeline *
87i915_timeline_create(struct drm_i915_private *i915, const char *name); 106i915_timeline_create(struct drm_i915_private *i915, const char *name);
88 107
diff --git a/drivers/gpu/drm/i915/i915_utils.h b/drivers/gpu/drm/i915/i915_utils.h
index 395dd2511568..5858a43e19da 100644
--- a/drivers/gpu/drm/i915/i915_utils.h
+++ b/drivers/gpu/drm/i915/i915_utils.h
@@ -68,7 +68,7 @@
68 68
69/* Note we don't consider signbits :| */ 69/* Note we don't consider signbits :| */
70#define overflows_type(x, T) \ 70#define overflows_type(x, T) \
71 (sizeof(x) > sizeof(T) && (x) >> (sizeof(T) * BITS_PER_BYTE)) 71 (sizeof(x) > sizeof(T) && (x) >> BITS_PER_TYPE(T))
72 72
73#define ptr_mask_bits(ptr, n) ({ \ 73#define ptr_mask_bits(ptr, n) ({ \
74 unsigned long __v = (unsigned long)(ptr); \ 74 unsigned long __v = (unsigned long)(ptr); \
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index 35fce4c88629..5b4d78cdb4ca 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -305,12 +305,12 @@ int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
305 GEM_BUG_ON(!drm_mm_node_allocated(&vma->node)); 305 GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
306 GEM_BUG_ON(vma->size > vma->node.size); 306 GEM_BUG_ON(vma->size > vma->node.size);
307 307
308 if (GEM_WARN_ON(range_overflows(vma->node.start, 308 if (GEM_DEBUG_WARN_ON(range_overflows(vma->node.start,
309 vma->node.size, 309 vma->node.size,
310 vma->vm->total))) 310 vma->vm->total)))
311 return -ENODEV; 311 return -ENODEV;
312 312
313 if (GEM_WARN_ON(!flags)) 313 if (GEM_DEBUG_WARN_ON(!flags))
314 return -EINVAL; 314 return -EINVAL;
315 315
316 bind_flags = 0; 316 bind_flags = 0;
diff --git a/drivers/gpu/drm/i915/icl_dsi.c b/drivers/gpu/drm/i915/icl_dsi.c
index 13830e43a4d1..01f422df8c23 100644
--- a/drivers/gpu/drm/i915/icl_dsi.c
+++ b/drivers/gpu/drm/i915/icl_dsi.c
@@ -25,8 +25,153 @@
25 * Jani Nikula <jani.nikula@intel.com> 25 * Jani Nikula <jani.nikula@intel.com>
26 */ 26 */
27 27
28#include <drm/drm_mipi_dsi.h>
28#include "intel_dsi.h" 29#include "intel_dsi.h"
29 30
31static inline int header_credits_available(struct drm_i915_private *dev_priv,
32 enum transcoder dsi_trans)
33{
34 return (I915_READ(DSI_CMD_TXCTL(dsi_trans)) & FREE_HEADER_CREDIT_MASK)
35 >> FREE_HEADER_CREDIT_SHIFT;
36}
37
38static inline int payload_credits_available(struct drm_i915_private *dev_priv,
39 enum transcoder dsi_trans)
40{
41 return (I915_READ(DSI_CMD_TXCTL(dsi_trans)) & FREE_PLOAD_CREDIT_MASK)
42 >> FREE_PLOAD_CREDIT_SHIFT;
43}
44
45static void wait_for_header_credits(struct drm_i915_private *dev_priv,
46 enum transcoder dsi_trans)
47{
48 if (wait_for_us(header_credits_available(dev_priv, dsi_trans) >=
49 MAX_HEADER_CREDIT, 100))
50 DRM_ERROR("DSI header credits not released\n");
51}
52
53static void wait_for_payload_credits(struct drm_i915_private *dev_priv,
54 enum transcoder dsi_trans)
55{
56 if (wait_for_us(payload_credits_available(dev_priv, dsi_trans) >=
57 MAX_PLOAD_CREDIT, 100))
58 DRM_ERROR("DSI payload credits not released\n");
59}
60
61static enum transcoder dsi_port_to_transcoder(enum port port)
62{
63 if (port == PORT_A)
64 return TRANSCODER_DSI_0;
65 else
66 return TRANSCODER_DSI_1;
67}
68
69static void wait_for_cmds_dispatched_to_panel(struct intel_encoder *encoder)
70{
71 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
72 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
73 struct mipi_dsi_device *dsi;
74 enum port port;
75 enum transcoder dsi_trans;
76 int ret;
77
78 /* wait for header/payload credits to be released */
79 for_each_dsi_port(port, intel_dsi->ports) {
80 dsi_trans = dsi_port_to_transcoder(port);
81 wait_for_header_credits(dev_priv, dsi_trans);
82 wait_for_payload_credits(dev_priv, dsi_trans);
83 }
84
85 /* send nop DCS command */
86 for_each_dsi_port(port, intel_dsi->ports) {
87 dsi = intel_dsi->dsi_hosts[port]->device;
88 dsi->mode_flags |= MIPI_DSI_MODE_LPM;
89 dsi->channel = 0;
90 ret = mipi_dsi_dcs_nop(dsi);
91 if (ret < 0)
92 DRM_ERROR("error sending DCS NOP command\n");
93 }
94
95 /* wait for header credits to be released */
96 for_each_dsi_port(port, intel_dsi->ports) {
97 dsi_trans = dsi_port_to_transcoder(port);
98 wait_for_header_credits(dev_priv, dsi_trans);
99 }
100
101 /* wait for LP TX in progress bit to be cleared */
102 for_each_dsi_port(port, intel_dsi->ports) {
103 dsi_trans = dsi_port_to_transcoder(port);
104 if (wait_for_us(!(I915_READ(DSI_LP_MSG(dsi_trans)) &
105 LPTX_IN_PROGRESS), 20))
106 DRM_ERROR("LPTX bit not cleared\n");
107 }
108}
109
110static void dsi_program_swing_and_deemphasis(struct intel_encoder *encoder)
111{
112 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
113 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
114 enum port port;
115 u32 tmp;
116 int lane;
117
118 for_each_dsi_port(port, intel_dsi->ports) {
119
120 /*
121 * Program voltage swing and pre-emphasis level values as per
122 * table in BSPEC under DDI buffer programing
123 */
124 tmp = I915_READ(ICL_PORT_TX_DW5_LN0(port));
125 tmp &= ~(SCALING_MODE_SEL_MASK | RTERM_SELECT_MASK);
126 tmp |= SCALING_MODE_SEL(0x2);
127 tmp |= TAP2_DISABLE | TAP3_DISABLE;
128 tmp |= RTERM_SELECT(0x6);
129 I915_WRITE(ICL_PORT_TX_DW5_GRP(port), tmp);
130
131 tmp = I915_READ(ICL_PORT_TX_DW5_AUX(port));
132 tmp &= ~(SCALING_MODE_SEL_MASK | RTERM_SELECT_MASK);
133 tmp |= SCALING_MODE_SEL(0x2);
134 tmp |= TAP2_DISABLE | TAP3_DISABLE;
135 tmp |= RTERM_SELECT(0x6);
136 I915_WRITE(ICL_PORT_TX_DW5_AUX(port), tmp);
137
138 tmp = I915_READ(ICL_PORT_TX_DW2_LN0(port));
139 tmp &= ~(SWING_SEL_LOWER_MASK | SWING_SEL_UPPER_MASK |
140 RCOMP_SCALAR_MASK);
141 tmp |= SWING_SEL_UPPER(0x2);
142 tmp |= SWING_SEL_LOWER(0x2);
143 tmp |= RCOMP_SCALAR(0x98);
144 I915_WRITE(ICL_PORT_TX_DW2_GRP(port), tmp);
145
146 tmp = I915_READ(ICL_PORT_TX_DW2_AUX(port));
147 tmp &= ~(SWING_SEL_LOWER_MASK | SWING_SEL_UPPER_MASK |
148 RCOMP_SCALAR_MASK);
149 tmp |= SWING_SEL_UPPER(0x2);
150 tmp |= SWING_SEL_LOWER(0x2);
151 tmp |= RCOMP_SCALAR(0x98);
152 I915_WRITE(ICL_PORT_TX_DW2_AUX(port), tmp);
153
154 tmp = I915_READ(ICL_PORT_TX_DW4_AUX(port));
155 tmp &= ~(POST_CURSOR_1_MASK | POST_CURSOR_2_MASK |
156 CURSOR_COEFF_MASK);
157 tmp |= POST_CURSOR_1(0x0);
158 tmp |= POST_CURSOR_2(0x0);
159 tmp |= CURSOR_COEFF(0x3f);
160 I915_WRITE(ICL_PORT_TX_DW4_AUX(port), tmp);
161
162 for (lane = 0; lane <= 3; lane++) {
163 /* Bspec: must not use GRP register for write */
164 tmp = I915_READ(ICL_PORT_TX_DW4_LN(port, lane));
165 tmp &= ~(POST_CURSOR_1_MASK | POST_CURSOR_2_MASK |
166 CURSOR_COEFF_MASK);
167 tmp |= POST_CURSOR_1(0x0);
168 tmp |= POST_CURSOR_2(0x0);
169 tmp |= CURSOR_COEFF(0x3f);
170 I915_WRITE(ICL_PORT_TX_DW4_LN(port, lane), tmp);
171 }
172 }
173}
174
30static void gen11_dsi_program_esc_clk_div(struct intel_encoder *encoder) 175static void gen11_dsi_program_esc_clk_div(struct intel_encoder *encoder)
31{ 176{
32 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 177 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
@@ -105,10 +250,553 @@ static void gen11_dsi_power_up_lanes(struct intel_encoder *encoder)
105 } 250 }
106} 251}
107 252
108static void gen11_dsi_enable_port_and_phy(struct intel_encoder *encoder) 253static void gen11_dsi_config_phy_lanes_sequence(struct intel_encoder *encoder)
254{
255 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
256 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
257 enum port port;
258 u32 tmp;
259 int lane;
260
261 /* Step 4b(i) set loadgen select for transmit and aux lanes */
262 for_each_dsi_port(port, intel_dsi->ports) {
263 tmp = I915_READ(ICL_PORT_TX_DW4_AUX(port));
264 tmp &= ~LOADGEN_SELECT;
265 I915_WRITE(ICL_PORT_TX_DW4_AUX(port), tmp);
266 for (lane = 0; lane <= 3; lane++) {
267 tmp = I915_READ(ICL_PORT_TX_DW4_LN(port, lane));
268 tmp &= ~LOADGEN_SELECT;
269 if (lane != 2)
270 tmp |= LOADGEN_SELECT;
271 I915_WRITE(ICL_PORT_TX_DW4_LN(port, lane), tmp);
272 }
273 }
274
275 /* Step 4b(ii) set latency optimization for transmit and aux lanes */
276 for_each_dsi_port(port, intel_dsi->ports) {
277 tmp = I915_READ(ICL_PORT_TX_DW2_AUX(port));
278 tmp &= ~FRC_LATENCY_OPTIM_MASK;
279 tmp |= FRC_LATENCY_OPTIM_VAL(0x5);
280 I915_WRITE(ICL_PORT_TX_DW2_AUX(port), tmp);
281 tmp = I915_READ(ICL_PORT_TX_DW2_LN0(port));
282 tmp &= ~FRC_LATENCY_OPTIM_MASK;
283 tmp |= FRC_LATENCY_OPTIM_VAL(0x5);
284 I915_WRITE(ICL_PORT_TX_DW2_GRP(port), tmp);
285 }
286
287}
288
289static void gen11_dsi_voltage_swing_program_seq(struct intel_encoder *encoder)
290{
291 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
292 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
293 u32 tmp;
294 enum port port;
295
296 /* clear common keeper enable bit */
297 for_each_dsi_port(port, intel_dsi->ports) {
298 tmp = I915_READ(ICL_PORT_PCS_DW1_LN0(port));
299 tmp &= ~COMMON_KEEPER_EN;
300 I915_WRITE(ICL_PORT_PCS_DW1_GRP(port), tmp);
301 tmp = I915_READ(ICL_PORT_PCS_DW1_AUX(port));
302 tmp &= ~COMMON_KEEPER_EN;
303 I915_WRITE(ICL_PORT_PCS_DW1_AUX(port), tmp);
304 }
305
306 /*
307 * Set SUS Clock Config bitfield to 11b
308 * Note: loadgen select program is done
309 * as part of lane phy sequence configuration
310 */
311 for_each_dsi_port(port, intel_dsi->ports) {
312 tmp = I915_READ(ICL_PORT_CL_DW5(port));
313 tmp |= SUS_CLOCK_CONFIG;
314 I915_WRITE(ICL_PORT_CL_DW5(port), tmp);
315 }
316
317 /* Clear training enable to change swing values */
318 for_each_dsi_port(port, intel_dsi->ports) {
319 tmp = I915_READ(ICL_PORT_TX_DW5_LN0(port));
320 tmp &= ~TX_TRAINING_EN;
321 I915_WRITE(ICL_PORT_TX_DW5_GRP(port), tmp);
322 tmp = I915_READ(ICL_PORT_TX_DW5_AUX(port));
323 tmp &= ~TX_TRAINING_EN;
324 I915_WRITE(ICL_PORT_TX_DW5_AUX(port), tmp);
325 }
326
327 /* Program swing and de-emphasis */
328 dsi_program_swing_and_deemphasis(encoder);
329
330 /* Set training enable to trigger update */
331 for_each_dsi_port(port, intel_dsi->ports) {
332 tmp = I915_READ(ICL_PORT_TX_DW5_LN0(port));
333 tmp |= TX_TRAINING_EN;
334 I915_WRITE(ICL_PORT_TX_DW5_GRP(port), tmp);
335 tmp = I915_READ(ICL_PORT_TX_DW5_AUX(port));
336 tmp |= TX_TRAINING_EN;
337 I915_WRITE(ICL_PORT_TX_DW5_AUX(port), tmp);
338 }
339}
340
341static void gen11_dsi_enable_ddi_buffer(struct intel_encoder *encoder)
342{
343 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
344 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
345 u32 tmp;
346 enum port port;
347
348 for_each_dsi_port(port, intel_dsi->ports) {
349 tmp = I915_READ(DDI_BUF_CTL(port));
350 tmp |= DDI_BUF_CTL_ENABLE;
351 I915_WRITE(DDI_BUF_CTL(port), tmp);
352
353 if (wait_for_us(!(I915_READ(DDI_BUF_CTL(port)) &
354 DDI_BUF_IS_IDLE),
355 500))
356 DRM_ERROR("DDI port:%c buffer idle\n", port_name(port));
357 }
358}
359
360static void gen11_dsi_setup_dphy_timings(struct intel_encoder *encoder)
361{
362 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
363 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
364 u32 tmp;
365 enum port port;
366
367 /* Program T-INIT master registers */
368 for_each_dsi_port(port, intel_dsi->ports) {
369 tmp = I915_READ(ICL_DSI_T_INIT_MASTER(port));
370 tmp &= ~MASTER_INIT_TIMER_MASK;
371 tmp |= intel_dsi->init_count;
372 I915_WRITE(ICL_DSI_T_INIT_MASTER(port), tmp);
373 }
374
375 /* Program DPHY clock lanes timings */
376 for_each_dsi_port(port, intel_dsi->ports) {
377 I915_WRITE(DPHY_CLK_TIMING_PARAM(port), intel_dsi->dphy_reg);
378
379 /* shadow register inside display core */
380 I915_WRITE(DSI_CLK_TIMING_PARAM(port), intel_dsi->dphy_reg);
381 }
382
383 /* Program DPHY data lanes timings */
384 for_each_dsi_port(port, intel_dsi->ports) {
385 I915_WRITE(DPHY_DATA_TIMING_PARAM(port),
386 intel_dsi->dphy_data_lane_reg);
387
388 /* shadow register inside display core */
389 I915_WRITE(DSI_DATA_TIMING_PARAM(port),
390 intel_dsi->dphy_data_lane_reg);
391 }
392
393 /*
394 * If DSI link operating at or below an 800 MHz,
395 * TA_SURE should be override and programmed to
396 * a value '0' inside TA_PARAM_REGISTERS otherwise
397 * leave all fields at HW default values.
398 */
399 if (intel_dsi_bitrate(intel_dsi) <= 800000) {
400 for_each_dsi_port(port, intel_dsi->ports) {
401 tmp = I915_READ(DPHY_TA_TIMING_PARAM(port));
402 tmp &= ~TA_SURE_MASK;
403 tmp |= TA_SURE_OVERRIDE | TA_SURE(0);
404 I915_WRITE(DPHY_TA_TIMING_PARAM(port), tmp);
405
406 /* shadow register inside display core */
407 tmp = I915_READ(DSI_TA_TIMING_PARAM(port));
408 tmp &= ~TA_SURE_MASK;
409 tmp |= TA_SURE_OVERRIDE | TA_SURE(0);
410 I915_WRITE(DSI_TA_TIMING_PARAM(port), tmp);
411 }
412 }
413}
414
415static void
416gen11_dsi_configure_transcoder(struct intel_encoder *encoder,
417 const struct intel_crtc_state *pipe_config)
418{
419 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
420 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
421 struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
422 enum pipe pipe = intel_crtc->pipe;
423 u32 tmp;
424 enum port port;
425 enum transcoder dsi_trans;
426
427 for_each_dsi_port(port, intel_dsi->ports) {
428 dsi_trans = dsi_port_to_transcoder(port);
429 tmp = I915_READ(DSI_TRANS_FUNC_CONF(dsi_trans));
430
431 if (intel_dsi->eotp_pkt)
432 tmp &= ~EOTP_DISABLED;
433 else
434 tmp |= EOTP_DISABLED;
435
436 /* enable link calibration if freq > 1.5Gbps */
437 if (intel_dsi_bitrate(intel_dsi) >= 1500 * 1000) {
438 tmp &= ~LINK_CALIBRATION_MASK;
439 tmp |= CALIBRATION_ENABLED_INITIAL_ONLY;
440 }
441
442 /* configure continuous clock */
443 tmp &= ~CONTINUOUS_CLK_MASK;
444 if (intel_dsi->clock_stop)
445 tmp |= CLK_ENTER_LP_AFTER_DATA;
446 else
447 tmp |= CLK_HS_CONTINUOUS;
448
449 /* configure buffer threshold limit to minimum */
450 tmp &= ~PIX_BUF_THRESHOLD_MASK;
451 tmp |= PIX_BUF_THRESHOLD_1_4;
452
453 /* set virtual channel to '0' */
454 tmp &= ~PIX_VIRT_CHAN_MASK;
455 tmp |= PIX_VIRT_CHAN(0);
456
457 /* program BGR transmission */
458 if (intel_dsi->bgr_enabled)
459 tmp |= BGR_TRANSMISSION;
460
461 /* select pixel format */
462 tmp &= ~PIX_FMT_MASK;
463 switch (intel_dsi->pixel_format) {
464 default:
465 MISSING_CASE(intel_dsi->pixel_format);
466 /* fallthrough */
467 case MIPI_DSI_FMT_RGB565:
468 tmp |= PIX_FMT_RGB565;
469 break;
470 case MIPI_DSI_FMT_RGB666_PACKED:
471 tmp |= PIX_FMT_RGB666_PACKED;
472 break;
473 case MIPI_DSI_FMT_RGB666:
474 tmp |= PIX_FMT_RGB666_LOOSE;
475 break;
476 case MIPI_DSI_FMT_RGB888:
477 tmp |= PIX_FMT_RGB888;
478 break;
479 }
480
481 /* program DSI operation mode */
482 if (is_vid_mode(intel_dsi)) {
483 tmp &= ~OP_MODE_MASK;
484 switch (intel_dsi->video_mode_format) {
485 default:
486 MISSING_CASE(intel_dsi->video_mode_format);
487 /* fallthrough */
488 case VIDEO_MODE_NON_BURST_WITH_SYNC_EVENTS:
489 tmp |= VIDEO_MODE_SYNC_EVENT;
490 break;
491 case VIDEO_MODE_NON_BURST_WITH_SYNC_PULSE:
492 tmp |= VIDEO_MODE_SYNC_PULSE;
493 break;
494 }
495 }
496
497 I915_WRITE(DSI_TRANS_FUNC_CONF(dsi_trans), tmp);
498 }
499
500 /* enable port sync mode if dual link */
501 if (intel_dsi->dual_link) {
502 for_each_dsi_port(port, intel_dsi->ports) {
503 dsi_trans = dsi_port_to_transcoder(port);
504 tmp = I915_READ(TRANS_DDI_FUNC_CTL2(dsi_trans));
505 tmp |= PORT_SYNC_MODE_ENABLE;
506 I915_WRITE(TRANS_DDI_FUNC_CTL2(dsi_trans), tmp);
507 }
508
509 //TODO: configure DSS_CTL1
510 }
511
512 for_each_dsi_port(port, intel_dsi->ports) {
513 dsi_trans = dsi_port_to_transcoder(port);
514
515 /* select data lane width */
516 tmp = I915_READ(TRANS_DDI_FUNC_CTL(dsi_trans));
517 tmp &= ~DDI_PORT_WIDTH_MASK;
518 tmp |= DDI_PORT_WIDTH(intel_dsi->lane_count);
519
520 /* select input pipe */
521 tmp &= ~TRANS_DDI_EDP_INPUT_MASK;
522 switch (pipe) {
523 default:
524 MISSING_CASE(pipe);
525 /* fallthrough */
526 case PIPE_A:
527 tmp |= TRANS_DDI_EDP_INPUT_A_ON;
528 break;
529 case PIPE_B:
530 tmp |= TRANS_DDI_EDP_INPUT_B_ONOFF;
531 break;
532 case PIPE_C:
533 tmp |= TRANS_DDI_EDP_INPUT_C_ONOFF;
534 break;
535 }
536
537 /* enable DDI buffer */
538 tmp |= TRANS_DDI_FUNC_ENABLE;
539 I915_WRITE(TRANS_DDI_FUNC_CTL(dsi_trans), tmp);
540 }
541
542 /* wait for link ready */
543 for_each_dsi_port(port, intel_dsi->ports) {
544 dsi_trans = dsi_port_to_transcoder(port);
545 if (wait_for_us((I915_READ(DSI_TRANS_FUNC_CONF(dsi_trans)) &
546 LINK_READY), 2500))
547 DRM_ERROR("DSI link not ready\n");
548 }
549}
550
551static void
552gen11_dsi_set_transcoder_timings(struct intel_encoder *encoder,
553 const struct intel_crtc_state *pipe_config)
554{
555 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
556 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
557 const struct drm_display_mode *adjusted_mode =
558 &pipe_config->base.adjusted_mode;
559 enum port port;
560 enum transcoder dsi_trans;
561 /* horizontal timings */
562 u16 htotal, hactive, hsync_start, hsync_end, hsync_size;
563 u16 hfront_porch, hback_porch;
564 /* vertical timings */
565 u16 vtotal, vactive, vsync_start, vsync_end, vsync_shift;
566
567 hactive = adjusted_mode->crtc_hdisplay;
568 htotal = adjusted_mode->crtc_htotal;
569 hsync_start = adjusted_mode->crtc_hsync_start;
570 hsync_end = adjusted_mode->crtc_hsync_end;
571 hsync_size = hsync_end - hsync_start;
572 hfront_porch = (adjusted_mode->crtc_hsync_start -
573 adjusted_mode->crtc_hdisplay);
574 hback_porch = (adjusted_mode->crtc_htotal -
575 adjusted_mode->crtc_hsync_end);
576 vactive = adjusted_mode->crtc_vdisplay;
577 vtotal = adjusted_mode->crtc_vtotal;
578 vsync_start = adjusted_mode->crtc_vsync_start;
579 vsync_end = adjusted_mode->crtc_vsync_end;
580 vsync_shift = hsync_start - htotal / 2;
581
582 if (intel_dsi->dual_link) {
583 hactive /= 2;
584 if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK)
585 hactive += intel_dsi->pixel_overlap;
586 htotal /= 2;
587 }
588
589 /* minimum hactive as per bspec: 256 pixels */
590 if (adjusted_mode->crtc_hdisplay < 256)
591 DRM_ERROR("hactive is less then 256 pixels\n");
592
593 /* if RGB666 format, then hactive must be multiple of 4 pixels */
594 if (intel_dsi->pixel_format == MIPI_DSI_FMT_RGB666 && hactive % 4 != 0)
595 DRM_ERROR("hactive pixels are not multiple of 4\n");
596
597 /* program TRANS_HTOTAL register */
598 for_each_dsi_port(port, intel_dsi->ports) {
599 dsi_trans = dsi_port_to_transcoder(port);
600 I915_WRITE(HTOTAL(dsi_trans),
601 (hactive - 1) | ((htotal - 1) << 16));
602 }
603
604 /* TRANS_HSYNC register to be programmed only for video mode */
605 if (intel_dsi->operation_mode == INTEL_DSI_VIDEO_MODE) {
606 if (intel_dsi->video_mode_format ==
607 VIDEO_MODE_NON_BURST_WITH_SYNC_PULSE) {
608 /* BSPEC: hsync size should be atleast 16 pixels */
609 if (hsync_size < 16)
610 DRM_ERROR("hsync size < 16 pixels\n");
611 }
612
613 if (hback_porch < 16)
614 DRM_ERROR("hback porch < 16 pixels\n");
615
616 if (intel_dsi->dual_link) {
617 hsync_start /= 2;
618 hsync_end /= 2;
619 }
620
621 for_each_dsi_port(port, intel_dsi->ports) {
622 dsi_trans = dsi_port_to_transcoder(port);
623 I915_WRITE(HSYNC(dsi_trans),
624 (hsync_start - 1) | ((hsync_end - 1) << 16));
625 }
626 }
627
628 /* program TRANS_VTOTAL register */
629 for_each_dsi_port(port, intel_dsi->ports) {
630 dsi_trans = dsi_port_to_transcoder(port);
631 /*
632 * FIXME: Programing this by assuming progressive mode, since
633 * non-interlaced info from VBT is not saved inside
634 * struct drm_display_mode.
635 * For interlace mode: program required pixel minus 2
636 */
637 I915_WRITE(VTOTAL(dsi_trans),
638 (vactive - 1) | ((vtotal - 1) << 16));
639 }
640
641 if (vsync_end < vsync_start || vsync_end > vtotal)
642 DRM_ERROR("Invalid vsync_end value\n");
643
644 if (vsync_start < vactive)
645 DRM_ERROR("vsync_start less than vactive\n");
646
647 /* program TRANS_VSYNC register */
648 for_each_dsi_port(port, intel_dsi->ports) {
649 dsi_trans = dsi_port_to_transcoder(port);
650 I915_WRITE(VSYNC(dsi_trans),
651 (vsync_start - 1) | ((vsync_end - 1) << 16));
652 }
653
654 /*
655 * FIXME: It has to be programmed only for interlaced
656 * modes. Put the check condition here once interlaced
657 * info available as described above.
658 * program TRANS_VSYNCSHIFT register
659 */
660 for_each_dsi_port(port, intel_dsi->ports) {
661 dsi_trans = dsi_port_to_transcoder(port);
662 I915_WRITE(VSYNCSHIFT(dsi_trans), vsync_shift);
663 }
664}
665
666static void gen11_dsi_enable_transcoder(struct intel_encoder *encoder)
667{
668 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
669 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
670 enum port port;
671 enum transcoder dsi_trans;
672 u32 tmp;
673
674 for_each_dsi_port(port, intel_dsi->ports) {
675 dsi_trans = dsi_port_to_transcoder(port);
676 tmp = I915_READ(PIPECONF(dsi_trans));
677 tmp |= PIPECONF_ENABLE;
678 I915_WRITE(PIPECONF(dsi_trans), tmp);
679
680 /* wait for transcoder to be enabled */
681 if (intel_wait_for_register(dev_priv, PIPECONF(dsi_trans),
682 I965_PIPECONF_ACTIVE,
683 I965_PIPECONF_ACTIVE, 10))
684 DRM_ERROR("DSI transcoder not enabled\n");
685 }
686}
687
688static void gen11_dsi_setup_timeouts(struct intel_encoder *encoder)
689{
690 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
691 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
692 enum port port;
693 enum transcoder dsi_trans;
694 u32 tmp, hs_tx_timeout, lp_rx_timeout, ta_timeout, divisor, mul;
695
696 /*
697 * escape clock count calculation:
698 * BYTE_CLK_COUNT = TIME_NS/(8 * UI)
699 * UI (nsec) = (10^6)/Bitrate
700 * TIME_NS = (BYTE_CLK_COUNT * 8 * 10^6)/ Bitrate
701 * ESCAPE_CLK_COUNT = TIME_NS/ESC_CLK_NS
702 */
703 divisor = intel_dsi_tlpx_ns(intel_dsi) * intel_dsi_bitrate(intel_dsi) * 1000;
704 mul = 8 * 1000000;
705 hs_tx_timeout = DIV_ROUND_UP(intel_dsi->hs_tx_timeout * mul,
706 divisor);
707 lp_rx_timeout = DIV_ROUND_UP(intel_dsi->lp_rx_timeout * mul, divisor);
708 ta_timeout = DIV_ROUND_UP(intel_dsi->turn_arnd_val * mul, divisor);
709
710 for_each_dsi_port(port, intel_dsi->ports) {
711 dsi_trans = dsi_port_to_transcoder(port);
712
713 /* program hst_tx_timeout */
714 tmp = I915_READ(DSI_HSTX_TO(dsi_trans));
715 tmp &= ~HSTX_TIMEOUT_VALUE_MASK;
716 tmp |= HSTX_TIMEOUT_VALUE(hs_tx_timeout);
717 I915_WRITE(DSI_HSTX_TO(dsi_trans), tmp);
718
719 /* FIXME: DSI_CALIB_TO */
720
721 /* program lp_rx_host timeout */
722 tmp = I915_READ(DSI_LPRX_HOST_TO(dsi_trans));
723 tmp &= ~LPRX_TIMEOUT_VALUE_MASK;
724 tmp |= LPRX_TIMEOUT_VALUE(lp_rx_timeout);
725 I915_WRITE(DSI_LPRX_HOST_TO(dsi_trans), tmp);
726
727 /* FIXME: DSI_PWAIT_TO */
728
729 /* program turn around timeout */
730 tmp = I915_READ(DSI_TA_TO(dsi_trans));
731 tmp &= ~TA_TIMEOUT_VALUE_MASK;
732 tmp |= TA_TIMEOUT_VALUE(ta_timeout);
733 I915_WRITE(DSI_TA_TO(dsi_trans), tmp);
734 }
735}
736
737static void
738gen11_dsi_enable_port_and_phy(struct intel_encoder *encoder,
739 const struct intel_crtc_state *pipe_config)
109{ 740{
110 /* step 4a: power up all lanes of the DDI used by DSI */ 741 /* step 4a: power up all lanes of the DDI used by DSI */
111 gen11_dsi_power_up_lanes(encoder); 742 gen11_dsi_power_up_lanes(encoder);
743
744 /* step 4b: configure lane sequencing of the Combo-PHY transmitters */
745 gen11_dsi_config_phy_lanes_sequence(encoder);
746
747 /* step 4c: configure voltage swing and skew */
748 gen11_dsi_voltage_swing_program_seq(encoder);
749
750 /* enable DDI buffer */
751 gen11_dsi_enable_ddi_buffer(encoder);
752
753 /* setup D-PHY timings */
754 gen11_dsi_setup_dphy_timings(encoder);
755
756 /* step 4h: setup DSI protocol timeouts */
757 gen11_dsi_setup_timeouts(encoder);
758
759 /* Step (4h, 4i, 4j, 4k): Configure transcoder */
760 gen11_dsi_configure_transcoder(encoder, pipe_config);
761}
762
763static void gen11_dsi_powerup_panel(struct intel_encoder *encoder)
764{
765 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
766 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
767 struct mipi_dsi_device *dsi;
768 enum port port;
769 enum transcoder dsi_trans;
770 u32 tmp;
771 int ret;
772
773 /* set maximum return packet size */
774 for_each_dsi_port(port, intel_dsi->ports) {
775 dsi_trans = dsi_port_to_transcoder(port);
776
777 /*
778 * FIXME: This uses the number of DW's currently in the payload
779 * receive queue. This is probably not what we want here.
780 */
781 tmp = I915_READ(DSI_CMD_RXCTL(dsi_trans));
782 tmp &= NUMBER_RX_PLOAD_DW_MASK;
783 /* multiply "Number Rx Payload DW" by 4 to get max value */
784 tmp = tmp * 4;
785 dsi = intel_dsi->dsi_hosts[port]->device;
786 ret = mipi_dsi_set_maximum_return_packet_size(dsi, tmp);
787 if (ret < 0)
788 DRM_ERROR("error setting max return pkt size%d\n", tmp);
789 }
790
791 /* panel power on related mipi dsi vbt sequences */
792 intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_ON);
793 intel_dsi_msleep(intel_dsi, intel_dsi->panel_on_delay);
794 intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DEASSERT_RESET);
795 intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_INIT_OTP);
796 intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_ON);
797
798 /* ensure all panel commands dispatched before enabling transcoder */
799 wait_for_cmds_dispatched_to_panel(encoder);
112} 800}
113 801
114static void __attribute__((unused)) 802static void __attribute__((unused))
@@ -116,6 +804,8 @@ gen11_dsi_pre_enable(struct intel_encoder *encoder,
116 const struct intel_crtc_state *pipe_config, 804 const struct intel_crtc_state *pipe_config,
117 const struct drm_connector_state *conn_state) 805 const struct drm_connector_state *conn_state)
118{ 806{
807 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
808
119 /* step2: enable IO power */ 809 /* step2: enable IO power */
120 gen11_dsi_enable_io_power(encoder); 810 gen11_dsi_enable_io_power(encoder);
121 811
@@ -123,5 +813,169 @@ gen11_dsi_pre_enable(struct intel_encoder *encoder,
123 gen11_dsi_program_esc_clk_div(encoder); 813 gen11_dsi_program_esc_clk_div(encoder);
124 814
125 /* step4: enable DSI port and DPHY */ 815 /* step4: enable DSI port and DPHY */
126 gen11_dsi_enable_port_and_phy(encoder); 816 gen11_dsi_enable_port_and_phy(encoder, pipe_config);
817
818 /* step5: program and powerup panel */
819 gen11_dsi_powerup_panel(encoder);
820
821 /* step6c: configure transcoder timings */
822 gen11_dsi_set_transcoder_timings(encoder, pipe_config);
823
824 /* step6d: enable dsi transcoder */
825 gen11_dsi_enable_transcoder(encoder);
826
827 /* step7: enable backlight */
828 intel_panel_enable_backlight(pipe_config, conn_state);
829 intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_BACKLIGHT_ON);
830}
831
832static void gen11_dsi_disable_transcoder(struct intel_encoder *encoder)
833{
834 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
835 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
836 enum port port;
837 enum transcoder dsi_trans;
838 u32 tmp;
839
840 for_each_dsi_port(port, intel_dsi->ports) {
841 dsi_trans = dsi_port_to_transcoder(port);
842
843 /* disable transcoder */
844 tmp = I915_READ(PIPECONF(dsi_trans));
845 tmp &= ~PIPECONF_ENABLE;
846 I915_WRITE(PIPECONF(dsi_trans), tmp);
847
848 /* wait for transcoder to be disabled */
849 if (intel_wait_for_register(dev_priv, PIPECONF(dsi_trans),
850 I965_PIPECONF_ACTIVE, 0, 50))
851 DRM_ERROR("DSI trancoder not disabled\n");
852 }
853}
854
855static void gen11_dsi_powerdown_panel(struct intel_encoder *encoder)
856{
857 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
858
859 intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_OFF);
860 intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_ASSERT_RESET);
861 intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_POWER_OFF);
862
863 /* ensure cmds dispatched to panel */
864 wait_for_cmds_dispatched_to_panel(encoder);
865}
866
867static void gen11_dsi_deconfigure_trancoder(struct intel_encoder *encoder)
868{
869 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
870 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
871 enum port port;
872 enum transcoder dsi_trans;
873 u32 tmp;
874
875 /* put dsi link in ULPS */
876 for_each_dsi_port(port, intel_dsi->ports) {
877 dsi_trans = dsi_port_to_transcoder(port);
878 tmp = I915_READ(DSI_LP_MSG(dsi_trans));
879 tmp |= LINK_ENTER_ULPS;
880 tmp &= ~LINK_ULPS_TYPE_LP11;
881 I915_WRITE(DSI_LP_MSG(dsi_trans), tmp);
882
883 if (wait_for_us((I915_READ(DSI_LP_MSG(dsi_trans)) &
884 LINK_IN_ULPS),
885 10))
886 DRM_ERROR("DSI link not in ULPS\n");
887 }
888
889 /* disable ddi function */
890 for_each_dsi_port(port, intel_dsi->ports) {
891 dsi_trans = dsi_port_to_transcoder(port);
892 tmp = I915_READ(TRANS_DDI_FUNC_CTL(dsi_trans));
893 tmp &= ~TRANS_DDI_FUNC_ENABLE;
894 I915_WRITE(TRANS_DDI_FUNC_CTL(dsi_trans), tmp);
895 }
896
897 /* disable port sync mode if dual link */
898 if (intel_dsi->dual_link) {
899 for_each_dsi_port(port, intel_dsi->ports) {
900 dsi_trans = dsi_port_to_transcoder(port);
901 tmp = I915_READ(TRANS_DDI_FUNC_CTL2(dsi_trans));
902 tmp &= ~PORT_SYNC_MODE_ENABLE;
903 I915_WRITE(TRANS_DDI_FUNC_CTL2(dsi_trans), tmp);
904 }
905 }
906}
907
908static void gen11_dsi_disable_port(struct intel_encoder *encoder)
909{
910 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
911 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
912 u32 tmp;
913 enum port port;
914
915 for_each_dsi_port(port, intel_dsi->ports) {
916 tmp = I915_READ(DDI_BUF_CTL(port));
917 tmp &= ~DDI_BUF_CTL_ENABLE;
918 I915_WRITE(DDI_BUF_CTL(port), tmp);
919
920 if (wait_for_us((I915_READ(DDI_BUF_CTL(port)) &
921 DDI_BUF_IS_IDLE),
922 8))
923 DRM_ERROR("DDI port:%c buffer not idle\n",
924 port_name(port));
925 }
926}
927
928static void gen11_dsi_disable_io_power(struct intel_encoder *encoder)
929{
930 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
931 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
932 enum port port;
933 u32 tmp;
934
935 intel_display_power_put(dev_priv, POWER_DOMAIN_PORT_DDI_A_IO);
936
937 if (intel_dsi->dual_link)
938 intel_display_power_put(dev_priv, POWER_DOMAIN_PORT_DDI_B_IO);
939
940 /* set mode to DDI */
941 for_each_dsi_port(port, intel_dsi->ports) {
942 tmp = I915_READ(ICL_DSI_IO_MODECTL(port));
943 tmp &= ~COMBO_PHY_MODE_DSI;
944 I915_WRITE(ICL_DSI_IO_MODECTL(port), tmp);
945 }
946}
947
948static void __attribute__((unused)) gen11_dsi_disable(
949 struct intel_encoder *encoder,
950 const struct intel_crtc_state *old_crtc_state,
951 const struct drm_connector_state *old_conn_state)
952{
953 struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
954
955 /* step1: turn off backlight */
956 intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_BACKLIGHT_OFF);
957 intel_panel_disable_backlight(old_conn_state);
958
959 /* step2d,e: disable transcoder and wait */
960 gen11_dsi_disable_transcoder(encoder);
961
962 /* step2f,g: powerdown panel */
963 gen11_dsi_powerdown_panel(encoder);
964
965 /* step2h,i,j: deconfig trancoder */
966 gen11_dsi_deconfigure_trancoder(encoder);
967
968 /* step3: disable port */
969 gen11_dsi_disable_port(encoder);
970
971 /* step4: disable IO power */
972 gen11_dsi_disable_io_power(encoder);
973}
974
975void icl_dsi_init(struct drm_i915_private *dev_priv)
976{
977 enum port port;
978
979 if (!intel_bios_is_dsi_present(dev_priv, &port))
980 return;
127} 981}
diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c
index b04952bacf77..a5a2c8fe58a7 100644
--- a/drivers/gpu/drm/i915/intel_atomic.c
+++ b/drivers/gpu/drm/i915/intel_atomic.c
@@ -203,6 +203,72 @@ intel_crtc_destroy_state(struct drm_crtc *crtc,
203 drm_atomic_helper_crtc_destroy_state(crtc, state); 203 drm_atomic_helper_crtc_destroy_state(crtc, state);
204} 204}
205 205
206static void intel_atomic_setup_scaler(struct intel_crtc_scaler_state *scaler_state,
207 int num_scalers_need, struct intel_crtc *intel_crtc,
208 const char *name, int idx,
209 struct intel_plane_state *plane_state,
210 int *scaler_id)
211{
212 struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
213 int j;
214 u32 mode;
215
216 if (*scaler_id < 0) {
217 /* find a free scaler */
218 for (j = 0; j < intel_crtc->num_scalers; j++) {
219 if (scaler_state->scalers[j].in_use)
220 continue;
221
222 *scaler_id = j;
223 scaler_state->scalers[*scaler_id].in_use = 1;
224 break;
225 }
226 }
227
228 if (WARN(*scaler_id < 0, "Cannot find scaler for %s:%d\n", name, idx))
229 return;
230
231 /* set scaler mode */
232 if (plane_state && plane_state->base.fb &&
233 plane_state->base.fb->format->is_yuv &&
234 plane_state->base.fb->format->num_planes > 1) {
235 if (IS_GEN9(dev_priv) &&
236 !IS_GEMINILAKE(dev_priv)) {
237 mode = SKL_PS_SCALER_MODE_NV12;
238 } else if (icl_is_hdr_plane(to_intel_plane(plane_state->base.plane))) {
239 /*
240 * On gen11+'s HDR planes we only use the scaler for
241 * scaling. They have a dedicated chroma upsampler, so
242 * we don't need the scaler to upsample the UV plane.
243 */
244 mode = PS_SCALER_MODE_NORMAL;
245 } else {
246 mode = PS_SCALER_MODE_PLANAR;
247
248 if (plane_state->linked_plane)
249 mode |= PS_PLANE_Y_SEL(plane_state->linked_plane->id);
250 }
251 } else if (INTEL_GEN(dev_priv) > 9 || IS_GEMINILAKE(dev_priv)) {
252 mode = PS_SCALER_MODE_NORMAL;
253 } else if (num_scalers_need == 1 && intel_crtc->num_scalers > 1) {
254 /*
255 * when only 1 scaler is in use on a pipe with 2 scalers
256 * scaler 0 operates in high quality (HQ) mode.
257 * In this case use scaler 0 to take advantage of HQ mode
258 */
259 scaler_state->scalers[*scaler_id].in_use = 0;
260 *scaler_id = 0;
261 scaler_state->scalers[0].in_use = 1;
262 mode = SKL_PS_SCALER_MODE_HQ;
263 } else {
264 mode = SKL_PS_SCALER_MODE_DYN;
265 }
266
267 DRM_DEBUG_KMS("Attached scaler id %u.%u to %s:%d\n",
268 intel_crtc->pipe, *scaler_id, name, idx);
269 scaler_state->scalers[*scaler_id].mode = mode;
270}
271
206/** 272/**
207 * intel_atomic_setup_scalers() - setup scalers for crtc per staged requests 273 * intel_atomic_setup_scalers() - setup scalers for crtc per staged requests
208 * @dev_priv: i915 device 274 * @dev_priv: i915 device
@@ -232,7 +298,7 @@ int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv,
232 struct drm_atomic_state *drm_state = crtc_state->base.state; 298 struct drm_atomic_state *drm_state = crtc_state->base.state;
233 struct intel_atomic_state *intel_state = to_intel_atomic_state(drm_state); 299 struct intel_atomic_state *intel_state = to_intel_atomic_state(drm_state);
234 int num_scalers_need; 300 int num_scalers_need;
235 int i, j; 301 int i;
236 302
237 num_scalers_need = hweight32(scaler_state->scaler_users); 303 num_scalers_need = hweight32(scaler_state->scaler_users);
238 304
@@ -304,59 +370,17 @@ int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv,
304 idx = plane->base.id; 370 idx = plane->base.id;
305 371
306 /* plane on different crtc cannot be a scaler user of this crtc */ 372 /* plane on different crtc cannot be a scaler user of this crtc */
307 if (WARN_ON(intel_plane->pipe != intel_crtc->pipe)) { 373 if (WARN_ON(intel_plane->pipe != intel_crtc->pipe))
308 continue; 374 continue;
309 }
310 375
311 plane_state = intel_atomic_get_new_plane_state(intel_state, 376 plane_state = intel_atomic_get_new_plane_state(intel_state,
312 intel_plane); 377 intel_plane);
313 scaler_id = &plane_state->scaler_id; 378 scaler_id = &plane_state->scaler_id;
314 } 379 }
315 380
316 if (*scaler_id < 0) { 381 intel_atomic_setup_scaler(scaler_state, num_scalers_need,
317 /* find a free scaler */ 382 intel_crtc, name, idx,
318 for (j = 0; j < intel_crtc->num_scalers; j++) { 383 plane_state, scaler_id);
319 if (!scaler_state->scalers[j].in_use) {
320 scaler_state->scalers[j].in_use = 1;
321 *scaler_id = j;
322 DRM_DEBUG_KMS("Attached scaler id %u.%u to %s:%d\n",
323 intel_crtc->pipe, *scaler_id, name, idx);
324 break;
325 }
326 }
327 }
328
329 if (WARN_ON(*scaler_id < 0)) {
330 DRM_DEBUG_KMS("Cannot find scaler for %s:%d\n", name, idx);
331 continue;
332 }
333
334 /* set scaler mode */
335 if ((INTEL_GEN(dev_priv) >= 9) &&
336 plane_state && plane_state->base.fb &&
337 plane_state->base.fb->format->format ==
338 DRM_FORMAT_NV12) {
339 if (INTEL_GEN(dev_priv) == 9 &&
340 !IS_GEMINILAKE(dev_priv) &&
341 !IS_SKYLAKE(dev_priv))
342 scaler_state->scalers[*scaler_id].mode =
343 SKL_PS_SCALER_MODE_NV12;
344 else
345 scaler_state->scalers[*scaler_id].mode =
346 PS_SCALER_MODE_PLANAR;
347 } else if (num_scalers_need == 1 && intel_crtc->pipe != PIPE_C) {
348 /*
349 * when only 1 scaler is in use on either pipe A or B,
350 * scaler 0 operates in high quality (HQ) mode.
351 * In this case use scaler 0 to take advantage of HQ mode
352 */
353 *scaler_id = 0;
354 scaler_state->scalers[0].in_use = 1;
355 scaler_state->scalers[0].mode = PS_SCALER_MODE_HQ;
356 scaler_state->scalers[1].in_use = 0;
357 } else {
358 scaler_state->scalers[*scaler_id].mode = PS_SCALER_MODE_DYN;
359 }
360 } 384 }
361 385
362 return 0; 386 return 0;
diff --git a/drivers/gpu/drm/i915/intel_atomic_plane.c b/drivers/gpu/drm/i915/intel_atomic_plane.c
index aabebe0d2e9b..905f8ef3ba4f 100644
--- a/drivers/gpu/drm/i915/intel_atomic_plane.c
+++ b/drivers/gpu/drm/i915/intel_atomic_plane.c
@@ -36,28 +36,31 @@
36#include <drm/drm_plane_helper.h> 36#include <drm/drm_plane_helper.h>
37#include "intel_drv.h" 37#include "intel_drv.h"
38 38
39/** 39struct intel_plane *intel_plane_alloc(void)
40 * intel_create_plane_state - create plane state object
41 * @plane: drm plane
42 *
43 * Allocates a fresh plane state for the given plane and sets some of
44 * the state values to sensible initial values.
45 *
46 * Returns: A newly allocated plane state, or NULL on failure
47 */
48struct intel_plane_state *
49intel_create_plane_state(struct drm_plane *plane)
50{ 40{
51 struct intel_plane_state *state; 41 struct intel_plane_state *plane_state;
42 struct intel_plane *plane;
52 43
53 state = kzalloc(sizeof(*state), GFP_KERNEL); 44 plane = kzalloc(sizeof(*plane), GFP_KERNEL);
54 if (!state) 45 if (!plane)
55 return NULL; 46 return ERR_PTR(-ENOMEM);
56 47
57 state->base.plane = plane; 48 plane_state = kzalloc(sizeof(*plane_state), GFP_KERNEL);
58 state->base.rotation = DRM_MODE_ROTATE_0; 49 if (!plane_state) {
50 kfree(plane);
51 return ERR_PTR(-ENOMEM);
52 }
59 53
60 return state; 54 __drm_atomic_helper_plane_reset(&plane->base, &plane_state->base);
55 plane_state->scaler_id = -1;
56
57 return plane;
58}
59
60void intel_plane_free(struct intel_plane *plane)
61{
62 intel_plane_destroy_state(&plane->base, plane->base.state);
63 kfree(plane);
61} 64}
62 65
63/** 66/**
@@ -117,10 +120,14 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
117 struct intel_plane *intel_plane = to_intel_plane(plane); 120 struct intel_plane *intel_plane = to_intel_plane(plane);
118 int ret; 121 int ret;
119 122
123 crtc_state->active_planes &= ~BIT(intel_plane->id);
124 crtc_state->nv12_planes &= ~BIT(intel_plane->id);
125 intel_state->base.visible = false;
126
127 /* If this is a cursor plane, no further checks are needed. */
120 if (!intel_state->base.crtc && !old_plane_state->base.crtc) 128 if (!intel_state->base.crtc && !old_plane_state->base.crtc)
121 return 0; 129 return 0;
122 130
123 intel_state->base.visible = false;
124 ret = intel_plane->check_plane(crtc_state, intel_state); 131 ret = intel_plane->check_plane(crtc_state, intel_state);
125 if (ret) 132 if (ret)
126 return ret; 133 return ret;
@@ -128,13 +135,9 @@ int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_
128 /* FIXME pre-g4x don't work like this */ 135 /* FIXME pre-g4x don't work like this */
129 if (state->visible) 136 if (state->visible)
130 crtc_state->active_planes |= BIT(intel_plane->id); 137 crtc_state->active_planes |= BIT(intel_plane->id);
131 else
132 crtc_state->active_planes &= ~BIT(intel_plane->id);
133 138
134 if (state->visible && state->fb->format->format == DRM_FORMAT_NV12) 139 if (state->visible && state->fb->format->format == DRM_FORMAT_NV12)
135 crtc_state->nv12_planes |= BIT(intel_plane->id); 140 crtc_state->nv12_planes |= BIT(intel_plane->id);
136 else
137 crtc_state->nv12_planes &= ~BIT(intel_plane->id);
138 141
139 return intel_plane_atomic_calc_changes(old_crtc_state, 142 return intel_plane_atomic_calc_changes(old_crtc_state,
140 &crtc_state->base, 143 &crtc_state->base,
@@ -152,6 +155,7 @@ static int intel_plane_atomic_check(struct drm_plane *plane,
152 const struct drm_crtc_state *old_crtc_state; 155 const struct drm_crtc_state *old_crtc_state;
153 struct drm_crtc_state *new_crtc_state; 156 struct drm_crtc_state *new_crtc_state;
154 157
158 new_plane_state->visible = false;
155 if (!crtc) 159 if (!crtc)
156 return 0; 160 return 0;
157 161
@@ -164,29 +168,52 @@ static int intel_plane_atomic_check(struct drm_plane *plane,
164 to_intel_plane_state(new_plane_state)); 168 to_intel_plane_state(new_plane_state));
165} 169}
166 170
167static void intel_plane_atomic_update(struct drm_plane *plane, 171void intel_update_planes_on_crtc(struct intel_atomic_state *old_state,
168 struct drm_plane_state *old_state) 172 struct intel_crtc *crtc,
173 struct intel_crtc_state *old_crtc_state,
174 struct intel_crtc_state *new_crtc_state)
169{ 175{
170 struct intel_atomic_state *state = to_intel_atomic_state(old_state->state); 176 struct intel_plane_state *new_plane_state;
171 struct intel_plane *intel_plane = to_intel_plane(plane); 177 struct intel_plane *plane;
172 const struct intel_plane_state *new_plane_state = 178 u32 update_mask;
173 intel_atomic_get_new_plane_state(state, intel_plane); 179 int i;
174 struct drm_crtc *crtc = new_plane_state->base.crtc ?: old_state->crtc; 180
175 181 update_mask = old_crtc_state->active_planes;
176 if (new_plane_state->base.visible) { 182 update_mask |= new_crtc_state->active_planes;
177 const struct intel_crtc_state *new_crtc_state = 183
178 intel_atomic_get_new_crtc_state(state, to_intel_crtc(crtc)); 184 for_each_new_intel_plane_in_state(old_state, plane, new_plane_state, i) {
179 185 if (crtc->pipe != plane->pipe ||
180 trace_intel_update_plane(plane, 186 !(update_mask & BIT(plane->id)))
181 to_intel_crtc(crtc)); 187 continue;
182 188
183 intel_plane->update_plane(intel_plane, 189 if (new_plane_state->base.visible) {
184 new_crtc_state, new_plane_state); 190 trace_intel_update_plane(&plane->base, crtc);
185 } else { 191
186 trace_intel_disable_plane(plane, 192 plane->update_plane(plane, new_crtc_state, new_plane_state);
187 to_intel_crtc(crtc)); 193 } else if (new_plane_state->slave) {
188 194 struct intel_plane *master =
189 intel_plane->disable_plane(intel_plane, to_intel_crtc(crtc)); 195 new_plane_state->linked_plane;
196
197 /*
198 * We update the slave plane from this function because
199 * programming it from the master plane's update_plane
200 * callback runs into issues when the Y plane is
201 * reassigned, disabled or used by a different plane.
202 *
203 * The slave plane is updated with the master plane's
204 * plane_state.
205 */
206 new_plane_state =
207 intel_atomic_get_new_plane_state(old_state, master);
208
209 trace_intel_update_plane(&plane->base, crtc);
210
211 plane->update_slave(plane, new_crtc_state, new_plane_state);
212 } else {
213 trace_intel_disable_plane(&plane->base, crtc);
214
215 plane->disable_plane(plane, crtc);
216 }
190 } 217 }
191} 218}
192 219
@@ -194,7 +221,6 @@ const struct drm_plane_helper_funcs intel_plane_helper_funcs = {
194 .prepare_fb = intel_prepare_plane_fb, 221 .prepare_fb = intel_prepare_plane_fb,
195 .cleanup_fb = intel_cleanup_plane_fb, 222 .cleanup_fb = intel_cleanup_plane_fb,
196 .atomic_check = intel_plane_atomic_check, 223 .atomic_check = intel_plane_atomic_check,
197 .atomic_update = intel_plane_atomic_update,
198}; 224};
199 225
200/** 226/**
diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c
index 769f3f586661..ae55a6865d5c 100644
--- a/drivers/gpu/drm/i915/intel_audio.c
+++ b/drivers/gpu/drm/i915/intel_audio.c
@@ -144,26 +144,43 @@ static const struct {
144/* HDMI N/CTS table */ 144/* HDMI N/CTS table */
145#define TMDS_297M 297000 145#define TMDS_297M 297000
146#define TMDS_296M 296703 146#define TMDS_296M 296703
147#define TMDS_594M 594000
148#define TMDS_593M 593407
149
147static const struct { 150static const struct {
148 int sample_rate; 151 int sample_rate;
149 int clock; 152 int clock;
150 int n; 153 int n;
151 int cts; 154 int cts;
152} hdmi_aud_ncts[] = { 155} hdmi_aud_ncts[] = {
153 { 44100, TMDS_296M, 4459, 234375 },
154 { 44100, TMDS_297M, 4704, 247500 },
155 { 48000, TMDS_296M, 5824, 281250 },
156 { 48000, TMDS_297M, 5120, 247500 },
157 { 32000, TMDS_296M, 5824, 421875 }, 156 { 32000, TMDS_296M, 5824, 421875 },
158 { 32000, TMDS_297M, 3072, 222750 }, 157 { 32000, TMDS_297M, 3072, 222750 },
158 { 32000, TMDS_593M, 5824, 843750 },
159 { 32000, TMDS_594M, 3072, 445500 },
160 { 44100, TMDS_296M, 4459, 234375 },
161 { 44100, TMDS_297M, 4704, 247500 },
162 { 44100, TMDS_593M, 8918, 937500 },
163 { 44100, TMDS_594M, 9408, 990000 },
159 { 88200, TMDS_296M, 8918, 234375 }, 164 { 88200, TMDS_296M, 8918, 234375 },
160 { 88200, TMDS_297M, 9408, 247500 }, 165 { 88200, TMDS_297M, 9408, 247500 },
161 { 96000, TMDS_296M, 11648, 281250 }, 166 { 88200, TMDS_593M, 17836, 937500 },
162 { 96000, TMDS_297M, 10240, 247500 }, 167 { 88200, TMDS_594M, 18816, 990000 },
163 { 176400, TMDS_296M, 17836, 234375 }, 168 { 176400, TMDS_296M, 17836, 234375 },
164 { 176400, TMDS_297M, 18816, 247500 }, 169 { 176400, TMDS_297M, 18816, 247500 },
170 { 176400, TMDS_593M, 35672, 937500 },
171 { 176400, TMDS_594M, 37632, 990000 },
172 { 48000, TMDS_296M, 5824, 281250 },
173 { 48000, TMDS_297M, 5120, 247500 },
174 { 48000, TMDS_593M, 5824, 562500 },
175 { 48000, TMDS_594M, 6144, 594000 },
176 { 96000, TMDS_296M, 11648, 281250 },
177 { 96000, TMDS_297M, 10240, 247500 },
178 { 96000, TMDS_593M, 11648, 562500 },
179 { 96000, TMDS_594M, 12288, 594000 },
165 { 192000, TMDS_296M, 23296, 281250 }, 180 { 192000, TMDS_296M, 23296, 281250 },
166 { 192000, TMDS_297M, 20480, 247500 }, 181 { 192000, TMDS_297M, 20480, 247500 },
182 { 192000, TMDS_593M, 23296, 562500 },
183 { 192000, TMDS_594M, 24576, 594000 },
167}; 184};
168 185
169/* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */ 186/* get AUD_CONFIG_PIXEL_CLOCK_HDMI_* value for mode */
@@ -912,6 +929,9 @@ static int i915_audio_component_bind(struct device *i915_kdev,
912 if (WARN_ON(acomp->base.ops || acomp->base.dev)) 929 if (WARN_ON(acomp->base.ops || acomp->base.dev))
913 return -EEXIST; 930 return -EEXIST;
914 931
932 if (WARN_ON(!device_link_add(hda_kdev, i915_kdev, DL_FLAG_STATELESS)))
933 return -ENOMEM;
934
915 drm_modeset_lock_all(&dev_priv->drm); 935 drm_modeset_lock_all(&dev_priv->drm);
916 acomp->base.ops = &i915_audio_component_ops; 936 acomp->base.ops = &i915_audio_component_ops;
917 acomp->base.dev = i915_kdev; 937 acomp->base.dev = i915_kdev;
@@ -935,6 +955,8 @@ static void i915_audio_component_unbind(struct device *i915_kdev,
935 acomp->base.dev = NULL; 955 acomp->base.dev = NULL;
936 dev_priv->audio_component = NULL; 956 dev_priv->audio_component = NULL;
937 drm_modeset_unlock_all(&dev_priv->drm); 957 drm_modeset_unlock_all(&dev_priv->drm);
958
959 device_link_remove(hda_kdev, i915_kdev);
938} 960}
939 961
940static const struct component_ops i915_audio_component_bind_ops = { 962static const struct component_ops i915_audio_component_bind_ops = {
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index 1faa494e2bc9..0694aa8bb9bc 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -420,6 +420,13 @@ parse_general_features(struct drm_i915_private *dev_priv,
420 intel_bios_ssc_frequency(dev_priv, general->ssc_freq); 420 intel_bios_ssc_frequency(dev_priv, general->ssc_freq);
421 dev_priv->vbt.display_clock_mode = general->display_clock_mode; 421 dev_priv->vbt.display_clock_mode = general->display_clock_mode;
422 dev_priv->vbt.fdi_rx_polarity_inverted = general->fdi_rx_polarity_inverted; 422 dev_priv->vbt.fdi_rx_polarity_inverted = general->fdi_rx_polarity_inverted;
423 if (bdb->version >= 181) {
424 dev_priv->vbt.orientation = general->rotate_180 ?
425 DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP :
426 DRM_MODE_PANEL_ORIENTATION_NORMAL;
427 } else {
428 dev_priv->vbt.orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
429 }
423 DRM_DEBUG_KMS("BDB_GENERAL_FEATURES int_tv_support %d int_crt_support %d lvds_use_ssc %d lvds_ssc_freq %d display_clock_mode %d fdi_rx_polarity_inverted %d\n", 430 DRM_DEBUG_KMS("BDB_GENERAL_FEATURES int_tv_support %d int_crt_support %d lvds_use_ssc %d lvds_ssc_freq %d display_clock_mode %d fdi_rx_polarity_inverted %d\n",
424 dev_priv->vbt.int_tv_support, 431 dev_priv->vbt.int_tv_support,
425 dev_priv->vbt.int_crt_support, 432 dev_priv->vbt.int_crt_support,
@@ -852,6 +859,30 @@ parse_mipi_config(struct drm_i915_private *dev_priv,
852 859
853 parse_dsi_backlight_ports(dev_priv, bdb->version, port); 860 parse_dsi_backlight_ports(dev_priv, bdb->version, port);
854 861
862 /* FIXME is the 90 vs. 270 correct? */
863 switch (config->rotation) {
864 case ENABLE_ROTATION_0:
865 /*
866 * Most (all?) VBTs claim 0 degrees despite having
867 * an upside down panel, thus we do not trust this.
868 */
869 dev_priv->vbt.dsi.orientation =
870 DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
871 break;
872 case ENABLE_ROTATION_90:
873 dev_priv->vbt.dsi.orientation =
874 DRM_MODE_PANEL_ORIENTATION_RIGHT_UP;
875 break;
876 case ENABLE_ROTATION_180:
877 dev_priv->vbt.dsi.orientation =
878 DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP;
879 break;
880 case ENABLE_ROTATION_270:
881 dev_priv->vbt.dsi.orientation =
882 DRM_MODE_PANEL_ORIENTATION_LEFT_UP;
883 break;
884 }
885
855 /* We have mandatory mipi config blocks. Initialize as generic panel */ 886 /* We have mandatory mipi config blocks. Initialize as generic panel */
856 dev_priv->vbt.dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID; 887 dev_priv->vbt.dsi.panel_id = MIPI_DSI_GENERIC_PANEL_ID;
857} 888}
@@ -2039,17 +2070,17 @@ bool intel_bios_is_dsi_present(struct drm_i915_private *dev_priv,
2039 2070
2040 dvo_port = child->dvo_port; 2071 dvo_port = child->dvo_port;
2041 2072
2042 switch (dvo_port) { 2073 if (dvo_port == DVO_PORT_MIPIA ||
2043 case DVO_PORT_MIPIA: 2074 (dvo_port == DVO_PORT_MIPIB && IS_ICELAKE(dev_priv)) ||
2044 case DVO_PORT_MIPIC: 2075 (dvo_port == DVO_PORT_MIPIC && !IS_ICELAKE(dev_priv))) {
2045 if (port) 2076 if (port)
2046 *port = dvo_port - DVO_PORT_MIPIA; 2077 *port = dvo_port - DVO_PORT_MIPIA;
2047 return true; 2078 return true;
2048 case DVO_PORT_MIPIB: 2079 } else if (dvo_port == DVO_PORT_MIPIB ||
2049 case DVO_PORT_MIPID: 2080 dvo_port == DVO_PORT_MIPIC ||
2081 dvo_port == DVO_PORT_MIPID) {
2050 DRM_DEBUG_KMS("VBT has unsupported DSI port %c\n", 2082 DRM_DEBUG_KMS("VBT has unsupported DSI port %c\n",
2051 port_name(dvo_port - DVO_PORT_MIPIA)); 2083 port_name(dvo_port - DVO_PORT_MIPIA));
2052 break;
2053 } 2084 }
2054 } 2085 }
2055 2086
@@ -2159,3 +2190,49 @@ intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv,
2159 2190
2160 return false; 2191 return false;
2161} 2192}
2193
2194enum aux_ch intel_bios_port_aux_ch(struct drm_i915_private *dev_priv,
2195 enum port port)
2196{
2197 const struct ddi_vbt_port_info *info =
2198 &dev_priv->vbt.ddi_port_info[port];
2199 enum aux_ch aux_ch;
2200
2201 if (!info->alternate_aux_channel) {
2202 aux_ch = (enum aux_ch)port;
2203
2204 DRM_DEBUG_KMS("using AUX %c for port %c (platform default)\n",
2205 aux_ch_name(aux_ch), port_name(port));
2206 return aux_ch;
2207 }
2208
2209 switch (info->alternate_aux_channel) {
2210 case DP_AUX_A:
2211 aux_ch = AUX_CH_A;
2212 break;
2213 case DP_AUX_B:
2214 aux_ch = AUX_CH_B;
2215 break;
2216 case DP_AUX_C:
2217 aux_ch = AUX_CH_C;
2218 break;
2219 case DP_AUX_D:
2220 aux_ch = AUX_CH_D;
2221 break;
2222 case DP_AUX_E:
2223 aux_ch = AUX_CH_E;
2224 break;
2225 case DP_AUX_F:
2226 aux_ch = AUX_CH_F;
2227 break;
2228 default:
2229 MISSING_CASE(info->alternate_aux_channel);
2230 aux_ch = AUX_CH_A;
2231 break;
2232 }
2233
2234 DRM_DEBUG_KMS("using AUX %c for port %c (VBT)\n",
2235 aux_ch_name(aux_ch), port_name(port));
2236
2237 return aux_ch;
2238}
diff --git a/drivers/gpu/drm/i915/intel_cdclk.c b/drivers/gpu/drm/i915/intel_cdclk.c
index 29075c763428..25e3aba9cded 100644
--- a/drivers/gpu/drm/i915/intel_cdclk.c
+++ b/drivers/gpu/drm/i915/intel_cdclk.c
@@ -2138,16 +2138,8 @@ void intel_set_cdclk(struct drm_i915_private *dev_priv,
2138static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv, 2138static int intel_pixel_rate_to_cdclk(struct drm_i915_private *dev_priv,
2139 int pixel_rate) 2139 int pixel_rate)
2140{ 2140{
2141 if (INTEL_GEN(dev_priv) >= 10) 2141 if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
2142 return DIV_ROUND_UP(pixel_rate, 2); 2142 return DIV_ROUND_UP(pixel_rate, 2);
2143 else if (IS_GEMINILAKE(dev_priv))
2144 /*
2145 * FIXME: Avoid using a pixel clock that is more than 99% of the cdclk
2146 * as a temporary workaround. Use a higher cdclk instead. (Note that
2147 * intel_compute_max_dotclk() limits the max pixel clock to 99% of max
2148 * cdclk.)
2149 */
2150 return DIV_ROUND_UP(pixel_rate * 100, 2 * 99);
2151 else if (IS_GEN9(dev_priv) || 2143 else if (IS_GEN9(dev_priv) ||
2152 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) 2144 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
2153 return pixel_rate; 2145 return pixel_rate;
@@ -2543,14 +2535,8 @@ static int intel_compute_max_dotclk(struct drm_i915_private *dev_priv)
2543{ 2535{
2544 int max_cdclk_freq = dev_priv->max_cdclk_freq; 2536 int max_cdclk_freq = dev_priv->max_cdclk_freq;
2545 2537
2546 if (INTEL_GEN(dev_priv) >= 10) 2538 if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
2547 return 2 * max_cdclk_freq; 2539 return 2 * max_cdclk_freq;
2548 else if (IS_GEMINILAKE(dev_priv))
2549 /*
2550 * FIXME: Limiting to 99% as a temporary workaround. See
2551 * intel_min_cdclk() for details.
2552 */
2553 return 2 * max_cdclk_freq * 99 / 100;
2554 else if (IS_GEN9(dev_priv) || 2540 else if (IS_GEN9(dev_priv) ||
2555 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) 2541 IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv))
2556 return max_cdclk_freq; 2542 return max_cdclk_freq;
@@ -2674,37 +2660,18 @@ static int cnp_rawclk(struct drm_i915_private *dev_priv)
2674 fraction = 200; 2660 fraction = 200;
2675 } 2661 }
2676 2662
2677 rawclk = CNP_RAWCLK_DIV((divider / 1000) - 1); 2663 rawclk = CNP_RAWCLK_DIV(divider / 1000);
2678 if (fraction) 2664 if (fraction) {
2679 rawclk |= CNP_RAWCLK_FRAC(DIV_ROUND_CLOSEST(1000, 2665 int numerator = 1;
2680 fraction) - 1);
2681
2682 I915_WRITE(PCH_RAWCLK_FREQ, rawclk);
2683 return divider + fraction;
2684}
2685 2666
2686static int icp_rawclk(struct drm_i915_private *dev_priv) 2667 rawclk |= CNP_RAWCLK_DEN(DIV_ROUND_CLOSEST(numerator * 1000,
2687{ 2668 fraction) - 1);
2688 u32 rawclk; 2669 if (HAS_PCH_ICP(dev_priv))
2689 int divider, numerator, denominator, frequency; 2670 rawclk |= ICP_RAWCLK_NUM(numerator);
2690
2691 if (I915_READ(SFUSE_STRAP) & SFUSE_STRAP_RAW_FREQUENCY) {
2692 frequency = 24000;
2693 divider = 23;
2694 numerator = 0;
2695 denominator = 0;
2696 } else {
2697 frequency = 19200;
2698 divider = 18;
2699 numerator = 1;
2700 denominator = 4;
2701 } 2671 }
2702 2672
2703 rawclk = CNP_RAWCLK_DIV(divider) | ICP_RAWCLK_NUM(numerator) |
2704 ICP_RAWCLK_DEN(denominator);
2705
2706 I915_WRITE(PCH_RAWCLK_FREQ, rawclk); 2673 I915_WRITE(PCH_RAWCLK_FREQ, rawclk);
2707 return frequency; 2674 return divider + fraction;
2708} 2675}
2709 2676
2710static int pch_rawclk(struct drm_i915_private *dev_priv) 2677static int pch_rawclk(struct drm_i915_private *dev_priv)
@@ -2754,9 +2721,7 @@ static int g4x_hrawclk(struct drm_i915_private *dev_priv)
2754 */ 2721 */
2755void intel_update_rawclk(struct drm_i915_private *dev_priv) 2722void intel_update_rawclk(struct drm_i915_private *dev_priv)
2756{ 2723{
2757 if (HAS_PCH_ICP(dev_priv)) 2724 if (HAS_PCH_CNP(dev_priv) || HAS_PCH_ICP(dev_priv))
2758 dev_priv->rawclk_freq = icp_rawclk(dev_priv);
2759 else if (HAS_PCH_CNP(dev_priv))
2760 dev_priv->rawclk_freq = cnp_rawclk(dev_priv); 2725 dev_priv->rawclk_freq = cnp_rawclk(dev_priv);
2761 else if (HAS_PCH_SPLIT(dev_priv)) 2726 else if (HAS_PCH_SPLIT(dev_priv))
2762 dev_priv->rawclk_freq = pch_rawclk(dev_priv); 2727 dev_priv->rawclk_freq = pch_rawclk(dev_priv);
diff --git a/drivers/gpu/drm/i915/intel_color.c b/drivers/gpu/drm/i915/intel_color.c
index c6a7beabd58d..5127da286a2b 100644
--- a/drivers/gpu/drm/i915/intel_color.c
+++ b/drivers/gpu/drm/i915/intel_color.c
@@ -149,7 +149,8 @@ static void ilk_load_csc_matrix(struct drm_crtc_state *crtc_state)
149 if (INTEL_GEN(dev_priv) >= 8 || IS_HASWELL(dev_priv)) 149 if (INTEL_GEN(dev_priv) >= 8 || IS_HASWELL(dev_priv))
150 limited_color_range = intel_crtc_state->limited_color_range; 150 limited_color_range = intel_crtc_state->limited_color_range;
151 151
152 if (intel_crtc_state->ycbcr420) { 152 if (intel_crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
153 intel_crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444) {
153 ilk_load_ycbcr_conversion_matrix(intel_crtc); 154 ilk_load_ycbcr_conversion_matrix(intel_crtc);
154 return; 155 return;
155 } else if (crtc_state->ctm) { 156 } else if (crtc_state->ctm) {
diff --git a/drivers/gpu/drm/i915/intel_combo_phy.c b/drivers/gpu/drm/i915/intel_combo_phy.c
new file mode 100644
index 000000000000..3d0271cebf99
--- /dev/null
+++ b/drivers/gpu/drm/i915/intel_combo_phy.c
@@ -0,0 +1,254 @@
1// SPDX-License-Identifier: MIT
2/*
3 * Copyright © 2018 Intel Corporation
4 */
5
6#include "intel_drv.h"
7
8#define for_each_combo_port(__dev_priv, __port) \
9 for ((__port) = PORT_A; (__port) < I915_MAX_PORTS; (__port)++) \
10 for_each_if(intel_port_is_combophy(__dev_priv, __port))
11
12#define for_each_combo_port_reverse(__dev_priv, __port) \
13 for ((__port) = I915_MAX_PORTS; (__port)-- > PORT_A;) \
14 for_each_if(intel_port_is_combophy(__dev_priv, __port))
15
16enum {
17 PROCMON_0_85V_DOT_0,
18 PROCMON_0_95V_DOT_0,
19 PROCMON_0_95V_DOT_1,
20 PROCMON_1_05V_DOT_0,
21 PROCMON_1_05V_DOT_1,
22};
23
24static const struct cnl_procmon {
25 u32 dw1, dw9, dw10;
26} cnl_procmon_values[] = {
27 [PROCMON_0_85V_DOT_0] =
28 { .dw1 = 0x00000000, .dw9 = 0x62AB67BB, .dw10 = 0x51914F96, },
29 [PROCMON_0_95V_DOT_0] =
30 { .dw1 = 0x00000000, .dw9 = 0x86E172C7, .dw10 = 0x77CA5EAB, },
31 [PROCMON_0_95V_DOT_1] =
32 { .dw1 = 0x00000000, .dw9 = 0x93F87FE1, .dw10 = 0x8AE871C5, },
33 [PROCMON_1_05V_DOT_0] =
34 { .dw1 = 0x00000000, .dw9 = 0x98FA82DD, .dw10 = 0x89E46DC1, },
35 [PROCMON_1_05V_DOT_1] =
36 { .dw1 = 0x00440000, .dw9 = 0x9A00AB25, .dw10 = 0x8AE38FF1, },
37};
38
39/*
40 * CNL has just one set of registers, while ICL has two sets: one for port A and
41 * the other for port B. The CNL registers are equivalent to the ICL port A
42 * registers, that's why we call the ICL macros even though the function has CNL
43 * on its name.
44 */
45static const struct cnl_procmon *
46cnl_get_procmon_ref_values(struct drm_i915_private *dev_priv, enum port port)
47{
48 const struct cnl_procmon *procmon;
49 u32 val;
50
51 val = I915_READ(ICL_PORT_COMP_DW3(port));
52 switch (val & (PROCESS_INFO_MASK | VOLTAGE_INFO_MASK)) {
53 default:
54 MISSING_CASE(val);
55 /* fall through */
56 case VOLTAGE_INFO_0_85V | PROCESS_INFO_DOT_0:
57 procmon = &cnl_procmon_values[PROCMON_0_85V_DOT_0];
58 break;
59 case VOLTAGE_INFO_0_95V | PROCESS_INFO_DOT_0:
60 procmon = &cnl_procmon_values[PROCMON_0_95V_DOT_0];
61 break;
62 case VOLTAGE_INFO_0_95V | PROCESS_INFO_DOT_1:
63 procmon = &cnl_procmon_values[PROCMON_0_95V_DOT_1];
64 break;
65 case VOLTAGE_INFO_1_05V | PROCESS_INFO_DOT_0:
66 procmon = &cnl_procmon_values[PROCMON_1_05V_DOT_0];
67 break;
68 case VOLTAGE_INFO_1_05V | PROCESS_INFO_DOT_1:
69 procmon = &cnl_procmon_values[PROCMON_1_05V_DOT_1];
70 break;
71 }
72
73 return procmon;
74}
75
76static void cnl_set_procmon_ref_values(struct drm_i915_private *dev_priv,
77 enum port port)
78{
79 const struct cnl_procmon *procmon;
80 u32 val;
81
82 procmon = cnl_get_procmon_ref_values(dev_priv, port);
83
84 val = I915_READ(ICL_PORT_COMP_DW1(port));
85 val &= ~((0xff << 16) | 0xff);
86 val |= procmon->dw1;
87 I915_WRITE(ICL_PORT_COMP_DW1(port), val);
88
89 I915_WRITE(ICL_PORT_COMP_DW9(port), procmon->dw9);
90 I915_WRITE(ICL_PORT_COMP_DW10(port), procmon->dw10);
91}
92
93static bool check_phy_reg(struct drm_i915_private *dev_priv,
94 enum port port, i915_reg_t reg, u32 mask,
95 u32 expected_val)
96{
97 u32 val = I915_READ(reg);
98
99 if ((val & mask) != expected_val) {
100 DRM_DEBUG_DRIVER("Port %c combo PHY reg %08x state mismatch: "
101 "current %08x mask %08x expected %08x\n",
102 port_name(port),
103 reg.reg, val, mask, expected_val);
104 return false;
105 }
106
107 return true;
108}
109
110static bool cnl_verify_procmon_ref_values(struct drm_i915_private *dev_priv,
111 enum port port)
112{
113 const struct cnl_procmon *procmon;
114 bool ret;
115
116 procmon = cnl_get_procmon_ref_values(dev_priv, port);
117
118 ret = check_phy_reg(dev_priv, port, ICL_PORT_COMP_DW1(port),
119 (0xff << 16) | 0xff, procmon->dw1);
120 ret &= check_phy_reg(dev_priv, port, ICL_PORT_COMP_DW9(port),
121 -1U, procmon->dw9);
122 ret &= check_phy_reg(dev_priv, port, ICL_PORT_COMP_DW10(port),
123 -1U, procmon->dw10);
124
125 return ret;
126}
127
128static bool cnl_combo_phy_enabled(struct drm_i915_private *dev_priv)
129{
130 return !(I915_READ(CHICKEN_MISC_2) & CNL_COMP_PWR_DOWN) &&
131 (I915_READ(CNL_PORT_COMP_DW0) & COMP_INIT);
132}
133
134static bool cnl_combo_phy_verify_state(struct drm_i915_private *dev_priv)
135{
136 enum port port = PORT_A;
137 bool ret;
138
139 if (!cnl_combo_phy_enabled(dev_priv))
140 return false;
141
142 ret = cnl_verify_procmon_ref_values(dev_priv, port);
143
144 ret &= check_phy_reg(dev_priv, port, CNL_PORT_CL1CM_DW5,
145 CL_POWER_DOWN_ENABLE, CL_POWER_DOWN_ENABLE);
146
147 return ret;
148}
149
150void cnl_combo_phys_init(struct drm_i915_private *dev_priv)
151{
152 u32 val;
153
154 val = I915_READ(CHICKEN_MISC_2);
155 val &= ~CNL_COMP_PWR_DOWN;
156 I915_WRITE(CHICKEN_MISC_2, val);
157
158 /* Dummy PORT_A to get the correct CNL register from the ICL macro */
159 cnl_set_procmon_ref_values(dev_priv, PORT_A);
160
161 val = I915_READ(CNL_PORT_COMP_DW0);
162 val |= COMP_INIT;
163 I915_WRITE(CNL_PORT_COMP_DW0, val);
164
165 val = I915_READ(CNL_PORT_CL1CM_DW5);
166 val |= CL_POWER_DOWN_ENABLE;
167 I915_WRITE(CNL_PORT_CL1CM_DW5, val);
168}
169
170void cnl_combo_phys_uninit(struct drm_i915_private *dev_priv)
171{
172 u32 val;
173
174 if (!cnl_combo_phy_verify_state(dev_priv))
175 DRM_WARN("Combo PHY HW state changed unexpectedly.\n");
176
177 val = I915_READ(CHICKEN_MISC_2);
178 val |= CNL_COMP_PWR_DOWN;
179 I915_WRITE(CHICKEN_MISC_2, val);
180}
181
182static bool icl_combo_phy_enabled(struct drm_i915_private *dev_priv,
183 enum port port)
184{
185 return !(I915_READ(ICL_PHY_MISC(port)) &
186 ICL_PHY_MISC_DE_IO_COMP_PWR_DOWN) &&
187 (I915_READ(ICL_PORT_COMP_DW0(port)) & COMP_INIT);
188}
189
190static bool icl_combo_phy_verify_state(struct drm_i915_private *dev_priv,
191 enum port port)
192{
193 bool ret;
194
195 if (!icl_combo_phy_enabled(dev_priv, port))
196 return false;
197
198 ret = cnl_verify_procmon_ref_values(dev_priv, port);
199
200 ret &= check_phy_reg(dev_priv, port, ICL_PORT_CL_DW5(port),
201 CL_POWER_DOWN_ENABLE, CL_POWER_DOWN_ENABLE);
202
203 return ret;
204}
205
206void icl_combo_phys_init(struct drm_i915_private *dev_priv)
207{
208 enum port port;
209
210 for_each_combo_port(dev_priv, port) {
211 u32 val;
212
213 if (icl_combo_phy_verify_state(dev_priv, port)) {
214 DRM_DEBUG_DRIVER("Port %c combo PHY already enabled, won't reprogram it.\n",
215 port_name(port));
216 continue;
217 }
218
219 val = I915_READ(ICL_PHY_MISC(port));
220 val &= ~ICL_PHY_MISC_DE_IO_COMP_PWR_DOWN;
221 I915_WRITE(ICL_PHY_MISC(port), val);
222
223 cnl_set_procmon_ref_values(dev_priv, port);
224
225 val = I915_READ(ICL_PORT_COMP_DW0(port));
226 val |= COMP_INIT;
227 I915_WRITE(ICL_PORT_COMP_DW0(port), val);
228
229 val = I915_READ(ICL_PORT_CL_DW5(port));
230 val |= CL_POWER_DOWN_ENABLE;
231 I915_WRITE(ICL_PORT_CL_DW5(port), val);
232 }
233}
234
235void icl_combo_phys_uninit(struct drm_i915_private *dev_priv)
236{
237 enum port port;
238
239 for_each_combo_port_reverse(dev_priv, port) {
240 u32 val;
241
242 if (!icl_combo_phy_verify_state(dev_priv, port))
243 DRM_WARN("Port %c combo PHY HW state changed unexpectedly\n",
244 port_name(port));
245
246 val = I915_READ(ICL_PHY_MISC(port));
247 val |= ICL_PHY_MISC_DE_IO_COMP_PWR_DOWN;
248 I915_WRITE(ICL_PHY_MISC(port), val);
249
250 val = I915_READ(ICL_PORT_COMP_DW0(port));
251 val &= ~COMP_INIT;
252 I915_WRITE(ICL_PORT_COMP_DW0(port), val);
253 }
254}
diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_connector.c
index ca44bf368e24..18e370f607bc 100644
--- a/drivers/gpu/drm/i915/intel_modes.c
+++ b/drivers/gpu/drm/i915/intel_connector.c
@@ -25,11 +25,140 @@
25 25
26#include <linux/slab.h> 26#include <linux/slab.h>
27#include <linux/i2c.h> 27#include <linux/i2c.h>
28#include <drm/drm_atomic_helper.h>
28#include <drm/drm_edid.h> 29#include <drm/drm_edid.h>
29#include <drm/drmP.h> 30#include <drm/drmP.h>
30#include "intel_drv.h" 31#include "intel_drv.h"
31#include "i915_drv.h" 32#include "i915_drv.h"
32 33
34int intel_connector_init(struct intel_connector *connector)
35{
36 struct intel_digital_connector_state *conn_state;
37
38 /*
39 * Allocate enough memory to hold intel_digital_connector_state,
40 * This might be a few bytes too many, but for connectors that don't
41 * need it we'll free the state and allocate a smaller one on the first
42 * successful commit anyway.
43 */
44 conn_state = kzalloc(sizeof(*conn_state), GFP_KERNEL);
45 if (!conn_state)
46 return -ENOMEM;
47
48 __drm_atomic_helper_connector_reset(&connector->base,
49 &conn_state->base);
50
51 return 0;
52}
53
54struct intel_connector *intel_connector_alloc(void)
55{
56 struct intel_connector *connector;
57
58 connector = kzalloc(sizeof(*connector), GFP_KERNEL);
59 if (!connector)
60 return NULL;
61
62 if (intel_connector_init(connector) < 0) {
63 kfree(connector);
64 return NULL;
65 }
66
67 return connector;
68}
69
70/*
71 * Free the bits allocated by intel_connector_alloc.
72 * This should only be used after intel_connector_alloc has returned
73 * successfully, and before drm_connector_init returns successfully.
74 * Otherwise the destroy callbacks for the connector and the state should
75 * take care of proper cleanup/free (see intel_connector_destroy).
76 */
77void intel_connector_free(struct intel_connector *connector)
78{
79 kfree(to_intel_digital_connector_state(connector->base.state));
80 kfree(connector);
81}
82
83/*
84 * Connector type independent destroy hook for drm_connector_funcs.
85 */
86void intel_connector_destroy(struct drm_connector *connector)
87{
88 struct intel_connector *intel_connector = to_intel_connector(connector);
89
90 kfree(intel_connector->detect_edid);
91
92 if (!IS_ERR_OR_NULL(intel_connector->edid))
93 kfree(intel_connector->edid);
94
95 intel_panel_fini(&intel_connector->panel);
96
97 drm_connector_cleanup(connector);
98 kfree(connector);
99}
100
101int intel_connector_register(struct drm_connector *connector)
102{
103 struct intel_connector *intel_connector = to_intel_connector(connector);
104 int ret;
105
106 ret = intel_backlight_device_register(intel_connector);
107 if (ret)
108 goto err;
109
110 if (i915_inject_load_failure()) {
111 ret = -EFAULT;
112 goto err_backlight;
113 }
114
115 return 0;
116
117err_backlight:
118 intel_backlight_device_unregister(intel_connector);
119err:
120 return ret;
121}
122
123void intel_connector_unregister(struct drm_connector *connector)
124{
125 struct intel_connector *intel_connector = to_intel_connector(connector);
126
127 intel_backlight_device_unregister(intel_connector);
128}
129
130void intel_connector_attach_encoder(struct intel_connector *connector,
131 struct intel_encoder *encoder)
132{
133 connector->encoder = encoder;
134 drm_connector_attach_encoder(&connector->base, &encoder->base);
135}
136
137/*
138 * Simple connector->get_hw_state implementation for encoders that support only
139 * one connector and no cloning and hence the encoder state determines the state
140 * of the connector.
141 */
142bool intel_connector_get_hw_state(struct intel_connector *connector)
143{
144 enum pipe pipe = 0;
145 struct intel_encoder *encoder = connector->encoder;
146
147 return encoder->get_hw_state(encoder, &pipe);
148}
149
150enum pipe intel_connector_get_pipe(struct intel_connector *connector)
151{
152 struct drm_device *dev = connector->base.dev;
153
154 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
155
156 if (!connector->base.state->crtc)
157 return INVALID_PIPE;
158
159 return to_intel_crtc(connector->base.state->crtc)->pipe;
160}
161
33/** 162/**
34 * intel_connector_update_modes - update connector from edid 163 * intel_connector_update_modes - update connector from edid
35 * @connector: DRM connector device to use 164 * @connector: DRM connector device to use
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index 0c6bf82bb059..68f2fb89ece3 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -354,6 +354,7 @@ static bool intel_crt_compute_config(struct intel_encoder *encoder,
354 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) 354 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
355 return false; 355 return false;
356 356
357 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
357 return true; 358 return true;
358} 359}
359 360
@@ -368,6 +369,7 @@ static bool pch_crt_compute_config(struct intel_encoder *encoder,
368 return false; 369 return false;
369 370
370 pipe_config->has_pch_encoder = true; 371 pipe_config->has_pch_encoder = true;
372 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
371 373
372 return true; 374 return true;
373} 375}
@@ -389,6 +391,7 @@ static bool hsw_crt_compute_config(struct intel_encoder *encoder,
389 return false; 391 return false;
390 392
391 pipe_config->has_pch_encoder = true; 393 pipe_config->has_pch_encoder = true;
394 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
392 395
393 /* LPT FDI RX only supports 8bpc. */ 396 /* LPT FDI RX only supports 8bpc. */
394 if (HAS_PCH_LPT(dev_priv)) { 397 if (HAS_PCH_LPT(dev_priv)) {
@@ -849,12 +852,6 @@ out:
849 return status; 852 return status;
850} 853}
851 854
852static void intel_crt_destroy(struct drm_connector *connector)
853{
854 drm_connector_cleanup(connector);
855 kfree(connector);
856}
857
858static int intel_crt_get_modes(struct drm_connector *connector) 855static int intel_crt_get_modes(struct drm_connector *connector)
859{ 856{
860 struct drm_device *dev = connector->dev; 857 struct drm_device *dev = connector->dev;
@@ -909,7 +906,7 @@ static const struct drm_connector_funcs intel_crt_connector_funcs = {
909 .fill_modes = drm_helper_probe_single_connector_modes, 906 .fill_modes = drm_helper_probe_single_connector_modes,
910 .late_register = intel_connector_register, 907 .late_register = intel_connector_register,
911 .early_unregister = intel_connector_unregister, 908 .early_unregister = intel_connector_unregister,
912 .destroy = intel_crt_destroy, 909 .destroy = intel_connector_destroy,
913 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 910 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
914 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 911 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
915}; 912};
diff --git a/drivers/gpu/drm/i915/intel_csr.c b/drivers/gpu/drm/i915/intel_csr.c
index d48186e9ddad..a516697bf57d 100644
--- a/drivers/gpu/drm/i915/intel_csr.c
+++ b/drivers/gpu/drm/i915/intel_csr.c
@@ -34,34 +34,38 @@
34 * low-power state and comes back to normal. 34 * low-power state and comes back to normal.
35 */ 35 */
36 36
37#define I915_CSR_ICL "i915/icl_dmc_ver1_07.bin" 37#define GEN12_CSR_MAX_FW_SIZE ICL_CSR_MAX_FW_SIZE
38MODULE_FIRMWARE(I915_CSR_ICL);
39#define ICL_CSR_VERSION_REQUIRED CSR_VERSION(1, 7)
40 38
41#define I915_CSR_GLK "i915/glk_dmc_ver1_04.bin" 39#define ICL_CSR_PATH "i915/icl_dmc_ver1_07.bin"
42MODULE_FIRMWARE(I915_CSR_GLK); 40#define ICL_CSR_VERSION_REQUIRED CSR_VERSION(1, 7)
43#define GLK_CSR_VERSION_REQUIRED CSR_VERSION(1, 4) 41#define ICL_CSR_MAX_FW_SIZE 0x6000
42MODULE_FIRMWARE(ICL_CSR_PATH);
44 43
45#define I915_CSR_CNL "i915/cnl_dmc_ver1_07.bin" 44#define CNL_CSR_PATH "i915/cnl_dmc_ver1_07.bin"
46MODULE_FIRMWARE(I915_CSR_CNL);
47#define CNL_CSR_VERSION_REQUIRED CSR_VERSION(1, 7) 45#define CNL_CSR_VERSION_REQUIRED CSR_VERSION(1, 7)
46#define CNL_CSR_MAX_FW_SIZE GLK_CSR_MAX_FW_SIZE
47MODULE_FIRMWARE(CNL_CSR_PATH);
48
49#define GLK_CSR_PATH "i915/glk_dmc_ver1_04.bin"
50#define GLK_CSR_VERSION_REQUIRED CSR_VERSION(1, 4)
51#define GLK_CSR_MAX_FW_SIZE 0x4000
52MODULE_FIRMWARE(GLK_CSR_PATH);
48 53
49#define I915_CSR_KBL "i915/kbl_dmc_ver1_04.bin" 54#define KBL_CSR_PATH "i915/kbl_dmc_ver1_04.bin"
50MODULE_FIRMWARE(I915_CSR_KBL);
51#define KBL_CSR_VERSION_REQUIRED CSR_VERSION(1, 4) 55#define KBL_CSR_VERSION_REQUIRED CSR_VERSION(1, 4)
56#define KBL_CSR_MAX_FW_SIZE BXT_CSR_MAX_FW_SIZE
57MODULE_FIRMWARE(KBL_CSR_PATH);
52 58
53#define I915_CSR_SKL "i915/skl_dmc_ver1_27.bin" 59#define SKL_CSR_PATH "i915/skl_dmc_ver1_27.bin"
54MODULE_FIRMWARE(I915_CSR_SKL);
55#define SKL_CSR_VERSION_REQUIRED CSR_VERSION(1, 27) 60#define SKL_CSR_VERSION_REQUIRED CSR_VERSION(1, 27)
61#define SKL_CSR_MAX_FW_SIZE BXT_CSR_MAX_FW_SIZE
62MODULE_FIRMWARE(SKL_CSR_PATH);
56 63
57#define I915_CSR_BXT "i915/bxt_dmc_ver1_07.bin" 64#define BXT_CSR_PATH "i915/bxt_dmc_ver1_07.bin"
58MODULE_FIRMWARE(I915_CSR_BXT);
59#define BXT_CSR_VERSION_REQUIRED CSR_VERSION(1, 7) 65#define BXT_CSR_VERSION_REQUIRED CSR_VERSION(1, 7)
60
61
62#define BXT_CSR_MAX_FW_SIZE 0x3000 66#define BXT_CSR_MAX_FW_SIZE 0x3000
63#define GLK_CSR_MAX_FW_SIZE 0x4000 67MODULE_FIRMWARE(BXT_CSR_PATH);
64#define ICL_CSR_MAX_FW_SIZE 0x6000 68
65#define CSR_DEFAULT_FW_OFFSET 0xFFFFFFFF 69#define CSR_DEFAULT_FW_OFFSET 0xFFFFFFFF
66 70
67struct intel_css_header { 71struct intel_css_header {
@@ -190,6 +194,12 @@ static const struct stepping_info bxt_stepping_info[] = {
190 {'B', '0'}, {'B', '1'}, {'B', '2'} 194 {'B', '0'}, {'B', '1'}, {'B', '2'}
191}; 195};
192 196
197static const struct stepping_info icl_stepping_info[] = {
198 {'A', '0'}, {'A', '1'}, {'A', '2'},
199 {'B', '0'}, {'B', '2'},
200 {'C', '0'}
201};
202
193static const struct stepping_info no_stepping_info = { '*', '*' }; 203static const struct stepping_info no_stepping_info = { '*', '*' };
194 204
195static const struct stepping_info * 205static const struct stepping_info *
@@ -198,7 +208,10 @@ intel_get_stepping_info(struct drm_i915_private *dev_priv)
198 const struct stepping_info *si; 208 const struct stepping_info *si;
199 unsigned int size; 209 unsigned int size;
200 210
201 if (IS_SKYLAKE(dev_priv)) { 211 if (IS_ICELAKE(dev_priv)) {
212 size = ARRAY_SIZE(icl_stepping_info);
213 si = icl_stepping_info;
214 } else if (IS_SKYLAKE(dev_priv)) {
202 size = ARRAY_SIZE(skl_stepping_info); 215 size = ARRAY_SIZE(skl_stepping_info);
203 si = skl_stepping_info; 216 si = skl_stepping_info;
204 } else if (IS_BROXTON(dev_priv)) { 217 } else if (IS_BROXTON(dev_priv)) {
@@ -285,10 +298,8 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
285 struct intel_csr *csr = &dev_priv->csr; 298 struct intel_csr *csr = &dev_priv->csr;
286 const struct stepping_info *si = intel_get_stepping_info(dev_priv); 299 const struct stepping_info *si = intel_get_stepping_info(dev_priv);
287 uint32_t dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes; 300 uint32_t dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes;
288 uint32_t max_fw_size = 0;
289 uint32_t i; 301 uint32_t i;
290 uint32_t *dmc_payload; 302 uint32_t *dmc_payload;
291 uint32_t required_version;
292 303
293 if (!fw) 304 if (!fw)
294 return NULL; 305 return NULL;
@@ -303,38 +314,19 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
303 return NULL; 314 return NULL;
304 } 315 }
305 316
306 csr->version = css_header->version; 317 if (csr->required_version &&
307 318 css_header->version != csr->required_version) {
308 if (csr->fw_path == i915_modparams.dmc_firmware_path) {
309 /* Bypass version check for firmware override. */
310 required_version = csr->version;
311 } else if (IS_ICELAKE(dev_priv)) {
312 required_version = ICL_CSR_VERSION_REQUIRED;
313 } else if (IS_CANNONLAKE(dev_priv)) {
314 required_version = CNL_CSR_VERSION_REQUIRED;
315 } else if (IS_GEMINILAKE(dev_priv)) {
316 required_version = GLK_CSR_VERSION_REQUIRED;
317 } else if (IS_KABYLAKE(dev_priv) || IS_COFFEELAKE(dev_priv)) {
318 required_version = KBL_CSR_VERSION_REQUIRED;
319 } else if (IS_SKYLAKE(dev_priv)) {
320 required_version = SKL_CSR_VERSION_REQUIRED;
321 } else if (IS_BROXTON(dev_priv)) {
322 required_version = BXT_CSR_VERSION_REQUIRED;
323 } else {
324 MISSING_CASE(INTEL_REVID(dev_priv));
325 required_version = 0;
326 }
327
328 if (csr->version != required_version) {
329 DRM_INFO("Refusing to load DMC firmware v%u.%u," 319 DRM_INFO("Refusing to load DMC firmware v%u.%u,"
330 " please use v%u.%u\n", 320 " please use v%u.%u\n",
331 CSR_VERSION_MAJOR(csr->version), 321 CSR_VERSION_MAJOR(css_header->version),
332 CSR_VERSION_MINOR(csr->version), 322 CSR_VERSION_MINOR(css_header->version),
333 CSR_VERSION_MAJOR(required_version), 323 CSR_VERSION_MAJOR(csr->required_version),
334 CSR_VERSION_MINOR(required_version)); 324 CSR_VERSION_MINOR(csr->required_version));
335 return NULL; 325 return NULL;
336 } 326 }
337 327
328 csr->version = css_header->version;
329
338 readcount += sizeof(struct intel_css_header); 330 readcount += sizeof(struct intel_css_header);
339 331
340 /* Extract Package Header information*/ 332 /* Extract Package Header information*/
@@ -402,15 +394,7 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
402 394
403 /* fw_size is in dwords, so multiplied by 4 to convert into bytes. */ 395 /* fw_size is in dwords, so multiplied by 4 to convert into bytes. */
404 nbytes = dmc_header->fw_size * 4; 396 nbytes = dmc_header->fw_size * 4;
405 if (INTEL_GEN(dev_priv) >= 11) 397 if (nbytes > csr->max_fw_size) {
406 max_fw_size = ICL_CSR_MAX_FW_SIZE;
407 else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv))
408 max_fw_size = GLK_CSR_MAX_FW_SIZE;
409 else if (IS_GEN9(dev_priv))
410 max_fw_size = BXT_CSR_MAX_FW_SIZE;
411 else
412 MISSING_CASE(INTEL_REVID(dev_priv));
413 if (nbytes > max_fw_size) {
414 DRM_ERROR("DMC FW too big (%u bytes)\n", nbytes); 398 DRM_ERROR("DMC FW too big (%u bytes)\n", nbytes);
415 return NULL; 399 return NULL;
416 } 400 }
@@ -475,27 +459,57 @@ void intel_csr_ucode_init(struct drm_i915_private *dev_priv)
475 if (!HAS_CSR(dev_priv)) 459 if (!HAS_CSR(dev_priv))
476 return; 460 return;
477 461
478 if (i915_modparams.dmc_firmware_path)
479 csr->fw_path = i915_modparams.dmc_firmware_path;
480 else if (IS_ICELAKE(dev_priv))
481 csr->fw_path = I915_CSR_ICL;
482 else if (IS_CANNONLAKE(dev_priv))
483 csr->fw_path = I915_CSR_CNL;
484 else if (IS_GEMINILAKE(dev_priv))
485 csr->fw_path = I915_CSR_GLK;
486 else if (IS_KABYLAKE(dev_priv) || IS_COFFEELAKE(dev_priv))
487 csr->fw_path = I915_CSR_KBL;
488 else if (IS_SKYLAKE(dev_priv))
489 csr->fw_path = I915_CSR_SKL;
490 else if (IS_BROXTON(dev_priv))
491 csr->fw_path = I915_CSR_BXT;
492
493 /* 462 /*
494 * Obtain a runtime pm reference, until CSR is loaded, 463 * Obtain a runtime pm reference, until CSR is loaded, to avoid entering
495 * to avoid entering runtime-suspend. 464 * runtime-suspend.
465 *
466 * On error, we return with the rpm wakeref held to prevent runtime
467 * suspend as runtime suspend *requires* a working CSR for whatever
468 * reason.
496 */ 469 */
497 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT); 470 intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
498 471
472 if (INTEL_GEN(dev_priv) >= 12) {
473 /* Allow to load fw via parameter using the last known size */
474 csr->max_fw_size = GEN12_CSR_MAX_FW_SIZE;
475 } else if (IS_ICELAKE(dev_priv)) {
476 csr->fw_path = ICL_CSR_PATH;
477 csr->required_version = ICL_CSR_VERSION_REQUIRED;
478 csr->max_fw_size = ICL_CSR_MAX_FW_SIZE;
479 } else if (IS_CANNONLAKE(dev_priv)) {
480 csr->fw_path = CNL_CSR_PATH;
481 csr->required_version = CNL_CSR_VERSION_REQUIRED;
482 csr->max_fw_size = CNL_CSR_MAX_FW_SIZE;
483 } else if (IS_GEMINILAKE(dev_priv)) {
484 csr->fw_path = GLK_CSR_PATH;
485 csr->required_version = GLK_CSR_VERSION_REQUIRED;
486 csr->max_fw_size = GLK_CSR_MAX_FW_SIZE;
487 } else if (IS_KABYLAKE(dev_priv) || IS_COFFEELAKE(dev_priv)) {
488 csr->fw_path = KBL_CSR_PATH;
489 csr->required_version = KBL_CSR_VERSION_REQUIRED;
490 csr->max_fw_size = KBL_CSR_MAX_FW_SIZE;
491 } else if (IS_SKYLAKE(dev_priv)) {
492 csr->fw_path = SKL_CSR_PATH;
493 csr->required_version = SKL_CSR_VERSION_REQUIRED;
494 csr->max_fw_size = SKL_CSR_MAX_FW_SIZE;
495 } else if (IS_BROXTON(dev_priv)) {
496 csr->fw_path = BXT_CSR_PATH;
497 csr->required_version = BXT_CSR_VERSION_REQUIRED;
498 csr->max_fw_size = BXT_CSR_MAX_FW_SIZE;
499 }
500
501 if (i915_modparams.dmc_firmware_path) {
502 if (strlen(i915_modparams.dmc_firmware_path) == 0) {
503 csr->fw_path = NULL;
504 DRM_INFO("Disabling CSR firmware and runtime PM\n");
505 return;
506 }
507
508 csr->fw_path = i915_modparams.dmc_firmware_path;
509 /* Bypass version check for firmware override. */
510 csr->required_version = 0;
511 }
512
499 if (csr->fw_path == NULL) { 513 if (csr->fw_path == NULL) {
500 DRM_DEBUG_KMS("No known CSR firmware for platform, disabling runtime PM\n"); 514 DRM_DEBUG_KMS("No known CSR firmware for platform, disabling runtime PM\n");
501 WARN_ON(!IS_ALPHA_SUPPORT(INTEL_INFO(dev_priv))); 515 WARN_ON(!IS_ALPHA_SUPPORT(INTEL_INFO(dev_priv)));
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 5186cd7075f9..ad11540ac436 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -642,7 +642,7 @@ skl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries)
642static const struct ddi_buf_trans * 642static const struct ddi_buf_trans *
643kbl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries) 643kbl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries)
644{ 644{
645 if (IS_KBL_ULX(dev_priv)) { 645 if (IS_KBL_ULX(dev_priv) || IS_AML_ULX(dev_priv)) {
646 *n_entries = ARRAY_SIZE(kbl_y_ddi_translations_dp); 646 *n_entries = ARRAY_SIZE(kbl_y_ddi_translations_dp);
647 return kbl_y_ddi_translations_dp; 647 return kbl_y_ddi_translations_dp;
648 } else if (IS_KBL_ULT(dev_priv) || IS_CFL_ULT(dev_priv)) { 648 } else if (IS_KBL_ULT(dev_priv) || IS_CFL_ULT(dev_priv)) {
@@ -658,7 +658,7 @@ static const struct ddi_buf_trans *
658skl_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries) 658skl_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries)
659{ 659{
660 if (dev_priv->vbt.edp.low_vswing) { 660 if (dev_priv->vbt.edp.low_vswing) {
661 if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv)) { 661 if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv) || IS_AML_ULX(dev_priv)) {
662 *n_entries = ARRAY_SIZE(skl_y_ddi_translations_edp); 662 *n_entries = ARRAY_SIZE(skl_y_ddi_translations_edp);
663 return skl_y_ddi_translations_edp; 663 return skl_y_ddi_translations_edp;
664 } else if (IS_SKL_ULT(dev_priv) || IS_KBL_ULT(dev_priv) || 664 } else if (IS_SKL_ULT(dev_priv) || IS_KBL_ULT(dev_priv) ||
@@ -680,7 +680,7 @@ skl_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries)
680static const struct ddi_buf_trans * 680static const struct ddi_buf_trans *
681skl_get_buf_trans_hdmi(struct drm_i915_private *dev_priv, int *n_entries) 681skl_get_buf_trans_hdmi(struct drm_i915_private *dev_priv, int *n_entries)
682{ 682{
683 if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv)) { 683 if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv) || IS_AML_ULX(dev_priv)) {
684 *n_entries = ARRAY_SIZE(skl_y_ddi_translations_hdmi); 684 *n_entries = ARRAY_SIZE(skl_y_ddi_translations_hdmi);
685 return skl_y_ddi_translations_hdmi; 685 return skl_y_ddi_translations_hdmi;
686 } else { 686 } else {
@@ -1060,10 +1060,10 @@ static uint32_t hsw_pll_to_ddi_pll_sel(const struct intel_shared_dpll *pll)
1060} 1060}
1061 1061
1062static uint32_t icl_pll_to_ddi_pll_sel(struct intel_encoder *encoder, 1062static uint32_t icl_pll_to_ddi_pll_sel(struct intel_encoder *encoder,
1063 const struct intel_shared_dpll *pll) 1063 const struct intel_crtc_state *crtc_state)
1064{ 1064{
1065 struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); 1065 const struct intel_shared_dpll *pll = crtc_state->shared_dpll;
1066 int clock = crtc->config->port_clock; 1066 int clock = crtc_state->port_clock;
1067 const enum intel_dpll_id id = pll->info->id; 1067 const enum intel_dpll_id id = pll->info->id;
1068 1068
1069 switch (id) { 1069 switch (id) {
@@ -1517,7 +1517,7 @@ static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)
1517 else 1517 else
1518 dotclock = pipe_config->port_clock; 1518 dotclock = pipe_config->port_clock;
1519 1519
1520 if (pipe_config->ycbcr420) 1520 if (pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
1521 dotclock *= 2; 1521 dotclock *= 2;
1522 1522
1523 if (pipe_config->pixel_multiplier) 1523 if (pipe_config->pixel_multiplier)
@@ -1737,16 +1737,16 @@ static void intel_ddi_clock_get(struct intel_encoder *encoder,
1737{ 1737{
1738 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1738 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1739 1739
1740 if (INTEL_GEN(dev_priv) <= 8) 1740 if (IS_ICELAKE(dev_priv))
1741 hsw_ddi_clock_get(encoder, pipe_config); 1741 icl_ddi_clock_get(encoder, pipe_config);
1742 else if (IS_GEN9_BC(dev_priv))
1743 skl_ddi_clock_get(encoder, pipe_config);
1744 else if (IS_GEN9_LP(dev_priv))
1745 bxt_ddi_clock_get(encoder, pipe_config);
1746 else if (IS_CANNONLAKE(dev_priv)) 1742 else if (IS_CANNONLAKE(dev_priv))
1747 cnl_ddi_clock_get(encoder, pipe_config); 1743 cnl_ddi_clock_get(encoder, pipe_config);
1748 else if (IS_ICELAKE(dev_priv)) 1744 else if (IS_GEN9_LP(dev_priv))
1749 icl_ddi_clock_get(encoder, pipe_config); 1745 bxt_ddi_clock_get(encoder, pipe_config);
1746 else if (IS_GEN9_BC(dev_priv))
1747 skl_ddi_clock_get(encoder, pipe_config);
1748 else if (INTEL_GEN(dev_priv) <= 8)
1749 hsw_ddi_clock_get(encoder, pipe_config);
1750} 1750}
1751 1751
1752void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state) 1752void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state)
@@ -1784,6 +1784,13 @@ void intel_ddi_set_pipe_settings(const struct intel_crtc_state *crtc_state)
1784 break; 1784 break;
1785 } 1785 }
1786 1786
1787 /*
1788 * As per DP 1.2 spec section 2.3.4.3 while sending
1789 * YCBCR 444 signals we should program MSA MISC1/0 fields with
1790 * colorspace information. The output colorspace encoding is BT601.
1791 */
1792 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444)
1793 temp |= TRANS_MSA_SAMPLING_444 | TRANS_MSA_CLRSP_YCBCR;
1787 I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp); 1794 I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
1788} 1795}
1789 1796
@@ -1998,24 +2005,24 @@ out:
1998 return ret; 2005 return ret;
1999} 2006}
2000 2007
2001bool intel_ddi_get_hw_state(struct intel_encoder *encoder, 2008static void intel_ddi_get_encoder_pipes(struct intel_encoder *encoder,
2002 enum pipe *pipe) 2009 u8 *pipe_mask, bool *is_dp_mst)
2003{ 2010{
2004 struct drm_device *dev = encoder->base.dev; 2011 struct drm_device *dev = encoder->base.dev;
2005 struct drm_i915_private *dev_priv = to_i915(dev); 2012 struct drm_i915_private *dev_priv = to_i915(dev);
2006 enum port port = encoder->port; 2013 enum port port = encoder->port;
2007 enum pipe p; 2014 enum pipe p;
2008 u32 tmp; 2015 u32 tmp;
2009 bool ret; 2016 u8 mst_pipe_mask;
2017
2018 *pipe_mask = 0;
2019 *is_dp_mst = false;
2010 2020
2011 if (!intel_display_power_get_if_enabled(dev_priv, 2021 if (!intel_display_power_get_if_enabled(dev_priv,
2012 encoder->power_domain)) 2022 encoder->power_domain))
2013 return false; 2023 return;
2014
2015 ret = false;
2016 2024
2017 tmp = I915_READ(DDI_BUF_CTL(port)); 2025 tmp = I915_READ(DDI_BUF_CTL(port));
2018
2019 if (!(tmp & DDI_BUF_CTL_ENABLE)) 2026 if (!(tmp & DDI_BUF_CTL_ENABLE))
2020 goto out; 2027 goto out;
2021 2028
@@ -2023,44 +2030,58 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
2023 tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP)); 2030 tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
2024 2031
2025 switch (tmp & TRANS_DDI_EDP_INPUT_MASK) { 2032 switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
2033 default:
2034 MISSING_CASE(tmp & TRANS_DDI_EDP_INPUT_MASK);
2035 /* fallthrough */
2026 case TRANS_DDI_EDP_INPUT_A_ON: 2036 case TRANS_DDI_EDP_INPUT_A_ON:
2027 case TRANS_DDI_EDP_INPUT_A_ONOFF: 2037 case TRANS_DDI_EDP_INPUT_A_ONOFF:
2028 *pipe = PIPE_A; 2038 *pipe_mask = BIT(PIPE_A);
2029 break; 2039 break;
2030 case TRANS_DDI_EDP_INPUT_B_ONOFF: 2040 case TRANS_DDI_EDP_INPUT_B_ONOFF:
2031 *pipe = PIPE_B; 2041 *pipe_mask = BIT(PIPE_B);
2032 break; 2042 break;
2033 case TRANS_DDI_EDP_INPUT_C_ONOFF: 2043 case TRANS_DDI_EDP_INPUT_C_ONOFF:
2034 *pipe = PIPE_C; 2044 *pipe_mask = BIT(PIPE_C);
2035 break; 2045 break;
2036 } 2046 }
2037 2047
2038 ret = true;
2039
2040 goto out; 2048 goto out;
2041 } 2049 }
2042 2050
2051 mst_pipe_mask = 0;
2043 for_each_pipe(dev_priv, p) { 2052 for_each_pipe(dev_priv, p) {
2044 enum transcoder cpu_transcoder = (enum transcoder) p; 2053 enum transcoder cpu_transcoder = (enum transcoder)p;
2045 2054
2046 tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)); 2055 tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
2047 2056
2048 if ((tmp & TRANS_DDI_PORT_MASK) == TRANS_DDI_SELECT_PORT(port)) { 2057 if ((tmp & TRANS_DDI_PORT_MASK) != TRANS_DDI_SELECT_PORT(port))
2049 if ((tmp & TRANS_DDI_MODE_SELECT_MASK) == 2058 continue;
2050 TRANS_DDI_MODE_SELECT_DP_MST)
2051 goto out;
2052 2059
2053 *pipe = p; 2060 if ((tmp & TRANS_DDI_MODE_SELECT_MASK) ==
2054 ret = true; 2061 TRANS_DDI_MODE_SELECT_DP_MST)
2062 mst_pipe_mask |= BIT(p);
2055 2063
2056 goto out; 2064 *pipe_mask |= BIT(p);
2057 }
2058 } 2065 }
2059 2066
2060 DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port)); 2067 if (!*pipe_mask)
2068 DRM_DEBUG_KMS("No pipe for ddi port %c found\n",
2069 port_name(port));
2070
2071 if (!mst_pipe_mask && hweight8(*pipe_mask) > 1) {
2072 DRM_DEBUG_KMS("Multiple pipes for non DP-MST port %c (pipe_mask %02x)\n",
2073 port_name(port), *pipe_mask);
2074 *pipe_mask = BIT(ffs(*pipe_mask) - 1);
2075 }
2076
2077 if (mst_pipe_mask && mst_pipe_mask != *pipe_mask)
2078 DRM_DEBUG_KMS("Conflicting MST and non-MST encoders for port %c (pipe_mask %02x mst_pipe_mask %02x)\n",
2079 port_name(port), *pipe_mask, mst_pipe_mask);
2080 else
2081 *is_dp_mst = mst_pipe_mask;
2061 2082
2062out: 2083out:
2063 if (ret && IS_GEN9_LP(dev_priv)) { 2084 if (*pipe_mask && IS_GEN9_LP(dev_priv)) {
2064 tmp = I915_READ(BXT_PHY_CTL(port)); 2085 tmp = I915_READ(BXT_PHY_CTL(port));
2065 if ((tmp & (BXT_PHY_CMNLANE_POWERDOWN_ACK | 2086 if ((tmp & (BXT_PHY_CMNLANE_POWERDOWN_ACK |
2066 BXT_PHY_LANE_POWERDOWN_ACK | 2087 BXT_PHY_LANE_POWERDOWN_ACK |
@@ -2070,12 +2091,26 @@ out:
2070 } 2091 }
2071 2092
2072 intel_display_power_put(dev_priv, encoder->power_domain); 2093 intel_display_power_put(dev_priv, encoder->power_domain);
2094}
2073 2095
2074 return ret; 2096bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
2097 enum pipe *pipe)
2098{
2099 u8 pipe_mask;
2100 bool is_mst;
2101
2102 intel_ddi_get_encoder_pipes(encoder, &pipe_mask, &is_mst);
2103
2104 if (is_mst || !pipe_mask)
2105 return false;
2106
2107 *pipe = ffs(pipe_mask) - 1;
2108
2109 return true;
2075} 2110}
2076 2111
2077static inline enum intel_display_power_domain 2112static inline enum intel_display_power_domain
2078intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp) 2113intel_ddi_main_link_aux_domain(struct intel_digital_port *dig_port)
2079{ 2114{
2080 /* CNL+ HW requires corresponding AUX IOs to be powered up for PSR with 2115 /* CNL+ HW requires corresponding AUX IOs to be powered up for PSR with
2081 * DC states enabled at the same time, while for driver initiated AUX 2116 * DC states enabled at the same time, while for driver initiated AUX
@@ -2089,13 +2124,14 @@ intel_ddi_main_link_aux_domain(struct intel_dp *intel_dp)
2089 * Note that PSR is enabled only on Port A even though this function 2124 * Note that PSR is enabled only on Port A even though this function
2090 * returns the correct domain for other ports too. 2125 * returns the correct domain for other ports too.
2091 */ 2126 */
2092 return intel_dp->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A : 2127 return dig_port->aux_ch == AUX_CH_A ? POWER_DOMAIN_AUX_IO_A :
2093 intel_dp->aux_power_domain; 2128 intel_aux_power_domain(dig_port);
2094} 2129}
2095 2130
2096static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder, 2131static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
2097 struct intel_crtc_state *crtc_state) 2132 struct intel_crtc_state *crtc_state)
2098{ 2133{
2134 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2099 struct intel_digital_port *dig_port; 2135 struct intel_digital_port *dig_port;
2100 u64 domains; 2136 u64 domains;
2101 2137
@@ -2110,12 +2146,13 @@ static u64 intel_ddi_get_power_domains(struct intel_encoder *encoder,
2110 dig_port = enc_to_dig_port(&encoder->base); 2146 dig_port = enc_to_dig_port(&encoder->base);
2111 domains = BIT_ULL(dig_port->ddi_io_power_domain); 2147 domains = BIT_ULL(dig_port->ddi_io_power_domain);
2112 2148
2113 /* AUX power is only needed for (e)DP mode, not for HDMI. */ 2149 /*
2114 if (intel_crtc_has_dp_encoder(crtc_state)) { 2150 * AUX power is only needed for (e)DP mode, and for HDMI mode on TC
2115 struct intel_dp *intel_dp = &dig_port->dp; 2151 * ports.
2116 2152 */
2117 domains |= BIT_ULL(intel_ddi_main_link_aux_domain(intel_dp)); 2153 if (intel_crtc_has_dp_encoder(crtc_state) ||
2118 } 2154 intel_port_is_tc(dev_priv, encoder->port))
2155 domains |= BIT_ULL(intel_ddi_main_link_aux_domain(dig_port));
2119 2156
2120 return domains; 2157 return domains;
2121} 2158}
@@ -2813,12 +2850,59 @@ void icl_unmap_plls_to_ports(struct drm_crtc *crtc,
2813 } 2850 }
2814} 2851}
2815 2852
2853void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder)
2854{
2855 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2856 u32 val;
2857 enum port port = encoder->port;
2858 bool clk_enabled;
2859
2860 /*
2861 * In case of DP MST, we sanitize the primary encoder only, not the
2862 * virtual ones.
2863 */
2864 if (encoder->type == INTEL_OUTPUT_DP_MST)
2865 return;
2866
2867 val = I915_READ(DPCLKA_CFGCR0_ICL);
2868 clk_enabled = !(val & icl_dpclka_cfgcr0_clk_off(dev_priv, port));
2869
2870 if (!encoder->base.crtc && intel_encoder_is_dp(encoder)) {
2871 u8 pipe_mask;
2872 bool is_mst;
2873
2874 intel_ddi_get_encoder_pipes(encoder, &pipe_mask, &is_mst);
2875 /*
2876 * In the unlikely case that BIOS enables DP in MST mode, just
2877 * warn since our MST HW readout is incomplete.
2878 */
2879 if (WARN_ON(is_mst))
2880 return;
2881 }
2882
2883 if (clk_enabled == !!encoder->base.crtc)
2884 return;
2885
2886 /*
2887 * Punt on the case now where clock is disabled, but the encoder is
2888 * enabled, something else is really broken then.
2889 */
2890 if (WARN_ON(!clk_enabled))
2891 return;
2892
2893 DRM_NOTE("Port %c is disabled but it has a mapped PLL, unmap it\n",
2894 port_name(port));
2895 val |= icl_dpclka_cfgcr0_clk_off(dev_priv, port);
2896 I915_WRITE(DPCLKA_CFGCR0_ICL, val);
2897}
2898
2816static void intel_ddi_clk_select(struct intel_encoder *encoder, 2899static void intel_ddi_clk_select(struct intel_encoder *encoder,
2817 const struct intel_shared_dpll *pll) 2900 const struct intel_crtc_state *crtc_state)
2818{ 2901{
2819 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2902 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2820 enum port port = encoder->port; 2903 enum port port = encoder->port;
2821 uint32_t val; 2904 uint32_t val;
2905 const struct intel_shared_dpll *pll = crtc_state->shared_dpll;
2822 2906
2823 if (WARN_ON(!pll)) 2907 if (WARN_ON(!pll))
2824 return; 2908 return;
@@ -2828,7 +2912,7 @@ static void intel_ddi_clk_select(struct intel_encoder *encoder,
2828 if (IS_ICELAKE(dev_priv)) { 2912 if (IS_ICELAKE(dev_priv)) {
2829 if (!intel_port_is_combophy(dev_priv, port)) 2913 if (!intel_port_is_combophy(dev_priv, port))
2830 I915_WRITE(DDI_CLK_SEL(port), 2914 I915_WRITE(DDI_CLK_SEL(port),
2831 icl_pll_to_ddi_pll_sel(encoder, pll)); 2915 icl_pll_to_ddi_pll_sel(encoder, crtc_state));
2832 } else if (IS_CANNONLAKE(dev_priv)) { 2916 } else if (IS_CANNONLAKE(dev_priv)) {
2833 /* Configure DPCLKA_CFGCR0 to map the DPLL to the DDI. */ 2917 /* Configure DPCLKA_CFGCR0 to map the DPLL to the DDI. */
2834 val = I915_READ(DPCLKA_CFGCR0); 2918 val = I915_READ(DPCLKA_CFGCR0);
@@ -2881,6 +2965,137 @@ static void intel_ddi_clk_disable(struct intel_encoder *encoder)
2881 } 2965 }
2882} 2966}
2883 2967
2968static void icl_enable_phy_clock_gating(struct intel_digital_port *dig_port)
2969{
2970 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
2971 enum port port = dig_port->base.port;
2972 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
2973 i915_reg_t mg_regs[2] = { MG_DP_MODE(port, 0), MG_DP_MODE(port, 1) };
2974 u32 val;
2975 int i;
2976
2977 if (tc_port == PORT_TC_NONE)
2978 return;
2979
2980 for (i = 0; i < ARRAY_SIZE(mg_regs); i++) {
2981 val = I915_READ(mg_regs[i]);
2982 val |= MG_DP_MODE_CFG_TR2PWR_GATING |
2983 MG_DP_MODE_CFG_TRPWR_GATING |
2984 MG_DP_MODE_CFG_CLNPWR_GATING |
2985 MG_DP_MODE_CFG_DIGPWR_GATING |
2986 MG_DP_MODE_CFG_GAONPWR_GATING;
2987 I915_WRITE(mg_regs[i], val);
2988 }
2989
2990 val = I915_READ(MG_MISC_SUS0(tc_port));
2991 val |= MG_MISC_SUS0_SUSCLK_DYNCLKGATE_MODE(3) |
2992 MG_MISC_SUS0_CFG_TR2PWR_GATING |
2993 MG_MISC_SUS0_CFG_CL2PWR_GATING |
2994 MG_MISC_SUS0_CFG_GAONPWR_GATING |
2995 MG_MISC_SUS0_CFG_TRPWR_GATING |
2996 MG_MISC_SUS0_CFG_CL1PWR_GATING |
2997 MG_MISC_SUS0_CFG_DGPWR_GATING;
2998 I915_WRITE(MG_MISC_SUS0(tc_port), val);
2999}
3000
3001static void icl_disable_phy_clock_gating(struct intel_digital_port *dig_port)
3002{
3003 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
3004 enum port port = dig_port->base.port;
3005 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
3006 i915_reg_t mg_regs[2] = { MG_DP_MODE(port, 0), MG_DP_MODE(port, 1) };
3007 u32 val;
3008 int i;
3009
3010 if (tc_port == PORT_TC_NONE)
3011 return;
3012
3013 for (i = 0; i < ARRAY_SIZE(mg_regs); i++) {
3014 val = I915_READ(mg_regs[i]);
3015 val &= ~(MG_DP_MODE_CFG_TR2PWR_GATING |
3016 MG_DP_MODE_CFG_TRPWR_GATING |
3017 MG_DP_MODE_CFG_CLNPWR_GATING |
3018 MG_DP_MODE_CFG_DIGPWR_GATING |
3019 MG_DP_MODE_CFG_GAONPWR_GATING);
3020 I915_WRITE(mg_regs[i], val);
3021 }
3022
3023 val = I915_READ(MG_MISC_SUS0(tc_port));
3024 val &= ~(MG_MISC_SUS0_SUSCLK_DYNCLKGATE_MODE_MASK |
3025 MG_MISC_SUS0_CFG_TR2PWR_GATING |
3026 MG_MISC_SUS0_CFG_CL2PWR_GATING |
3027 MG_MISC_SUS0_CFG_GAONPWR_GATING |
3028 MG_MISC_SUS0_CFG_TRPWR_GATING |
3029 MG_MISC_SUS0_CFG_CL1PWR_GATING |
3030 MG_MISC_SUS0_CFG_DGPWR_GATING);
3031 I915_WRITE(MG_MISC_SUS0(tc_port), val);
3032}
3033
3034static void icl_program_mg_dp_mode(struct intel_digital_port *intel_dig_port)
3035{
3036 struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
3037 enum port port = intel_dig_port->base.port;
3038 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
3039 u32 ln0, ln1, lane_info;
3040
3041 if (tc_port == PORT_TC_NONE || intel_dig_port->tc_type == TC_PORT_TBT)
3042 return;
3043
3044 ln0 = I915_READ(MG_DP_MODE(port, 0));
3045 ln1 = I915_READ(MG_DP_MODE(port, 1));
3046
3047 switch (intel_dig_port->tc_type) {
3048 case TC_PORT_TYPEC:
3049 ln0 &= ~(MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE);
3050 ln1 &= ~(MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE);
3051
3052 lane_info = (I915_READ(PORT_TX_DFLEXDPSP) &
3053 DP_LANE_ASSIGNMENT_MASK(tc_port)) >>
3054 DP_LANE_ASSIGNMENT_SHIFT(tc_port);
3055
3056 switch (lane_info) {
3057 case 0x1:
3058 case 0x4:
3059 break;
3060 case 0x2:
3061 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE;
3062 break;
3063 case 0x3:
3064 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE |
3065 MG_DP_MODE_CFG_DP_X2_MODE;
3066 break;
3067 case 0x8:
3068 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE;
3069 break;
3070 case 0xC:
3071 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE |
3072 MG_DP_MODE_CFG_DP_X2_MODE;
3073 break;
3074 case 0xF:
3075 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE |
3076 MG_DP_MODE_CFG_DP_X2_MODE;
3077 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE |
3078 MG_DP_MODE_CFG_DP_X2_MODE;
3079 break;
3080 default:
3081 MISSING_CASE(lane_info);
3082 }
3083 break;
3084
3085 case TC_PORT_LEGACY:
3086 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE;
3087 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE;
3088 break;
3089
3090 default:
3091 MISSING_CASE(intel_dig_port->tc_type);
3092 return;
3093 }
3094
3095 I915_WRITE(MG_DP_MODE(port, 0), ln0);
3096 I915_WRITE(MG_DP_MODE(port, 1), ln1);
3097}
3098
2884static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder, 3099static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
2885 const struct intel_crtc_state *crtc_state, 3100 const struct intel_crtc_state *crtc_state,
2886 const struct drm_connector_state *conn_state) 3101 const struct drm_connector_state *conn_state)
@@ -2894,19 +3109,16 @@ static void intel_ddi_pre_enable_dp(struct intel_encoder *encoder,
2894 3109
2895 WARN_ON(is_mst && (port == PORT_A || port == PORT_E)); 3110 WARN_ON(is_mst && (port == PORT_A || port == PORT_E));
2896 3111
2897 intel_display_power_get(dev_priv,
2898 intel_ddi_main_link_aux_domain(intel_dp));
2899
2900 intel_dp_set_link_params(intel_dp, crtc_state->port_clock, 3112 intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
2901 crtc_state->lane_count, is_mst); 3113 crtc_state->lane_count, is_mst);
2902 3114
2903 intel_edp_panel_on(intel_dp); 3115 intel_edp_panel_on(intel_dp);
2904 3116
2905 intel_ddi_clk_select(encoder, crtc_state->shared_dpll); 3117 intel_ddi_clk_select(encoder, crtc_state);
2906 3118
2907 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain); 3119 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain);
2908 3120
2909 icl_program_mg_dp_mode(intel_dp); 3121 icl_program_mg_dp_mode(dig_port);
2910 icl_disable_phy_clock_gating(dig_port); 3122 icl_disable_phy_clock_gating(dig_port);
2911 3123
2912 if (IS_ICELAKE(dev_priv)) 3124 if (IS_ICELAKE(dev_priv))
@@ -2944,10 +3156,13 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder,
2944 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); 3156 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
2945 3157
2946 intel_dp_dual_mode_set_tmds_output(intel_hdmi, true); 3158 intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);
2947 intel_ddi_clk_select(encoder, crtc_state->shared_dpll); 3159 intel_ddi_clk_select(encoder, crtc_state);
2948 3160
2949 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain); 3161 intel_display_power_get(dev_priv, dig_port->ddi_io_power_domain);
2950 3162
3163 icl_program_mg_dp_mode(dig_port);
3164 icl_disable_phy_clock_gating(dig_port);
3165
2951 if (IS_ICELAKE(dev_priv)) 3166 if (IS_ICELAKE(dev_priv))
2952 icl_ddi_vswing_sequence(encoder, crtc_state->port_clock, 3167 icl_ddi_vswing_sequence(encoder, crtc_state->port_clock,
2953 level, INTEL_OUTPUT_HDMI); 3168 level, INTEL_OUTPUT_HDMI);
@@ -2958,12 +3173,14 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder,
2958 else 3173 else
2959 intel_prepare_hdmi_ddi_buffers(encoder, level); 3174 intel_prepare_hdmi_ddi_buffers(encoder, level);
2960 3175
3176 icl_enable_phy_clock_gating(dig_port);
3177
2961 if (IS_GEN9_BC(dev_priv)) 3178 if (IS_GEN9_BC(dev_priv))
2962 skl_ddi_set_iboost(encoder, level, INTEL_OUTPUT_HDMI); 3179 skl_ddi_set_iboost(encoder, level, INTEL_OUTPUT_HDMI);
2963 3180
2964 intel_ddi_enable_pipe_clock(crtc_state); 3181 intel_ddi_enable_pipe_clock(crtc_state);
2965 3182
2966 intel_dig_port->set_infoframes(&encoder->base, 3183 intel_dig_port->set_infoframes(encoder,
2967 crtc_state->has_infoframe, 3184 crtc_state->has_infoframe,
2968 crtc_state, conn_state); 3185 crtc_state, conn_state);
2969} 3186}
@@ -2993,10 +3210,22 @@ static void intel_ddi_pre_enable(struct intel_encoder *encoder,
2993 3210
2994 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true); 3211 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
2995 3212
2996 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 3213 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
2997 intel_ddi_pre_enable_hdmi(encoder, crtc_state, conn_state); 3214 intel_ddi_pre_enable_hdmi(encoder, crtc_state, conn_state);
2998 else 3215 } else {
3216 struct intel_lspcon *lspcon =
3217 enc_to_intel_lspcon(&encoder->base);
3218
2999 intel_ddi_pre_enable_dp(encoder, crtc_state, conn_state); 3219 intel_ddi_pre_enable_dp(encoder, crtc_state, conn_state);
3220 if (lspcon->active) {
3221 struct intel_digital_port *dig_port =
3222 enc_to_dig_port(&encoder->base);
3223
3224 dig_port->set_infoframes(encoder,
3225 crtc_state->has_infoframe,
3226 crtc_state, conn_state);
3227 }
3228 }
3000} 3229}
3001 3230
3002static void intel_disable_ddi_buf(struct intel_encoder *encoder) 3231static void intel_disable_ddi_buf(struct intel_encoder *encoder)
@@ -3049,9 +3278,6 @@ static void intel_ddi_post_disable_dp(struct intel_encoder *encoder,
3049 intel_display_power_put(dev_priv, dig_port->ddi_io_power_domain); 3278 intel_display_power_put(dev_priv, dig_port->ddi_io_power_domain);
3050 3279
3051 intel_ddi_clk_disable(encoder); 3280 intel_ddi_clk_disable(encoder);
3052
3053 intel_display_power_put(dev_priv,
3054 intel_ddi_main_link_aux_domain(intel_dp));
3055} 3281}
3056 3282
3057static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder, 3283static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder,
@@ -3062,7 +3288,7 @@ static void intel_ddi_post_disable_hdmi(struct intel_encoder *encoder,
3062 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); 3288 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
3063 struct intel_hdmi *intel_hdmi = &dig_port->hdmi; 3289 struct intel_hdmi *intel_hdmi = &dig_port->hdmi;
3064 3290
3065 dig_port->set_infoframes(&encoder->base, false, 3291 dig_port->set_infoframes(encoder, false,
3066 old_crtc_state, old_conn_state); 3292 old_crtc_state, old_conn_state);
3067 3293
3068 intel_ddi_disable_pipe_clock(old_crtc_state); 3294 intel_ddi_disable_pipe_clock(old_crtc_state);
@@ -3154,6 +3380,26 @@ static void intel_enable_ddi_dp(struct intel_encoder *encoder,
3154 intel_audio_codec_enable(encoder, crtc_state, conn_state); 3380 intel_audio_codec_enable(encoder, crtc_state, conn_state);
3155} 3381}
3156 3382
3383static i915_reg_t
3384gen9_chicken_trans_reg_by_port(struct drm_i915_private *dev_priv,
3385 enum port port)
3386{
3387 static const i915_reg_t regs[] = {
3388 [PORT_A] = CHICKEN_TRANS_EDP,
3389 [PORT_B] = CHICKEN_TRANS_A,
3390 [PORT_C] = CHICKEN_TRANS_B,
3391 [PORT_D] = CHICKEN_TRANS_C,
3392 [PORT_E] = CHICKEN_TRANS_A,
3393 };
3394
3395 WARN_ON(INTEL_GEN(dev_priv) < 9);
3396
3397 if (WARN_ON(port < PORT_A || port > PORT_E))
3398 port = PORT_A;
3399
3400 return regs[port];
3401}
3402
3157static void intel_enable_ddi_hdmi(struct intel_encoder *encoder, 3403static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3158 const struct intel_crtc_state *crtc_state, 3404 const struct intel_crtc_state *crtc_state,
3159 const struct drm_connector_state *conn_state) 3405 const struct drm_connector_state *conn_state)
@@ -3177,17 +3423,10 @@ static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3177 * the bits affect a specific DDI port rather than 3423 * the bits affect a specific DDI port rather than
3178 * a specific transcoder. 3424 * a specific transcoder.
3179 */ 3425 */
3180 static const enum transcoder port_to_transcoder[] = { 3426 i915_reg_t reg = gen9_chicken_trans_reg_by_port(dev_priv, port);
3181 [PORT_A] = TRANSCODER_EDP,
3182 [PORT_B] = TRANSCODER_A,
3183 [PORT_C] = TRANSCODER_B,
3184 [PORT_D] = TRANSCODER_C,
3185 [PORT_E] = TRANSCODER_A,
3186 };
3187 enum transcoder transcoder = port_to_transcoder[port];
3188 u32 val; 3427 u32 val;
3189 3428
3190 val = I915_READ(CHICKEN_TRANS(transcoder)); 3429 val = I915_READ(reg);
3191 3430
3192 if (port == PORT_E) 3431 if (port == PORT_E)
3193 val |= DDIE_TRAINING_OVERRIDE_ENABLE | 3432 val |= DDIE_TRAINING_OVERRIDE_ENABLE |
@@ -3196,8 +3435,8 @@ static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3196 val |= DDI_TRAINING_OVERRIDE_ENABLE | 3435 val |= DDI_TRAINING_OVERRIDE_ENABLE |
3197 DDI_TRAINING_OVERRIDE_VALUE; 3436 DDI_TRAINING_OVERRIDE_VALUE;
3198 3437
3199 I915_WRITE(CHICKEN_TRANS(transcoder), val); 3438 I915_WRITE(reg, val);
3200 POSTING_READ(CHICKEN_TRANS(transcoder)); 3439 POSTING_READ(reg);
3201 3440
3202 udelay(1); 3441 udelay(1);
3203 3442
@@ -3208,7 +3447,7 @@ static void intel_enable_ddi_hdmi(struct intel_encoder *encoder,
3208 val &= ~(DDI_TRAINING_OVERRIDE_ENABLE | 3447 val &= ~(DDI_TRAINING_OVERRIDE_ENABLE |
3209 DDI_TRAINING_OVERRIDE_VALUE); 3448 DDI_TRAINING_OVERRIDE_VALUE);
3210 3449
3211 I915_WRITE(CHICKEN_TRANS(transcoder), val); 3450 I915_WRITE(reg, val);
3212 } 3451 }
3213 3452
3214 /* In HDMI/DVI mode, the port width, and swing/emphasis values 3453 /* In HDMI/DVI mode, the port width, and swing/emphasis values
@@ -3282,13 +3521,76 @@ static void intel_disable_ddi(struct intel_encoder *encoder,
3282 intel_disable_ddi_dp(encoder, old_crtc_state, old_conn_state); 3521 intel_disable_ddi_dp(encoder, old_crtc_state, old_conn_state);
3283} 3522}
3284 3523
3285static void bxt_ddi_pre_pll_enable(struct intel_encoder *encoder, 3524static void intel_ddi_set_fia_lane_count(struct intel_encoder *encoder,
3286 const struct intel_crtc_state *pipe_config, 3525 const struct intel_crtc_state *pipe_config,
3287 const struct drm_connector_state *conn_state) 3526 enum port port)
3527{
3528 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3529 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
3530 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
3531 u32 val = I915_READ(PORT_TX_DFLEXDPMLE1);
3532 bool lane_reversal = dig_port->saved_port_bits & DDI_BUF_PORT_REVERSAL;
3533
3534 val &= ~DFLEXDPMLE1_DPMLETC_MASK(tc_port);
3535 switch (pipe_config->lane_count) {
3536 case 1:
3537 val |= (lane_reversal) ? DFLEXDPMLE1_DPMLETC_ML3(tc_port) :
3538 DFLEXDPMLE1_DPMLETC_ML0(tc_port);
3539 break;
3540 case 2:
3541 val |= (lane_reversal) ? DFLEXDPMLE1_DPMLETC_ML3_2(tc_port) :
3542 DFLEXDPMLE1_DPMLETC_ML1_0(tc_port);
3543 break;
3544 case 4:
3545 val |= DFLEXDPMLE1_DPMLETC_ML3_0(tc_port);
3546 break;
3547 default:
3548 MISSING_CASE(pipe_config->lane_count);
3549 }
3550 I915_WRITE(PORT_TX_DFLEXDPMLE1, val);
3551}
3552
3553static void
3554intel_ddi_pre_pll_enable(struct intel_encoder *encoder,
3555 const struct intel_crtc_state *crtc_state,
3556 const struct drm_connector_state *conn_state)
3557{
3558 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3559 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
3560 enum port port = encoder->port;
3561
3562 if (intel_crtc_has_dp_encoder(crtc_state) ||
3563 intel_port_is_tc(dev_priv, encoder->port))
3564 intel_display_power_get(dev_priv,
3565 intel_ddi_main_link_aux_domain(dig_port));
3566
3567 if (IS_GEN9_LP(dev_priv))
3568 bxt_ddi_phy_set_lane_optim_mask(encoder,
3569 crtc_state->lane_lat_optim_mask);
3570
3571 /*
3572 * Program the lane count for static/dynamic connections on Type-C ports.
3573 * Skip this step for TBT.
3574 */
3575 if (dig_port->tc_type == TC_PORT_UNKNOWN ||
3576 dig_port->tc_type == TC_PORT_TBT)
3577 return;
3578
3579 intel_ddi_set_fia_lane_count(encoder, crtc_state, port);
3580}
3581
3582static void
3583intel_ddi_post_pll_disable(struct intel_encoder *encoder,
3584 const struct intel_crtc_state *crtc_state,
3585 const struct drm_connector_state *conn_state)
3288{ 3586{
3289 uint8_t mask = pipe_config->lane_lat_optim_mask; 3587 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
3588 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
3290 3589
3291 bxt_ddi_phy_set_lane_optim_mask(encoder, mask); 3590 if (intel_crtc_has_dp_encoder(crtc_state) ||
3591 intel_port_is_tc(dev_priv, encoder->port))
3592 intel_display_power_put(dev_priv,
3593 intel_ddi_main_link_aux_domain(dig_port));
3292} 3594}
3293 3595
3294void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp) 3596void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
@@ -3353,10 +3655,10 @@ static bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv,
3353void intel_ddi_compute_min_voltage_level(struct drm_i915_private *dev_priv, 3655void intel_ddi_compute_min_voltage_level(struct drm_i915_private *dev_priv,
3354 struct intel_crtc_state *crtc_state) 3656 struct intel_crtc_state *crtc_state)
3355{ 3657{
3356 if (IS_CANNONLAKE(dev_priv) && crtc_state->port_clock > 594000) 3658 if (IS_ICELAKE(dev_priv) && crtc_state->port_clock > 594000)
3357 crtc_state->min_voltage_level = 2;
3358 else if (IS_ICELAKE(dev_priv) && crtc_state->port_clock > 594000)
3359 crtc_state->min_voltage_level = 1; 3659 crtc_state->min_voltage_level = 1;
3660 else if (IS_CANNONLAKE(dev_priv) && crtc_state->port_clock > 594000)
3661 crtc_state->min_voltage_level = 2;
3360} 3662}
3361 3663
3362void intel_ddi_get_config(struct intel_encoder *encoder, 3664void intel_ddi_get_config(struct intel_encoder *encoder,
@@ -3406,7 +3708,7 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
3406 pipe_config->has_hdmi_sink = true; 3708 pipe_config->has_hdmi_sink = true;
3407 intel_dig_port = enc_to_dig_port(&encoder->base); 3709 intel_dig_port = enc_to_dig_port(&encoder->base);
3408 3710
3409 if (intel_dig_port->infoframe_enabled(&encoder->base, pipe_config)) 3711 if (intel_dig_port->infoframe_enabled(encoder, pipe_config))
3410 pipe_config->has_infoframe = true; 3712 pipe_config->has_infoframe = true;
3411 3713
3412 if ((temp & TRANS_DDI_HDMI_SCRAMBLING_MASK) == 3714 if ((temp & TRANS_DDI_HDMI_SCRAMBLING_MASK) ==
@@ -3767,6 +4069,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3767 struct intel_encoder *intel_encoder; 4069 struct intel_encoder *intel_encoder;
3768 struct drm_encoder *encoder; 4070 struct drm_encoder *encoder;
3769 bool init_hdmi, init_dp, init_lspcon = false; 4071 bool init_hdmi, init_dp, init_lspcon = false;
4072 enum pipe pipe;
3770 4073
3771 4074
3772 init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi || 4075 init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
@@ -3805,8 +4108,8 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3805 intel_encoder->compute_output_type = intel_ddi_compute_output_type; 4108 intel_encoder->compute_output_type = intel_ddi_compute_output_type;
3806 intel_encoder->compute_config = intel_ddi_compute_config; 4109 intel_encoder->compute_config = intel_ddi_compute_config;
3807 intel_encoder->enable = intel_enable_ddi; 4110 intel_encoder->enable = intel_enable_ddi;
3808 if (IS_GEN9_LP(dev_priv)) 4111 intel_encoder->pre_pll_enable = intel_ddi_pre_pll_enable;
3809 intel_encoder->pre_pll_enable = bxt_ddi_pre_pll_enable; 4112 intel_encoder->post_pll_disable = intel_ddi_post_pll_disable;
3810 intel_encoder->pre_enable = intel_ddi_pre_enable; 4113 intel_encoder->pre_enable = intel_ddi_pre_enable;
3811 intel_encoder->disable = intel_disable_ddi; 4114 intel_encoder->disable = intel_disable_ddi;
3812 intel_encoder->post_disable = intel_ddi_post_disable; 4115 intel_encoder->post_disable = intel_ddi_post_disable;
@@ -3817,8 +4120,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3817 intel_encoder->type = INTEL_OUTPUT_DDI; 4120 intel_encoder->type = INTEL_OUTPUT_DDI;
3818 intel_encoder->power_domain = intel_port_to_power_domain(port); 4121 intel_encoder->power_domain = intel_port_to_power_domain(port);
3819 intel_encoder->port = port; 4122 intel_encoder->port = port;
3820 intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
3821 intel_encoder->cloneable = 0; 4123 intel_encoder->cloneable = 0;
4124 for_each_pipe(dev_priv, pipe)
4125 intel_encoder->crtc_mask |= BIT(pipe);
3822 4126
3823 if (INTEL_GEN(dev_priv) >= 11) 4127 if (INTEL_GEN(dev_priv) >= 11)
3824 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) & 4128 intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
@@ -3828,6 +4132,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3828 (DDI_BUF_PORT_REVERSAL | DDI_A_4_LANES); 4132 (DDI_BUF_PORT_REVERSAL | DDI_A_4_LANES);
3829 intel_dig_port->dp.output_reg = INVALID_MMIO_REG; 4133 intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
3830 intel_dig_port->max_lanes = intel_ddi_max_lanes(intel_dig_port); 4134 intel_dig_port->max_lanes = intel_ddi_max_lanes(intel_dig_port);
4135 intel_dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port);
3831 4136
3832 switch (port) { 4137 switch (port) {
3833 case PORT_A: 4138 case PORT_A:
@@ -3858,8 +4163,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3858 MISSING_CASE(port); 4163 MISSING_CASE(port);
3859 } 4164 }
3860 4165
3861 intel_infoframe_init(intel_dig_port);
3862
3863 if (init_dp) { 4166 if (init_dp) {
3864 if (!intel_ddi_init_dp_connector(intel_dig_port)) 4167 if (!intel_ddi_init_dp_connector(intel_dig_port))
3865 goto err; 4168 goto err;
@@ -3888,6 +4191,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
3888 port_name(port)); 4191 port_name(port));
3889 } 4192 }
3890 4193
4194 intel_infoframe_init(intel_dig_port);
3891 return; 4195 return;
3892 4196
3893err: 4197err:
diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c
index 0ef0c6448d53..ceecb5bd5226 100644
--- a/drivers/gpu/drm/i915/intel_device_info.c
+++ b/drivers/gpu/drm/i915/intel_device_info.c
@@ -474,7 +474,7 @@ static void broadwell_sseu_info_init(struct drm_i915_private *dev_priv)
474 u8 eu_disabled_mask; 474 u8 eu_disabled_mask;
475 u32 n_disabled; 475 u32 n_disabled;
476 476
477 if (!(sseu->subslice_mask[ss] & BIT(ss))) 477 if (!(sseu->subslice_mask[s] & BIT(ss)))
478 /* skip disabled subslice */ 478 /* skip disabled subslice */
479 continue; 479 continue;
480 480
@@ -744,27 +744,30 @@ void intel_device_info_runtime_init(struct intel_device_info *info)
744 if (INTEL_GEN(dev_priv) >= 10) { 744 if (INTEL_GEN(dev_priv) >= 10) {
745 for_each_pipe(dev_priv, pipe) 745 for_each_pipe(dev_priv, pipe)
746 info->num_scalers[pipe] = 2; 746 info->num_scalers[pipe] = 2;
747 } else if (INTEL_GEN(dev_priv) == 9) { 747 } else if (IS_GEN9(dev_priv)) {
748 info->num_scalers[PIPE_A] = 2; 748 info->num_scalers[PIPE_A] = 2;
749 info->num_scalers[PIPE_B] = 2; 749 info->num_scalers[PIPE_B] = 2;
750 info->num_scalers[PIPE_C] = 1; 750 info->num_scalers[PIPE_C] = 1;
751 } 751 }
752 752
753 BUILD_BUG_ON(I915_NUM_ENGINES > 753 BUILD_BUG_ON(I915_NUM_ENGINES > BITS_PER_TYPE(intel_ring_mask_t));
754 sizeof(intel_ring_mask_t) * BITS_PER_BYTE);
755 754
756 /* 755 if (IS_GEN11(dev_priv))
757 * Skylake and Broxton currently don't expose the topmost plane as its 756 for_each_pipe(dev_priv, pipe)
758 * use is exclusive with the legacy cursor and we only want to expose 757 info->num_sprites[pipe] = 6;
759 * one of those, not both. Until we can safely expose the topmost plane 758 else if (IS_GEN10(dev_priv) || IS_GEMINILAKE(dev_priv))
760 * as a DRM_PLANE_TYPE_CURSOR with all the features exposed/supported,
761 * we don't expose the topmost plane at all to prevent ABI breakage
762 * down the line.
763 */
764 if (IS_GEN10(dev_priv) || IS_GEMINILAKE(dev_priv))
765 for_each_pipe(dev_priv, pipe) 759 for_each_pipe(dev_priv, pipe)
766 info->num_sprites[pipe] = 3; 760 info->num_sprites[pipe] = 3;
767 else if (IS_BROXTON(dev_priv)) { 761 else if (IS_BROXTON(dev_priv)) {
762 /*
763 * Skylake and Broxton currently don't expose the topmost plane as its
764 * use is exclusive with the legacy cursor and we only want to expose
765 * one of those, not both. Until we can safely expose the topmost plane
766 * as a DRM_PLANE_TYPE_CURSOR with all the features exposed/supported,
767 * we don't expose the topmost plane at all to prevent ABI breakage
768 * down the line.
769 */
770
768 info->num_sprites[PIPE_A] = 2; 771 info->num_sprites[PIPE_A] = 2;
769 info->num_sprites[PIPE_B] = 2; 772 info->num_sprites[PIPE_B] = 2;
770 info->num_sprites[PIPE_C] = 1; 773 info->num_sprites[PIPE_C] = 1;
@@ -844,13 +847,18 @@ void intel_device_info_runtime_init(struct intel_device_info *info)
844 cherryview_sseu_info_init(dev_priv); 847 cherryview_sseu_info_init(dev_priv);
845 else if (IS_BROADWELL(dev_priv)) 848 else if (IS_BROADWELL(dev_priv))
846 broadwell_sseu_info_init(dev_priv); 849 broadwell_sseu_info_init(dev_priv);
847 else if (INTEL_GEN(dev_priv) == 9) 850 else if (IS_GEN9(dev_priv))
848 gen9_sseu_info_init(dev_priv); 851 gen9_sseu_info_init(dev_priv);
849 else if (INTEL_GEN(dev_priv) == 10) 852 else if (IS_GEN10(dev_priv))
850 gen10_sseu_info_init(dev_priv); 853 gen10_sseu_info_init(dev_priv);
851 else if (INTEL_GEN(dev_priv) >= 11) 854 else if (INTEL_GEN(dev_priv) >= 11)
852 gen11_sseu_info_init(dev_priv); 855 gen11_sseu_info_init(dev_priv);
853 856
857 if (IS_GEN6(dev_priv) && intel_vtd_active()) {
858 DRM_INFO("Disabling ppGTT for VT-d support\n");
859 info->ppgtt = INTEL_PPGTT_NONE;
860 }
861
854 /* Initialize command stream timestamp frequency */ 862 /* Initialize command stream timestamp frequency */
855 info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv); 863 info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv);
856} 864}
@@ -872,40 +880,37 @@ void intel_driver_caps_print(const struct intel_driver_caps *caps,
872void intel_device_info_init_mmio(struct drm_i915_private *dev_priv) 880void intel_device_info_init_mmio(struct drm_i915_private *dev_priv)
873{ 881{
874 struct intel_device_info *info = mkwrite_device_info(dev_priv); 882 struct intel_device_info *info = mkwrite_device_info(dev_priv);
875 u8 vdbox_disable, vebox_disable;
876 u32 media_fuse; 883 u32 media_fuse;
877 int i; 884 unsigned int i;
878 885
879 if (INTEL_GEN(dev_priv) < 11) 886 if (INTEL_GEN(dev_priv) < 11)
880 return; 887 return;
881 888
882 media_fuse = I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE); 889 media_fuse = ~I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE);
883 890
884 vdbox_disable = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK; 891 info->vdbox_enable = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK;
885 vebox_disable = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >> 892 info->vebox_enable = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >>
886 GEN11_GT_VEBOX_DISABLE_SHIFT; 893 GEN11_GT_VEBOX_DISABLE_SHIFT;
887 894
888 DRM_DEBUG_DRIVER("vdbox disable: %04x\n", vdbox_disable); 895 DRM_DEBUG_DRIVER("vdbox enable: %04x\n", info->vdbox_enable);
889 for (i = 0; i < I915_MAX_VCS; i++) { 896 for (i = 0; i < I915_MAX_VCS; i++) {
890 if (!HAS_ENGINE(dev_priv, _VCS(i))) 897 if (!HAS_ENGINE(dev_priv, _VCS(i)))
891 continue; 898 continue;
892 899
893 if (!(BIT(i) & vdbox_disable)) 900 if (!(BIT(i) & info->vdbox_enable)) {
894 continue; 901 info->ring_mask &= ~ENGINE_MASK(_VCS(i));
895 902 DRM_DEBUG_DRIVER("vcs%u fused off\n", i);
896 info->ring_mask &= ~ENGINE_MASK(_VCS(i)); 903 }
897 DRM_DEBUG_DRIVER("vcs%u fused off\n", i);
898 } 904 }
899 905
900 DRM_DEBUG_DRIVER("vebox disable: %04x\n", vebox_disable); 906 DRM_DEBUG_DRIVER("vebox enable: %04x\n", info->vebox_enable);
901 for (i = 0; i < I915_MAX_VECS; i++) { 907 for (i = 0; i < I915_MAX_VECS; i++) {
902 if (!HAS_ENGINE(dev_priv, _VECS(i))) 908 if (!HAS_ENGINE(dev_priv, _VECS(i)))
903 continue; 909 continue;
904 910
905 if (!(BIT(i) & vebox_disable)) 911 if (!(BIT(i) & info->vebox_enable)) {
906 continue; 912 info->ring_mask &= ~ENGINE_MASK(_VECS(i));
907 913 DRM_DEBUG_DRIVER("vecs%u fused off\n", i);
908 info->ring_mask &= ~ENGINE_MASK(_VECS(i)); 914 }
909 DRM_DEBUG_DRIVER("vecs%u fused off\n", i);
910 } 915 }
911} 916}
diff --git a/drivers/gpu/drm/i915/intel_device_info.h b/drivers/gpu/drm/i915/intel_device_info.h
index 6eecd64734d5..88f97210dc49 100644
--- a/drivers/gpu/drm/i915/intel_device_info.h
+++ b/drivers/gpu/drm/i915/intel_device_info.h
@@ -25,6 +25,8 @@
25#ifndef _INTEL_DEVICE_INFO_H_ 25#ifndef _INTEL_DEVICE_INFO_H_
26#define _INTEL_DEVICE_INFO_H_ 26#define _INTEL_DEVICE_INFO_H_
27 27
28#include <uapi/drm/i915_drm.h>
29
28#include "intel_display.h" 30#include "intel_display.h"
29 31
30struct drm_printer; 32struct drm_printer;
@@ -74,21 +76,25 @@ enum intel_platform {
74 INTEL_MAX_PLATFORMS 76 INTEL_MAX_PLATFORMS
75}; 77};
76 78
79enum intel_ppgtt {
80 INTEL_PPGTT_NONE = I915_GEM_PPGTT_NONE,
81 INTEL_PPGTT_ALIASING = I915_GEM_PPGTT_ALIASING,
82 INTEL_PPGTT_FULL = I915_GEM_PPGTT_FULL,
83 INTEL_PPGTT_FULL_4LVL,
84};
85
77#define DEV_INFO_FOR_EACH_FLAG(func) \ 86#define DEV_INFO_FOR_EACH_FLAG(func) \
78 func(is_mobile); \ 87 func(is_mobile); \
79 func(is_lp); \ 88 func(is_lp); \
80 func(is_alpha_support); \ 89 func(is_alpha_support); \
81 /* Keep has_* in alphabetical order */ \ 90 /* Keep has_* in alphabetical order */ \
82 func(has_64bit_reloc); \ 91 func(has_64bit_reloc); \
83 func(has_aliasing_ppgtt); \
84 func(has_csr); \ 92 func(has_csr); \
85 func(has_ddi); \ 93 func(has_ddi); \
86 func(has_dp_mst); \ 94 func(has_dp_mst); \
87 func(has_reset_engine); \ 95 func(has_reset_engine); \
88 func(has_fbc); \ 96 func(has_fbc); \
89 func(has_fpga_dbg); \ 97 func(has_fpga_dbg); \
90 func(has_full_ppgtt); \
91 func(has_full_48bit_ppgtt); \
92 func(has_gmch_display); \ 98 func(has_gmch_display); \
93 func(has_guc); \ 99 func(has_guc); \
94 func(has_guc_ct); \ 100 func(has_guc_ct); \
@@ -118,7 +124,7 @@ enum intel_platform {
118 124
119struct sseu_dev_info { 125struct sseu_dev_info {
120 u8 slice_mask; 126 u8 slice_mask;
121 u8 subslice_mask[GEN_MAX_SUBSLICES]; 127 u8 subslice_mask[GEN_MAX_SLICES];
122 u16 eu_total; 128 u16 eu_total;
123 u8 eu_per_subslice; 129 u8 eu_per_subslice;
124 u8 min_eu_in_pool; 130 u8 min_eu_in_pool;
@@ -154,6 +160,7 @@ struct intel_device_info {
154 enum intel_platform platform; 160 enum intel_platform platform;
155 u32 platform_mask; 161 u32 platform_mask;
156 162
163 enum intel_ppgtt ppgtt;
157 unsigned int page_sizes; /* page sizes supported by the HW */ 164 unsigned int page_sizes; /* page sizes supported by the HW */
158 165
159 u32 display_mmio_offset; 166 u32 display_mmio_offset;
@@ -170,7 +177,6 @@ struct intel_device_info {
170 /* Register offsets for the various display pipes and transcoders */ 177 /* Register offsets for the various display pipes and transcoders */
171 int pipe_offsets[I915_MAX_TRANSCODERS]; 178 int pipe_offsets[I915_MAX_TRANSCODERS];
172 int trans_offsets[I915_MAX_TRANSCODERS]; 179 int trans_offsets[I915_MAX_TRANSCODERS];
173 int palette_offsets[I915_MAX_PIPES];
174 int cursor_offsets[I915_MAX_PIPES]; 180 int cursor_offsets[I915_MAX_PIPES];
175 181
176 /* Slice/subslice/EU info */ 182 /* Slice/subslice/EU info */
@@ -178,6 +184,10 @@ struct intel_device_info {
178 184
179 u32 cs_timestamp_frequency_khz; 185 u32 cs_timestamp_frequency_khz;
180 186
187 /* Enabled (not fused off) media engine bitmasks. */
188 u8 vdbox_enable;
189 u8 vebox_enable;
190
181 struct color_luts { 191 struct color_luts {
182 u16 degamma_lut_size; 192 u16 degamma_lut_size;
183 u16 gamma_lut_size; 193 u16 gamma_lut_size;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 9741cc419e1b..812ec5ae5c7b 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -24,7 +24,6 @@
24 * Eric Anholt <eric@anholt.net> 24 * Eric Anholt <eric@anholt.net>
25 */ 25 */
26 26
27#include <linux/dmi.h>
28#include <linux/module.h> 27#include <linux/module.h>
29#include <linux/input.h> 28#include <linux/input.h>
30#include <linux/i2c.h> 29#include <linux/i2c.h>
@@ -74,55 +73,6 @@ static const uint64_t i9xx_format_modifiers[] = {
74 DRM_FORMAT_MOD_INVALID 73 DRM_FORMAT_MOD_INVALID
75}; 74};
76 75
77static const uint32_t skl_primary_formats[] = {
78 DRM_FORMAT_C8,
79 DRM_FORMAT_RGB565,
80 DRM_FORMAT_XRGB8888,
81 DRM_FORMAT_XBGR8888,
82 DRM_FORMAT_ARGB8888,
83 DRM_FORMAT_ABGR8888,
84 DRM_FORMAT_XRGB2101010,
85 DRM_FORMAT_XBGR2101010,
86 DRM_FORMAT_YUYV,
87 DRM_FORMAT_YVYU,
88 DRM_FORMAT_UYVY,
89 DRM_FORMAT_VYUY,
90};
91
92static const uint32_t skl_pri_planar_formats[] = {
93 DRM_FORMAT_C8,
94 DRM_FORMAT_RGB565,
95 DRM_FORMAT_XRGB8888,
96 DRM_FORMAT_XBGR8888,
97 DRM_FORMAT_ARGB8888,
98 DRM_FORMAT_ABGR8888,
99 DRM_FORMAT_XRGB2101010,
100 DRM_FORMAT_XBGR2101010,
101 DRM_FORMAT_YUYV,
102 DRM_FORMAT_YVYU,
103 DRM_FORMAT_UYVY,
104 DRM_FORMAT_VYUY,
105 DRM_FORMAT_NV12,
106};
107
108static const uint64_t skl_format_modifiers_noccs[] = {
109 I915_FORMAT_MOD_Yf_TILED,
110 I915_FORMAT_MOD_Y_TILED,
111 I915_FORMAT_MOD_X_TILED,
112 DRM_FORMAT_MOD_LINEAR,
113 DRM_FORMAT_MOD_INVALID
114};
115
116static const uint64_t skl_format_modifiers_ccs[] = {
117 I915_FORMAT_MOD_Yf_TILED_CCS,
118 I915_FORMAT_MOD_Y_TILED_CCS,
119 I915_FORMAT_MOD_Yf_TILED,
120 I915_FORMAT_MOD_Y_TILED,
121 I915_FORMAT_MOD_X_TILED,
122 DRM_FORMAT_MOD_LINEAR,
123 DRM_FORMAT_MOD_INVALID
124};
125
126/* Cursor formats */ 76/* Cursor formats */
127static const uint32_t intel_cursor_formats[] = { 77static const uint32_t intel_cursor_formats[] = {
128 DRM_FORMAT_ARGB8888, 78 DRM_FORMAT_ARGB8888,
@@ -141,15 +91,15 @@ static void ironlake_pch_clock_get(struct intel_crtc *crtc,
141static int intel_framebuffer_init(struct intel_framebuffer *ifb, 91static int intel_framebuffer_init(struct intel_framebuffer *ifb,
142 struct drm_i915_gem_object *obj, 92 struct drm_i915_gem_object *obj,
143 struct drm_mode_fb_cmd2 *mode_cmd); 93 struct drm_mode_fb_cmd2 *mode_cmd);
144static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc); 94static void intel_set_pipe_timings(const struct intel_crtc_state *crtc_state);
145static void intel_set_pipe_timings(struct intel_crtc *intel_crtc); 95static void intel_set_pipe_src_size(const struct intel_crtc_state *crtc_state);
146static void intel_set_pipe_src_size(struct intel_crtc *intel_crtc); 96static void intel_cpu_transcoder_set_m_n(const struct intel_crtc_state *crtc_state,
147static void intel_cpu_transcoder_set_m_n(struct intel_crtc *crtc, 97 const struct intel_link_m_n *m_n,
148 struct intel_link_m_n *m_n, 98 const struct intel_link_m_n *m2_n2);
149 struct intel_link_m_n *m2_n2); 99static void i9xx_set_pipeconf(const struct intel_crtc_state *crtc_state);
150static void ironlake_set_pipeconf(struct drm_crtc *crtc); 100static void ironlake_set_pipeconf(const struct intel_crtc_state *crtc_state);
151static void haswell_set_pipeconf(struct drm_crtc *crtc); 101static void haswell_set_pipeconf(const struct intel_crtc_state *crtc_state);
152static void haswell_set_pipemisc(struct drm_crtc *crtc); 102static void haswell_set_pipemisc(const struct intel_crtc_state *crtc_state);
153static void vlv_prepare_pll(struct intel_crtc *crtc, 103static void vlv_prepare_pll(struct intel_crtc *crtc,
154 const struct intel_crtc_state *pipe_config); 104 const struct intel_crtc_state *pipe_config);
155static void chv_prepare_pll(struct intel_crtc *crtc, 105static void chv_prepare_pll(struct intel_crtc *crtc,
@@ -158,9 +108,9 @@ static void intel_begin_crtc_commit(struct drm_crtc *, struct drm_crtc_state *);
158static void intel_finish_crtc_commit(struct drm_crtc *, struct drm_crtc_state *); 108static void intel_finish_crtc_commit(struct drm_crtc *, struct drm_crtc_state *);
159static void intel_crtc_init_scalers(struct intel_crtc *crtc, 109static void intel_crtc_init_scalers(struct intel_crtc *crtc,
160 struct intel_crtc_state *crtc_state); 110 struct intel_crtc_state *crtc_state);
161static void skylake_pfit_enable(struct intel_crtc *crtc); 111static void skylake_pfit_enable(const struct intel_crtc_state *crtc_state);
162static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force); 112static void ironlake_pfit_disable(const struct intel_crtc_state *old_crtc_state);
163static void ironlake_pfit_enable(struct intel_crtc *crtc); 113static void ironlake_pfit_enable(const struct intel_crtc_state *crtc_state);
164static void intel_modeset_setup_hw_state(struct drm_device *dev, 114static void intel_modeset_setup_hw_state(struct drm_device *dev,
165 struct drm_modeset_acquire_ctx *ctx); 115 struct drm_modeset_acquire_ctx *ctx);
166static void intel_pre_disable_primary_noatomic(struct drm_crtc *crtc); 116static void intel_pre_disable_primary_noatomic(struct drm_crtc *crtc);
@@ -506,23 +456,8 @@ static const struct intel_limit intel_limits_bxt = {
506}; 456};
507 457
508static void 458static void
509skl_wa_528(struct drm_i915_private *dev_priv, int pipe, bool enable)
510{
511 if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv))
512 return;
513
514 if (enable)
515 I915_WRITE(CHICKEN_PIPESL_1(pipe), HSW_FBCQ_DIS);
516 else
517 I915_WRITE(CHICKEN_PIPESL_1(pipe), 0);
518}
519
520static void
521skl_wa_clkgate(struct drm_i915_private *dev_priv, int pipe, bool enable) 459skl_wa_clkgate(struct drm_i915_private *dev_priv, int pipe, bool enable)
522{ 460{
523 if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv))
524 return;
525
526 if (enable) 461 if (enable)
527 I915_WRITE(CLKGATE_DIS_PSL(pipe), 462 I915_WRITE(CLKGATE_DIS_PSL(pipe),
528 DUPS1_GATING_DIS | DUPS2_GATING_DIS); 463 DUPS1_GATING_DIS | DUPS2_GATING_DIS);
@@ -1381,6 +1316,7 @@ static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
1381 "PCH LVDS enabled on transcoder %c, should be disabled\n", 1316 "PCH LVDS enabled on transcoder %c, should be disabled\n",
1382 pipe_name(pipe)); 1317 pipe_name(pipe));
1383 1318
1319 /* PCH SDVOB multiplex with HDMIB */
1384 assert_pch_hdmi_disabled(dev_priv, pipe, PORT_B, PCH_HDMIB); 1320 assert_pch_hdmi_disabled(dev_priv, pipe, PORT_B, PCH_HDMIB);
1385 assert_pch_hdmi_disabled(dev_priv, pipe, PORT_C, PCH_HDMIC); 1321 assert_pch_hdmi_disabled(dev_priv, pipe, PORT_C, PCH_HDMIC);
1386 assert_pch_hdmi_disabled(dev_priv, pipe, PORT_D, PCH_HDMID); 1322 assert_pch_hdmi_disabled(dev_priv, pipe, PORT_D, PCH_HDMID);
@@ -1565,14 +1501,15 @@ static void i9xx_enable_pll(struct intel_crtc *crtc,
1565 } 1501 }
1566} 1502}
1567 1503
1568static void i9xx_disable_pll(struct intel_crtc *crtc) 1504static void i9xx_disable_pll(const struct intel_crtc_state *crtc_state)
1569{ 1505{
1506 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
1570 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1507 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1571 enum pipe pipe = crtc->pipe; 1508 enum pipe pipe = crtc->pipe;
1572 1509
1573 /* Disable DVO 2x clock on both PLLs if necessary */ 1510 /* Disable DVO 2x clock on both PLLs if necessary */
1574 if (IS_I830(dev_priv) && 1511 if (IS_I830(dev_priv) &&
1575 intel_crtc_has_type(crtc->config, INTEL_OUTPUT_DVO) && 1512 intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DVO) &&
1576 !intel_num_dvo_pipes(dev_priv)) { 1513 !intel_num_dvo_pipes(dev_priv)) {
1577 I915_WRITE(DPLL(PIPE_B), 1514 I915_WRITE(DPLL(PIPE_B),
1578 I915_READ(DPLL(PIPE_B)) & ~DPLL_DVO_2X_MODE); 1515 I915_READ(DPLL(PIPE_B)) & ~DPLL_DVO_2X_MODE);
@@ -1666,16 +1603,16 @@ void vlv_wait_port_ready(struct drm_i915_private *dev_priv,
1666 I915_READ(dpll_reg) & port_mask, expected_mask); 1603 I915_READ(dpll_reg) & port_mask, expected_mask);
1667} 1604}
1668 1605
1669static void ironlake_enable_pch_transcoder(struct drm_i915_private *dev_priv, 1606static void ironlake_enable_pch_transcoder(const struct intel_crtc_state *crtc_state)
1670 enum pipe pipe)
1671{ 1607{
1672 struct intel_crtc *intel_crtc = intel_get_crtc_for_pipe(dev_priv, 1608 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
1673 pipe); 1609 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
1610 enum pipe pipe = crtc->pipe;
1674 i915_reg_t reg; 1611 i915_reg_t reg;
1675 uint32_t val, pipeconf_val; 1612 uint32_t val, pipeconf_val;
1676 1613
1677 /* Make sure PCH DPLL is enabled */ 1614 /* Make sure PCH DPLL is enabled */
1678 assert_shared_dpll_enabled(dev_priv, intel_crtc->config->shared_dpll); 1615 assert_shared_dpll_enabled(dev_priv, crtc_state->shared_dpll);
1679 1616
1680 /* FDI must be feeding us bits for PCH ports */ 1617 /* FDI must be feeding us bits for PCH ports */
1681 assert_fdi_tx_enabled(dev_priv, pipe); 1618 assert_fdi_tx_enabled(dev_priv, pipe);
@@ -1701,7 +1638,7 @@ static void ironlake_enable_pch_transcoder(struct drm_i915_private *dev_priv,
1701 * here for both 8bpc and 12bpc. 1638 * here for both 8bpc and 12bpc.
1702 */ 1639 */
1703 val &= ~PIPECONF_BPC_MASK; 1640 val &= ~PIPECONF_BPC_MASK;
1704 if (intel_crtc_has_type(intel_crtc->config, INTEL_OUTPUT_HDMI)) 1641 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))
1705 val |= PIPECONF_8BPC; 1642 val |= PIPECONF_8BPC;
1706 else 1643 else
1707 val |= pipeconf_val & PIPECONF_BPC_MASK; 1644 val |= pipeconf_val & PIPECONF_BPC_MASK;
@@ -1710,7 +1647,7 @@ static void ironlake_enable_pch_transcoder(struct drm_i915_private *dev_priv,
1710 val &= ~TRANS_INTERLACE_MASK; 1647 val &= ~TRANS_INTERLACE_MASK;
1711 if ((pipeconf_val & PIPECONF_INTERLACE_MASK) == PIPECONF_INTERLACED_ILK) 1648 if ((pipeconf_val & PIPECONF_INTERLACE_MASK) == PIPECONF_INTERLACED_ILK)
1712 if (HAS_PCH_IBX(dev_priv) && 1649 if (HAS_PCH_IBX(dev_priv) &&
1713 intel_crtc_has_type(intel_crtc->config, INTEL_OUTPUT_SDVO)) 1650 intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO))
1714 val |= TRANS_LEGACY_INTERLACED_ILK; 1651 val |= TRANS_LEGACY_INTERLACED_ILK;
1715 else 1652 else
1716 val |= TRANS_INTERLACED; 1653 val |= TRANS_INTERLACED;
@@ -2254,6 +2191,11 @@ static u32 intel_adjust_tile_offset(int *x, int *y,
2254 return new_offset; 2191 return new_offset;
2255} 2192}
2256 2193
2194static bool is_surface_linear(u64 modifier, int color_plane)
2195{
2196 return modifier == DRM_FORMAT_MOD_LINEAR;
2197}
2198
2257static u32 intel_adjust_aligned_offset(int *x, int *y, 2199static u32 intel_adjust_aligned_offset(int *x, int *y,
2258 const struct drm_framebuffer *fb, 2200 const struct drm_framebuffer *fb,
2259 int color_plane, 2201 int color_plane,
@@ -2266,7 +2208,7 @@ static u32 intel_adjust_aligned_offset(int *x, int *y,
2266 2208
2267 WARN_ON(new_offset > old_offset); 2209 WARN_ON(new_offset > old_offset);
2268 2210
2269 if (fb->modifier != DRM_FORMAT_MOD_LINEAR) { 2211 if (!is_surface_linear(fb->modifier, color_plane)) {
2270 unsigned int tile_size, tile_width, tile_height; 2212 unsigned int tile_size, tile_width, tile_height;
2271 unsigned int pitch_tiles; 2213 unsigned int pitch_tiles;
2272 2214
@@ -2330,14 +2272,13 @@ static u32 intel_compute_aligned_offset(struct drm_i915_private *dev_priv,
2330 unsigned int rotation, 2272 unsigned int rotation,
2331 u32 alignment) 2273 u32 alignment)
2332{ 2274{
2333 uint64_t fb_modifier = fb->modifier;
2334 unsigned int cpp = fb->format->cpp[color_plane]; 2275 unsigned int cpp = fb->format->cpp[color_plane];
2335 u32 offset, offset_aligned; 2276 u32 offset, offset_aligned;
2336 2277
2337 if (alignment) 2278 if (alignment)
2338 alignment--; 2279 alignment--;
2339 2280
2340 if (fb_modifier != DRM_FORMAT_MOD_LINEAR) { 2281 if (!is_surface_linear(fb->modifier, color_plane)) {
2341 unsigned int tile_size, tile_width, tile_height; 2282 unsigned int tile_size, tile_width, tile_height;
2342 unsigned int tile_rows, tiles, pitch_tiles; 2283 unsigned int tile_rows, tiles, pitch_tiles;
2343 2284
@@ -2574,7 +2515,7 @@ intel_fill_fb_info(struct drm_i915_private *dev_priv,
2574 tile_size); 2515 tile_size);
2575 offset /= tile_size; 2516 offset /= tile_size;
2576 2517
2577 if (fb->modifier != DRM_FORMAT_MOD_LINEAR) { 2518 if (!is_surface_linear(fb->modifier, i)) {
2578 unsigned int tile_width, tile_height; 2519 unsigned int tile_width, tile_height;
2579 unsigned int pitch_tiles; 2520 unsigned int pitch_tiles;
2580 struct drm_rect r; 2521 struct drm_rect r;
@@ -2788,10 +2729,6 @@ intel_set_plane_visible(struct intel_crtc_state *crtc_state,
2788 crtc_state->base.plane_mask |= drm_plane_mask(&plane->base); 2729 crtc_state->base.plane_mask |= drm_plane_mask(&plane->base);
2789 else 2730 else
2790 crtc_state->base.plane_mask &= ~drm_plane_mask(&plane->base); 2731 crtc_state->base.plane_mask &= ~drm_plane_mask(&plane->base);
2791
2792 DRM_DEBUG_KMS("%s active planes 0x%x\n",
2793 crtc_state->base.crtc->name,
2794 crtc_state->active_planes);
2795} 2732}
2796 2733
2797static void fixup_active_planes(struct intel_crtc_state *crtc_state) 2734static void fixup_active_planes(struct intel_crtc_state *crtc_state)
@@ -2819,6 +2756,10 @@ static void intel_plane_disable_noatomic(struct intel_crtc *crtc,
2819 struct intel_plane_state *plane_state = 2756 struct intel_plane_state *plane_state =
2820 to_intel_plane_state(plane->base.state); 2757 to_intel_plane_state(plane->base.state);
2821 2758
2759 DRM_DEBUG_KMS("Disabling [PLANE:%d:%s] on [CRTC:%d:%s]\n",
2760 plane->base.base.id, plane->base.name,
2761 crtc->base.base.id, crtc->base.name);
2762
2822 intel_set_plane_visible(crtc_state, plane_state, false); 2763 intel_set_plane_visible(crtc_state, plane_state, false);
2823 fixup_active_planes(crtc_state); 2764 fixup_active_planes(crtc_state);
2824 2765
@@ -2890,6 +2831,7 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
2890 return; 2831 return;
2891 2832
2892valid_fb: 2833valid_fb:
2834 intel_state->base.rotation = plane_config->rotation;
2893 intel_fill_fb_ggtt_view(&intel_state->view, fb, 2835 intel_fill_fb_ggtt_view(&intel_state->view, fb,
2894 intel_state->base.rotation); 2836 intel_state->base.rotation);
2895 intel_state->color_plane[0].stride = 2837 intel_state->color_plane[0].stride =
@@ -3098,28 +3040,6 @@ static int skl_check_main_surface(struct intel_plane_state *plane_state)
3098 return 0; 3040 return 0;
3099} 3041}
3100 3042
3101static int
3102skl_check_nv12_surface(struct intel_plane_state *plane_state)
3103{
3104 /* Display WA #1106 */
3105 if (plane_state->base.rotation !=
3106 (DRM_MODE_REFLECT_X | DRM_MODE_ROTATE_90) &&
3107 plane_state->base.rotation != DRM_MODE_ROTATE_270)
3108 return 0;
3109
3110 /*
3111 * src coordinates are rotated here.
3112 * We check height but report it as width
3113 */
3114 if (((drm_rect_height(&plane_state->base.src) >> 16) % 4) != 0) {
3115 DRM_DEBUG_KMS("src width must be multiple "
3116 "of 4 for rotated NV12\n");
3117 return -EINVAL;
3118 }
3119
3120 return 0;
3121}
3122
3123static int skl_check_nv12_aux_surface(struct intel_plane_state *plane_state) 3043static int skl_check_nv12_aux_surface(struct intel_plane_state *plane_state)
3124{ 3044{
3125 const struct drm_framebuffer *fb = plane_state->base.fb; 3045 const struct drm_framebuffer *fb = plane_state->base.fb;
@@ -3198,9 +3118,6 @@ int skl_check_plane_surface(struct intel_plane_state *plane_state)
3198 * the main surface setup depends on it. 3118 * the main surface setup depends on it.
3199 */ 3119 */
3200 if (fb->format->format == DRM_FORMAT_NV12) { 3120 if (fb->format->format == DRM_FORMAT_NV12) {
3201 ret = skl_check_nv12_surface(plane_state);
3202 if (ret)
3203 return ret;
3204 ret = skl_check_nv12_aux_surface(plane_state); 3121 ret = skl_check_nv12_aux_surface(plane_state);
3205 if (ret) 3122 if (ret)
3206 return ret; 3123 return ret;
@@ -3448,7 +3365,6 @@ static void i9xx_update_plane(struct intel_plane *plane,
3448 intel_plane_ggtt_offset(plane_state) + 3365 intel_plane_ggtt_offset(plane_state) +
3449 dspaddr_offset); 3366 dspaddr_offset);
3450 } 3367 }
3451 POSTING_READ_FW(reg);
3452 3368
3453 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 3369 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
3454} 3370}
@@ -3467,7 +3383,6 @@ static void i9xx_disable_plane(struct intel_plane *plane,
3467 I915_WRITE_FW(DSPSURF(i9xx_plane), 0); 3383 I915_WRITE_FW(DSPSURF(i9xx_plane), 0);
3468 else 3384 else
3469 I915_WRITE_FW(DSPADDR(i9xx_plane), 0); 3385 I915_WRITE_FW(DSPADDR(i9xx_plane), 0);
3470 POSTING_READ_FW(DSPCNTR(i9xx_plane));
3471 3386
3472 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 3387 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
3473} 3388}
@@ -3527,13 +3442,13 @@ static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id)
3527/* 3442/*
3528 * This function detaches (aka. unbinds) unused scalers in hardware 3443 * This function detaches (aka. unbinds) unused scalers in hardware
3529 */ 3444 */
3530static void skl_detach_scalers(struct intel_crtc *intel_crtc) 3445static void skl_detach_scalers(const struct intel_crtc_state *crtc_state)
3531{ 3446{
3532 struct intel_crtc_scaler_state *scaler_state; 3447 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
3448 const struct intel_crtc_scaler_state *scaler_state =
3449 &crtc_state->scaler_state;
3533 int i; 3450 int i;
3534 3451
3535 scaler_state = &intel_crtc->config->scaler_state;
3536
3537 /* loop through and disable scalers that aren't in use */ 3452 /* loop through and disable scalers that aren't in use */
3538 for (i = 0; i < intel_crtc->num_scalers; i++) { 3453 for (i = 0; i < intel_crtc->num_scalers; i++) {
3539 if (!scaler_state->scalers[i].in_use) 3454 if (!scaler_state->scalers[i].in_use)
@@ -3597,29 +3512,38 @@ static u32 skl_plane_ctl_format(uint32_t pixel_format)
3597 return 0; 3512 return 0;
3598} 3513}
3599 3514
3600/* 3515static u32 skl_plane_ctl_alpha(const struct intel_plane_state *plane_state)
3601 * XXX: For ARBG/ABGR formats we default to expecting scanout buffers
3602 * to be already pre-multiplied. We need to add a knob (or a different
3603 * DRM_FORMAT) for user-space to configure that.
3604 */
3605static u32 skl_plane_ctl_alpha(uint32_t pixel_format)
3606{ 3516{
3607 switch (pixel_format) { 3517 if (!plane_state->base.fb->format->has_alpha)
3608 case DRM_FORMAT_ABGR8888: 3518 return PLANE_CTL_ALPHA_DISABLE;
3609 case DRM_FORMAT_ARGB8888: 3519
3520 switch (plane_state->base.pixel_blend_mode) {
3521 case DRM_MODE_BLEND_PIXEL_NONE:
3522 return PLANE_CTL_ALPHA_DISABLE;
3523 case DRM_MODE_BLEND_PREMULTI:
3610 return PLANE_CTL_ALPHA_SW_PREMULTIPLY; 3524 return PLANE_CTL_ALPHA_SW_PREMULTIPLY;
3525 case DRM_MODE_BLEND_COVERAGE:
3526 return PLANE_CTL_ALPHA_HW_PREMULTIPLY;
3611 default: 3527 default:
3528 MISSING_CASE(plane_state->base.pixel_blend_mode);
3612 return PLANE_CTL_ALPHA_DISABLE; 3529 return PLANE_CTL_ALPHA_DISABLE;
3613 } 3530 }
3614} 3531}
3615 3532
3616static u32 glk_plane_color_ctl_alpha(uint32_t pixel_format) 3533static u32 glk_plane_color_ctl_alpha(const struct intel_plane_state *plane_state)
3617{ 3534{
3618 switch (pixel_format) { 3535 if (!plane_state->base.fb->format->has_alpha)
3619 case DRM_FORMAT_ABGR8888: 3536 return PLANE_COLOR_ALPHA_DISABLE;
3620 case DRM_FORMAT_ARGB8888: 3537
3538 switch (plane_state->base.pixel_blend_mode) {
3539 case DRM_MODE_BLEND_PIXEL_NONE:
3540 return PLANE_COLOR_ALPHA_DISABLE;
3541 case DRM_MODE_BLEND_PREMULTI:
3621 return PLANE_COLOR_ALPHA_SW_PREMULTIPLY; 3542 return PLANE_COLOR_ALPHA_SW_PREMULTIPLY;
3543 case DRM_MODE_BLEND_COVERAGE:
3544 return PLANE_COLOR_ALPHA_HW_PREMULTIPLY;
3622 default: 3545 default:
3546 MISSING_CASE(plane_state->base.pixel_blend_mode);
3623 return PLANE_COLOR_ALPHA_DISABLE; 3547 return PLANE_COLOR_ALPHA_DISABLE;
3624 } 3548 }
3625} 3549}
@@ -3696,7 +3620,7 @@ u32 skl_plane_ctl(const struct intel_crtc_state *crtc_state,
3696 plane_ctl = PLANE_CTL_ENABLE; 3620 plane_ctl = PLANE_CTL_ENABLE;
3697 3621
3698 if (INTEL_GEN(dev_priv) < 10 && !IS_GEMINILAKE(dev_priv)) { 3622 if (INTEL_GEN(dev_priv) < 10 && !IS_GEMINILAKE(dev_priv)) {
3699 plane_ctl |= skl_plane_ctl_alpha(fb->format->format); 3623 plane_ctl |= skl_plane_ctl_alpha(plane_state);
3700 plane_ctl |= 3624 plane_ctl |=
3701 PLANE_CTL_PIPE_GAMMA_ENABLE | 3625 PLANE_CTL_PIPE_GAMMA_ENABLE |
3702 PLANE_CTL_PIPE_CSC_ENABLE | 3626 PLANE_CTL_PIPE_CSC_ENABLE |
@@ -3731,6 +3655,7 @@ u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
3731 struct drm_i915_private *dev_priv = 3655 struct drm_i915_private *dev_priv =
3732 to_i915(plane_state->base.plane->dev); 3656 to_i915(plane_state->base.plane->dev);
3733 const struct drm_framebuffer *fb = plane_state->base.fb; 3657 const struct drm_framebuffer *fb = plane_state->base.fb;
3658 struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
3734 u32 plane_color_ctl = 0; 3659 u32 plane_color_ctl = 0;
3735 3660
3736 if (INTEL_GEN(dev_priv) < 11) { 3661 if (INTEL_GEN(dev_priv) < 11) {
@@ -3738,9 +3663,9 @@ u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
3738 plane_color_ctl |= PLANE_COLOR_PIPE_CSC_ENABLE; 3663 plane_color_ctl |= PLANE_COLOR_PIPE_CSC_ENABLE;
3739 } 3664 }
3740 plane_color_ctl |= PLANE_COLOR_PLANE_GAMMA_DISABLE; 3665 plane_color_ctl |= PLANE_COLOR_PLANE_GAMMA_DISABLE;
3741 plane_color_ctl |= glk_plane_color_ctl_alpha(fb->format->format); 3666 plane_color_ctl |= glk_plane_color_ctl_alpha(plane_state);
3742 3667
3743 if (fb->format->is_yuv) { 3668 if (fb->format->is_yuv && !icl_is_hdr_plane(plane)) {
3744 if (plane_state->base.color_encoding == DRM_COLOR_YCBCR_BT709) 3669 if (plane_state->base.color_encoding == DRM_COLOR_YCBCR_BT709)
3745 plane_color_ctl |= PLANE_COLOR_CSC_MODE_YUV709_TO_RGB709; 3670 plane_color_ctl |= PLANE_COLOR_CSC_MODE_YUV709_TO_RGB709;
3746 else 3671 else
@@ -3748,6 +3673,8 @@ u32 glk_plane_color_ctl(const struct intel_crtc_state *crtc_state,
3748 3673
3749 if (plane_state->base.color_range == DRM_COLOR_YCBCR_FULL_RANGE) 3674 if (plane_state->base.color_range == DRM_COLOR_YCBCR_FULL_RANGE)
3750 plane_color_ctl |= PLANE_COLOR_YUV_RANGE_CORRECTION_DISABLE; 3675 plane_color_ctl |= PLANE_COLOR_YUV_RANGE_CORRECTION_DISABLE;
3676 } else if (fb->format->is_yuv) {
3677 plane_color_ctl |= PLANE_COLOR_INPUT_CSC_ENABLE;
3751 } 3678 }
3752 3679
3753 return plane_color_ctl; 3680 return plane_color_ctl;
@@ -3932,15 +3859,15 @@ static void intel_update_pipe_config(const struct intel_crtc_state *old_crtc_sta
3932 3859
3933 /* on skylake this is done by detaching scalers */ 3860 /* on skylake this is done by detaching scalers */
3934 if (INTEL_GEN(dev_priv) >= 9) { 3861 if (INTEL_GEN(dev_priv) >= 9) {
3935 skl_detach_scalers(crtc); 3862 skl_detach_scalers(new_crtc_state);
3936 3863
3937 if (new_crtc_state->pch_pfit.enabled) 3864 if (new_crtc_state->pch_pfit.enabled)
3938 skylake_pfit_enable(crtc); 3865 skylake_pfit_enable(new_crtc_state);
3939 } else if (HAS_PCH_SPLIT(dev_priv)) { 3866 } else if (HAS_PCH_SPLIT(dev_priv)) {
3940 if (new_crtc_state->pch_pfit.enabled) 3867 if (new_crtc_state->pch_pfit.enabled)
3941 ironlake_pfit_enable(crtc); 3868 ironlake_pfit_enable(new_crtc_state);
3942 else if (old_crtc_state->pch_pfit.enabled) 3869 else if (old_crtc_state->pch_pfit.enabled)
3943 ironlake_pfit_disable(crtc, true); 3870 ironlake_pfit_disable(old_crtc_state);
3944 } 3871 }
3945} 3872}
3946 3873
@@ -4339,10 +4266,10 @@ train_done:
4339 DRM_DEBUG_KMS("FDI train done.\n"); 4266 DRM_DEBUG_KMS("FDI train done.\n");
4340} 4267}
4341 4268
4342static void ironlake_fdi_pll_enable(struct intel_crtc *intel_crtc) 4269static void ironlake_fdi_pll_enable(const struct intel_crtc_state *crtc_state)
4343{ 4270{
4344 struct drm_device *dev = intel_crtc->base.dev; 4271 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
4345 struct drm_i915_private *dev_priv = to_i915(dev); 4272 struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
4346 int pipe = intel_crtc->pipe; 4273 int pipe = intel_crtc->pipe;
4347 i915_reg_t reg; 4274 i915_reg_t reg;
4348 u32 temp; 4275 u32 temp;
@@ -4351,7 +4278,7 @@ static void ironlake_fdi_pll_enable(struct intel_crtc *intel_crtc)
4351 reg = FDI_RX_CTL(pipe); 4278 reg = FDI_RX_CTL(pipe);
4352 temp = I915_READ(reg); 4279 temp = I915_READ(reg);
4353 temp &= ~(FDI_DP_PORT_WIDTH_MASK | (0x7 << 16)); 4280 temp &= ~(FDI_DP_PORT_WIDTH_MASK | (0x7 << 16));
4354 temp |= FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes); 4281 temp |= FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes);
4355 temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11; 4282 temp |= (I915_READ(PIPECONF(pipe)) & PIPECONF_BPC_MASK) << 11;
4356 I915_WRITE(reg, temp | FDI_RX_PLL_ENABLE); 4283 I915_WRITE(reg, temp | FDI_RX_PLL_ENABLE);
4357 4284
@@ -4500,10 +4427,11 @@ void lpt_disable_iclkip(struct drm_i915_private *dev_priv)
4500} 4427}
4501 4428
4502/* Program iCLKIP clock to the desired frequency */ 4429/* Program iCLKIP clock to the desired frequency */
4503static void lpt_program_iclkip(struct intel_crtc *crtc) 4430static void lpt_program_iclkip(const struct intel_crtc_state *crtc_state)
4504{ 4431{
4432 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
4505 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 4433 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
4506 int clock = crtc->config->base.adjusted_mode.crtc_clock; 4434 int clock = crtc_state->base.adjusted_mode.crtc_clock;
4507 u32 divsel, phaseinc, auxdiv, phasedir = 0; 4435 u32 divsel, phaseinc, auxdiv, phasedir = 0;
4508 u32 temp; 4436 u32 temp;
4509 4437
@@ -4614,12 +4542,12 @@ int lpt_get_iclkip(struct drm_i915_private *dev_priv)
4614 desired_divisor << auxdiv); 4542 desired_divisor << auxdiv);
4615} 4543}
4616 4544
4617static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc, 4545static void ironlake_pch_transcoder_set_timings(const struct intel_crtc_state *crtc_state,
4618 enum pipe pch_transcoder) 4546 enum pipe pch_transcoder)
4619{ 4547{
4620 struct drm_device *dev = crtc->base.dev; 4548 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
4621 struct drm_i915_private *dev_priv = to_i915(dev); 4549 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
4622 enum transcoder cpu_transcoder = crtc->config->cpu_transcoder; 4550 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
4623 4551
4624 I915_WRITE(PCH_TRANS_HTOTAL(pch_transcoder), 4552 I915_WRITE(PCH_TRANS_HTOTAL(pch_transcoder),
4625 I915_READ(HTOTAL(cpu_transcoder))); 4553 I915_READ(HTOTAL(cpu_transcoder)));
@@ -4638,9 +4566,8 @@ static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc,
4638 I915_READ(VSYNCSHIFT(cpu_transcoder))); 4566 I915_READ(VSYNCSHIFT(cpu_transcoder)));
4639} 4567}
4640 4568
4641static void cpt_set_fdi_bc_bifurcation(struct drm_device *dev, bool enable) 4569static void cpt_set_fdi_bc_bifurcation(struct drm_i915_private *dev_priv, bool enable)
4642{ 4570{
4643 struct drm_i915_private *dev_priv = to_i915(dev);
4644 uint32_t temp; 4571 uint32_t temp;
4645 4572
4646 temp = I915_READ(SOUTH_CHICKEN1); 4573 temp = I915_READ(SOUTH_CHICKEN1);
@@ -4659,22 +4586,23 @@ static void cpt_set_fdi_bc_bifurcation(struct drm_device *dev, bool enable)
4659 POSTING_READ(SOUTH_CHICKEN1); 4586 POSTING_READ(SOUTH_CHICKEN1);
4660} 4587}
4661 4588
4662static void ivybridge_update_fdi_bc_bifurcation(struct intel_crtc *intel_crtc) 4589static void ivybridge_update_fdi_bc_bifurcation(const struct intel_crtc_state *crtc_state)
4663{ 4590{
4664 struct drm_device *dev = intel_crtc->base.dev; 4591 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
4592 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
4665 4593
4666 switch (intel_crtc->pipe) { 4594 switch (crtc->pipe) {
4667 case PIPE_A: 4595 case PIPE_A:
4668 break; 4596 break;
4669 case PIPE_B: 4597 case PIPE_B:
4670 if (intel_crtc->config->fdi_lanes > 2) 4598 if (crtc_state->fdi_lanes > 2)
4671 cpt_set_fdi_bc_bifurcation(dev, false); 4599 cpt_set_fdi_bc_bifurcation(dev_priv, false);
4672 else 4600 else
4673 cpt_set_fdi_bc_bifurcation(dev, true); 4601 cpt_set_fdi_bc_bifurcation(dev_priv, true);
4674 4602
4675 break; 4603 break;
4676 case PIPE_C: 4604 case PIPE_C:
4677 cpt_set_fdi_bc_bifurcation(dev, true); 4605 cpt_set_fdi_bc_bifurcation(dev_priv, true);
4678 4606
4679 break; 4607 break;
4680 default: 4608 default:
@@ -4731,7 +4659,7 @@ static void ironlake_pch_enable(const struct intel_atomic_state *state,
4731 assert_pch_transcoder_disabled(dev_priv, pipe); 4659 assert_pch_transcoder_disabled(dev_priv, pipe);
4732 4660
4733 if (IS_IVYBRIDGE(dev_priv)) 4661 if (IS_IVYBRIDGE(dev_priv))
4734 ivybridge_update_fdi_bc_bifurcation(crtc); 4662 ivybridge_update_fdi_bc_bifurcation(crtc_state);
4735 4663
4736 /* Write the TU size bits before fdi link training, so that error 4664 /* Write the TU size bits before fdi link training, so that error
4737 * detection works. */ 4665 * detection works. */
@@ -4764,11 +4692,11 @@ static void ironlake_pch_enable(const struct intel_atomic_state *state,
4764 * Note that enable_shared_dpll tries to do the right thing, but 4692 * Note that enable_shared_dpll tries to do the right thing, but
4765 * get_shared_dpll unconditionally resets the pll - we need that to have 4693 * get_shared_dpll unconditionally resets the pll - we need that to have
4766 * the right LVDS enable sequence. */ 4694 * the right LVDS enable sequence. */
4767 intel_enable_shared_dpll(crtc); 4695 intel_enable_shared_dpll(crtc_state);
4768 4696
4769 /* set transcoder timing, panel must allow it */ 4697 /* set transcoder timing, panel must allow it */
4770 assert_panel_unlocked(dev_priv, pipe); 4698 assert_panel_unlocked(dev_priv, pipe);
4771 ironlake_pch_transcoder_set_timings(crtc, pipe); 4699 ironlake_pch_transcoder_set_timings(crtc_state, pipe);
4772 4700
4773 intel_fdi_normal_train(crtc); 4701 intel_fdi_normal_train(crtc);
4774 4702
@@ -4800,7 +4728,7 @@ static void ironlake_pch_enable(const struct intel_atomic_state *state,
4800 I915_WRITE(reg, temp); 4728 I915_WRITE(reg, temp);
4801 } 4729 }
4802 4730
4803 ironlake_enable_pch_transcoder(dev_priv, pipe); 4731 ironlake_enable_pch_transcoder(crtc_state);
4804} 4732}
4805 4733
4806static void lpt_pch_enable(const struct intel_atomic_state *state, 4734static void lpt_pch_enable(const struct intel_atomic_state *state,
@@ -4812,10 +4740,10 @@ static void lpt_pch_enable(const struct intel_atomic_state *state,
4812 4740
4813 assert_pch_transcoder_disabled(dev_priv, PIPE_A); 4741 assert_pch_transcoder_disabled(dev_priv, PIPE_A);
4814 4742
4815 lpt_program_iclkip(crtc); 4743 lpt_program_iclkip(crtc_state);
4816 4744
4817 /* Set transcoder timing. */ 4745 /* Set transcoder timing. */
4818 ironlake_pch_transcoder_set_timings(crtc, PIPE_A); 4746 ironlake_pch_transcoder_set_timings(crtc_state, PIPE_A);
4819 4747
4820 lpt_enable_pch_transcoder(dev_priv, cpu_transcoder); 4748 lpt_enable_pch_transcoder(dev_priv, cpu_transcoder);
4821} 4749}
@@ -4850,8 +4778,31 @@ static void cpt_verify_modeset(struct drm_device *dev, int pipe)
4850 * chroma samples for both of the luma samples, and thus we don't 4778 * chroma samples for both of the luma samples, and thus we don't
4851 * actually get the expected MPEG2 chroma siting convention :( 4779 * actually get the expected MPEG2 chroma siting convention :(
4852 * The same behaviour is observed on pre-SKL platforms as well. 4780 * The same behaviour is observed on pre-SKL platforms as well.
4781 *
4782 * Theory behind the formula (note that we ignore sub-pixel
4783 * source coordinates):
4784 * s = source sample position
4785 * d = destination sample position
4786 *
4787 * Downscaling 4:1:
4788 * -0.5
4789 * | 0.0
4790 * | | 1.5 (initial phase)
4791 * | | |
4792 * v v v
4793 * | s | s | s | s |
4794 * | d |
4795 *
4796 * Upscaling 1:4:
4797 * -0.5
4798 * | -0.375 (initial phase)
4799 * | | 0.0
4800 * | | |
4801 * v v v
4802 * | s |
4803 * | d | d | d | d |
4853 */ 4804 */
4854u16 skl_scaler_calc_phase(int sub, bool chroma_cosited) 4805u16 skl_scaler_calc_phase(int sub, int scale, bool chroma_cosited)
4855{ 4806{
4856 int phase = -0x8000; 4807 int phase = -0x8000;
4857 u16 trip = 0; 4808 u16 trip = 0;
@@ -4859,6 +4810,15 @@ u16 skl_scaler_calc_phase(int sub, bool chroma_cosited)
4859 if (chroma_cosited) 4810 if (chroma_cosited)
4860 phase += (sub - 1) * 0x8000 / sub; 4811 phase += (sub - 1) * 0x8000 / sub;
4861 4812
4813 phase += scale / (2 * sub);
4814
4815 /*
4816 * Hardware initial phase limited to [-0.5:1.5].
4817 * Since the max hardware scale factor is 3.0, we
4818 * should never actually excdeed 1.0 here.
4819 */
4820 WARN_ON(phase < -0x8000 || phase > 0x18000);
4821
4862 if (phase < 0) 4822 if (phase < 0)
4863 phase = 0x10000 + phase; 4823 phase = 0x10000 + phase;
4864 else 4824 else
@@ -4871,8 +4831,7 @@ static int
4871skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach, 4831skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
4872 unsigned int scaler_user, int *scaler_id, 4832 unsigned int scaler_user, int *scaler_id,
4873 int src_w, int src_h, int dst_w, int dst_h, 4833 int src_w, int src_h, int dst_w, int dst_h,
4874 bool plane_scaler_check, 4834 const struct drm_format_info *format, bool need_scaler)
4875 uint32_t pixel_format)
4876{ 4835{
4877 struct intel_crtc_scaler_state *scaler_state = 4836 struct intel_crtc_scaler_state *scaler_state =
4878 &crtc_state->scaler_state; 4837 &crtc_state->scaler_state;
@@ -4881,21 +4840,14 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
4881 struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev); 4840 struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
4882 const struct drm_display_mode *adjusted_mode = 4841 const struct drm_display_mode *adjusted_mode =
4883 &crtc_state->base.adjusted_mode; 4842 &crtc_state->base.adjusted_mode;
4884 int need_scaling;
4885 4843
4886 /* 4844 /*
4887 * Src coordinates are already rotated by 270 degrees for 4845 * Src coordinates are already rotated by 270 degrees for
4888 * the 90/270 degree plane rotation cases (to match the 4846 * the 90/270 degree plane rotation cases (to match the
4889 * GTT mapping), hence no need to account for rotation here. 4847 * GTT mapping), hence no need to account for rotation here.
4890 */ 4848 */
4891 need_scaling = src_w != dst_w || src_h != dst_h; 4849 if (src_w != dst_w || src_h != dst_h)
4892 4850 need_scaler = true;
4893 if (plane_scaler_check)
4894 if (pixel_format == DRM_FORMAT_NV12)
4895 need_scaling = true;
4896
4897 if (crtc_state->ycbcr420 && scaler_user == SKL_CRTC_INDEX)
4898 need_scaling = true;
4899 4851
4900 /* 4852 /*
4901 * Scaling/fitting not supported in IF-ID mode in GEN9+ 4853 * Scaling/fitting not supported in IF-ID mode in GEN9+
@@ -4904,7 +4856,7 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
4904 * for NV12. 4856 * for NV12.
4905 */ 4857 */
4906 if (INTEL_GEN(dev_priv) >= 9 && crtc_state->base.enable && 4858 if (INTEL_GEN(dev_priv) >= 9 && crtc_state->base.enable &&
4907 need_scaling && adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) { 4859 need_scaler && adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
4908 DRM_DEBUG_KMS("Pipe/Plane scaling not supported with IF-ID mode\n"); 4860 DRM_DEBUG_KMS("Pipe/Plane scaling not supported with IF-ID mode\n");
4909 return -EINVAL; 4861 return -EINVAL;
4910 } 4862 }
@@ -4919,7 +4871,7 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
4919 * update to free the scaler is done in plane/panel-fit programming. 4871 * update to free the scaler is done in plane/panel-fit programming.
4920 * For this purpose crtc/plane_state->scaler_id isn't reset here. 4872 * For this purpose crtc/plane_state->scaler_id isn't reset here.
4921 */ 4873 */
4922 if (force_detach || !need_scaling) { 4874 if (force_detach || !need_scaler) {
4923 if (*scaler_id >= 0) { 4875 if (*scaler_id >= 0) {
4924 scaler_state->scaler_users &= ~(1 << scaler_user); 4876 scaler_state->scaler_users &= ~(1 << scaler_user);
4925 scaler_state->scalers[*scaler_id].in_use = 0; 4877 scaler_state->scalers[*scaler_id].in_use = 0;
@@ -4933,7 +4885,7 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
4933 return 0; 4885 return 0;
4934 } 4886 }
4935 4887
4936 if (plane_scaler_check && pixel_format == DRM_FORMAT_NV12 && 4888 if (format && format->format == DRM_FORMAT_NV12 &&
4937 (src_h < SKL_MIN_YUV_420_SRC_H || src_w < SKL_MIN_YUV_420_SRC_W)) { 4889 (src_h < SKL_MIN_YUV_420_SRC_H || src_w < SKL_MIN_YUV_420_SRC_W)) {
4938 DRM_DEBUG_KMS("NV12: src dimensions not met\n"); 4890 DRM_DEBUG_KMS("NV12: src dimensions not met\n");
4939 return -EINVAL; 4891 return -EINVAL;
@@ -4976,12 +4928,16 @@ skl_update_scaler(struct intel_crtc_state *crtc_state, bool force_detach,
4976int skl_update_scaler_crtc(struct intel_crtc_state *state) 4928int skl_update_scaler_crtc(struct intel_crtc_state *state)
4977{ 4929{
4978 const struct drm_display_mode *adjusted_mode = &state->base.adjusted_mode; 4930 const struct drm_display_mode *adjusted_mode = &state->base.adjusted_mode;
4931 bool need_scaler = false;
4932
4933 if (state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
4934 need_scaler = true;
4979 4935
4980 return skl_update_scaler(state, !state->base.active, SKL_CRTC_INDEX, 4936 return skl_update_scaler(state, !state->base.active, SKL_CRTC_INDEX,
4981 &state->scaler_state.scaler_id, 4937 &state->scaler_state.scaler_id,
4982 state->pipe_src_w, state->pipe_src_h, 4938 state->pipe_src_w, state->pipe_src_h,
4983 adjusted_mode->crtc_hdisplay, 4939 adjusted_mode->crtc_hdisplay,
4984 adjusted_mode->crtc_vdisplay, false, 0); 4940 adjusted_mode->crtc_vdisplay, NULL, need_scaler);
4985} 4941}
4986 4942
4987/** 4943/**
@@ -4996,13 +4952,17 @@ int skl_update_scaler_crtc(struct intel_crtc_state *state)
4996static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state, 4952static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state,
4997 struct intel_plane_state *plane_state) 4953 struct intel_plane_state *plane_state)
4998{ 4954{
4999
5000 struct intel_plane *intel_plane = 4955 struct intel_plane *intel_plane =
5001 to_intel_plane(plane_state->base.plane); 4956 to_intel_plane(plane_state->base.plane);
5002 struct drm_framebuffer *fb = plane_state->base.fb; 4957 struct drm_framebuffer *fb = plane_state->base.fb;
5003 int ret; 4958 int ret;
5004
5005 bool force_detach = !fb || !plane_state->base.visible; 4959 bool force_detach = !fb || !plane_state->base.visible;
4960 bool need_scaler = false;
4961
4962 /* Pre-gen11 and SDR planes always need a scaler for planar formats. */
4963 if (!icl_is_hdr_plane(intel_plane) &&
4964 fb && fb->format->format == DRM_FORMAT_NV12)
4965 need_scaler = true;
5006 4966
5007 ret = skl_update_scaler(crtc_state, force_detach, 4967 ret = skl_update_scaler(crtc_state, force_detach,
5008 drm_plane_index(&intel_plane->base), 4968 drm_plane_index(&intel_plane->base),
@@ -5011,7 +4971,7 @@ static int skl_update_scaler_plane(struct intel_crtc_state *crtc_state,
5011 drm_rect_height(&plane_state->base.src) >> 16, 4971 drm_rect_height(&plane_state->base.src) >> 16,
5012 drm_rect_width(&plane_state->base.dst), 4972 drm_rect_width(&plane_state->base.dst),
5013 drm_rect_height(&plane_state->base.dst), 4973 drm_rect_height(&plane_state->base.dst),
5014 fb ? true : false, fb ? fb->format->format : 0); 4974 fb ? fb->format : NULL, need_scaler);
5015 4975
5016 if (ret || plane_state->scaler_id < 0) 4976 if (ret || plane_state->scaler_id < 0)
5017 return ret; 4977 return ret;
@@ -5057,23 +5017,30 @@ static void skylake_scaler_disable(struct intel_crtc *crtc)
5057 skl_detach_scaler(crtc, i); 5017 skl_detach_scaler(crtc, i);
5058} 5018}
5059 5019
5060static void skylake_pfit_enable(struct intel_crtc *crtc) 5020static void skylake_pfit_enable(const struct intel_crtc_state *crtc_state)
5061{ 5021{
5062 struct drm_device *dev = crtc->base.dev; 5022 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
5063 struct drm_i915_private *dev_priv = to_i915(dev); 5023 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
5064 int pipe = crtc->pipe; 5024 enum pipe pipe = crtc->pipe;
5065 struct intel_crtc_scaler_state *scaler_state = 5025 const struct intel_crtc_scaler_state *scaler_state =
5066 &crtc->config->scaler_state; 5026 &crtc_state->scaler_state;
5067 5027
5068 if (crtc->config->pch_pfit.enabled) { 5028 if (crtc_state->pch_pfit.enabled) {
5069 u16 uv_rgb_hphase, uv_rgb_vphase; 5029 u16 uv_rgb_hphase, uv_rgb_vphase;
5030 int pfit_w, pfit_h, hscale, vscale;
5070 int id; 5031 int id;
5071 5032
5072 if (WARN_ON(crtc->config->scaler_state.scaler_id < 0)) 5033 if (WARN_ON(crtc_state->scaler_state.scaler_id < 0))
5073 return; 5034 return;
5074 5035
5075 uv_rgb_hphase = skl_scaler_calc_phase(1, false); 5036 pfit_w = (crtc_state->pch_pfit.size >> 16) & 0xFFFF;
5076 uv_rgb_vphase = skl_scaler_calc_phase(1, false); 5037 pfit_h = crtc_state->pch_pfit.size & 0xFFFF;
5038
5039 hscale = (crtc_state->pipe_src_w << 16) / pfit_w;
5040 vscale = (crtc_state->pipe_src_h << 16) / pfit_h;
5041
5042 uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
5043 uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
5077 5044
5078 id = scaler_state->scaler_id; 5045 id = scaler_state->scaler_id;
5079 I915_WRITE(SKL_PS_CTRL(pipe, id), PS_SCALER_EN | 5046 I915_WRITE(SKL_PS_CTRL(pipe, id), PS_SCALER_EN |
@@ -5082,18 +5049,18 @@ static void skylake_pfit_enable(struct intel_crtc *crtc)
5082 PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase)); 5049 PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase));
5083 I915_WRITE_FW(SKL_PS_HPHASE(pipe, id), 5050 I915_WRITE_FW(SKL_PS_HPHASE(pipe, id),
5084 PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase)); 5051 PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase));
5085 I915_WRITE(SKL_PS_WIN_POS(pipe, id), crtc->config->pch_pfit.pos); 5052 I915_WRITE(SKL_PS_WIN_POS(pipe, id), crtc_state->pch_pfit.pos);
5086 I915_WRITE(SKL_PS_WIN_SZ(pipe, id), crtc->config->pch_pfit.size); 5053 I915_WRITE(SKL_PS_WIN_SZ(pipe, id), crtc_state->pch_pfit.size);
5087 } 5054 }
5088} 5055}
5089 5056
5090static void ironlake_pfit_enable(struct intel_crtc *crtc) 5057static void ironlake_pfit_enable(const struct intel_crtc_state *crtc_state)
5091{ 5058{
5092 struct drm_device *dev = crtc->base.dev; 5059 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
5093 struct drm_i915_private *dev_priv = to_i915(dev); 5060 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
5094 int pipe = crtc->pipe; 5061 int pipe = crtc->pipe;
5095 5062
5096 if (crtc->config->pch_pfit.enabled) { 5063 if (crtc_state->pch_pfit.enabled) {
5097 /* Force use of hard-coded filter coefficients 5064 /* Force use of hard-coded filter coefficients
5098 * as some pre-programmed values are broken, 5065 * as some pre-programmed values are broken,
5099 * e.g. x201. 5066 * e.g. x201.
@@ -5103,8 +5070,8 @@ static void ironlake_pfit_enable(struct intel_crtc *crtc)
5103 PF_PIPE_SEL_IVB(pipe)); 5070 PF_PIPE_SEL_IVB(pipe));
5104 else 5071 else
5105 I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3); 5072 I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3);
5106 I915_WRITE(PF_WIN_POS(pipe), crtc->config->pch_pfit.pos); 5073 I915_WRITE(PF_WIN_POS(pipe), crtc_state->pch_pfit.pos);
5107 I915_WRITE(PF_WIN_SZ(pipe), crtc->config->pch_pfit.size); 5074 I915_WRITE(PF_WIN_SZ(pipe), crtc_state->pch_pfit.size);
5108 } 5075 }
5109} 5076}
5110 5077
@@ -5299,11 +5266,8 @@ static bool needs_nv12_wa(struct drm_i915_private *dev_priv,
5299 if (!crtc_state->nv12_planes) 5266 if (!crtc_state->nv12_planes)
5300 return false; 5267 return false;
5301 5268
5302 if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv)) 5269 /* WA Display #0827: Gen9:all */
5303 return false; 5270 if (IS_GEN9(dev_priv) && !IS_GEMINILAKE(dev_priv))
5304
5305 if ((INTEL_GEN(dev_priv) == 9 && !IS_GEMINILAKE(dev_priv)) ||
5306 IS_CANNONLAKE(dev_priv))
5307 return true; 5271 return true;
5308 5272
5309 return false; 5273 return false;
@@ -5346,7 +5310,6 @@ static void intel_post_plane_update(struct intel_crtc_state *old_crtc_state)
5346 if (needs_nv12_wa(dev_priv, old_crtc_state) && 5310 if (needs_nv12_wa(dev_priv, old_crtc_state) &&
5347 !needs_nv12_wa(dev_priv, pipe_config)) { 5311 !needs_nv12_wa(dev_priv, pipe_config)) {
5348 skl_wa_clkgate(dev_priv, crtc->pipe, false); 5312 skl_wa_clkgate(dev_priv, crtc->pipe, false);
5349 skl_wa_528(dev_priv, crtc->pipe, false);
5350 } 5313 }
5351} 5314}
5352 5315
@@ -5386,7 +5349,6 @@ static void intel_pre_plane_update(struct intel_crtc_state *old_crtc_state,
5386 if (!needs_nv12_wa(dev_priv, old_crtc_state) && 5349 if (!needs_nv12_wa(dev_priv, old_crtc_state) &&
5387 needs_nv12_wa(dev_priv, pipe_config)) { 5350 needs_nv12_wa(dev_priv, pipe_config)) {
5388 skl_wa_clkgate(dev_priv, crtc->pipe, true); 5351 skl_wa_clkgate(dev_priv, crtc->pipe, true);
5389 skl_wa_528(dev_priv, crtc->pipe, true);
5390 } 5352 }
5391 5353
5392 /* 5354 /*
@@ -5409,7 +5371,8 @@ static void intel_pre_plane_update(struct intel_crtc_state *old_crtc_state,
5409 * 5371 *
5410 * WaCxSRDisabledForSpriteScaling:ivb 5372 * WaCxSRDisabledForSpriteScaling:ivb
5411 */ 5373 */
5412 if (pipe_config->disable_lp_wm && ilk_disable_lp_wm(dev)) 5374 if (pipe_config->disable_lp_wm && ilk_disable_lp_wm(dev) &&
5375 old_crtc_state->base.active)
5413 intel_wait_for_vblank(dev_priv, crtc->pipe); 5376 intel_wait_for_vblank(dev_priv, crtc->pipe);
5414 5377
5415 /* 5378 /*
@@ -5440,24 +5403,23 @@ static void intel_pre_plane_update(struct intel_crtc_state *old_crtc_state,
5440 intel_update_watermarks(crtc); 5403 intel_update_watermarks(crtc);
5441} 5404}
5442 5405
5443static void intel_crtc_disable_planes(struct drm_crtc *crtc, unsigned plane_mask) 5406static void intel_crtc_disable_planes(struct intel_crtc *crtc, unsigned plane_mask)
5444{ 5407{
5445 struct drm_device *dev = crtc->dev; 5408 struct drm_device *dev = crtc->base.dev;
5446 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 5409 struct intel_plane *plane;
5447 struct drm_plane *p; 5410 unsigned fb_bits = 0;
5448 int pipe = intel_crtc->pipe;
5449 5411
5450 intel_crtc_dpms_overlay_disable(intel_crtc); 5412 intel_crtc_dpms_overlay_disable(crtc);
5451 5413
5452 drm_for_each_plane_mask(p, dev, plane_mask) 5414 for_each_intel_plane_on_crtc(dev, crtc, plane) {
5453 to_intel_plane(p)->disable_plane(to_intel_plane(p), intel_crtc); 5415 if (plane_mask & BIT(plane->id)) {
5416 plane->disable_plane(plane, crtc);
5454 5417
5455 /* 5418 fb_bits |= plane->frontbuffer_bit;
5456 * FIXME: Once we grow proper nuclear flip support out of this we need 5419 }
5457 * to compute the mask of flip planes precisely. For the time being 5420 }
5458 * consider this a flip to a NULL plane. 5421
5459 */ 5422 intel_frontbuffer_flip(to_i915(dev), fb_bits);
5460 intel_frontbuffer_flip(to_i915(dev), INTEL_FRONTBUFFER_ALL_MASK(pipe));
5461} 5423}
5462 5424
5463static void intel_encoders_pre_pll_enable(struct drm_crtc *crtc, 5425static void intel_encoders_pre_pll_enable(struct drm_crtc *crtc,
@@ -5515,7 +5477,8 @@ static void intel_encoders_enable(struct drm_crtc *crtc,
5515 if (conn_state->crtc != crtc) 5477 if (conn_state->crtc != crtc)
5516 continue; 5478 continue;
5517 5479
5518 encoder->enable(encoder, crtc_state, conn_state); 5480 if (encoder->enable)
5481 encoder->enable(encoder, crtc_state, conn_state);
5519 intel_opregion_notify_encoder(encoder, true); 5482 intel_opregion_notify_encoder(encoder, true);
5520 } 5483 }
5521} 5484}
@@ -5536,7 +5499,8 @@ static void intel_encoders_disable(struct drm_crtc *crtc,
5536 continue; 5499 continue;
5537 5500
5538 intel_opregion_notify_encoder(encoder, false); 5501 intel_opregion_notify_encoder(encoder, false);
5539 encoder->disable(encoder, old_crtc_state, old_conn_state); 5502 if (encoder->disable)
5503 encoder->disable(encoder, old_crtc_state, old_conn_state);
5540 } 5504 }
5541} 5505}
5542 5506
@@ -5607,37 +5571,37 @@ static void ironlake_crtc_enable(struct intel_crtc_state *pipe_config,
5607 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false); 5571 intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
5608 intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false); 5572 intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
5609 5573
5610 if (intel_crtc->config->has_pch_encoder) 5574 if (pipe_config->has_pch_encoder)
5611 intel_prepare_shared_dpll(intel_crtc); 5575 intel_prepare_shared_dpll(pipe_config);
5612 5576
5613 if (intel_crtc_has_dp_encoder(intel_crtc->config)) 5577 if (intel_crtc_has_dp_encoder(pipe_config))
5614 intel_dp_set_m_n(intel_crtc, M1_N1); 5578 intel_dp_set_m_n(pipe_config, M1_N1);
5615 5579
5616 intel_set_pipe_timings(intel_crtc); 5580 intel_set_pipe_timings(pipe_config);
5617 intel_set_pipe_src_size(intel_crtc); 5581 intel_set_pipe_src_size(pipe_config);
5618 5582
5619 if (intel_crtc->config->has_pch_encoder) { 5583 if (pipe_config->has_pch_encoder) {
5620 intel_cpu_transcoder_set_m_n(intel_crtc, 5584 intel_cpu_transcoder_set_m_n(pipe_config,
5621 &intel_crtc->config->fdi_m_n, NULL); 5585 &pipe_config->fdi_m_n, NULL);
5622 } 5586 }
5623 5587
5624 ironlake_set_pipeconf(crtc); 5588 ironlake_set_pipeconf(pipe_config);
5625 5589
5626 intel_crtc->active = true; 5590 intel_crtc->active = true;
5627 5591
5628 intel_encoders_pre_enable(crtc, pipe_config, old_state); 5592 intel_encoders_pre_enable(crtc, pipe_config, old_state);
5629 5593
5630 if (intel_crtc->config->has_pch_encoder) { 5594 if (pipe_config->has_pch_encoder) {
5631 /* Note: FDI PLL enabling _must_ be done before we enable the 5595 /* Note: FDI PLL enabling _must_ be done before we enable the
5632 * cpu pipes, hence this is separate from all the other fdi/pch 5596 * cpu pipes, hence this is separate from all the other fdi/pch
5633 * enabling. */ 5597 * enabling. */
5634 ironlake_fdi_pll_enable(intel_crtc); 5598 ironlake_fdi_pll_enable(pipe_config);
5635 } else { 5599 } else {
5636 assert_fdi_tx_disabled(dev_priv, pipe); 5600 assert_fdi_tx_disabled(dev_priv, pipe);
5637 assert_fdi_rx_disabled(dev_priv, pipe); 5601 assert_fdi_rx_disabled(dev_priv, pipe);
5638 } 5602 }
5639 5603
5640 ironlake_pfit_enable(intel_crtc); 5604 ironlake_pfit_enable(pipe_config);
5641 5605
5642 /* 5606 /*
5643 * On ILK+ LUT must be loaded before the pipe is running but with 5607 * On ILK+ LUT must be loaded before the pipe is running but with
@@ -5646,10 +5610,10 @@ static void ironlake_crtc_enable(struct intel_crtc_state *pipe_config,
5646 intel_color_load_luts(&pipe_config->base); 5610 intel_color_load_luts(&pipe_config->base);
5647 5611
5648 if (dev_priv->display.initial_watermarks != NULL) 5612 if (dev_priv->display.initial_watermarks != NULL)
5649 dev_priv->display.initial_watermarks(old_intel_state, intel_crtc->config); 5613 dev_priv->display.initial_watermarks(old_intel_state, pipe_config);
5650 intel_enable_pipe(pipe_config); 5614 intel_enable_pipe(pipe_config);
5651 5615
5652 if (intel_crtc->config->has_pch_encoder) 5616 if (pipe_config->has_pch_encoder)
5653 ironlake_pch_enable(old_intel_state, pipe_config); 5617 ironlake_pch_enable(old_intel_state, pipe_config);
5654 5618
5655 assert_vblank_disabled(crtc); 5619 assert_vblank_disabled(crtc);
@@ -5666,7 +5630,7 @@ static void ironlake_crtc_enable(struct intel_crtc_state *pipe_config,
5666 * some interlaced HDMI modes. Let's do the double wait always 5630 * some interlaced HDMI modes. Let's do the double wait always
5667 * in case there are more corner cases we don't know about. 5631 * in case there are more corner cases we don't know about.
5668 */ 5632 */
5669 if (intel_crtc->config->has_pch_encoder) { 5633 if (pipe_config->has_pch_encoder) {
5670 intel_wait_for_vblank(dev_priv, pipe); 5634 intel_wait_for_vblank(dev_priv, pipe);
5671 intel_wait_for_vblank(dev_priv, pipe); 5635 intel_wait_for_vblank(dev_priv, pipe);
5672 } 5636 }
@@ -5700,10 +5664,9 @@ static void icl_pipe_mbus_enable(struct intel_crtc *crtc)
5700 enum pipe pipe = crtc->pipe; 5664 enum pipe pipe = crtc->pipe;
5701 uint32_t val; 5665 uint32_t val;
5702 5666
5703 val = MBUS_DBOX_BW_CREDIT(1) | MBUS_DBOX_A_CREDIT(2); 5667 val = MBUS_DBOX_A_CREDIT(2);
5704 5668 val |= MBUS_DBOX_BW_CREDIT(1);
5705 /* Program B credit equally to all pipes */ 5669 val |= MBUS_DBOX_B_CREDIT(8);
5706 val |= MBUS_DBOX_B_CREDIT(24 / INTEL_INFO(dev_priv)->num_pipes);
5707 5670
5708 I915_WRITE(PIPE_MBUS_DBOX_CTL(pipe), val); 5671 I915_WRITE(PIPE_MBUS_DBOX_CTL(pipe), val);
5709} 5672}
@@ -5715,7 +5678,7 @@ static void haswell_crtc_enable(struct intel_crtc_state *pipe_config,
5715 struct drm_i915_private *dev_priv = to_i915(crtc->dev); 5678 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
5716 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 5679 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
5717 int pipe = intel_crtc->pipe, hsw_workaround_pipe; 5680 int pipe = intel_crtc->pipe, hsw_workaround_pipe;
5718 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder; 5681 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
5719 struct intel_atomic_state *old_intel_state = 5682 struct intel_atomic_state *old_intel_state =
5720 to_intel_atomic_state(old_state); 5683 to_intel_atomic_state(old_state);
5721 bool psl_clkgate_wa; 5684 bool psl_clkgate_wa;
@@ -5726,37 +5689,37 @@ static void haswell_crtc_enable(struct intel_crtc_state *pipe_config,
5726 5689
5727 intel_encoders_pre_pll_enable(crtc, pipe_config, old_state); 5690 intel_encoders_pre_pll_enable(crtc, pipe_config, old_state);
5728 5691
5729 if (intel_crtc->config->shared_dpll) 5692 if (pipe_config->shared_dpll)
5730 intel_enable_shared_dpll(intel_crtc); 5693 intel_enable_shared_dpll(pipe_config);
5731 5694
5732 if (INTEL_GEN(dev_priv) >= 11) 5695 if (INTEL_GEN(dev_priv) >= 11)
5733 icl_map_plls_to_ports(crtc, pipe_config, old_state); 5696 icl_map_plls_to_ports(crtc, pipe_config, old_state);
5734 5697
5735 intel_encoders_pre_enable(crtc, pipe_config, old_state); 5698 intel_encoders_pre_enable(crtc, pipe_config, old_state);
5736 5699
5737 if (intel_crtc_has_dp_encoder(intel_crtc->config)) 5700 if (intel_crtc_has_dp_encoder(pipe_config))
5738 intel_dp_set_m_n(intel_crtc, M1_N1); 5701 intel_dp_set_m_n(pipe_config, M1_N1);
5739 5702
5740 if (!transcoder_is_dsi(cpu_transcoder)) 5703 if (!transcoder_is_dsi(cpu_transcoder))
5741 intel_set_pipe_timings(intel_crtc); 5704 intel_set_pipe_timings(pipe_config);
5742 5705
5743 intel_set_pipe_src_size(intel_crtc); 5706 intel_set_pipe_src_size(pipe_config);
5744 5707
5745 if (cpu_transcoder != TRANSCODER_EDP && 5708 if (cpu_transcoder != TRANSCODER_EDP &&
5746 !transcoder_is_dsi(cpu_transcoder)) { 5709 !transcoder_is_dsi(cpu_transcoder)) {
5747 I915_WRITE(PIPE_MULT(cpu_transcoder), 5710 I915_WRITE(PIPE_MULT(cpu_transcoder),
5748 intel_crtc->config->pixel_multiplier - 1); 5711 pipe_config->pixel_multiplier - 1);
5749 } 5712 }
5750 5713
5751 if (intel_crtc->config->has_pch_encoder) { 5714 if (pipe_config->has_pch_encoder) {
5752 intel_cpu_transcoder_set_m_n(intel_crtc, 5715 intel_cpu_transcoder_set_m_n(pipe_config,
5753 &intel_crtc->config->fdi_m_n, NULL); 5716 &pipe_config->fdi_m_n, NULL);
5754 } 5717 }
5755 5718
5756 if (!transcoder_is_dsi(cpu_transcoder)) 5719 if (!transcoder_is_dsi(cpu_transcoder))
5757 haswell_set_pipeconf(crtc); 5720 haswell_set_pipeconf(pipe_config);
5758 5721
5759 haswell_set_pipemisc(crtc); 5722 haswell_set_pipemisc(pipe_config);
5760 5723
5761 intel_color_set_csc(&pipe_config->base); 5724 intel_color_set_csc(&pipe_config->base);
5762 5725
@@ -5764,14 +5727,14 @@ static void haswell_crtc_enable(struct intel_crtc_state *pipe_config,
5764 5727
5765 /* Display WA #1180: WaDisableScalarClockGating: glk, cnl */ 5728 /* Display WA #1180: WaDisableScalarClockGating: glk, cnl */
5766 psl_clkgate_wa = (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv)) && 5729 psl_clkgate_wa = (IS_GEMINILAKE(dev_priv) || IS_CANNONLAKE(dev_priv)) &&
5767 intel_crtc->config->pch_pfit.enabled; 5730 pipe_config->pch_pfit.enabled;
5768 if (psl_clkgate_wa) 5731 if (psl_clkgate_wa)
5769 glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true); 5732 glk_pipe_scaler_clock_gating_wa(dev_priv, pipe, true);
5770 5733
5771 if (INTEL_GEN(dev_priv) >= 9) 5734 if (INTEL_GEN(dev_priv) >= 9)
5772 skylake_pfit_enable(intel_crtc); 5735 skylake_pfit_enable(pipe_config);
5773 else 5736 else
5774 ironlake_pfit_enable(intel_crtc); 5737 ironlake_pfit_enable(pipe_config);
5775 5738
5776 /* 5739 /*
5777 * On ILK+ LUT must be loaded before the pipe is running but with 5740 * On ILK+ LUT must be loaded before the pipe is running but with
@@ -5804,10 +5767,10 @@ static void haswell_crtc_enable(struct intel_crtc_state *pipe_config,
5804 if (!transcoder_is_dsi(cpu_transcoder)) 5767 if (!transcoder_is_dsi(cpu_transcoder))
5805 intel_enable_pipe(pipe_config); 5768 intel_enable_pipe(pipe_config);
5806 5769
5807 if (intel_crtc->config->has_pch_encoder) 5770 if (pipe_config->has_pch_encoder)
5808 lpt_pch_enable(old_intel_state, pipe_config); 5771 lpt_pch_enable(old_intel_state, pipe_config);
5809 5772
5810 if (intel_crtc_has_type(intel_crtc->config, INTEL_OUTPUT_DP_MST)) 5773 if (intel_crtc_has_type(pipe_config, INTEL_OUTPUT_DP_MST))
5811 intel_ddi_set_vc_payload_alloc(pipe_config, true); 5774 intel_ddi_set_vc_payload_alloc(pipe_config, true);
5812 5775
5813 assert_vblank_disabled(crtc); 5776 assert_vblank_disabled(crtc);
@@ -5829,15 +5792,15 @@ static void haswell_crtc_enable(struct intel_crtc_state *pipe_config,
5829 } 5792 }
5830} 5793}
5831 5794
5832static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force) 5795static void ironlake_pfit_disable(const struct intel_crtc_state *old_crtc_state)
5833{ 5796{
5834 struct drm_device *dev = crtc->base.dev; 5797 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
5835 struct drm_i915_private *dev_priv = to_i915(dev); 5798 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
5836 int pipe = crtc->pipe; 5799 enum pipe pipe = crtc->pipe;
5837 5800
5838 /* To avoid upsetting the power well on haswell only disable the pfit if 5801 /* To avoid upsetting the power well on haswell only disable the pfit if
5839 * it's in use. The hw state code will make sure we get this right. */ 5802 * it's in use. The hw state code will make sure we get this right. */
5840 if (force || crtc->config->pch_pfit.enabled) { 5803 if (old_crtc_state->pch_pfit.enabled) {
5841 I915_WRITE(PF_CTL(pipe), 0); 5804 I915_WRITE(PF_CTL(pipe), 0);
5842 I915_WRITE(PF_WIN_POS(pipe), 0); 5805 I915_WRITE(PF_WIN_POS(pipe), 0);
5843 I915_WRITE(PF_WIN_SZ(pipe), 0); 5806 I915_WRITE(PF_WIN_SZ(pipe), 0);
@@ -5868,14 +5831,14 @@ static void ironlake_crtc_disable(struct intel_crtc_state *old_crtc_state,
5868 5831
5869 intel_disable_pipe(old_crtc_state); 5832 intel_disable_pipe(old_crtc_state);
5870 5833
5871 ironlake_pfit_disable(intel_crtc, false); 5834 ironlake_pfit_disable(old_crtc_state);
5872 5835
5873 if (intel_crtc->config->has_pch_encoder) 5836 if (old_crtc_state->has_pch_encoder)
5874 ironlake_fdi_disable(crtc); 5837 ironlake_fdi_disable(crtc);
5875 5838
5876 intel_encoders_post_disable(crtc, old_crtc_state, old_state); 5839 intel_encoders_post_disable(crtc, old_crtc_state, old_state);
5877 5840
5878 if (intel_crtc->config->has_pch_encoder) { 5841 if (old_crtc_state->has_pch_encoder) {
5879 ironlake_disable_pch_transcoder(dev_priv, pipe); 5842 ironlake_disable_pch_transcoder(dev_priv, pipe);
5880 5843
5881 if (HAS_PCH_CPT(dev_priv)) { 5844 if (HAS_PCH_CPT(dev_priv)) {
@@ -5929,21 +5892,22 @@ static void haswell_crtc_disable(struct intel_crtc_state *old_crtc_state,
5929 if (INTEL_GEN(dev_priv) >= 9) 5892 if (INTEL_GEN(dev_priv) >= 9)
5930 skylake_scaler_disable(intel_crtc); 5893 skylake_scaler_disable(intel_crtc);
5931 else 5894 else
5932 ironlake_pfit_disable(intel_crtc, false); 5895 ironlake_pfit_disable(old_crtc_state);
5933 5896
5934 intel_encoders_post_disable(crtc, old_crtc_state, old_state); 5897 intel_encoders_post_disable(crtc, old_crtc_state, old_state);
5935 5898
5936 if (INTEL_GEN(dev_priv) >= 11) 5899 if (INTEL_GEN(dev_priv) >= 11)
5937 icl_unmap_plls_to_ports(crtc, old_crtc_state, old_state); 5900 icl_unmap_plls_to_ports(crtc, old_crtc_state, old_state);
5901
5902 intel_encoders_post_pll_disable(crtc, old_crtc_state, old_state);
5938} 5903}
5939 5904
5940static void i9xx_pfit_enable(struct intel_crtc *crtc) 5905static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state)
5941{ 5906{
5942 struct drm_device *dev = crtc->base.dev; 5907 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
5943 struct drm_i915_private *dev_priv = to_i915(dev); 5908 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
5944 struct intel_crtc_state *pipe_config = crtc->config;
5945 5909
5946 if (!pipe_config->gmch_pfit.control) 5910 if (!crtc_state->gmch_pfit.control)
5947 return; 5911 return;
5948 5912
5949 /* 5913 /*
@@ -5953,8 +5917,8 @@ static void i9xx_pfit_enable(struct intel_crtc *crtc)
5953 WARN_ON(I915_READ(PFIT_CONTROL) & PFIT_ENABLE); 5917 WARN_ON(I915_READ(PFIT_CONTROL) & PFIT_ENABLE);
5954 assert_pipe_disabled(dev_priv, crtc->pipe); 5918 assert_pipe_disabled(dev_priv, crtc->pipe);
5955 5919
5956 I915_WRITE(PFIT_PGM_RATIOS, pipe_config->gmch_pfit.pgm_ratios); 5920 I915_WRITE(PFIT_PGM_RATIOS, crtc_state->gmch_pfit.pgm_ratios);
5957 I915_WRITE(PFIT_CONTROL, pipe_config->gmch_pfit.control); 5921 I915_WRITE(PFIT_CONTROL, crtc_state->gmch_pfit.control);
5958 5922
5959 /* Border color in case we don't scale up to the full screen. Black by 5923 /* Border color in case we don't scale up to the full screen. Black by
5960 * default, change to something else for debugging. */ 5924 * default, change to something else for debugging. */
@@ -6009,6 +5973,28 @@ enum intel_display_power_domain intel_port_to_power_domain(enum port port)
6009 } 5973 }
6010} 5974}
6011 5975
5976enum intel_display_power_domain
5977intel_aux_power_domain(struct intel_digital_port *dig_port)
5978{
5979 switch (dig_port->aux_ch) {
5980 case AUX_CH_A:
5981 return POWER_DOMAIN_AUX_A;
5982 case AUX_CH_B:
5983 return POWER_DOMAIN_AUX_B;
5984 case AUX_CH_C:
5985 return POWER_DOMAIN_AUX_C;
5986 case AUX_CH_D:
5987 return POWER_DOMAIN_AUX_D;
5988 case AUX_CH_E:
5989 return POWER_DOMAIN_AUX_E;
5990 case AUX_CH_F:
5991 return POWER_DOMAIN_AUX_F;
5992 default:
5993 MISSING_CASE(dig_port->aux_ch);
5994 return POWER_DOMAIN_AUX_A;
5995 }
5996}
5997
6012static u64 get_crtc_power_domains(struct drm_crtc *crtc, 5998static u64 get_crtc_power_domains(struct drm_crtc *crtc,
6013 struct intel_crtc_state *crtc_state) 5999 struct intel_crtc_state *crtc_state)
6014{ 6000{
@@ -6088,20 +6074,18 @@ static void valleyview_crtc_enable(struct intel_crtc_state *pipe_config,
6088 if (WARN_ON(intel_crtc->active)) 6074 if (WARN_ON(intel_crtc->active))
6089 return; 6075 return;
6090 6076
6091 if (intel_crtc_has_dp_encoder(intel_crtc->config)) 6077 if (intel_crtc_has_dp_encoder(pipe_config))
6092 intel_dp_set_m_n(intel_crtc, M1_N1); 6078 intel_dp_set_m_n(pipe_config, M1_N1);
6093 6079
6094 intel_set_pipe_timings(intel_crtc); 6080 intel_set_pipe_timings(pipe_config);
6095 intel_set_pipe_src_size(intel_crtc); 6081 intel_set_pipe_src_size(pipe_config);
6096 6082
6097 if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) { 6083 if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {
6098 struct drm_i915_private *dev_priv = to_i915(dev);
6099
6100 I915_WRITE(CHV_BLEND(pipe), CHV_BLEND_LEGACY); 6084 I915_WRITE(CHV_BLEND(pipe), CHV_BLEND_LEGACY);
6101 I915_WRITE(CHV_CANVAS(pipe), 0); 6085 I915_WRITE(CHV_CANVAS(pipe), 0);
6102 } 6086 }
6103 6087
6104 i9xx_set_pipeconf(intel_crtc); 6088 i9xx_set_pipeconf(pipe_config);
6105 6089
6106 intel_color_set_csc(&pipe_config->base); 6090 intel_color_set_csc(&pipe_config->base);
6107 6091
@@ -6112,16 +6096,16 @@ static void valleyview_crtc_enable(struct intel_crtc_state *pipe_config,
6112 intel_encoders_pre_pll_enable(crtc, pipe_config, old_state); 6096 intel_encoders_pre_pll_enable(crtc, pipe_config, old_state);
6113 6097
6114 if (IS_CHERRYVIEW(dev_priv)) { 6098 if (IS_CHERRYVIEW(dev_priv)) {
6115 chv_prepare_pll(intel_crtc, intel_crtc->config); 6099 chv_prepare_pll(intel_crtc, pipe_config);
6116 chv_enable_pll(intel_crtc, intel_crtc->config); 6100 chv_enable_pll(intel_crtc, pipe_config);
6117 } else { 6101 } else {
6118 vlv_prepare_pll(intel_crtc, intel_crtc->config); 6102 vlv_prepare_pll(intel_crtc, pipe_config);
6119 vlv_enable_pll(intel_crtc, intel_crtc->config); 6103 vlv_enable_pll(intel_crtc, pipe_config);
6120 } 6104 }
6121 6105
6122 intel_encoders_pre_enable(crtc, pipe_config, old_state); 6106 intel_encoders_pre_enable(crtc, pipe_config, old_state);
6123 6107
6124 i9xx_pfit_enable(intel_crtc); 6108 i9xx_pfit_enable(pipe_config);
6125 6109
6126 intel_color_load_luts(&pipe_config->base); 6110 intel_color_load_luts(&pipe_config->base);
6127 6111
@@ -6135,13 +6119,13 @@ static void valleyview_crtc_enable(struct intel_crtc_state *pipe_config,
6135 intel_encoders_enable(crtc, pipe_config, old_state); 6119 intel_encoders_enable(crtc, pipe_config, old_state);
6136} 6120}
6137 6121
6138static void i9xx_set_pll_dividers(struct intel_crtc *crtc) 6122static void i9xx_set_pll_dividers(const struct intel_crtc_state *crtc_state)
6139{ 6123{
6140 struct drm_device *dev = crtc->base.dev; 6124 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
6141 struct drm_i915_private *dev_priv = to_i915(dev); 6125 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
6142 6126
6143 I915_WRITE(FP0(crtc->pipe), crtc->config->dpll_hw_state.fp0); 6127 I915_WRITE(FP0(crtc->pipe), crtc_state->dpll_hw_state.fp0);
6144 I915_WRITE(FP1(crtc->pipe), crtc->config->dpll_hw_state.fp1); 6128 I915_WRITE(FP1(crtc->pipe), crtc_state->dpll_hw_state.fp1);
6145} 6129}
6146 6130
6147static void i9xx_crtc_enable(struct intel_crtc_state *pipe_config, 6131static void i9xx_crtc_enable(struct intel_crtc_state *pipe_config,
@@ -6158,15 +6142,15 @@ static void i9xx_crtc_enable(struct intel_crtc_state *pipe_config,
6158 if (WARN_ON(intel_crtc->active)) 6142 if (WARN_ON(intel_crtc->active))
6159 return; 6143 return;
6160 6144
6161 i9xx_set_pll_dividers(intel_crtc); 6145 i9xx_set_pll_dividers(pipe_config);
6162 6146
6163 if (intel_crtc_has_dp_encoder(intel_crtc->config)) 6147 if (intel_crtc_has_dp_encoder(pipe_config))
6164 intel_dp_set_m_n(intel_crtc, M1_N1); 6148 intel_dp_set_m_n(pipe_config, M1_N1);
6165 6149
6166 intel_set_pipe_timings(intel_crtc); 6150 intel_set_pipe_timings(pipe_config);
6167 intel_set_pipe_src_size(intel_crtc); 6151 intel_set_pipe_src_size(pipe_config);
6168 6152
6169 i9xx_set_pipeconf(intel_crtc); 6153 i9xx_set_pipeconf(pipe_config);
6170 6154
6171 intel_crtc->active = true; 6155 intel_crtc->active = true;
6172 6156
@@ -6177,13 +6161,13 @@ static void i9xx_crtc_enable(struct intel_crtc_state *pipe_config,
6177 6161
6178 i9xx_enable_pll(intel_crtc, pipe_config); 6162 i9xx_enable_pll(intel_crtc, pipe_config);
6179 6163
6180 i9xx_pfit_enable(intel_crtc); 6164 i9xx_pfit_enable(pipe_config);
6181 6165
6182 intel_color_load_luts(&pipe_config->base); 6166 intel_color_load_luts(&pipe_config->base);
6183 6167
6184 if (dev_priv->display.initial_watermarks != NULL) 6168 if (dev_priv->display.initial_watermarks != NULL)
6185 dev_priv->display.initial_watermarks(old_intel_state, 6169 dev_priv->display.initial_watermarks(old_intel_state,
6186 intel_crtc->config); 6170 pipe_config);
6187 else 6171 else
6188 intel_update_watermarks(intel_crtc); 6172 intel_update_watermarks(intel_crtc);
6189 intel_enable_pipe(pipe_config); 6173 intel_enable_pipe(pipe_config);
@@ -6194,12 +6178,12 @@ static void i9xx_crtc_enable(struct intel_crtc_state *pipe_config,
6194 intel_encoders_enable(crtc, pipe_config, old_state); 6178 intel_encoders_enable(crtc, pipe_config, old_state);
6195} 6179}
6196 6180
6197static void i9xx_pfit_disable(struct intel_crtc *crtc) 6181static void i9xx_pfit_disable(const struct intel_crtc_state *old_crtc_state)
6198{ 6182{
6199 struct drm_device *dev = crtc->base.dev; 6183 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
6200 struct drm_i915_private *dev_priv = to_i915(dev); 6184 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
6201 6185
6202 if (!crtc->config->gmch_pfit.control) 6186 if (!old_crtc_state->gmch_pfit.control)
6203 return; 6187 return;
6204 6188
6205 assert_pipe_disabled(dev_priv, crtc->pipe); 6189 assert_pipe_disabled(dev_priv, crtc->pipe);
@@ -6232,17 +6216,17 @@ static void i9xx_crtc_disable(struct intel_crtc_state *old_crtc_state,
6232 6216
6233 intel_disable_pipe(old_crtc_state); 6217 intel_disable_pipe(old_crtc_state);
6234 6218
6235 i9xx_pfit_disable(intel_crtc); 6219 i9xx_pfit_disable(old_crtc_state);
6236 6220
6237 intel_encoders_post_disable(crtc, old_crtc_state, old_state); 6221 intel_encoders_post_disable(crtc, old_crtc_state, old_state);
6238 6222
6239 if (!intel_crtc_has_type(intel_crtc->config, INTEL_OUTPUT_DSI)) { 6223 if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DSI)) {
6240 if (IS_CHERRYVIEW(dev_priv)) 6224 if (IS_CHERRYVIEW(dev_priv))
6241 chv_disable_pll(dev_priv, pipe); 6225 chv_disable_pll(dev_priv, pipe);
6242 else if (IS_VALLEYVIEW(dev_priv)) 6226 else if (IS_VALLEYVIEW(dev_priv))
6243 vlv_disable_pll(dev_priv, pipe); 6227 vlv_disable_pll(dev_priv, pipe);
6244 else 6228 else
6245 i9xx_disable_pll(intel_crtc); 6229 i9xx_disable_pll(old_crtc_state);
6246 } 6230 }
6247 6231
6248 intel_encoders_post_pll_disable(crtc, old_crtc_state, old_state); 6232 intel_encoders_post_pll_disable(crtc, old_crtc_state, old_state);
@@ -6316,7 +6300,7 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc,
6316 6300
6317 intel_fbc_disable(intel_crtc); 6301 intel_fbc_disable(intel_crtc);
6318 intel_update_watermarks(intel_crtc); 6302 intel_update_watermarks(intel_crtc);
6319 intel_disable_shared_dpll(intel_crtc); 6303 intel_disable_shared_dpll(to_intel_crtc_state(crtc->state));
6320 6304
6321 domains = intel_crtc->enabled_power_domains; 6305 domains = intel_crtc->enabled_power_domains;
6322 for_each_power_domain(domain, domains) 6306 for_each_power_domain(domain, domains)
@@ -6394,66 +6378,6 @@ static void intel_connector_verify_state(struct drm_crtc_state *crtc_state,
6394 } 6378 }
6395} 6379}
6396 6380
6397int intel_connector_init(struct intel_connector *connector)
6398{
6399 struct intel_digital_connector_state *conn_state;
6400
6401 /*
6402 * Allocate enough memory to hold intel_digital_connector_state,
6403 * This might be a few bytes too many, but for connectors that don't
6404 * need it we'll free the state and allocate a smaller one on the first
6405 * succesful commit anyway.
6406 */
6407 conn_state = kzalloc(sizeof(*conn_state), GFP_KERNEL);
6408 if (!conn_state)
6409 return -ENOMEM;
6410
6411 __drm_atomic_helper_connector_reset(&connector->base,
6412 &conn_state->base);
6413
6414 return 0;
6415}
6416
6417struct intel_connector *intel_connector_alloc(void)
6418{
6419 struct intel_connector *connector;
6420
6421 connector = kzalloc(sizeof *connector, GFP_KERNEL);
6422 if (!connector)
6423 return NULL;
6424
6425 if (intel_connector_init(connector) < 0) {
6426 kfree(connector);
6427 return NULL;
6428 }
6429
6430 return connector;
6431}
6432
6433/*
6434 * Free the bits allocated by intel_connector_alloc.
6435 * This should only be used after intel_connector_alloc has returned
6436 * successfully, and before drm_connector_init returns successfully.
6437 * Otherwise the destroy callbacks for the connector and the state should
6438 * take care of proper cleanup/free
6439 */
6440void intel_connector_free(struct intel_connector *connector)
6441{
6442 kfree(to_intel_digital_connector_state(connector->base.state));
6443 kfree(connector);
6444}
6445
6446/* Simple connector->get_hw_state implementation for encoders that support only
6447 * one connector and no cloning and hence the encoder state determines the state
6448 * of the connector. */
6449bool intel_connector_get_hw_state(struct intel_connector *connector)
6450{
6451 enum pipe pipe = 0;
6452 struct intel_encoder *encoder = connector->encoder;
6453
6454 return encoder->get_hw_state(encoder, &pipe);
6455}
6456
6457static int pipe_required_fdi_lanes(struct intel_crtc_state *crtc_state) 6381static int pipe_required_fdi_lanes(struct intel_crtc_state *crtc_state)
6458{ 6382{
6459 if (crtc_state->base.enable && crtc_state->has_pch_encoder) 6383 if (crtc_state->base.enable && crtc_state->has_pch_encoder)
@@ -6564,6 +6488,9 @@ retry:
6564 link_bw, &pipe_config->fdi_m_n, false); 6488 link_bw, &pipe_config->fdi_m_n, false);
6565 6489
6566 ret = ironlake_check_fdi_lanes(dev, intel_crtc->pipe, pipe_config); 6490 ret = ironlake_check_fdi_lanes(dev, intel_crtc->pipe, pipe_config);
6491 if (ret == -EDEADLK)
6492 return ret;
6493
6567 if (ret == -EINVAL && pipe_config->pipe_bpp > 6*3) { 6494 if (ret == -EINVAL && pipe_config->pipe_bpp > 6*3) {
6568 pipe_config->pipe_bpp -= 2*3; 6495 pipe_config->pipe_bpp -= 2*3;
6569 DRM_DEBUG_KMS("fdi link bw constraint, reducing pipe bpp to %i\n", 6496 DRM_DEBUG_KMS("fdi link bw constraint, reducing pipe bpp to %i\n",
@@ -6720,7 +6647,9 @@ static int intel_crtc_compute_config(struct intel_crtc *crtc,
6720 return -EINVAL; 6647 return -EINVAL;
6721 } 6648 }
6722 6649
6723 if (pipe_config->ycbcr420 && pipe_config->base.ctm) { 6650 if ((pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
6651 pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR444) &&
6652 pipe_config->base.ctm) {
6724 /* 6653 /*
6725 * There is only one pipe CSC unit per pipe, and we need that 6654 * There is only one pipe CSC unit per pipe, and we need that
6726 * for output conversion from RGB->YCBCR. So if CTM is already 6655 * for output conversion from RGB->YCBCR. So if CTM is already
@@ -6886,12 +6815,12 @@ static void vlv_pllb_recal_opamp(struct drm_i915_private *dev_priv, enum pipe
6886 vlv_dpio_write(dev_priv, pipe, VLV_REF_DW13, reg_val); 6815 vlv_dpio_write(dev_priv, pipe, VLV_REF_DW13, reg_val);
6887} 6816}
6888 6817
6889static void intel_pch_transcoder_set_m_n(struct intel_crtc *crtc, 6818static void intel_pch_transcoder_set_m_n(const struct intel_crtc_state *crtc_state,
6890 struct intel_link_m_n *m_n) 6819 const struct intel_link_m_n *m_n)
6891{ 6820{
6892 struct drm_device *dev = crtc->base.dev; 6821 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
6893 struct drm_i915_private *dev_priv = to_i915(dev); 6822 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
6894 int pipe = crtc->pipe; 6823 enum pipe pipe = crtc->pipe;
6895 6824
6896 I915_WRITE(PCH_TRANS_DATA_M1(pipe), TU_SIZE(m_n->tu) | m_n->gmch_m); 6825 I915_WRITE(PCH_TRANS_DATA_M1(pipe), TU_SIZE(m_n->tu) | m_n->gmch_m);
6897 I915_WRITE(PCH_TRANS_DATA_N1(pipe), m_n->gmch_n); 6826 I915_WRITE(PCH_TRANS_DATA_N1(pipe), m_n->gmch_n);
@@ -6899,25 +6828,39 @@ static void intel_pch_transcoder_set_m_n(struct intel_crtc *crtc,
6899 I915_WRITE(PCH_TRANS_LINK_N1(pipe), m_n->link_n); 6828 I915_WRITE(PCH_TRANS_LINK_N1(pipe), m_n->link_n);
6900} 6829}
6901 6830
6902static void intel_cpu_transcoder_set_m_n(struct intel_crtc *crtc, 6831static bool transcoder_has_m2_n2(struct drm_i915_private *dev_priv,
6903 struct intel_link_m_n *m_n, 6832 enum transcoder transcoder)
6904 struct intel_link_m_n *m2_n2)
6905{ 6833{
6834 if (IS_HASWELL(dev_priv))
6835 return transcoder == TRANSCODER_EDP;
6836
6837 /*
6838 * Strictly speaking some registers are available before
6839 * gen7, but we only support DRRS on gen7+
6840 */
6841 return IS_GEN7(dev_priv) || IS_CHERRYVIEW(dev_priv);
6842}
6843
6844static void intel_cpu_transcoder_set_m_n(const struct intel_crtc_state *crtc_state,
6845 const struct intel_link_m_n *m_n,
6846 const struct intel_link_m_n *m2_n2)
6847{
6848 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
6906 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 6849 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
6907 int pipe = crtc->pipe; 6850 enum pipe pipe = crtc->pipe;
6908 enum transcoder transcoder = crtc->config->cpu_transcoder; 6851 enum transcoder transcoder = crtc_state->cpu_transcoder;
6909 6852
6910 if (INTEL_GEN(dev_priv) >= 5) { 6853 if (INTEL_GEN(dev_priv) >= 5) {
6911 I915_WRITE(PIPE_DATA_M1(transcoder), TU_SIZE(m_n->tu) | m_n->gmch_m); 6854 I915_WRITE(PIPE_DATA_M1(transcoder), TU_SIZE(m_n->tu) | m_n->gmch_m);
6912 I915_WRITE(PIPE_DATA_N1(transcoder), m_n->gmch_n); 6855 I915_WRITE(PIPE_DATA_N1(transcoder), m_n->gmch_n);
6913 I915_WRITE(PIPE_LINK_M1(transcoder), m_n->link_m); 6856 I915_WRITE(PIPE_LINK_M1(transcoder), m_n->link_m);
6914 I915_WRITE(PIPE_LINK_N1(transcoder), m_n->link_n); 6857 I915_WRITE(PIPE_LINK_N1(transcoder), m_n->link_n);
6915 /* M2_N2 registers to be set only for gen < 8 (M2_N2 available 6858 /*
6916 * for gen < 8) and if DRRS is supported (to make sure the 6859 * M2_N2 registers are set only if DRRS is supported
6917 * registers are not unnecessarily accessed). 6860 * (to make sure the registers are not unnecessarily accessed).
6918 */ 6861 */
6919 if (m2_n2 && (IS_CHERRYVIEW(dev_priv) || 6862 if (m2_n2 && crtc_state->has_drrs &&
6920 INTEL_GEN(dev_priv) < 8) && crtc->config->has_drrs) { 6863 transcoder_has_m2_n2(dev_priv, transcoder)) {
6921 I915_WRITE(PIPE_DATA_M2(transcoder), 6864 I915_WRITE(PIPE_DATA_M2(transcoder),
6922 TU_SIZE(m2_n2->tu) | m2_n2->gmch_m); 6865 TU_SIZE(m2_n2->tu) | m2_n2->gmch_m);
6923 I915_WRITE(PIPE_DATA_N2(transcoder), m2_n2->gmch_n); 6866 I915_WRITE(PIPE_DATA_N2(transcoder), m2_n2->gmch_n);
@@ -6932,29 +6875,29 @@ static void intel_cpu_transcoder_set_m_n(struct intel_crtc *crtc,
6932 } 6875 }
6933} 6876}
6934 6877
6935void intel_dp_set_m_n(struct intel_crtc *crtc, enum link_m_n_set m_n) 6878void intel_dp_set_m_n(const struct intel_crtc_state *crtc_state, enum link_m_n_set m_n)
6936{ 6879{
6937 struct intel_link_m_n *dp_m_n, *dp_m2_n2 = NULL; 6880 const struct intel_link_m_n *dp_m_n, *dp_m2_n2 = NULL;
6938 6881
6939 if (m_n == M1_N1) { 6882 if (m_n == M1_N1) {
6940 dp_m_n = &crtc->config->dp_m_n; 6883 dp_m_n = &crtc_state->dp_m_n;
6941 dp_m2_n2 = &crtc->config->dp_m2_n2; 6884 dp_m2_n2 = &crtc_state->dp_m2_n2;
6942 } else if (m_n == M2_N2) { 6885 } else if (m_n == M2_N2) {
6943 6886
6944 /* 6887 /*
6945 * M2_N2 registers are not supported. Hence m2_n2 divider value 6888 * M2_N2 registers are not supported. Hence m2_n2 divider value
6946 * needs to be programmed into M1_N1. 6889 * needs to be programmed into M1_N1.
6947 */ 6890 */
6948 dp_m_n = &crtc->config->dp_m2_n2; 6891 dp_m_n = &crtc_state->dp_m2_n2;
6949 } else { 6892 } else {
6950 DRM_ERROR("Unsupported divider value\n"); 6893 DRM_ERROR("Unsupported divider value\n");
6951 return; 6894 return;
6952 } 6895 }
6953 6896
6954 if (crtc->config->has_pch_encoder) 6897 if (crtc_state->has_pch_encoder)
6955 intel_pch_transcoder_set_m_n(crtc, &crtc->config->dp_m_n); 6898 intel_pch_transcoder_set_m_n(crtc_state, &crtc_state->dp_m_n);
6956 else 6899 else
6957 intel_cpu_transcoder_set_m_n(crtc, dp_m_n, dp_m2_n2); 6900 intel_cpu_transcoder_set_m_n(crtc_state, dp_m_n, dp_m2_n2);
6958} 6901}
6959 6902
6960static void vlv_compute_dpll(struct intel_crtc *crtc, 6903static void vlv_compute_dpll(struct intel_crtc *crtc,
@@ -7053,8 +6996,8 @@ static void vlv_prepare_pll(struct intel_crtc *crtc,
7053 6996
7054 /* Set HBR and RBR LPF coefficients */ 6997 /* Set HBR and RBR LPF coefficients */
7055 if (pipe_config->port_clock == 162000 || 6998 if (pipe_config->port_clock == 162000 ||
7056 intel_crtc_has_type(crtc->config, INTEL_OUTPUT_ANALOG) || 6999 intel_crtc_has_type(pipe_config, INTEL_OUTPUT_ANALOG) ||
7057 intel_crtc_has_type(crtc->config, INTEL_OUTPUT_HDMI)) 7000 intel_crtc_has_type(pipe_config, INTEL_OUTPUT_HDMI))
7058 vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW10(pipe), 7001 vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW10(pipe),
7059 0x009f0003); 7002 0x009f0003);
7060 else 7003 else
@@ -7081,7 +7024,7 @@ static void vlv_prepare_pll(struct intel_crtc *crtc,
7081 7024
7082 coreclk = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW7(pipe)); 7025 coreclk = vlv_dpio_read(dev_priv, pipe, VLV_PLL_DW7(pipe));
7083 coreclk = (coreclk & 0x0000ff00) | 0x01c00000; 7026 coreclk = (coreclk & 0x0000ff00) | 0x01c00000;
7084 if (intel_crtc_has_dp_encoder(crtc->config)) 7027 if (intel_crtc_has_dp_encoder(pipe_config))
7085 coreclk |= 0x01000000; 7028 coreclk |= 0x01000000;
7086 vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW7(pipe), coreclk); 7029 vlv_dpio_write(dev_priv, pipe, VLV_PLL_DW7(pipe), coreclk);
7087 7030
@@ -7360,12 +7303,13 @@ static void i8xx_compute_dpll(struct intel_crtc *crtc,
7360 crtc_state->dpll_hw_state.dpll = dpll; 7303 crtc_state->dpll_hw_state.dpll = dpll;
7361} 7304}
7362 7305
7363static void intel_set_pipe_timings(struct intel_crtc *intel_crtc) 7306static void intel_set_pipe_timings(const struct intel_crtc_state *crtc_state)
7364{ 7307{
7365 struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev); 7308 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
7366 enum pipe pipe = intel_crtc->pipe; 7309 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
7367 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder; 7310 enum pipe pipe = crtc->pipe;
7368 const struct drm_display_mode *adjusted_mode = &intel_crtc->config->base.adjusted_mode; 7311 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
7312 const struct drm_display_mode *adjusted_mode = &crtc_state->base.adjusted_mode;
7369 uint32_t crtc_vtotal, crtc_vblank_end; 7313 uint32_t crtc_vtotal, crtc_vblank_end;
7370 int vsyncshift = 0; 7314 int vsyncshift = 0;
7371 7315
@@ -7379,7 +7323,7 @@ static void intel_set_pipe_timings(struct intel_crtc *intel_crtc)
7379 crtc_vtotal -= 1; 7323 crtc_vtotal -= 1;
7380 crtc_vblank_end -= 1; 7324 crtc_vblank_end -= 1;
7381 7325
7382 if (intel_crtc_has_type(intel_crtc->config, INTEL_OUTPUT_SDVO)) 7326 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO))
7383 vsyncshift = (adjusted_mode->crtc_htotal - 1) / 2; 7327 vsyncshift = (adjusted_mode->crtc_htotal - 1) / 2;
7384 else 7328 else
7385 vsyncshift = adjusted_mode->crtc_hsync_start - 7329 vsyncshift = adjusted_mode->crtc_hsync_start -
@@ -7421,18 +7365,18 @@ static void intel_set_pipe_timings(struct intel_crtc *intel_crtc)
7421 7365
7422} 7366}
7423 7367
7424static void intel_set_pipe_src_size(struct intel_crtc *intel_crtc) 7368static void intel_set_pipe_src_size(const struct intel_crtc_state *crtc_state)
7425{ 7369{
7426 struct drm_device *dev = intel_crtc->base.dev; 7370 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
7427 struct drm_i915_private *dev_priv = to_i915(dev); 7371 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
7428 enum pipe pipe = intel_crtc->pipe; 7372 enum pipe pipe = crtc->pipe;
7429 7373
7430 /* pipesrc controls the size that is scaled from, which should 7374 /* pipesrc controls the size that is scaled from, which should
7431 * always be the user's requested size. 7375 * always be the user's requested size.
7432 */ 7376 */
7433 I915_WRITE(PIPESRC(pipe), 7377 I915_WRITE(PIPESRC(pipe),
7434 ((intel_crtc->config->pipe_src_w - 1) << 16) | 7378 ((crtc_state->pipe_src_w - 1) << 16) |
7435 (intel_crtc->config->pipe_src_h - 1)); 7379 (crtc_state->pipe_src_h - 1));
7436} 7380}
7437 7381
7438static void intel_get_pipe_timings(struct intel_crtc *crtc, 7382static void intel_get_pipe_timings(struct intel_crtc *crtc,
@@ -7508,29 +7452,30 @@ void intel_mode_from_pipe_config(struct drm_display_mode *mode,
7508 drm_mode_set_name(mode); 7452 drm_mode_set_name(mode);
7509} 7453}
7510 7454
7511static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc) 7455static void i9xx_set_pipeconf(const struct intel_crtc_state *crtc_state)
7512{ 7456{
7513 struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev); 7457 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
7458 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
7514 uint32_t pipeconf; 7459 uint32_t pipeconf;
7515 7460
7516 pipeconf = 0; 7461 pipeconf = 0;
7517 7462
7518 /* we keep both pipes enabled on 830 */ 7463 /* we keep both pipes enabled on 830 */
7519 if (IS_I830(dev_priv)) 7464 if (IS_I830(dev_priv))
7520 pipeconf |= I915_READ(PIPECONF(intel_crtc->pipe)) & PIPECONF_ENABLE; 7465 pipeconf |= I915_READ(PIPECONF(crtc->pipe)) & PIPECONF_ENABLE;
7521 7466
7522 if (intel_crtc->config->double_wide) 7467 if (crtc_state->double_wide)
7523 pipeconf |= PIPECONF_DOUBLE_WIDE; 7468 pipeconf |= PIPECONF_DOUBLE_WIDE;
7524 7469
7525 /* only g4x and later have fancy bpc/dither controls */ 7470 /* only g4x and later have fancy bpc/dither controls */
7526 if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) || 7471 if (IS_G4X(dev_priv) || IS_VALLEYVIEW(dev_priv) ||
7527 IS_CHERRYVIEW(dev_priv)) { 7472 IS_CHERRYVIEW(dev_priv)) {
7528 /* Bspec claims that we can't use dithering for 30bpp pipes. */ 7473 /* Bspec claims that we can't use dithering for 30bpp pipes. */
7529 if (intel_crtc->config->dither && intel_crtc->config->pipe_bpp != 30) 7474 if (crtc_state->dither && crtc_state->pipe_bpp != 30)
7530 pipeconf |= PIPECONF_DITHER_EN | 7475 pipeconf |= PIPECONF_DITHER_EN |
7531 PIPECONF_DITHER_TYPE_SP; 7476 PIPECONF_DITHER_TYPE_SP;
7532 7477
7533 switch (intel_crtc->config->pipe_bpp) { 7478 switch (crtc_state->pipe_bpp) {
7534 case 18: 7479 case 18:
7535 pipeconf |= PIPECONF_6BPC; 7480 pipeconf |= PIPECONF_6BPC;
7536 break; 7481 break;
@@ -7546,9 +7491,9 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc)
7546 } 7491 }
7547 } 7492 }
7548 7493
7549 if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) { 7494 if (crtc_state->base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) {
7550 if (INTEL_GEN(dev_priv) < 4 || 7495 if (INTEL_GEN(dev_priv) < 4 ||
7551 intel_crtc_has_type(intel_crtc->config, INTEL_OUTPUT_SDVO)) 7496 intel_crtc_has_type(crtc_state, INTEL_OUTPUT_SDVO))
7552 pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION; 7497 pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION;
7553 else 7498 else
7554 pipeconf |= PIPECONF_INTERLACE_W_SYNC_SHIFT; 7499 pipeconf |= PIPECONF_INTERLACE_W_SYNC_SHIFT;
@@ -7556,11 +7501,11 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc)
7556 pipeconf |= PIPECONF_PROGRESSIVE; 7501 pipeconf |= PIPECONF_PROGRESSIVE;
7557 7502
7558 if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) && 7503 if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
7559 intel_crtc->config->limited_color_range) 7504 crtc_state->limited_color_range)
7560 pipeconf |= PIPECONF_COLOR_RANGE_SELECT; 7505 pipeconf |= PIPECONF_COLOR_RANGE_SELECT;
7561 7506
7562 I915_WRITE(PIPECONF(intel_crtc->pipe), pipeconf); 7507 I915_WRITE(PIPECONF(crtc->pipe), pipeconf);
7563 POSTING_READ(PIPECONF(intel_crtc->pipe)); 7508 POSTING_READ(PIPECONF(crtc->pipe));
7564} 7509}
7565 7510
7566static int i8xx_crtc_compute_clock(struct intel_crtc *crtc, 7511static int i8xx_crtc_compute_clock(struct intel_crtc *crtc,
@@ -7843,8 +7788,15 @@ i9xx_get_initial_plane_config(struct intel_crtc *crtc,
7843 plane_config->tiling = I915_TILING_X; 7788 plane_config->tiling = I915_TILING_X;
7844 fb->modifier = I915_FORMAT_MOD_X_TILED; 7789 fb->modifier = I915_FORMAT_MOD_X_TILED;
7845 } 7790 }
7791
7792 if (val & DISPPLANE_ROTATE_180)
7793 plane_config->rotation = DRM_MODE_ROTATE_180;
7846 } 7794 }
7847 7795
7796 if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B &&
7797 val & DISPPLANE_MIRROR)
7798 plane_config->rotation |= DRM_MODE_REFLECT_X;
7799
7848 pixel_format = val & DISPPLANE_PIXFORMAT_MASK; 7800 pixel_format = val & DISPPLANE_PIXFORMAT_MASK;
7849 fourcc = i9xx_format_to_fourcc(pixel_format); 7801 fourcc = i9xx_format_to_fourcc(pixel_format);
7850 fb->format = drm_format_info(fourcc); 7802 fb->format = drm_format_info(fourcc);
@@ -7916,6 +7868,49 @@ static void chv_crtc_clock_get(struct intel_crtc *crtc,
7916 pipe_config->port_clock = chv_calc_dpll_params(refclk, &clock); 7868 pipe_config->port_clock = chv_calc_dpll_params(refclk, &clock);
7917} 7869}
7918 7870
7871static void intel_get_crtc_ycbcr_config(struct intel_crtc *crtc,
7872 struct intel_crtc_state *pipe_config)
7873{
7874 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
7875 enum intel_output_format output = INTEL_OUTPUT_FORMAT_RGB;
7876
7877 pipe_config->lspcon_downsampling = false;
7878
7879 if (IS_BROADWELL(dev_priv) || INTEL_GEN(dev_priv) >= 9) {
7880 u32 tmp = I915_READ(PIPEMISC(crtc->pipe));
7881
7882 if (tmp & PIPEMISC_OUTPUT_COLORSPACE_YUV) {
7883 bool ycbcr420_enabled = tmp & PIPEMISC_YUV420_ENABLE;
7884 bool blend = tmp & PIPEMISC_YUV420_MODE_FULL_BLEND;
7885
7886 if (ycbcr420_enabled) {
7887 /* We support 4:2:0 in full blend mode only */
7888 if (!blend)
7889 output = INTEL_OUTPUT_FORMAT_INVALID;
7890 else if (!(IS_GEMINILAKE(dev_priv) ||
7891 INTEL_GEN(dev_priv) >= 10))
7892 output = INTEL_OUTPUT_FORMAT_INVALID;
7893 else
7894 output = INTEL_OUTPUT_FORMAT_YCBCR420;
7895 } else {
7896 /*
7897 * Currently there is no interface defined to
7898 * check user preference between RGB/YCBCR444
7899 * or YCBCR420. So the only possible case for
7900 * YCBCR444 usage is driving YCBCR420 output
7901 * with LSPCON, when pipe is configured for
7902 * YCBCR444 output and LSPCON takes care of
7903 * downsampling it.
7904 */
7905 pipe_config->lspcon_downsampling = true;
7906 output = INTEL_OUTPUT_FORMAT_YCBCR444;
7907 }
7908 }
7909 }
7910
7911 pipe_config->output_format = output;
7912}
7913
7919static bool i9xx_get_pipe_config(struct intel_crtc *crtc, 7914static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
7920 struct intel_crtc_state *pipe_config) 7915 struct intel_crtc_state *pipe_config)
7921{ 7916{
@@ -7928,6 +7923,7 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
7928 if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) 7923 if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
7929 return false; 7924 return false;
7930 7925
7926 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
7931 pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe; 7927 pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
7932 pipe_config->shared_dpll = NULL; 7928 pipe_config->shared_dpll = NULL;
7933 7929
@@ -8459,16 +8455,16 @@ void intel_init_pch_refclk(struct drm_i915_private *dev_priv)
8459 lpt_init_pch_refclk(dev_priv); 8455 lpt_init_pch_refclk(dev_priv);
8460} 8456}
8461 8457
8462static void ironlake_set_pipeconf(struct drm_crtc *crtc) 8458static void ironlake_set_pipeconf(const struct intel_crtc_state *crtc_state)
8463{ 8459{
8464 struct drm_i915_private *dev_priv = to_i915(crtc->dev); 8460 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
8465 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 8461 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
8466 int pipe = intel_crtc->pipe; 8462 enum pipe pipe = crtc->pipe;
8467 uint32_t val; 8463 uint32_t val;
8468 8464
8469 val = 0; 8465 val = 0;
8470 8466
8471 switch (intel_crtc->config->pipe_bpp) { 8467 switch (crtc_state->pipe_bpp) {
8472 case 18: 8468 case 18:
8473 val |= PIPECONF_6BPC; 8469 val |= PIPECONF_6BPC;
8474 break; 8470 break;
@@ -8486,32 +8482,32 @@ static void ironlake_set_pipeconf(struct drm_crtc *crtc)
8486 BUG(); 8482 BUG();
8487 } 8483 }
8488 8484
8489 if (intel_crtc->config->dither) 8485 if (crtc_state->dither)
8490 val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP); 8486 val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
8491 8487
8492 if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) 8488 if (crtc_state->base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
8493 val |= PIPECONF_INTERLACED_ILK; 8489 val |= PIPECONF_INTERLACED_ILK;
8494 else 8490 else
8495 val |= PIPECONF_PROGRESSIVE; 8491 val |= PIPECONF_PROGRESSIVE;
8496 8492
8497 if (intel_crtc->config->limited_color_range) 8493 if (crtc_state->limited_color_range)
8498 val |= PIPECONF_COLOR_RANGE_SELECT; 8494 val |= PIPECONF_COLOR_RANGE_SELECT;
8499 8495
8500 I915_WRITE(PIPECONF(pipe), val); 8496 I915_WRITE(PIPECONF(pipe), val);
8501 POSTING_READ(PIPECONF(pipe)); 8497 POSTING_READ(PIPECONF(pipe));
8502} 8498}
8503 8499
8504static void haswell_set_pipeconf(struct drm_crtc *crtc) 8500static void haswell_set_pipeconf(const struct intel_crtc_state *crtc_state)
8505{ 8501{
8506 struct drm_i915_private *dev_priv = to_i915(crtc->dev); 8502 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
8507 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 8503 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
8508 enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder; 8504 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
8509 u32 val = 0; 8505 u32 val = 0;
8510 8506
8511 if (IS_HASWELL(dev_priv) && intel_crtc->config->dither) 8507 if (IS_HASWELL(dev_priv) && crtc_state->dither)
8512 val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP); 8508 val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
8513 8509
8514 if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) 8510 if (crtc_state->base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
8515 val |= PIPECONF_INTERLACED_ILK; 8511 val |= PIPECONF_INTERLACED_ILK;
8516 else 8512 else
8517 val |= PIPECONF_PROGRESSIVE; 8513 val |= PIPECONF_PROGRESSIVE;
@@ -8520,16 +8516,15 @@ static void haswell_set_pipeconf(struct drm_crtc *crtc)
8520 POSTING_READ(PIPECONF(cpu_transcoder)); 8516 POSTING_READ(PIPECONF(cpu_transcoder));
8521} 8517}
8522 8518
8523static void haswell_set_pipemisc(struct drm_crtc *crtc) 8519static void haswell_set_pipemisc(const struct intel_crtc_state *crtc_state)
8524{ 8520{
8525 struct drm_i915_private *dev_priv = to_i915(crtc->dev); 8521 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
8526 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 8522 struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
8527 struct intel_crtc_state *config = intel_crtc->config;
8528 8523
8529 if (IS_BROADWELL(dev_priv) || INTEL_GEN(dev_priv) >= 9) { 8524 if (IS_BROADWELL(dev_priv) || INTEL_GEN(dev_priv) >= 9) {
8530 u32 val = 0; 8525 u32 val = 0;
8531 8526
8532 switch (intel_crtc->config->pipe_bpp) { 8527 switch (crtc_state->pipe_bpp) {
8533 case 18: 8528 case 18:
8534 val |= PIPEMISC_DITHER_6_BPC; 8529 val |= PIPEMISC_DITHER_6_BPC;
8535 break; 8530 break;
@@ -8547,14 +8542,16 @@ static void haswell_set_pipemisc(struct drm_crtc *crtc)
8547 BUG(); 8542 BUG();
8548 } 8543 }
8549 8544
8550 if (intel_crtc->config->dither) 8545 if (crtc_state->dither)
8551 val |= PIPEMISC_DITHER_ENABLE | PIPEMISC_DITHER_TYPE_SP; 8546 val |= PIPEMISC_DITHER_ENABLE | PIPEMISC_DITHER_TYPE_SP;
8552 8547
8553 if (config->ycbcr420) { 8548 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 ||
8554 val |= PIPEMISC_OUTPUT_COLORSPACE_YUV | 8549 crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444)
8555 PIPEMISC_YUV420_ENABLE | 8550 val |= PIPEMISC_OUTPUT_COLORSPACE_YUV;
8551
8552 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
8553 val |= PIPEMISC_YUV420_ENABLE |
8556 PIPEMISC_YUV420_MODE_FULL_BLEND; 8554 PIPEMISC_YUV420_MODE_FULL_BLEND;
8557 }
8558 8555
8559 I915_WRITE(PIPEMISC(intel_crtc->pipe), val); 8556 I915_WRITE(PIPEMISC(intel_crtc->pipe), val);
8560 } 8557 }
@@ -8765,12 +8762,8 @@ static void intel_cpu_transcoder_get_m_n(struct intel_crtc *crtc,
8765 m_n->gmch_n = I915_READ(PIPE_DATA_N1(transcoder)); 8762 m_n->gmch_n = I915_READ(PIPE_DATA_N1(transcoder));
8766 m_n->tu = ((I915_READ(PIPE_DATA_M1(transcoder)) 8763 m_n->tu = ((I915_READ(PIPE_DATA_M1(transcoder))
8767 & TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1; 8764 & TU_SIZE_MASK) >> TU_SIZE_SHIFT) + 1;
8768 /* Read M2_N2 registers only for gen < 8 (M2_N2 available for 8765
8769 * gen < 8) and if DRRS is supported (to make sure the 8766 if (m2_n2 && transcoder_has_m2_n2(dev_priv, transcoder)) {
8770 * registers are not unnecessarily read).
8771 */
8772 if (m2_n2 && INTEL_GEN(dev_priv) < 8 &&
8773 crtc->config->has_drrs) {
8774 m2_n2->link_m = I915_READ(PIPE_LINK_M2(transcoder)); 8767 m2_n2->link_m = I915_READ(PIPE_LINK_M2(transcoder));
8775 m2_n2->link_n = I915_READ(PIPE_LINK_N2(transcoder)); 8768 m2_n2->link_n = I915_READ(PIPE_LINK_N2(transcoder));
8776 m2_n2->gmch_m = I915_READ(PIPE_DATA_M2(transcoder)) 8769 m2_n2->gmch_m = I915_READ(PIPE_DATA_M2(transcoder))
@@ -8913,6 +8906,29 @@ skylake_get_initial_plane_config(struct intel_crtc *crtc,
8913 goto error; 8906 goto error;
8914 } 8907 }
8915 8908
8909 /*
8910 * DRM_MODE_ROTATE_ is counter clockwise to stay compatible with Xrandr
8911 * while i915 HW rotation is clockwise, thats why this swapping.
8912 */
8913 switch (val & PLANE_CTL_ROTATE_MASK) {
8914 case PLANE_CTL_ROTATE_0:
8915 plane_config->rotation = DRM_MODE_ROTATE_0;
8916 break;
8917 case PLANE_CTL_ROTATE_90:
8918 plane_config->rotation = DRM_MODE_ROTATE_270;
8919 break;
8920 case PLANE_CTL_ROTATE_180:
8921 plane_config->rotation = DRM_MODE_ROTATE_180;
8922 break;
8923 case PLANE_CTL_ROTATE_270:
8924 plane_config->rotation = DRM_MODE_ROTATE_90;
8925 break;
8926 }
8927
8928 if (INTEL_GEN(dev_priv) >= 10 &&
8929 val & PLANE_CTL_FLIP_HORIZONTAL)
8930 plane_config->rotation |= DRM_MODE_REFLECT_X;
8931
8916 base = I915_READ(PLANE_SURF(pipe, plane_id)) & 0xfffff000; 8932 base = I915_READ(PLANE_SURF(pipe, plane_id)) & 0xfffff000;
8917 plane_config->base = base; 8933 plane_config->base = base;
8918 8934
@@ -8979,6 +8995,7 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
8979 if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) 8995 if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
8980 return false; 8996 return false;
8981 8997
8998 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
8982 pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe; 8999 pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
8983 pipe_config->shared_dpll = NULL; 9000 pipe_config->shared_dpll = NULL;
8984 9001
@@ -9327,30 +9344,17 @@ static void icelake_get_ddi_pll(struct drm_i915_private *dev_priv,
9327 u32 temp; 9344 u32 temp;
9328 9345
9329 /* TODO: TBT pll not implemented. */ 9346 /* TODO: TBT pll not implemented. */
9330 switch (port) { 9347 if (intel_port_is_combophy(dev_priv, port)) {
9331 case PORT_A:
9332 case PORT_B:
9333 temp = I915_READ(DPCLKA_CFGCR0_ICL) & 9348 temp = I915_READ(DPCLKA_CFGCR0_ICL) &
9334 DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port); 9349 DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port);
9335 id = temp >> DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(port); 9350 id = temp >> DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(port);
9336 9351
9337 if (WARN_ON(id != DPLL_ID_ICL_DPLL0 && id != DPLL_ID_ICL_DPLL1)) 9352 if (WARN_ON(!intel_dpll_is_combophy(id)))
9338 return; 9353 return;
9339 break; 9354 } else if (intel_port_is_tc(dev_priv, port)) {
9340 case PORT_C: 9355 id = icl_port_to_mg_pll_id(port);
9341 id = DPLL_ID_ICL_MGPLL1; 9356 } else {
9342 break; 9357 WARN(1, "Invalid port %x\n", port);
9343 case PORT_D:
9344 id = DPLL_ID_ICL_MGPLL2;
9345 break;
9346 case PORT_E:
9347 id = DPLL_ID_ICL_MGPLL3;
9348 break;
9349 case PORT_F:
9350 id = DPLL_ID_ICL_MGPLL4;
9351 break;
9352 default:
9353 MISSING_CASE(port);
9354 return; 9358 return;
9355 } 9359 }
9356 9360
@@ -9613,27 +9617,11 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
9613 } 9617 }
9614 9618
9615 intel_get_pipe_src_size(crtc, pipe_config); 9619 intel_get_pipe_src_size(crtc, pipe_config);
9620 intel_get_crtc_ycbcr_config(crtc, pipe_config);
9616 9621
9617 pipe_config->gamma_mode = 9622 pipe_config->gamma_mode =
9618 I915_READ(GAMMA_MODE(crtc->pipe)) & GAMMA_MODE_MODE_MASK; 9623 I915_READ(GAMMA_MODE(crtc->pipe)) & GAMMA_MODE_MODE_MASK;
9619 9624
9620 if (IS_BROADWELL(dev_priv) || INTEL_GEN(dev_priv) >= 9) {
9621 u32 tmp = I915_READ(PIPEMISC(crtc->pipe));
9622 bool clrspace_yuv = tmp & PIPEMISC_OUTPUT_COLORSPACE_YUV;
9623
9624 if (IS_GEMINILAKE(dev_priv) || INTEL_GEN(dev_priv) >= 10) {
9625 bool blend_mode_420 = tmp &
9626 PIPEMISC_YUV420_MODE_FULL_BLEND;
9627
9628 pipe_config->ycbcr420 = tmp & PIPEMISC_YUV420_ENABLE;
9629 if (pipe_config->ycbcr420 != clrspace_yuv ||
9630 pipe_config->ycbcr420 != blend_mode_420)
9631 DRM_DEBUG_KMS("Bad 4:2:0 mode (%08x)\n", tmp);
9632 } else if (clrspace_yuv) {
9633 DRM_DEBUG_KMS("YCbCr 4:2:0 Unsupported\n");
9634 }
9635 }
9636
9637 power_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe); 9625 power_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe);
9638 if (intel_display_power_get_if_enabled(dev_priv, power_domain)) { 9626 if (intel_display_power_get_if_enabled(dev_priv, power_domain)) {
9639 power_domain_mask |= BIT_ULL(power_domain); 9627 power_domain_mask |= BIT_ULL(power_domain);
@@ -9902,8 +9890,6 @@ static void i845_update_cursor(struct intel_plane *plane,
9902 I915_WRITE_FW(CURPOS(PIPE_A), pos); 9890 I915_WRITE_FW(CURPOS(PIPE_A), pos);
9903 } 9891 }
9904 9892
9905 POSTING_READ_FW(CURCNTR(PIPE_A));
9906
9907 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 9893 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
9908} 9894}
9909 9895
@@ -10132,8 +10118,6 @@ static void i9xx_update_cursor(struct intel_plane *plane,
10132 I915_WRITE_FW(CURBASE(pipe), base); 10118 I915_WRITE_FW(CURBASE(pipe), base);
10133 } 10119 }
10134 10120
10135 POSTING_READ_FW(CURBASE(pipe));
10136
10137 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 10121 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
10138} 10122}
10139 10123
@@ -10738,14 +10722,40 @@ int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_stat
10738 pipe_config->fb_bits |= plane->frontbuffer_bit; 10722 pipe_config->fb_bits |= plane->frontbuffer_bit;
10739 10723
10740 /* 10724 /*
10725 * ILK/SNB DVSACNTR/Sprite Enable
10726 * IVB SPR_CTL/Sprite Enable
10727 * "When in Self Refresh Big FIFO mode, a write to enable the
10728 * plane will be internally buffered and delayed while Big FIFO
10729 * mode is exiting."
10730 *
10731 * Which means that enabling the sprite can take an extra frame
10732 * when we start in big FIFO mode (LP1+). Thus we need to drop
10733 * down to LP0 and wait for vblank in order to make sure the
10734 * sprite gets enabled on the next vblank after the register write.
10735 * Doing otherwise would risk enabling the sprite one frame after
10736 * we've already signalled flip completion. We can resume LP1+
10737 * once the sprite has been enabled.
10738 *
10739 *
10741 * WaCxSRDisabledForSpriteScaling:ivb 10740 * WaCxSRDisabledForSpriteScaling:ivb
10741 * IVB SPR_SCALE/Scaling Enable
10742 * "Low Power watermarks must be disabled for at least one
10743 * frame before enabling sprite scaling, and kept disabled
10744 * until sprite scaling is disabled."
10742 * 10745 *
10743 * cstate->update_wm was already set above, so this flag will 10746 * ILK/SNB DVSASCALE/Scaling Enable
10744 * take effect when we commit and program watermarks. 10747 * "When in Self Refresh Big FIFO mode, scaling enable will be
10748 * masked off while Big FIFO mode is exiting."
10749 *
10750 * Despite the w/a only being listed for IVB we assume that
10751 * the ILK/SNB note has similar ramifications, hence we apply
10752 * the w/a on all three platforms.
10745 */ 10753 */
10746 if (plane->id == PLANE_SPRITE0 && IS_IVYBRIDGE(dev_priv) && 10754 if (plane->id == PLANE_SPRITE0 &&
10747 needs_scaling(to_intel_plane_state(plane_state)) && 10755 (IS_GEN5(dev_priv) || IS_GEN6(dev_priv) ||
10748 !needs_scaling(old_plane_state)) 10756 IS_IVYBRIDGE(dev_priv)) &&
10757 (turn_on || (!needs_scaling(old_plane_state) &&
10758 needs_scaling(to_intel_plane_state(plane_state)))))
10749 pipe_config->disable_lp_wm = true; 10759 pipe_config->disable_lp_wm = true;
10750 10760
10751 return 0; 10761 return 0;
@@ -10781,6 +10791,98 @@ static bool check_single_encoder_cloning(struct drm_atomic_state *state,
10781 return true; 10791 return true;
10782} 10792}
10783 10793
10794static int icl_add_linked_planes(struct intel_atomic_state *state)
10795{
10796 struct intel_plane *plane, *linked;
10797 struct intel_plane_state *plane_state, *linked_plane_state;
10798 int i;
10799
10800 for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
10801 linked = plane_state->linked_plane;
10802
10803 if (!linked)
10804 continue;
10805
10806 linked_plane_state = intel_atomic_get_plane_state(state, linked);
10807 if (IS_ERR(linked_plane_state))
10808 return PTR_ERR(linked_plane_state);
10809
10810 WARN_ON(linked_plane_state->linked_plane != plane);
10811 WARN_ON(linked_plane_state->slave == plane_state->slave);
10812 }
10813
10814 return 0;
10815}
10816
10817static int icl_check_nv12_planes(struct intel_crtc_state *crtc_state)
10818{
10819 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
10820 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
10821 struct intel_atomic_state *state = to_intel_atomic_state(crtc_state->base.state);
10822 struct intel_plane *plane, *linked;
10823 struct intel_plane_state *plane_state;
10824 int i;
10825
10826 if (INTEL_GEN(dev_priv) < 11)
10827 return 0;
10828
10829 /*
10830 * Destroy all old plane links and make the slave plane invisible
10831 * in the crtc_state->active_planes mask.
10832 */
10833 for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
10834 if (plane->pipe != crtc->pipe || !plane_state->linked_plane)
10835 continue;
10836
10837 plane_state->linked_plane = NULL;
10838 if (plane_state->slave && !plane_state->base.visible)
10839 crtc_state->active_planes &= ~BIT(plane->id);
10840
10841 plane_state->slave = false;
10842 }
10843
10844 if (!crtc_state->nv12_planes)
10845 return 0;
10846
10847 for_each_new_intel_plane_in_state(state, plane, plane_state, i) {
10848 struct intel_plane_state *linked_state = NULL;
10849
10850 if (plane->pipe != crtc->pipe ||
10851 !(crtc_state->nv12_planes & BIT(plane->id)))
10852 continue;
10853
10854 for_each_intel_plane_on_crtc(&dev_priv->drm, crtc, linked) {
10855 if (!icl_is_nv12_y_plane(linked->id))
10856 continue;
10857
10858 if (crtc_state->active_planes & BIT(linked->id))
10859 continue;
10860
10861 linked_state = intel_atomic_get_plane_state(state, linked);
10862 if (IS_ERR(linked_state))
10863 return PTR_ERR(linked_state);
10864
10865 break;
10866 }
10867
10868 if (!linked_state) {
10869 DRM_DEBUG_KMS("Need %d free Y planes for NV12\n",
10870 hweight8(crtc_state->nv12_planes));
10871
10872 return -EINVAL;
10873 }
10874
10875 plane_state->linked_plane = linked;
10876
10877 linked_state->slave = true;
10878 linked_state->linked_plane = plane;
10879 crtc_state->active_planes |= BIT(linked->id);
10880 DRM_DEBUG_KMS("Using %s as Y plane for %s\n", linked->base.name, plane->base.name);
10881 }
10882
10883 return 0;
10884}
10885
10784static int intel_crtc_atomic_check(struct drm_crtc *crtc, 10886static int intel_crtc_atomic_check(struct drm_crtc *crtc,
10785 struct drm_crtc_state *crtc_state) 10887 struct drm_crtc_state *crtc_state)
10786{ 10888{
@@ -10789,7 +10891,6 @@ static int intel_crtc_atomic_check(struct drm_crtc *crtc,
10789 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 10891 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
10790 struct intel_crtc_state *pipe_config = 10892 struct intel_crtc_state *pipe_config =
10791 to_intel_crtc_state(crtc_state); 10893 to_intel_crtc_state(crtc_state);
10792 struct drm_atomic_state *state = crtc_state->state;
10793 int ret; 10894 int ret;
10794 bool mode_changed = needs_modeset(crtc_state); 10895 bool mode_changed = needs_modeset(crtc_state);
10795 10896
@@ -10826,8 +10927,7 @@ static int intel_crtc_atomic_check(struct drm_crtc *crtc,
10826 } 10927 }
10827 } 10928 }
10828 10929
10829 if (dev_priv->display.compute_intermediate_wm && 10930 if (dev_priv->display.compute_intermediate_wm) {
10830 !to_intel_atomic_state(state)->skip_intermediate_wm) {
10831 if (WARN_ON(!dev_priv->display.compute_pipe_wm)) 10931 if (WARN_ON(!dev_priv->display.compute_pipe_wm))
10832 return 0; 10932 return 0;
10833 10933
@@ -10843,9 +10943,6 @@ static int intel_crtc_atomic_check(struct drm_crtc *crtc,
10843 DRM_DEBUG_KMS("No valid intermediate pipe watermarks are possible\n"); 10943 DRM_DEBUG_KMS("No valid intermediate pipe watermarks are possible\n");
10844 return ret; 10944 return ret;
10845 } 10945 }
10846 } else if (dev_priv->display.compute_intermediate_wm) {
10847 if (HAS_PCH_SPLIT(dev_priv) && INTEL_GEN(dev_priv) < 9)
10848 pipe_config->wm.ilk.intermediate = pipe_config->wm.ilk.optimal;
10849 } 10946 }
10850 10947
10851 if (INTEL_GEN(dev_priv) >= 9) { 10948 if (INTEL_GEN(dev_priv) >= 9) {
@@ -10853,6 +10950,8 @@ static int intel_crtc_atomic_check(struct drm_crtc *crtc,
10853 ret = skl_update_scaler_crtc(pipe_config); 10950 ret = skl_update_scaler_crtc(pipe_config);
10854 10951
10855 if (!ret) 10952 if (!ret)
10953 ret = icl_check_nv12_planes(pipe_config);
10954 if (!ret)
10856 ret = skl_check_pipe_max_pixel_rate(intel_crtc, 10955 ret = skl_check_pipe_max_pixel_rate(intel_crtc,
10857 pipe_config); 10956 pipe_config);
10858 if (!ret) 10957 if (!ret)
@@ -10867,8 +10966,6 @@ static int intel_crtc_atomic_check(struct drm_crtc *crtc,
10867} 10966}
10868 10967
10869static const struct drm_crtc_helper_funcs intel_helper_funcs = { 10968static const struct drm_crtc_helper_funcs intel_helper_funcs = {
10870 .atomic_begin = intel_begin_crtc_commit,
10871 .atomic_flush = intel_finish_crtc_commit,
10872 .atomic_check = intel_crtc_atomic_check, 10969 .atomic_check = intel_crtc_atomic_check,
10873}; 10970};
10874 10971
@@ -10897,30 +10994,42 @@ static void intel_modeset_update_connector_atomic_state(struct drm_device *dev)
10897 drm_connector_list_iter_end(&conn_iter); 10994 drm_connector_list_iter_end(&conn_iter);
10898} 10995}
10899 10996
10900static void 10997static int
10901connected_sink_compute_bpp(struct intel_connector *connector, 10998compute_sink_pipe_bpp(const struct drm_connector_state *conn_state,
10902 struct intel_crtc_state *pipe_config) 10999 struct intel_crtc_state *pipe_config)
10903{ 11000{
10904 const struct drm_display_info *info = &connector->base.display_info; 11001 struct drm_connector *connector = conn_state->connector;
10905 int bpp = pipe_config->pipe_bpp; 11002 const struct drm_display_info *info = &connector->display_info;
11003 int bpp;
10906 11004
10907 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] checking for sink bpp constrains\n", 11005 switch (conn_state->max_bpc) {
10908 connector->base.base.id, 11006 case 6 ... 7:
10909 connector->base.name); 11007 bpp = 6 * 3;
10910 11008 break;
10911 /* Don't use an invalid EDID bpc value */ 11009 case 8 ... 9:
10912 if (info->bpc != 0 && info->bpc * 3 < bpp) { 11010 bpp = 8 * 3;
10913 DRM_DEBUG_KMS("clamping display bpp (was %d) to EDID reported max of %d\n", 11011 break;
10914 bpp, info->bpc * 3); 11012 case 10 ... 11:
10915 pipe_config->pipe_bpp = info->bpc * 3; 11013 bpp = 10 * 3;
11014 break;
11015 case 12:
11016 bpp = 12 * 3;
11017 break;
11018 default:
11019 return -EINVAL;
10916 } 11020 }
10917 11021
10918 /* Clamp bpp to 8 on screens without EDID 1.4 */ 11022 if (bpp < pipe_config->pipe_bpp) {
10919 if (info->bpc == 0 && bpp > 24) { 11023 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Limiting display bpp to %d instead of "
10920 DRM_DEBUG_KMS("clamping display bpp (was %d) to default limit of 24\n", 11024 "EDID bpp %d, requested bpp %d, max platform bpp %d\n",
10921 bpp); 11025 connector->base.id, connector->name,
10922 pipe_config->pipe_bpp = 24; 11026 bpp, 3 * info->bpc, 3 * conn_state->max_requested_bpc,
11027 pipe_config->pipe_bpp);
11028
11029 pipe_config->pipe_bpp = bpp;
10923 } 11030 }
11031
11032 return 0;
10924} 11033}
10925 11034
10926static int 11035static int
@@ -10928,7 +11037,7 @@ compute_baseline_pipe_bpp(struct intel_crtc *crtc,
10928 struct intel_crtc_state *pipe_config) 11037 struct intel_crtc_state *pipe_config)
10929{ 11038{
10930 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 11039 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
10931 struct drm_atomic_state *state; 11040 struct drm_atomic_state *state = pipe_config->base.state;
10932 struct drm_connector *connector; 11041 struct drm_connector *connector;
10933 struct drm_connector_state *connector_state; 11042 struct drm_connector_state *connector_state;
10934 int bpp, i; 11043 int bpp, i;
@@ -10941,21 +11050,21 @@ compute_baseline_pipe_bpp(struct intel_crtc *crtc,
10941 else 11050 else
10942 bpp = 8*3; 11051 bpp = 8*3;
10943 11052
10944
10945 pipe_config->pipe_bpp = bpp; 11053 pipe_config->pipe_bpp = bpp;
10946 11054
10947 state = pipe_config->base.state; 11055 /* Clamp display bpp to connector max bpp */
10948
10949 /* Clamp display bpp to EDID value */
10950 for_each_new_connector_in_state(state, connector, connector_state, i) { 11056 for_each_new_connector_in_state(state, connector, connector_state, i) {
11057 int ret;
11058
10951 if (connector_state->crtc != &crtc->base) 11059 if (connector_state->crtc != &crtc->base)
10952 continue; 11060 continue;
10953 11061
10954 connected_sink_compute_bpp(to_intel_connector(connector), 11062 ret = compute_sink_pipe_bpp(connector_state, pipe_config);
10955 pipe_config); 11063 if (ret)
11064 return ret;
10956 } 11065 }
10957 11066
10958 return bpp; 11067 return 0;
10959} 11068}
10960 11069
10961static void intel_dump_crtc_timings(const struct drm_display_mode *mode) 11070static void intel_dump_crtc_timings(const struct drm_display_mode *mode)
@@ -11025,6 +11134,20 @@ static void snprintf_output_types(char *buf, size_t len,
11025 WARN_ON_ONCE(output_types != 0); 11134 WARN_ON_ONCE(output_types != 0);
11026} 11135}
11027 11136
11137static const char * const output_format_str[] = {
11138 [INTEL_OUTPUT_FORMAT_INVALID] = "Invalid",
11139 [INTEL_OUTPUT_FORMAT_RGB] = "RGB",
11140 [INTEL_OUTPUT_FORMAT_YCBCR420] = "YCBCR4:2:0",
11141 [INTEL_OUTPUT_FORMAT_YCBCR444] = "YCBCR4:4:4",
11142};
11143
11144static const char *output_formats(enum intel_output_format format)
11145{
11146 if (format >= ARRAY_SIZE(output_format_str))
11147 format = INTEL_OUTPUT_FORMAT_INVALID;
11148 return output_format_str[format];
11149}
11150
11028static void intel_dump_pipe_config(struct intel_crtc *crtc, 11151static void intel_dump_pipe_config(struct intel_crtc *crtc,
11029 struct intel_crtc_state *pipe_config, 11152 struct intel_crtc_state *pipe_config,
11030 const char *context) 11153 const char *context)
@@ -11044,6 +11167,9 @@ static void intel_dump_pipe_config(struct intel_crtc *crtc,
11044 DRM_DEBUG_KMS("output_types: %s (0x%x)\n", 11167 DRM_DEBUG_KMS("output_types: %s (0x%x)\n",
11045 buf, pipe_config->output_types); 11168 buf, pipe_config->output_types);
11046 11169
11170 DRM_DEBUG_KMS("output format: %s\n",
11171 output_formats(pipe_config->output_format));
11172
11047 DRM_DEBUG_KMS("cpu_transcoder: %s, pipe bpp: %i, dithering: %i\n", 11173 DRM_DEBUG_KMS("cpu_transcoder: %s, pipe bpp: %i, dithering: %i\n",
11048 transcoder_name(pipe_config->cpu_transcoder), 11174 transcoder_name(pipe_config->cpu_transcoder),
11049 pipe_config->pipe_bpp, pipe_config->dither); 11175 pipe_config->pipe_bpp, pipe_config->dither);
@@ -11053,9 +11179,6 @@ static void intel_dump_pipe_config(struct intel_crtc *crtc,
11053 pipe_config->fdi_lanes, 11179 pipe_config->fdi_lanes,
11054 &pipe_config->fdi_m_n); 11180 &pipe_config->fdi_m_n);
11055 11181
11056 if (pipe_config->ycbcr420)
11057 DRM_DEBUG_KMS("YCbCr 4:2:0 output enabled\n");
11058
11059 if (intel_crtc_has_dp_encoder(pipe_config)) { 11182 if (intel_crtc_has_dp_encoder(pipe_config)) {
11060 intel_dump_m_n_config(pipe_config, "dp m_n", 11183 intel_dump_m_n_config(pipe_config, "dp m_n",
11061 pipe_config->lane_count, &pipe_config->dp_m_n); 11184 pipe_config->lane_count, &pipe_config->dp_m_n);
@@ -11244,7 +11367,7 @@ intel_modeset_pipe_config(struct drm_crtc *crtc,
11244 struct intel_encoder *encoder; 11367 struct intel_encoder *encoder;
11245 struct drm_connector *connector; 11368 struct drm_connector *connector;
11246 struct drm_connector_state *connector_state; 11369 struct drm_connector_state *connector_state;
11247 int base_bpp, ret = -EINVAL; 11370 int base_bpp, ret;
11248 int i; 11371 int i;
11249 bool retry = true; 11372 bool retry = true;
11250 11373
@@ -11266,10 +11389,12 @@ intel_modeset_pipe_config(struct drm_crtc *crtc,
11266 (DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC))) 11389 (DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC)))
11267 pipe_config->base.adjusted_mode.flags |= DRM_MODE_FLAG_NVSYNC; 11390 pipe_config->base.adjusted_mode.flags |= DRM_MODE_FLAG_NVSYNC;
11268 11391
11269 base_bpp = compute_baseline_pipe_bpp(to_intel_crtc(crtc), 11392 ret = compute_baseline_pipe_bpp(to_intel_crtc(crtc),
11270 pipe_config); 11393 pipe_config);
11271 if (base_bpp < 0) 11394 if (ret)
11272 goto fail; 11395 return ret;
11396
11397 base_bpp = pipe_config->pipe_bpp;
11273 11398
11274 /* 11399 /*
11275 * Determine the real pipe dimensions. Note that stereo modes can 11400 * Determine the real pipe dimensions. Note that stereo modes can
@@ -11291,7 +11416,7 @@ intel_modeset_pipe_config(struct drm_crtc *crtc,
11291 11416
11292 if (!check_single_encoder_cloning(state, to_intel_crtc(crtc), encoder)) { 11417 if (!check_single_encoder_cloning(state, to_intel_crtc(crtc), encoder)) {
11293 DRM_DEBUG_KMS("rejecting invalid cloning configuration\n"); 11418 DRM_DEBUG_KMS("rejecting invalid cloning configuration\n");
11294 goto fail; 11419 return -EINVAL;
11295 } 11420 }
11296 11421
11297 /* 11422 /*
@@ -11327,7 +11452,7 @@ encoder_retry:
11327 11452
11328 if (!(encoder->compute_config(encoder, pipe_config, connector_state))) { 11453 if (!(encoder->compute_config(encoder, pipe_config, connector_state))) {
11329 DRM_DEBUG_KMS("Encoder config failure\n"); 11454 DRM_DEBUG_KMS("Encoder config failure\n");
11330 goto fail; 11455 return -EINVAL;
11331 } 11456 }
11332 } 11457 }
11333 11458
@@ -11338,16 +11463,16 @@ encoder_retry:
11338 * pipe_config->pixel_multiplier; 11463 * pipe_config->pixel_multiplier;
11339 11464
11340 ret = intel_crtc_compute_config(to_intel_crtc(crtc), pipe_config); 11465 ret = intel_crtc_compute_config(to_intel_crtc(crtc), pipe_config);
11466 if (ret == -EDEADLK)
11467 return ret;
11341 if (ret < 0) { 11468 if (ret < 0) {
11342 DRM_DEBUG_KMS("CRTC fixup failed\n"); 11469 DRM_DEBUG_KMS("CRTC fixup failed\n");
11343 goto fail; 11470 return ret;
11344 } 11471 }
11345 11472
11346 if (ret == RETRY) { 11473 if (ret == RETRY) {
11347 if (WARN(!retry, "loop in pipe configuration computation\n")) { 11474 if (WARN(!retry, "loop in pipe configuration computation\n"))
11348 ret = -EINVAL; 11475 return -EINVAL;
11349 goto fail;
11350 }
11351 11476
11352 DRM_DEBUG_KMS("CRTC bw constrained, retrying\n"); 11477 DRM_DEBUG_KMS("CRTC bw constrained, retrying\n");
11353 retry = false; 11478 retry = false;
@@ -11363,8 +11488,7 @@ encoder_retry:
11363 DRM_DEBUG_KMS("hw max bpp: %i, pipe bpp: %i, dithering: %i\n", 11488 DRM_DEBUG_KMS("hw max bpp: %i, pipe bpp: %i, dithering: %i\n",
11364 base_bpp, pipe_config->pipe_bpp, pipe_config->dither); 11489 base_bpp, pipe_config->pipe_bpp, pipe_config->dither);
11365 11490
11366fail: 11491 return 0;
11367 return ret;
11368} 11492}
11369 11493
11370static bool intel_fuzzy_clock_check(int clock1, int clock2) 11494static bool intel_fuzzy_clock_check(int clock1, int clock2)
@@ -11633,6 +11757,7 @@ intel_pipe_config_compare(struct drm_i915_private *dev_priv,
11633 PIPE_CONF_CHECK_I(base.adjusted_mode.crtc_vsync_end); 11757 PIPE_CONF_CHECK_I(base.adjusted_mode.crtc_vsync_end);
11634 11758
11635 PIPE_CONF_CHECK_I(pixel_multiplier); 11759 PIPE_CONF_CHECK_I(pixel_multiplier);
11760 PIPE_CONF_CHECK_I(output_format);
11636 PIPE_CONF_CHECK_BOOL(has_hdmi_sink); 11761 PIPE_CONF_CHECK_BOOL(has_hdmi_sink);
11637 if ((INTEL_GEN(dev_priv) < 8 && !IS_HASWELL(dev_priv)) || 11762 if ((INTEL_GEN(dev_priv) < 8 && !IS_HASWELL(dev_priv)) ||
11638 IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) 11763 IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
@@ -11641,7 +11766,6 @@ intel_pipe_config_compare(struct drm_i915_private *dev_priv,
11641 PIPE_CONF_CHECK_BOOL(hdmi_scrambling); 11766 PIPE_CONF_CHECK_BOOL(hdmi_scrambling);
11642 PIPE_CONF_CHECK_BOOL(hdmi_high_tmds_clock_ratio); 11767 PIPE_CONF_CHECK_BOOL(hdmi_high_tmds_clock_ratio);
11643 PIPE_CONF_CHECK_BOOL_INCOMPLETE(has_infoframe); 11768 PIPE_CONF_CHECK_BOOL_INCOMPLETE(has_infoframe);
11644 PIPE_CONF_CHECK_BOOL(ycbcr420);
11645 11769
11646 PIPE_CONF_CHECK_BOOL_INCOMPLETE(has_audio); 11770 PIPE_CONF_CHECK_BOOL_INCOMPLETE(has_audio);
11647 11771
@@ -12150,8 +12274,9 @@ intel_modeset_verify_disabled(struct drm_device *dev,
12150 verify_disabled_dpll_state(dev); 12274 verify_disabled_dpll_state(dev);
12151} 12275}
12152 12276
12153static void update_scanline_offset(struct intel_crtc *crtc) 12277static void update_scanline_offset(const struct intel_crtc_state *crtc_state)
12154{ 12278{
12279 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
12155 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 12280 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
12156 12281
12157 /* 12282 /*
@@ -12182,7 +12307,7 @@ static void update_scanline_offset(struct intel_crtc *crtc)
12182 * answer that's slightly in the future. 12307 * answer that's slightly in the future.
12183 */ 12308 */
12184 if (IS_GEN2(dev_priv)) { 12309 if (IS_GEN2(dev_priv)) {
12185 const struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode; 12310 const struct drm_display_mode *adjusted_mode = &crtc_state->base.adjusted_mode;
12186 int vtotal; 12311 int vtotal;
12187 12312
12188 vtotal = adjusted_mode->crtc_vtotal; 12313 vtotal = adjusted_mode->crtc_vtotal;
@@ -12191,7 +12316,7 @@ static void update_scanline_offset(struct intel_crtc *crtc)
12191 12316
12192 crtc->scanline_offset = vtotal - 1; 12317 crtc->scanline_offset = vtotal - 1;
12193 } else if (HAS_DDI(dev_priv) && 12318 } else if (HAS_DDI(dev_priv) &&
12194 intel_crtc_has_type(crtc->config, INTEL_OUTPUT_HDMI)) { 12319 intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
12195 crtc->scanline_offset = 2; 12320 crtc->scanline_offset = 2;
12196 } else 12321 } else
12197 crtc->scanline_offset = 1; 12322 crtc->scanline_offset = 1;
@@ -12474,6 +12599,8 @@ static int intel_atomic_check(struct drm_device *dev,
12474 } 12599 }
12475 12600
12476 ret = intel_modeset_pipe_config(crtc, pipe_config); 12601 ret = intel_modeset_pipe_config(crtc, pipe_config);
12602 if (ret == -EDEADLK)
12603 return ret;
12477 if (ret) { 12604 if (ret) {
12478 intel_dump_pipe_config(to_intel_crtc(crtc), 12605 intel_dump_pipe_config(to_intel_crtc(crtc),
12479 pipe_config, "[failed]"); 12606 pipe_config, "[failed]");
@@ -12505,6 +12632,10 @@ static int intel_atomic_check(struct drm_device *dev,
12505 intel_state->cdclk.logical = dev_priv->cdclk.logical; 12632 intel_state->cdclk.logical = dev_priv->cdclk.logical;
12506 } 12633 }
12507 12634
12635 ret = icl_add_linked_planes(intel_state);
12636 if (ret)
12637 return ret;
12638
12508 ret = drm_atomic_helper_check_planes(dev, state); 12639 ret = drm_atomic_helper_check_planes(dev, state);
12509 if (ret) 12640 if (ret)
12510 return ret; 12641 return ret;
@@ -12537,6 +12668,7 @@ static void intel_update_crtc(struct drm_crtc *crtc,
12537 struct drm_device *dev = crtc->dev; 12668 struct drm_device *dev = crtc->dev;
12538 struct drm_i915_private *dev_priv = to_i915(dev); 12669 struct drm_i915_private *dev_priv = to_i915(dev);
12539 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 12670 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
12671 struct intel_crtc_state *old_intel_cstate = to_intel_crtc_state(old_crtc_state);
12540 struct intel_crtc_state *pipe_config = to_intel_crtc_state(new_crtc_state); 12672 struct intel_crtc_state *pipe_config = to_intel_crtc_state(new_crtc_state);
12541 bool modeset = needs_modeset(new_crtc_state); 12673 bool modeset = needs_modeset(new_crtc_state);
12542 struct intel_plane_state *new_plane_state = 12674 struct intel_plane_state *new_plane_state =
@@ -12544,7 +12676,7 @@ static void intel_update_crtc(struct drm_crtc *crtc,
12544 to_intel_plane(crtc->primary)); 12676 to_intel_plane(crtc->primary));
12545 12677
12546 if (modeset) { 12678 if (modeset) {
12547 update_scanline_offset(intel_crtc); 12679 update_scanline_offset(pipe_config);
12548 dev_priv->display.crtc_enable(pipe_config, state); 12680 dev_priv->display.crtc_enable(pipe_config, state);
12549 12681
12550 /* vblanks work again, re-enable pipe CRC. */ 12682 /* vblanks work again, re-enable pipe CRC. */
@@ -12557,7 +12689,12 @@ static void intel_update_crtc(struct drm_crtc *crtc,
12557 if (new_plane_state) 12689 if (new_plane_state)
12558 intel_fbc_enable(intel_crtc, pipe_config, new_plane_state); 12690 intel_fbc_enable(intel_crtc, pipe_config, new_plane_state);
12559 12691
12560 drm_atomic_helper_commit_planes_on_crtc(old_crtc_state); 12692 intel_begin_crtc_commit(crtc, old_crtc_state);
12693
12694 intel_update_planes_on_crtc(to_intel_atomic_state(state), intel_crtc,
12695 old_intel_cstate, pipe_config);
12696
12697 intel_finish_crtc_commit(crtc, old_crtc_state);
12561} 12698}
12562 12699
12563static void intel_update_crtcs(struct drm_atomic_state *state) 12700static void intel_update_crtcs(struct drm_atomic_state *state)
@@ -12589,13 +12726,12 @@ static void skl_update_crtcs(struct drm_atomic_state *state)
12589 int i; 12726 int i;
12590 u8 hw_enabled_slices = dev_priv->wm.skl_hw.ddb.enabled_slices; 12727 u8 hw_enabled_slices = dev_priv->wm.skl_hw.ddb.enabled_slices;
12591 u8 required_slices = intel_state->wm_results.ddb.enabled_slices; 12728 u8 required_slices = intel_state->wm_results.ddb.enabled_slices;
12592 12729 struct skl_ddb_entry entries[I915_MAX_PIPES] = {};
12593 const struct skl_ddb_entry *entries[I915_MAX_PIPES] = {};
12594 12730
12595 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) 12731 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i)
12596 /* ignore allocations for crtc's that have been turned off. */ 12732 /* ignore allocations for crtc's that have been turned off. */
12597 if (new_crtc_state->active) 12733 if (new_crtc_state->active)
12598 entries[i] = &to_intel_crtc_state(old_crtc_state)->wm.skl.ddb; 12734 entries[i] = to_intel_crtc_state(old_crtc_state)->wm.skl.ddb;
12599 12735
12600 /* If 2nd DBuf slice required, enable it here */ 12736 /* If 2nd DBuf slice required, enable it here */
12601 if (INTEL_GEN(dev_priv) >= 11 && required_slices > hw_enabled_slices) 12737 if (INTEL_GEN(dev_priv) >= 11 && required_slices > hw_enabled_slices)
@@ -12621,14 +12757,13 @@ static void skl_update_crtcs(struct drm_atomic_state *state)
12621 if (updated & cmask || !cstate->base.active) 12757 if (updated & cmask || !cstate->base.active)
12622 continue; 12758 continue;
12623 12759
12624 if (skl_ddb_allocation_overlaps(dev_priv, 12760 if (skl_ddb_allocation_overlaps(&cstate->wm.skl.ddb,
12625 entries, 12761 entries,
12626 &cstate->wm.skl.ddb, 12762 INTEL_INFO(dev_priv)->num_pipes, i))
12627 i))
12628 continue; 12763 continue;
12629 12764
12630 updated |= cmask; 12765 updated |= cmask;
12631 entries[i] = &cstate->wm.skl.ddb; 12766 entries[i] = cstate->wm.skl.ddb;
12632 12767
12633 /* 12768 /*
12634 * If this is an already active pipe, it's DDB changed, 12769 * If this is an already active pipe, it's DDB changed,
@@ -12718,8 +12853,9 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
12718 struct intel_atomic_state *intel_state = to_intel_atomic_state(state); 12853 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
12719 struct drm_i915_private *dev_priv = to_i915(dev); 12854 struct drm_i915_private *dev_priv = to_i915(dev);
12720 struct drm_crtc_state *old_crtc_state, *new_crtc_state; 12855 struct drm_crtc_state *old_crtc_state, *new_crtc_state;
12856 struct intel_crtc_state *new_intel_crtc_state, *old_intel_crtc_state;
12721 struct drm_crtc *crtc; 12857 struct drm_crtc *crtc;
12722 struct intel_crtc_state *intel_cstate; 12858 struct intel_crtc *intel_crtc;
12723 u64 put_domains[I915_MAX_PIPES] = {}; 12859 u64 put_domains[I915_MAX_PIPES] = {};
12724 int i; 12860 int i;
12725 12861
@@ -12731,24 +12867,25 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
12731 intel_display_power_get(dev_priv, POWER_DOMAIN_MODESET); 12867 intel_display_power_get(dev_priv, POWER_DOMAIN_MODESET);
12732 12868
12733 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { 12869 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
12734 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 12870 old_intel_crtc_state = to_intel_crtc_state(old_crtc_state);
12871 new_intel_crtc_state = to_intel_crtc_state(new_crtc_state);
12872 intel_crtc = to_intel_crtc(crtc);
12735 12873
12736 if (needs_modeset(new_crtc_state) || 12874 if (needs_modeset(new_crtc_state) ||
12737 to_intel_crtc_state(new_crtc_state)->update_pipe) { 12875 to_intel_crtc_state(new_crtc_state)->update_pipe) {
12738 12876
12739 put_domains[to_intel_crtc(crtc)->pipe] = 12877 put_domains[intel_crtc->pipe] =
12740 modeset_get_crtc_power_domains(crtc, 12878 modeset_get_crtc_power_domains(crtc,
12741 to_intel_crtc_state(new_crtc_state)); 12879 new_intel_crtc_state);
12742 } 12880 }
12743 12881
12744 if (!needs_modeset(new_crtc_state)) 12882 if (!needs_modeset(new_crtc_state))
12745 continue; 12883 continue;
12746 12884
12747 intel_pre_plane_update(to_intel_crtc_state(old_crtc_state), 12885 intel_pre_plane_update(old_intel_crtc_state, new_intel_crtc_state);
12748 to_intel_crtc_state(new_crtc_state));
12749 12886
12750 if (old_crtc_state->active) { 12887 if (old_crtc_state->active) {
12751 intel_crtc_disable_planes(crtc, old_crtc_state->plane_mask); 12888 intel_crtc_disable_planes(intel_crtc, old_intel_crtc_state->active_planes);
12752 12889
12753 /* 12890 /*
12754 * We need to disable pipe CRC before disabling the pipe, 12891 * We need to disable pipe CRC before disabling the pipe,
@@ -12756,10 +12893,10 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
12756 */ 12893 */
12757 intel_crtc_disable_pipe_crc(intel_crtc); 12894 intel_crtc_disable_pipe_crc(intel_crtc);
12758 12895
12759 dev_priv->display.crtc_disable(to_intel_crtc_state(old_crtc_state), state); 12896 dev_priv->display.crtc_disable(old_intel_crtc_state, state);
12760 intel_crtc->active = false; 12897 intel_crtc->active = false;
12761 intel_fbc_disable(intel_crtc); 12898 intel_fbc_disable(intel_crtc);
12762 intel_disable_shared_dpll(intel_crtc); 12899 intel_disable_shared_dpll(old_intel_crtc_state);
12763 12900
12764 /* 12901 /*
12765 * Underruns don't always raise 12902 * Underruns don't always raise
@@ -12768,17 +12905,12 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
12768 intel_check_cpu_fifo_underruns(dev_priv); 12905 intel_check_cpu_fifo_underruns(dev_priv);
12769 intel_check_pch_fifo_underruns(dev_priv); 12906 intel_check_pch_fifo_underruns(dev_priv);
12770 12907
12771 if (!new_crtc_state->active) { 12908 /* FIXME unify this for all platforms */
12772 /* 12909 if (!new_crtc_state->active &&
12773 * Make sure we don't call initial_watermarks 12910 !HAS_GMCH_DISPLAY(dev_priv) &&
12774 * for ILK-style watermark updates. 12911 dev_priv->display.initial_watermarks)
12775 * 12912 dev_priv->display.initial_watermarks(intel_state,
12776 * No clue what this is supposed to achieve. 12913 new_intel_crtc_state);
12777 */
12778 if (INTEL_GEN(dev_priv) >= 9)
12779 dev_priv->display.initial_watermarks(intel_state,
12780 to_intel_crtc_state(new_crtc_state));
12781 }
12782 } 12914 }
12783 } 12915 }
12784 12916
@@ -12837,11 +12969,11 @@ static void intel_atomic_commit_tail(struct drm_atomic_state *state)
12837 * TODO: Move this (and other cleanup) to an async worker eventually. 12969 * TODO: Move this (and other cleanup) to an async worker eventually.
12838 */ 12970 */
12839 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) { 12971 for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
12840 intel_cstate = to_intel_crtc_state(new_crtc_state); 12972 new_intel_crtc_state = to_intel_crtc_state(new_crtc_state);
12841 12973
12842 if (dev_priv->display.optimize_watermarks) 12974 if (dev_priv->display.optimize_watermarks)
12843 dev_priv->display.optimize_watermarks(intel_state, 12975 dev_priv->display.optimize_watermarks(intel_state,
12844 intel_cstate); 12976 new_intel_crtc_state);
12845 } 12977 }
12846 12978
12847 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) { 12979 for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
@@ -13224,13 +13356,12 @@ intel_prepare_plane_fb(struct drm_plane *plane,
13224 13356
13225 ret = intel_plane_pin_fb(to_intel_plane_state(new_state)); 13357 ret = intel_plane_pin_fb(to_intel_plane_state(new_state));
13226 13358
13227 fb_obj_bump_render_priority(obj);
13228
13229 mutex_unlock(&dev_priv->drm.struct_mutex); 13359 mutex_unlock(&dev_priv->drm.struct_mutex);
13230 i915_gem_object_unpin_pages(obj); 13360 i915_gem_object_unpin_pages(obj);
13231 if (ret) 13361 if (ret)
13232 return ret; 13362 return ret;
13233 13363
13364 fb_obj_bump_render_priority(obj);
13234 intel_fb_obj_flush(obj, ORIGIN_DIRTYFB); 13365 intel_fb_obj_flush(obj, ORIGIN_DIRTYFB);
13235 13366
13236 if (!new_state->fence) { /* implicit fencing */ 13367 if (!new_state->fence) { /* implicit fencing */
@@ -13361,7 +13492,7 @@ static void intel_begin_crtc_commit(struct drm_crtc *crtc,
13361 if (intel_cstate->update_pipe) 13492 if (intel_cstate->update_pipe)
13362 intel_update_pipe_config(old_intel_cstate, intel_cstate); 13493 intel_update_pipe_config(old_intel_cstate, intel_cstate);
13363 else if (INTEL_GEN(dev_priv) >= 9) 13494 else if (INTEL_GEN(dev_priv) >= 9)
13364 skl_detach_scalers(intel_crtc); 13495 skl_detach_scalers(intel_cstate);
13365 13496
13366out: 13497out:
13367 if (dev_priv->display.atomic_update_watermarks) 13498 if (dev_priv->display.atomic_update_watermarks)
@@ -13463,56 +13594,6 @@ static bool i965_plane_format_mod_supported(struct drm_plane *_plane,
13463 } 13594 }
13464} 13595}
13465 13596
13466static bool skl_plane_format_mod_supported(struct drm_plane *_plane,
13467 u32 format, u64 modifier)
13468{
13469 struct intel_plane *plane = to_intel_plane(_plane);
13470
13471 switch (modifier) {
13472 case DRM_FORMAT_MOD_LINEAR:
13473 case I915_FORMAT_MOD_X_TILED:
13474 case I915_FORMAT_MOD_Y_TILED:
13475 case I915_FORMAT_MOD_Yf_TILED:
13476 break;
13477 case I915_FORMAT_MOD_Y_TILED_CCS:
13478 case I915_FORMAT_MOD_Yf_TILED_CCS:
13479 if (!plane->has_ccs)
13480 return false;
13481 break;
13482 default:
13483 return false;
13484 }
13485
13486 switch (format) {
13487 case DRM_FORMAT_XRGB8888:
13488 case DRM_FORMAT_XBGR8888:
13489 case DRM_FORMAT_ARGB8888:
13490 case DRM_FORMAT_ABGR8888:
13491 if (is_ccs_modifier(modifier))
13492 return true;
13493 /* fall through */
13494 case DRM_FORMAT_RGB565:
13495 case DRM_FORMAT_XRGB2101010:
13496 case DRM_FORMAT_XBGR2101010:
13497 case DRM_FORMAT_YUYV:
13498 case DRM_FORMAT_YVYU:
13499 case DRM_FORMAT_UYVY:
13500 case DRM_FORMAT_VYUY:
13501 case DRM_FORMAT_NV12:
13502 if (modifier == I915_FORMAT_MOD_Yf_TILED)
13503 return true;
13504 /* fall through */
13505 case DRM_FORMAT_C8:
13506 if (modifier == DRM_FORMAT_MOD_LINEAR ||
13507 modifier == I915_FORMAT_MOD_X_TILED ||
13508 modifier == I915_FORMAT_MOD_Y_TILED)
13509 return true;
13510 /* fall through */
13511 default:
13512 return false;
13513 }
13514}
13515
13516static bool intel_cursor_format_mod_supported(struct drm_plane *_plane, 13597static bool intel_cursor_format_mod_supported(struct drm_plane *_plane,
13517 u32 format, u64 modifier) 13598 u32 format, u64 modifier)
13518{ 13599{
@@ -13520,18 +13601,7 @@ static bool intel_cursor_format_mod_supported(struct drm_plane *_plane,
13520 format == DRM_FORMAT_ARGB8888; 13601 format == DRM_FORMAT_ARGB8888;
13521} 13602}
13522 13603
13523static struct drm_plane_funcs skl_plane_funcs = { 13604static const struct drm_plane_funcs i965_plane_funcs = {
13524 .update_plane = drm_atomic_helper_update_plane,
13525 .disable_plane = drm_atomic_helper_disable_plane,
13526 .destroy = intel_plane_destroy,
13527 .atomic_get_property = intel_plane_atomic_get_property,
13528 .atomic_set_property = intel_plane_atomic_set_property,
13529 .atomic_duplicate_state = intel_plane_duplicate_state,
13530 .atomic_destroy_state = intel_plane_destroy_state,
13531 .format_mod_supported = skl_plane_format_mod_supported,
13532};
13533
13534static struct drm_plane_funcs i965_plane_funcs = {
13535 .update_plane = drm_atomic_helper_update_plane, 13605 .update_plane = drm_atomic_helper_update_plane,
13536 .disable_plane = drm_atomic_helper_disable_plane, 13606 .disable_plane = drm_atomic_helper_disable_plane,
13537 .destroy = intel_plane_destroy, 13607 .destroy = intel_plane_destroy,
@@ -13542,7 +13612,7 @@ static struct drm_plane_funcs i965_plane_funcs = {
13542 .format_mod_supported = i965_plane_format_mod_supported, 13612 .format_mod_supported = i965_plane_format_mod_supported,
13543}; 13613};
13544 13614
13545static struct drm_plane_funcs i8xx_plane_funcs = { 13615static const struct drm_plane_funcs i8xx_plane_funcs = {
13546 .update_plane = drm_atomic_helper_update_plane, 13616 .update_plane = drm_atomic_helper_update_plane,
13547 .disable_plane = drm_atomic_helper_disable_plane, 13617 .disable_plane = drm_atomic_helper_disable_plane,
13548 .destroy = intel_plane_destroy, 13618 .destroy = intel_plane_destroy,
@@ -13568,14 +13638,16 @@ intel_legacy_cursor_update(struct drm_plane *plane,
13568 struct drm_plane_state *old_plane_state, *new_plane_state; 13638 struct drm_plane_state *old_plane_state, *new_plane_state;
13569 struct intel_plane *intel_plane = to_intel_plane(plane); 13639 struct intel_plane *intel_plane = to_intel_plane(plane);
13570 struct drm_framebuffer *old_fb; 13640 struct drm_framebuffer *old_fb;
13571 struct drm_crtc_state *crtc_state = crtc->state; 13641 struct intel_crtc_state *crtc_state =
13642 to_intel_crtc_state(crtc->state);
13643 struct intel_crtc_state *new_crtc_state;
13572 13644
13573 /* 13645 /*
13574 * When crtc is inactive or there is a modeset pending, 13646 * When crtc is inactive or there is a modeset pending,
13575 * wait for it to complete in the slowpath 13647 * wait for it to complete in the slowpath
13576 */ 13648 */
13577 if (!crtc_state->active || needs_modeset(crtc_state) || 13649 if (!crtc_state->base.active || needs_modeset(&crtc_state->base) ||
13578 to_intel_crtc_state(crtc_state)->update_pipe) 13650 crtc_state->update_pipe)
13579 goto slow; 13651 goto slow;
13580 13652
13581 old_plane_state = plane->state; 13653 old_plane_state = plane->state;
@@ -13605,6 +13677,12 @@ intel_legacy_cursor_update(struct drm_plane *plane,
13605 if (!new_plane_state) 13677 if (!new_plane_state)
13606 return -ENOMEM; 13678 return -ENOMEM;
13607 13679
13680 new_crtc_state = to_intel_crtc_state(intel_crtc_duplicate_state(crtc));
13681 if (!new_crtc_state) {
13682 ret = -ENOMEM;
13683 goto out_free;
13684 }
13685
13608 drm_atomic_set_fb_for_plane(new_plane_state, fb); 13686 drm_atomic_set_fb_for_plane(new_plane_state, fb);
13609 13687
13610 new_plane_state->src_x = src_x; 13688 new_plane_state->src_x = src_x;
@@ -13616,9 +13694,8 @@ intel_legacy_cursor_update(struct drm_plane *plane,
13616 new_plane_state->crtc_w = crtc_w; 13694 new_plane_state->crtc_w = crtc_w;
13617 new_plane_state->crtc_h = crtc_h; 13695 new_plane_state->crtc_h = crtc_h;
13618 13696
13619 ret = intel_plane_atomic_check_with_state(to_intel_crtc_state(crtc->state), 13697 ret = intel_plane_atomic_check_with_state(crtc_state, new_crtc_state,
13620 to_intel_crtc_state(crtc->state), /* FIXME need a new crtc state? */ 13698 to_intel_plane_state(old_plane_state),
13621 to_intel_plane_state(plane->state),
13622 to_intel_plane_state(new_plane_state)); 13699 to_intel_plane_state(new_plane_state));
13623 if (ret) 13700 if (ret)
13624 goto out_free; 13701 goto out_free;
@@ -13640,10 +13717,21 @@ intel_legacy_cursor_update(struct drm_plane *plane,
13640 /* Swap plane state */ 13717 /* Swap plane state */
13641 plane->state = new_plane_state; 13718 plane->state = new_plane_state;
13642 13719
13720 /*
13721 * We cannot swap crtc_state as it may be in use by an atomic commit or
13722 * page flip that's running simultaneously. If we swap crtc_state and
13723 * destroy the old state, we will cause a use-after-free there.
13724 *
13725 * Only update active_planes, which is needed for our internal
13726 * bookkeeping. Either value will do the right thing when updating
13727 * planes atomically. If the cursor was part of the atomic update then
13728 * we would have taken the slowpath.
13729 */
13730 crtc_state->active_planes = new_crtc_state->active_planes;
13731
13643 if (plane->state->visible) { 13732 if (plane->state->visible) {
13644 trace_intel_update_plane(plane, to_intel_crtc(crtc)); 13733 trace_intel_update_plane(plane, to_intel_crtc(crtc));
13645 intel_plane->update_plane(intel_plane, 13734 intel_plane->update_plane(intel_plane, crtc_state,
13646 to_intel_crtc_state(crtc->state),
13647 to_intel_plane_state(plane->state)); 13735 to_intel_plane_state(plane->state));
13648 } else { 13736 } else {
13649 trace_intel_disable_plane(plane, to_intel_crtc(crtc)); 13737 trace_intel_disable_plane(plane, to_intel_crtc(crtc));
@@ -13655,6 +13743,8 @@ intel_legacy_cursor_update(struct drm_plane *plane,
13655out_unlock: 13743out_unlock:
13656 mutex_unlock(&dev_priv->drm.struct_mutex); 13744 mutex_unlock(&dev_priv->drm.struct_mutex);
13657out_free: 13745out_free:
13746 if (new_crtc_state)
13747 intel_crtc_destroy_state(crtc, &new_crtc_state->base);
13658 if (ret) 13748 if (ret)
13659 intel_plane_destroy_state(plane, new_plane_state); 13749 intel_plane_destroy_state(plane, new_plane_state);
13660 else 13750 else
@@ -13695,176 +13785,90 @@ static bool i9xx_plane_has_fbc(struct drm_i915_private *dev_priv,
13695 return i9xx_plane == PLANE_A; 13785 return i9xx_plane == PLANE_A;
13696} 13786}
13697 13787
13698static bool skl_plane_has_fbc(struct drm_i915_private *dev_priv,
13699 enum pipe pipe, enum plane_id plane_id)
13700{
13701 if (!HAS_FBC(dev_priv))
13702 return false;
13703
13704 return pipe == PIPE_A && plane_id == PLANE_PRIMARY;
13705}
13706
13707bool skl_plane_has_planar(struct drm_i915_private *dev_priv,
13708 enum pipe pipe, enum plane_id plane_id)
13709{
13710 /*
13711 * FIXME: ICL requires two hardware planes for scanning out NV12
13712 * framebuffers. Do not advertize support until this is implemented.
13713 */
13714 if (INTEL_GEN(dev_priv) >= 11)
13715 return false;
13716
13717 if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv))
13718 return false;
13719
13720 if (INTEL_GEN(dev_priv) == 9 && !IS_GEMINILAKE(dev_priv) && pipe == PIPE_C)
13721 return false;
13722
13723 if (plane_id != PLANE_PRIMARY && plane_id != PLANE_SPRITE0)
13724 return false;
13725
13726 return true;
13727}
13728
13729static struct intel_plane * 13788static struct intel_plane *
13730intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe) 13789intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
13731{ 13790{
13732 struct intel_plane *primary = NULL; 13791 struct intel_plane *plane;
13733 struct intel_plane_state *state = NULL;
13734 const struct drm_plane_funcs *plane_funcs; 13792 const struct drm_plane_funcs *plane_funcs;
13735 const uint32_t *intel_primary_formats;
13736 unsigned int supported_rotations; 13793 unsigned int supported_rotations;
13737 unsigned int num_formats; 13794 unsigned int possible_crtcs;
13738 const uint64_t *modifiers; 13795 const u64 *modifiers;
13796 const u32 *formats;
13797 int num_formats;
13739 int ret; 13798 int ret;
13740 13799
13741 primary = kzalloc(sizeof(*primary), GFP_KERNEL); 13800 if (INTEL_GEN(dev_priv) >= 9)
13742 if (!primary) { 13801 return skl_universal_plane_create(dev_priv, pipe,
13743 ret = -ENOMEM; 13802 PLANE_PRIMARY);
13744 goto fail;
13745 }
13746
13747 state = intel_create_plane_state(&primary->base);
13748 if (!state) {
13749 ret = -ENOMEM;
13750 goto fail;
13751 }
13752 13803
13753 primary->base.state = &state->base; 13804 plane = intel_plane_alloc();
13805 if (IS_ERR(plane))
13806 return plane;
13754 13807
13755 if (INTEL_GEN(dev_priv) >= 9) 13808 plane->pipe = pipe;
13756 state->scaler_id = -1;
13757 primary->pipe = pipe;
13758 /* 13809 /*
13759 * On gen2/3 only plane A can do FBC, but the panel fitter and LVDS 13810 * On gen2/3 only plane A can do FBC, but the panel fitter and LVDS
13760 * port is hooked to pipe B. Hence we want plane A feeding pipe B. 13811 * port is hooked to pipe B. Hence we want plane A feeding pipe B.
13761 */ 13812 */
13762 if (HAS_FBC(dev_priv) && INTEL_GEN(dev_priv) < 4) 13813 if (HAS_FBC(dev_priv) && INTEL_GEN(dev_priv) < 4)
13763 primary->i9xx_plane = (enum i9xx_plane_id) !pipe; 13814 plane->i9xx_plane = (enum i9xx_plane_id) !pipe;
13764 else 13815 else
13765 primary->i9xx_plane = (enum i9xx_plane_id) pipe; 13816 plane->i9xx_plane = (enum i9xx_plane_id) pipe;
13766 primary->id = PLANE_PRIMARY; 13817 plane->id = PLANE_PRIMARY;
13767 primary->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, primary->id); 13818 plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane->id);
13768 13819
13769 if (INTEL_GEN(dev_priv) >= 9) 13820 plane->has_fbc = i9xx_plane_has_fbc(dev_priv, plane->i9xx_plane);
13770 primary->has_fbc = skl_plane_has_fbc(dev_priv, 13821 if (plane->has_fbc) {
13771 primary->pipe,
13772 primary->id);
13773 else
13774 primary->has_fbc = i9xx_plane_has_fbc(dev_priv,
13775 primary->i9xx_plane);
13776
13777 if (primary->has_fbc) {
13778 struct intel_fbc *fbc = &dev_priv->fbc; 13822 struct intel_fbc *fbc = &dev_priv->fbc;
13779 13823
13780 fbc->possible_framebuffer_bits |= primary->frontbuffer_bit; 13824 fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
13781 } 13825 }
13782 13826
13783 if (INTEL_GEN(dev_priv) >= 9) { 13827 if (INTEL_GEN(dev_priv) >= 4) {
13784 primary->has_ccs = skl_plane_has_ccs(dev_priv, pipe, 13828 formats = i965_primary_formats;
13785 PLANE_PRIMARY);
13786
13787 if (skl_plane_has_planar(dev_priv, pipe, PLANE_PRIMARY)) {
13788 intel_primary_formats = skl_pri_planar_formats;
13789 num_formats = ARRAY_SIZE(skl_pri_planar_formats);
13790 } else {
13791 intel_primary_formats = skl_primary_formats;
13792 num_formats = ARRAY_SIZE(skl_primary_formats);
13793 }
13794
13795 if (primary->has_ccs)
13796 modifiers = skl_format_modifiers_ccs;
13797 else
13798 modifiers = skl_format_modifiers_noccs;
13799
13800 primary->max_stride = skl_plane_max_stride;
13801 primary->update_plane = skl_update_plane;
13802 primary->disable_plane = skl_disable_plane;
13803 primary->get_hw_state = skl_plane_get_hw_state;
13804 primary->check_plane = skl_plane_check;
13805
13806 plane_funcs = &skl_plane_funcs;
13807 } else if (INTEL_GEN(dev_priv) >= 4) {
13808 intel_primary_formats = i965_primary_formats;
13809 num_formats = ARRAY_SIZE(i965_primary_formats); 13829 num_formats = ARRAY_SIZE(i965_primary_formats);
13810 modifiers = i9xx_format_modifiers; 13830 modifiers = i9xx_format_modifiers;
13811 13831
13812 primary->max_stride = i9xx_plane_max_stride; 13832 plane->max_stride = i9xx_plane_max_stride;
13813 primary->update_plane = i9xx_update_plane; 13833 plane->update_plane = i9xx_update_plane;
13814 primary->disable_plane = i9xx_disable_plane; 13834 plane->disable_plane = i9xx_disable_plane;
13815 primary->get_hw_state = i9xx_plane_get_hw_state; 13835 plane->get_hw_state = i9xx_plane_get_hw_state;
13816 primary->check_plane = i9xx_plane_check; 13836 plane->check_plane = i9xx_plane_check;
13817 13837
13818 plane_funcs = &i965_plane_funcs; 13838 plane_funcs = &i965_plane_funcs;
13819 } else { 13839 } else {
13820 intel_primary_formats = i8xx_primary_formats; 13840 formats = i8xx_primary_formats;
13821 num_formats = ARRAY_SIZE(i8xx_primary_formats); 13841 num_formats = ARRAY_SIZE(i8xx_primary_formats);
13822 modifiers = i9xx_format_modifiers; 13842 modifiers = i9xx_format_modifiers;
13823 13843
13824 primary->max_stride = i9xx_plane_max_stride; 13844 plane->max_stride = i9xx_plane_max_stride;
13825 primary->update_plane = i9xx_update_plane; 13845 plane->update_plane = i9xx_update_plane;
13826 primary->disable_plane = i9xx_disable_plane; 13846 plane->disable_plane = i9xx_disable_plane;
13827 primary->get_hw_state = i9xx_plane_get_hw_state; 13847 plane->get_hw_state = i9xx_plane_get_hw_state;
13828 primary->check_plane = i9xx_plane_check; 13848 plane->check_plane = i9xx_plane_check;
13829 13849
13830 plane_funcs = &i8xx_plane_funcs; 13850 plane_funcs = &i8xx_plane_funcs;
13831 } 13851 }
13832 13852
13833 if (INTEL_GEN(dev_priv) >= 9) 13853 possible_crtcs = BIT(pipe);
13834 ret = drm_universal_plane_init(&dev_priv->drm, &primary->base, 13854
13835 0, plane_funcs, 13855 if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
13836 intel_primary_formats, num_formats, 13856 ret = drm_universal_plane_init(&dev_priv->drm, &plane->base,
13837 modifiers, 13857 possible_crtcs, plane_funcs,
13838 DRM_PLANE_TYPE_PRIMARY, 13858 formats, num_formats, modifiers,
13839 "plane 1%c", pipe_name(pipe));
13840 else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv))
13841 ret = drm_universal_plane_init(&dev_priv->drm, &primary->base,
13842 0, plane_funcs,
13843 intel_primary_formats, num_formats,
13844 modifiers,
13845 DRM_PLANE_TYPE_PRIMARY, 13859 DRM_PLANE_TYPE_PRIMARY,
13846 "primary %c", pipe_name(pipe)); 13860 "primary %c", pipe_name(pipe));
13847 else 13861 else
13848 ret = drm_universal_plane_init(&dev_priv->drm, &primary->base, 13862 ret = drm_universal_plane_init(&dev_priv->drm, &plane->base,
13849 0, plane_funcs, 13863 possible_crtcs, plane_funcs,
13850 intel_primary_formats, num_formats, 13864 formats, num_formats, modifiers,
13851 modifiers,
13852 DRM_PLANE_TYPE_PRIMARY, 13865 DRM_PLANE_TYPE_PRIMARY,
13853 "plane %c", 13866 "plane %c",
13854 plane_name(primary->i9xx_plane)); 13867 plane_name(plane->i9xx_plane));
13855 if (ret) 13868 if (ret)
13856 goto fail; 13869 goto fail;
13857 13870
13858 if (INTEL_GEN(dev_priv) >= 10) { 13871 if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {
13859 supported_rotations =
13860 DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 |
13861 DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270 |
13862 DRM_MODE_REFLECT_X;
13863 } else if (INTEL_GEN(dev_priv) >= 9) {
13864 supported_rotations =
13865 DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 |
13866 DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270;
13867 } else if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {
13868 supported_rotations = 13872 supported_rotations =
13869 DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 | 13873 DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 |
13870 DRM_MODE_REFLECT_X; 13874 DRM_MODE_REFLECT_X;
@@ -13876,26 +13880,16 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe)
13876 } 13880 }
13877 13881
13878 if (INTEL_GEN(dev_priv) >= 4) 13882 if (INTEL_GEN(dev_priv) >= 4)
13879 drm_plane_create_rotation_property(&primary->base, 13883 drm_plane_create_rotation_property(&plane->base,
13880 DRM_MODE_ROTATE_0, 13884 DRM_MODE_ROTATE_0,
13881 supported_rotations); 13885 supported_rotations);
13882 13886
13883 if (INTEL_GEN(dev_priv) >= 9) 13887 drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs);
13884 drm_plane_create_color_properties(&primary->base,
13885 BIT(DRM_COLOR_YCBCR_BT601) |
13886 BIT(DRM_COLOR_YCBCR_BT709),
13887 BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) |
13888 BIT(DRM_COLOR_YCBCR_FULL_RANGE),
13889 DRM_COLOR_YCBCR_BT709,
13890 DRM_COLOR_YCBCR_LIMITED_RANGE);
13891
13892 drm_plane_helper_add(&primary->base, &intel_plane_helper_funcs);
13893 13888
13894 return primary; 13889 return plane;
13895 13890
13896fail: 13891fail:
13897 kfree(state); 13892 intel_plane_free(plane);
13898 kfree(primary);
13899 13893
13900 return ERR_PTR(ret); 13894 return ERR_PTR(ret);
13901} 13895}
@@ -13904,23 +13898,13 @@ static struct intel_plane *
13904intel_cursor_plane_create(struct drm_i915_private *dev_priv, 13898intel_cursor_plane_create(struct drm_i915_private *dev_priv,
13905 enum pipe pipe) 13899 enum pipe pipe)
13906{ 13900{
13907 struct intel_plane *cursor = NULL; 13901 unsigned int possible_crtcs;
13908 struct intel_plane_state *state = NULL; 13902 struct intel_plane *cursor;
13909 int ret; 13903 int ret;
13910 13904
13911 cursor = kzalloc(sizeof(*cursor), GFP_KERNEL); 13905 cursor = intel_plane_alloc();
13912 if (!cursor) { 13906 if (IS_ERR(cursor))
13913 ret = -ENOMEM; 13907 return cursor;
13914 goto fail;
13915 }
13916
13917 state = intel_create_plane_state(&cursor->base);
13918 if (!state) {
13919 ret = -ENOMEM;
13920 goto fail;
13921 }
13922
13923 cursor->base.state = &state->base;
13924 13908
13925 cursor->pipe = pipe; 13909 cursor->pipe = pipe;
13926 cursor->i9xx_plane = (enum i9xx_plane_id) pipe; 13910 cursor->i9xx_plane = (enum i9xx_plane_id) pipe;
@@ -13947,8 +13931,10 @@ intel_cursor_plane_create(struct drm_i915_private *dev_priv,
13947 if (IS_I845G(dev_priv) || IS_I865G(dev_priv) || HAS_CUR_FBC(dev_priv)) 13931 if (IS_I845G(dev_priv) || IS_I865G(dev_priv) || HAS_CUR_FBC(dev_priv))
13948 cursor->cursor.size = ~0; 13932 cursor->cursor.size = ~0;
13949 13933
13934 possible_crtcs = BIT(pipe);
13935
13950 ret = drm_universal_plane_init(&dev_priv->drm, &cursor->base, 13936 ret = drm_universal_plane_init(&dev_priv->drm, &cursor->base,
13951 0, &intel_cursor_plane_funcs, 13937 possible_crtcs, &intel_cursor_plane_funcs,
13952 intel_cursor_formats, 13938 intel_cursor_formats,
13953 ARRAY_SIZE(intel_cursor_formats), 13939 ARRAY_SIZE(intel_cursor_formats),
13954 cursor_format_modifiers, 13940 cursor_format_modifiers,
@@ -13963,16 +13949,12 @@ intel_cursor_plane_create(struct drm_i915_private *dev_priv,
13963 DRM_MODE_ROTATE_0 | 13949 DRM_MODE_ROTATE_0 |
13964 DRM_MODE_ROTATE_180); 13950 DRM_MODE_ROTATE_180);
13965 13951
13966 if (INTEL_GEN(dev_priv) >= 9)
13967 state->scaler_id = -1;
13968
13969 drm_plane_helper_add(&cursor->base, &intel_plane_helper_funcs); 13952 drm_plane_helper_add(&cursor->base, &intel_plane_helper_funcs);
13970 13953
13971 return cursor; 13954 return cursor;
13972 13955
13973fail: 13956fail:
13974 kfree(state); 13957 intel_plane_free(cursor);
13975 kfree(cursor);
13976 13958
13977 return ERR_PTR(ret); 13959 return ERR_PTR(ret);
13978} 13960}
@@ -13993,7 +13975,7 @@ static void intel_crtc_init_scalers(struct intel_crtc *crtc,
13993 struct intel_scaler *scaler = &scaler_state->scalers[i]; 13975 struct intel_scaler *scaler = &scaler_state->scalers[i];
13994 13976
13995 scaler->in_use = 0; 13977 scaler->in_use = 0;
13996 scaler->mode = PS_SCALER_MODE_DYN; 13978 scaler->mode = 0;
13997 } 13979 }
13998 13980
13999 scaler_state->scaler_id = -1; 13981 scaler_state->scaler_id = -1;
@@ -14088,18 +14070,6 @@ fail:
14088 return ret; 14070 return ret;
14089} 14071}
14090 14072
14091enum pipe intel_get_pipe_from_connector(struct intel_connector *connector)
14092{
14093 struct drm_device *dev = connector->base.dev;
14094
14095 WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
14096
14097 if (!connector->base.state->crtc)
14098 return INVALID_PIPE;
14099
14100 return to_intel_crtc(connector->base.state->crtc)->pipe;
14101}
14102
14103int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data, 14073int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data,
14104 struct drm_file *file) 14074 struct drm_file *file)
14105{ 14075{
@@ -14236,6 +14206,7 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv)
14236 intel_ddi_init(dev_priv, PORT_D); 14206 intel_ddi_init(dev_priv, PORT_D);
14237 intel_ddi_init(dev_priv, PORT_E); 14207 intel_ddi_init(dev_priv, PORT_E);
14238 intel_ddi_init(dev_priv, PORT_F); 14208 intel_ddi_init(dev_priv, PORT_F);
14209 icl_dsi_init(dev_priv);
14239 } else if (IS_GEN9_LP(dev_priv)) { 14210 } else if (IS_GEN9_LP(dev_priv)) {
14240 /* 14211 /*
14241 * FIXME: Broxton doesn't support port detection via the 14212 * FIXME: Broxton doesn't support port detection via the
@@ -14458,7 +14429,7 @@ static const struct drm_framebuffer_funcs intel_fb_funcs = {
14458 14429
14459static 14430static
14460u32 intel_fb_pitch_limit(struct drm_i915_private *dev_priv, 14431u32 intel_fb_pitch_limit(struct drm_i915_private *dev_priv,
14461 uint64_t fb_modifier, uint32_t pixel_format) 14432 u32 pixel_format, u64 fb_modifier)
14462{ 14433{
14463 struct intel_crtc *crtc; 14434 struct intel_crtc *crtc;
14464 struct intel_plane *plane; 14435 struct intel_plane *plane;
@@ -14526,13 +14497,19 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
14526 goto err; 14497 goto err;
14527 } 14498 }
14528 /* fall through */ 14499 /* fall through */
14529 case I915_FORMAT_MOD_Y_TILED:
14530 case I915_FORMAT_MOD_Yf_TILED: 14500 case I915_FORMAT_MOD_Yf_TILED:
14501 if (mode_cmd->pixel_format == DRM_FORMAT_C8) {
14502 DRM_DEBUG_KMS("Indexed format does not support Yf tiling\n");
14503 goto err;
14504 }
14505 /* fall through */
14506 case I915_FORMAT_MOD_Y_TILED:
14531 if (INTEL_GEN(dev_priv) < 9) { 14507 if (INTEL_GEN(dev_priv) < 9) {
14532 DRM_DEBUG_KMS("Unsupported tiling 0x%llx!\n", 14508 DRM_DEBUG_KMS("Unsupported tiling 0x%llx!\n",
14533 mode_cmd->modifier[0]); 14509 mode_cmd->modifier[0]);
14534 goto err; 14510 goto err;
14535 } 14511 }
14512 break;
14536 case DRM_FORMAT_MOD_LINEAR: 14513 case DRM_FORMAT_MOD_LINEAR:
14537 case I915_FORMAT_MOD_X_TILED: 14514 case I915_FORMAT_MOD_X_TILED:
14538 break; 14515 break;
@@ -14552,8 +14529,8 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
14552 goto err; 14529 goto err;
14553 } 14530 }
14554 14531
14555 pitch_limit = intel_fb_pitch_limit(dev_priv, mode_cmd->modifier[0], 14532 pitch_limit = intel_fb_pitch_limit(dev_priv, mode_cmd->pixel_format,
14556 mode_cmd->pixel_format); 14533 mode_cmd->modifier[0]);
14557 if (mode_cmd->pitches[0] > pitch_limit) { 14534 if (mode_cmd->pitches[0] > pitch_limit) {
14558 DRM_DEBUG_KMS("%s pitch (%u) must be at most %d\n", 14535 DRM_DEBUG_KMS("%s pitch (%u) must be at most %d\n",
14559 mode_cmd->modifier[0] != DRM_FORMAT_MOD_LINEAR ? 14536 mode_cmd->modifier[0] != DRM_FORMAT_MOD_LINEAR ?
@@ -14622,7 +14599,7 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
14622 break; 14599 break;
14623 case DRM_FORMAT_NV12: 14600 case DRM_FORMAT_NV12:
14624 if (INTEL_GEN(dev_priv) < 9 || IS_SKYLAKE(dev_priv) || 14601 if (INTEL_GEN(dev_priv) < 9 || IS_SKYLAKE(dev_priv) ||
14625 IS_BROXTON(dev_priv) || INTEL_GEN(dev_priv) >= 11) { 14602 IS_BROXTON(dev_priv)) {
14626 DRM_DEBUG_KMS("unsupported pixel format: %s\n", 14603 DRM_DEBUG_KMS("unsupported pixel format: %s\n",
14627 drm_get_format_name(mode_cmd->pixel_format, 14604 drm_get_format_name(mode_cmd->pixel_format,
14628 &format_name)); 14605 &format_name));
@@ -14646,7 +14623,7 @@ static int intel_framebuffer_init(struct intel_framebuffer *intel_fb,
14646 fb->height < SKL_MIN_YUV_420_SRC_H || 14623 fb->height < SKL_MIN_YUV_420_SRC_H ||
14647 (fb->width % 4) != 0 || (fb->height % 4) != 0)) { 14624 (fb->width % 4) != 0 || (fb->height % 4) != 0)) {
14648 DRM_DEBUG_KMS("src dimensions not correct for NV12\n"); 14625 DRM_DEBUG_KMS("src dimensions not correct for NV12\n");
14649 return -EINVAL; 14626 goto err;
14650 } 14627 }
14651 14628
14652 for (i = 0; i < fb->format->num_planes; i++) { 14629 for (i = 0; i < fb->format->num_planes; i++) {
@@ -14906,174 +14883,6 @@ void intel_init_display_hooks(struct drm_i915_private *dev_priv)
14906 dev_priv->display.update_crtcs = intel_update_crtcs; 14883 dev_priv->display.update_crtcs = intel_update_crtcs;
14907} 14884}
14908 14885
14909/*
14910 * Some machines (Lenovo U160) do not work with SSC on LVDS for some reason
14911 */
14912static void quirk_ssc_force_disable(struct drm_device *dev)
14913{
14914 struct drm_i915_private *dev_priv = to_i915(dev);
14915 dev_priv->quirks |= QUIRK_LVDS_SSC_DISABLE;
14916 DRM_INFO("applying lvds SSC disable quirk\n");
14917}
14918
14919/*
14920 * A machine (e.g. Acer Aspire 5734Z) may need to invert the panel backlight
14921 * brightness value
14922 */
14923static void quirk_invert_brightness(struct drm_device *dev)
14924{
14925 struct drm_i915_private *dev_priv = to_i915(dev);
14926 dev_priv->quirks |= QUIRK_INVERT_BRIGHTNESS;
14927 DRM_INFO("applying inverted panel brightness quirk\n");
14928}
14929
14930/* Some VBT's incorrectly indicate no backlight is present */
14931static void quirk_backlight_present(struct drm_device *dev)
14932{
14933 struct drm_i915_private *dev_priv = to_i915(dev);
14934 dev_priv->quirks |= QUIRK_BACKLIGHT_PRESENT;
14935 DRM_INFO("applying backlight present quirk\n");
14936}
14937
14938/* Toshiba Satellite P50-C-18C requires T12 delay to be min 800ms
14939 * which is 300 ms greater than eDP spec T12 min.
14940 */
14941static void quirk_increase_t12_delay(struct drm_device *dev)
14942{
14943 struct drm_i915_private *dev_priv = to_i915(dev);
14944
14945 dev_priv->quirks |= QUIRK_INCREASE_T12_DELAY;
14946 DRM_INFO("Applying T12 delay quirk\n");
14947}
14948
14949/*
14950 * GeminiLake NUC HDMI outputs require additional off time
14951 * this allows the onboard retimer to correctly sync to signal
14952 */
14953static void quirk_increase_ddi_disabled_time(struct drm_device *dev)
14954{
14955 struct drm_i915_private *dev_priv = to_i915(dev);
14956
14957 dev_priv->quirks |= QUIRK_INCREASE_DDI_DISABLED_TIME;
14958 DRM_INFO("Applying Increase DDI Disabled quirk\n");
14959}
14960
14961struct intel_quirk {
14962 int device;
14963 int subsystem_vendor;
14964 int subsystem_device;
14965 void (*hook)(struct drm_device *dev);
14966};
14967
14968/* For systems that don't have a meaningful PCI subdevice/subvendor ID */
14969struct intel_dmi_quirk {
14970 void (*hook)(struct drm_device *dev);
14971 const struct dmi_system_id (*dmi_id_list)[];
14972};
14973
14974static int intel_dmi_reverse_brightness(const struct dmi_system_id *id)
14975{
14976 DRM_INFO("Backlight polarity reversed on %s\n", id->ident);
14977 return 1;
14978}
14979
14980static const struct intel_dmi_quirk intel_dmi_quirks[] = {
14981 {
14982 .dmi_id_list = &(const struct dmi_system_id[]) {
14983 {
14984 .callback = intel_dmi_reverse_brightness,
14985 .ident = "NCR Corporation",
14986 .matches = {DMI_MATCH(DMI_SYS_VENDOR, "NCR Corporation"),
14987 DMI_MATCH(DMI_PRODUCT_NAME, ""),
14988 },
14989 },
14990 { } /* terminating entry */
14991 },
14992 .hook = quirk_invert_brightness,
14993 },
14994};
14995
14996static struct intel_quirk intel_quirks[] = {
14997 /* Lenovo U160 cannot use SSC on LVDS */
14998 { 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable },
14999
15000 /* Sony Vaio Y cannot use SSC on LVDS */
15001 { 0x0046, 0x104d, 0x9076, quirk_ssc_force_disable },
15002
15003 /* Acer Aspire 5734Z must invert backlight brightness */
15004 { 0x2a42, 0x1025, 0x0459, quirk_invert_brightness },
15005
15006 /* Acer/eMachines G725 */
15007 { 0x2a42, 0x1025, 0x0210, quirk_invert_brightness },
15008
15009 /* Acer/eMachines e725 */
15010 { 0x2a42, 0x1025, 0x0212, quirk_invert_brightness },
15011
15012 /* Acer/Packard Bell NCL20 */
15013 { 0x2a42, 0x1025, 0x034b, quirk_invert_brightness },
15014
15015 /* Acer Aspire 4736Z */
15016 { 0x2a42, 0x1025, 0x0260, quirk_invert_brightness },
15017
15018 /* Acer Aspire 5336 */
15019 { 0x2a42, 0x1025, 0x048a, quirk_invert_brightness },
15020
15021 /* Acer C720 and C720P Chromebooks (Celeron 2955U) have backlights */
15022 { 0x0a06, 0x1025, 0x0a11, quirk_backlight_present },
15023
15024 /* Acer C720 Chromebook (Core i3 4005U) */
15025 { 0x0a16, 0x1025, 0x0a11, quirk_backlight_present },
15026
15027 /* Apple Macbook 2,1 (Core 2 T7400) */
15028 { 0x27a2, 0x8086, 0x7270, quirk_backlight_present },
15029
15030 /* Apple Macbook 4,1 */
15031 { 0x2a02, 0x106b, 0x00a1, quirk_backlight_present },
15032
15033 /* Toshiba CB35 Chromebook (Celeron 2955U) */
15034 { 0x0a06, 0x1179, 0x0a88, quirk_backlight_present },
15035
15036 /* HP Chromebook 14 (Celeron 2955U) */
15037 { 0x0a06, 0x103c, 0x21ed, quirk_backlight_present },
15038
15039 /* Dell Chromebook 11 */
15040 { 0x0a06, 0x1028, 0x0a35, quirk_backlight_present },
15041
15042 /* Dell Chromebook 11 (2015 version) */
15043 { 0x0a16, 0x1028, 0x0a35, quirk_backlight_present },
15044
15045 /* Toshiba Satellite P50-C-18C */
15046 { 0x191B, 0x1179, 0xF840, quirk_increase_t12_delay },
15047
15048 /* GeminiLake NUC */
15049 { 0x3185, 0x8086, 0x2072, quirk_increase_ddi_disabled_time },
15050 { 0x3184, 0x8086, 0x2072, quirk_increase_ddi_disabled_time },
15051 /* ASRock ITX*/
15052 { 0x3185, 0x1849, 0x2212, quirk_increase_ddi_disabled_time },
15053 { 0x3184, 0x1849, 0x2212, quirk_increase_ddi_disabled_time },
15054};
15055
15056static void intel_init_quirks(struct drm_device *dev)
15057{
15058 struct pci_dev *d = dev->pdev;
15059 int i;
15060
15061 for (i = 0; i < ARRAY_SIZE(intel_quirks); i++) {
15062 struct intel_quirk *q = &intel_quirks[i];
15063
15064 if (d->device == q->device &&
15065 (d->subsystem_vendor == q->subsystem_vendor ||
15066 q->subsystem_vendor == PCI_ANY_ID) &&
15067 (d->subsystem_device == q->subsystem_device ||
15068 q->subsystem_device == PCI_ANY_ID))
15069 q->hook(dev);
15070 }
15071 for (i = 0; i < ARRAY_SIZE(intel_dmi_quirks); i++) {
15072 if (dmi_check_system(*intel_dmi_quirks[i].dmi_id_list) != 0)
15073 intel_dmi_quirks[i].hook(dev);
15074 }
15075}
15076
15077/* Disable the VGA plane that we never use */ 14886/* Disable the VGA plane that we never use */
15078static void i915_disable_vga(struct drm_i915_private *dev_priv) 14887static void i915_disable_vga(struct drm_i915_private *dev_priv)
15079{ 14888{
@@ -15233,6 +15042,14 @@ retry:
15233 ret = drm_atomic_add_affected_planes(state, crtc); 15042 ret = drm_atomic_add_affected_planes(state, crtc);
15234 if (ret) 15043 if (ret)
15235 goto out; 15044 goto out;
15045
15046 /*
15047 * FIXME hack to force a LUT update to avoid the
15048 * plane update forcing the pipe gamma on without
15049 * having a proper LUT loaded. Remove once we
15050 * have readout for pipe gamma enable.
15051 */
15052 crtc_state->color_mgmt_changed = true;
15236 } 15053 }
15237 } 15054 }
15238 15055
@@ -15279,7 +15096,9 @@ int intel_modeset_init(struct drm_device *dev)
15279 INIT_WORK(&dev_priv->atomic_helper.free_work, 15096 INIT_WORK(&dev_priv->atomic_helper.free_work,
15280 intel_atomic_helper_free_state_worker); 15097 intel_atomic_helper_free_state_worker);
15281 15098
15282 intel_init_quirks(dev); 15099 intel_init_quirks(dev_priv);
15100
15101 intel_fbc_init(dev_priv);
15283 15102
15284 intel_init_pm(dev_priv); 15103 intel_init_pm(dev_priv);
15285 15104
@@ -15511,8 +15330,8 @@ intel_sanitize_plane_mapping(struct drm_i915_private *dev_priv)
15511 if (pipe == crtc->pipe) 15330 if (pipe == crtc->pipe)
15512 continue; 15331 continue;
15513 15332
15514 DRM_DEBUG_KMS("%s attached to the wrong pipe, disabling plane\n", 15333 DRM_DEBUG_KMS("[PLANE:%d:%s] attached to the wrong pipe, disabling plane\n",
15515 plane->base.name); 15334 plane->base.base.id, plane->base.name);
15516 15335
15517 plane_crtc = intel_get_crtc_for_pipe(dev_priv, pipe); 15336 plane_crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
15518 intel_plane_disable_noatomic(plane_crtc, plane); 15337 intel_plane_disable_noatomic(plane_crtc, plane);
@@ -15553,7 +15372,8 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc,
15553{ 15372{
15554 struct drm_device *dev = crtc->base.dev; 15373 struct drm_device *dev = crtc->base.dev;
15555 struct drm_i915_private *dev_priv = to_i915(dev); 15374 struct drm_i915_private *dev_priv = to_i915(dev);
15556 enum transcoder cpu_transcoder = crtc->config->cpu_transcoder; 15375 struct intel_crtc_state *crtc_state = to_intel_crtc_state(crtc->base.state);
15376 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
15557 15377
15558 /* Clear any frame start delays used for debugging left by the BIOS */ 15378 /* Clear any frame start delays used for debugging left by the BIOS */
15559 if (crtc->active && !transcoder_is_dsi(cpu_transcoder)) { 15379 if (crtc->active && !transcoder_is_dsi(cpu_transcoder)) {
@@ -15563,7 +15383,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc,
15563 I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK); 15383 I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
15564 } 15384 }
15565 15385
15566 if (crtc->active) { 15386 if (crtc_state->base.active) {
15567 struct intel_plane *plane; 15387 struct intel_plane *plane;
15568 15388
15569 /* Disable everything but the primary plane */ 15389 /* Disable everything but the primary plane */
@@ -15579,10 +15399,10 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc,
15579 15399
15580 /* Adjust the state of the output pipe according to whether we 15400 /* Adjust the state of the output pipe according to whether we
15581 * have active connectors/encoders. */ 15401 * have active connectors/encoders. */
15582 if (crtc->active && !intel_crtc_has_encoders(crtc)) 15402 if (crtc_state->base.active && !intel_crtc_has_encoders(crtc))
15583 intel_crtc_disable_noatomic(&crtc->base, ctx); 15403 intel_crtc_disable_noatomic(&crtc->base, ctx);
15584 15404
15585 if (crtc->active || HAS_GMCH_DISPLAY(dev_priv)) { 15405 if (crtc_state->base.active || HAS_GMCH_DISPLAY(dev_priv)) {
15586 /* 15406 /*
15587 * We start out with underrun reporting disabled to avoid races. 15407 * We start out with underrun reporting disabled to avoid races.
15588 * For correct bookkeeping mark this on active crtcs. 15408 * For correct bookkeeping mark this on active crtcs.
@@ -15613,6 +15433,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc,
15613 15433
15614static void intel_sanitize_encoder(struct intel_encoder *encoder) 15434static void intel_sanitize_encoder(struct intel_encoder *encoder)
15615{ 15435{
15436 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
15616 struct intel_connector *connector; 15437 struct intel_connector *connector;
15617 15438
15618 /* We need to check both for a crtc link (meaning that the 15439 /* We need to check both for a crtc link (meaning that the
@@ -15636,7 +15457,8 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
15636 DRM_DEBUG_KMS("[ENCODER:%d:%s] manually disabled\n", 15457 DRM_DEBUG_KMS("[ENCODER:%d:%s] manually disabled\n",
15637 encoder->base.base.id, 15458 encoder->base.base.id,
15638 encoder->base.name); 15459 encoder->base.name);
15639 encoder->disable(encoder, to_intel_crtc_state(crtc_state), connector->base.state); 15460 if (encoder->disable)
15461 encoder->disable(encoder, to_intel_crtc_state(crtc_state), connector->base.state);
15640 if (encoder->post_disable) 15462 if (encoder->post_disable)
15641 encoder->post_disable(encoder, to_intel_crtc_state(crtc_state), connector->base.state); 15463 encoder->post_disable(encoder, to_intel_crtc_state(crtc_state), connector->base.state);
15642 } 15464 }
@@ -15653,6 +15475,9 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
15653 15475
15654 /* notify opregion of the sanitized encoder state */ 15476 /* notify opregion of the sanitized encoder state */
15655 intel_opregion_notify_encoder(encoder, connector && has_active_crtc); 15477 intel_opregion_notify_encoder(encoder, connector && has_active_crtc);
15478
15479 if (INTEL_GEN(dev_priv) >= 11)
15480 icl_sanitize_encoder_pll_mapping(encoder);
15656} 15481}
15657 15482
15658void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv) 15483void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv)
@@ -15701,6 +15526,10 @@ static void readout_plane_state(struct drm_i915_private *dev_priv)
15701 crtc_state = to_intel_crtc_state(crtc->base.state); 15526 crtc_state = to_intel_crtc_state(crtc->base.state);
15702 15527
15703 intel_set_plane_visible(crtc_state, plane_state, visible); 15528 intel_set_plane_visible(crtc_state, plane_state, visible);
15529
15530 DRM_DEBUG_KMS("[PLANE:%d:%s] hw state readout: %s, pipe %c\n",
15531 plane->base.base.id, plane->base.name,
15532 enableddisabled(visible), pipe_name(pipe));
15704 } 15533 }
15705 15534
15706 for_each_intel_crtc(&dev_priv->drm, crtc) { 15535 for_each_intel_crtc(&dev_priv->drm, crtc) {
@@ -15853,7 +15682,7 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
15853 15682
15854 drm_calc_timestamping_constants(&crtc->base, 15683 drm_calc_timestamping_constants(&crtc->base,
15855 &crtc_state->base.adjusted_mode); 15684 &crtc_state->base.adjusted_mode);
15856 update_scanline_offset(crtc); 15685 update_scanline_offset(crtc_state);
15857 } 15686 }
15858 15687
15859 dev_priv->min_cdclk[crtc->pipe] = min_cdclk; 15688 dev_priv->min_cdclk[crtc->pipe] = min_cdclk;
@@ -15908,6 +15737,65 @@ static void intel_early_display_was(struct drm_i915_private *dev_priv)
15908 } 15737 }
15909} 15738}
15910 15739
15740static void ibx_sanitize_pch_hdmi_port(struct drm_i915_private *dev_priv,
15741 enum port port, i915_reg_t hdmi_reg)
15742{
15743 u32 val = I915_READ(hdmi_reg);
15744
15745 if (val & SDVO_ENABLE ||
15746 (val & SDVO_PIPE_SEL_MASK) == SDVO_PIPE_SEL(PIPE_A))
15747 return;
15748
15749 DRM_DEBUG_KMS("Sanitizing transcoder select for HDMI %c\n",
15750 port_name(port));
15751
15752 val &= ~SDVO_PIPE_SEL_MASK;
15753 val |= SDVO_PIPE_SEL(PIPE_A);
15754
15755 I915_WRITE(hdmi_reg, val);
15756}
15757
15758static void ibx_sanitize_pch_dp_port(struct drm_i915_private *dev_priv,
15759 enum port port, i915_reg_t dp_reg)
15760{
15761 u32 val = I915_READ(dp_reg);
15762
15763 if (val & DP_PORT_EN ||
15764 (val & DP_PIPE_SEL_MASK) == DP_PIPE_SEL(PIPE_A))
15765 return;
15766
15767 DRM_DEBUG_KMS("Sanitizing transcoder select for DP %c\n",
15768 port_name(port));
15769
15770 val &= ~DP_PIPE_SEL_MASK;
15771 val |= DP_PIPE_SEL(PIPE_A);
15772
15773 I915_WRITE(dp_reg, val);
15774}
15775
15776static void ibx_sanitize_pch_ports(struct drm_i915_private *dev_priv)
15777{
15778 /*
15779 * The BIOS may select transcoder B on some of the PCH
15780 * ports even it doesn't enable the port. This would trip
15781 * assert_pch_dp_disabled() and assert_pch_hdmi_disabled().
15782 * Sanitize the transcoder select bits to prevent that. We
15783 * assume that the BIOS never actually enabled the port,
15784 * because if it did we'd actually have to toggle the port
15785 * on and back off to make the transcoder A select stick
15786 * (see. intel_dp_link_down(), intel_disable_hdmi(),
15787 * intel_disable_sdvo()).
15788 */
15789 ibx_sanitize_pch_dp_port(dev_priv, PORT_B, PCH_DP_B);
15790 ibx_sanitize_pch_dp_port(dev_priv, PORT_C, PCH_DP_C);
15791 ibx_sanitize_pch_dp_port(dev_priv, PORT_D, PCH_DP_D);
15792
15793 /* PCH SDVOB multiplex with HDMIB */
15794 ibx_sanitize_pch_hdmi_port(dev_priv, PORT_B, PCH_HDMIB);
15795 ibx_sanitize_pch_hdmi_port(dev_priv, PORT_C, PCH_HDMIC);
15796 ibx_sanitize_pch_hdmi_port(dev_priv, PORT_D, PCH_HDMID);
15797}
15798
15911/* Scan out the current hw modeset state, 15799/* Scan out the current hw modeset state,
15912 * and sanitizes it to the current state 15800 * and sanitizes it to the current state
15913 */ 15801 */
@@ -15917,6 +15805,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
15917{ 15805{
15918 struct drm_i915_private *dev_priv = to_i915(dev); 15806 struct drm_i915_private *dev_priv = to_i915(dev);
15919 struct intel_crtc *crtc; 15807 struct intel_crtc *crtc;
15808 struct intel_crtc_state *crtc_state;
15920 struct intel_encoder *encoder; 15809 struct intel_encoder *encoder;
15921 int i; 15810 int i;
15922 15811
@@ -15928,6 +15817,9 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
15928 /* HW state is read out, now we need to sanitize this mess. */ 15817 /* HW state is read out, now we need to sanitize this mess. */
15929 get_encoder_power_domains(dev_priv); 15818 get_encoder_power_domains(dev_priv);
15930 15819
15820 if (HAS_PCH_IBX(dev_priv))
15821 ibx_sanitize_pch_ports(dev_priv);
15822
15931 /* 15823 /*
15932 * intel_sanitize_plane_mapping() may need to do vblank 15824 * intel_sanitize_plane_mapping() may need to do vblank
15933 * waits, so we need vblank interrupts restored beforehand. 15825 * waits, so we need vblank interrupts restored beforehand.
@@ -15935,7 +15827,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
15935 for_each_intel_crtc(&dev_priv->drm, crtc) { 15827 for_each_intel_crtc(&dev_priv->drm, crtc) {
15936 drm_crtc_vblank_reset(&crtc->base); 15828 drm_crtc_vblank_reset(&crtc->base);
15937 15829
15938 if (crtc->active) 15830 if (crtc->base.state->active)
15939 drm_crtc_vblank_on(&crtc->base); 15831 drm_crtc_vblank_on(&crtc->base);
15940 } 15832 }
15941 15833
@@ -15945,8 +15837,9 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
15945 intel_sanitize_encoder(encoder); 15837 intel_sanitize_encoder(encoder);
15946 15838
15947 for_each_intel_crtc(&dev_priv->drm, crtc) { 15839 for_each_intel_crtc(&dev_priv->drm, crtc) {
15840 crtc_state = to_intel_crtc_state(crtc->base.state);
15948 intel_sanitize_crtc(crtc, ctx); 15841 intel_sanitize_crtc(crtc, ctx);
15949 intel_dump_pipe_config(crtc, crtc->config, 15842 intel_dump_pipe_config(crtc, crtc_state,
15950 "[setup_hw_state]"); 15843 "[setup_hw_state]");
15951 } 15844 }
15952 15845
@@ -15980,7 +15873,8 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
15980 for_each_intel_crtc(dev, crtc) { 15873 for_each_intel_crtc(dev, crtc) {
15981 u64 put_domains; 15874 u64 put_domains;
15982 15875
15983 put_domains = modeset_get_crtc_power_domains(&crtc->base, crtc->config); 15876 crtc_state = to_intel_crtc_state(crtc->base.state);
15877 put_domains = modeset_get_crtc_power_domains(&crtc->base, crtc_state);
15984 if (WARN_ON(put_domains)) 15878 if (WARN_ON(put_domains))
15985 modeset_put_power_domains(dev_priv, put_domains); 15879 modeset_put_power_domains(dev_priv, put_domains);
15986 } 15880 }
@@ -16024,29 +15918,6 @@ void intel_display_resume(struct drm_device *dev)
16024 drm_atomic_state_put(state); 15918 drm_atomic_state_put(state);
16025} 15919}
16026 15920
16027int intel_connector_register(struct drm_connector *connector)
16028{
16029 struct intel_connector *intel_connector = to_intel_connector(connector);
16030 int ret;
16031
16032 ret = intel_backlight_device_register(intel_connector);
16033 if (ret)
16034 goto err;
16035
16036 return 0;
16037
16038err:
16039 return ret;
16040}
16041
16042void intel_connector_unregister(struct drm_connector *connector)
16043{
16044 struct intel_connector *intel_connector = to_intel_connector(connector);
16045
16046 intel_backlight_device_unregister(intel_connector);
16047 intel_panel_destroy_backlight(connector);
16048}
16049
16050static void intel_hpd_poll_fini(struct drm_device *dev) 15921static void intel_hpd_poll_fini(struct drm_device *dev)
16051{ 15922{
16052 struct intel_connector *connector; 15923 struct intel_connector *connector;
@@ -16057,9 +15928,9 @@ static void intel_hpd_poll_fini(struct drm_device *dev)
16057 for_each_intel_connector_iter(connector, &conn_iter) { 15928 for_each_intel_connector_iter(connector, &conn_iter) {
16058 if (connector->modeset_retry_work.func) 15929 if (connector->modeset_retry_work.func)
16059 cancel_work_sync(&connector->modeset_retry_work); 15930 cancel_work_sync(&connector->modeset_retry_work);
16060 if (connector->hdcp_shim) { 15931 if (connector->hdcp.shim) {
16061 cancel_delayed_work_sync(&connector->hdcp_check_work); 15932 cancel_delayed_work_sync(&connector->hdcp.check_work);
16062 cancel_work_sync(&connector->hdcp_prop_work); 15933 cancel_work_sync(&connector->hdcp.prop_work);
16063 } 15934 }
16064 } 15935 }
16065 drm_connector_list_iter_end(&conn_iter); 15936 drm_connector_list_iter_end(&conn_iter);
@@ -16099,18 +15970,13 @@ void intel_modeset_cleanup(struct drm_device *dev)
16099 15970
16100 drm_mode_config_cleanup(dev); 15971 drm_mode_config_cleanup(dev);
16101 15972
16102 intel_cleanup_overlay(dev_priv); 15973 intel_overlay_cleanup(dev_priv);
16103 15974
16104 intel_teardown_gmbus(dev_priv); 15975 intel_teardown_gmbus(dev_priv);
16105 15976
16106 destroy_workqueue(dev_priv->modeset_wq); 15977 destroy_workqueue(dev_priv->modeset_wq);
16107}
16108 15978
16109void intel_connector_attach_encoder(struct intel_connector *connector, 15979 intel_fbc_cleanup_cfb(dev_priv);
16110 struct intel_encoder *encoder)
16111{
16112 connector->encoder = encoder;
16113 drm_connector_attach_encoder(&connector->base, &encoder->base);
16114} 15980}
16115 15981
16116/* 15982/*
diff --git a/drivers/gpu/drm/i915/intel_display.h b/drivers/gpu/drm/i915/intel_display.h
index 9fac67e31205..5f2955b944da 100644
--- a/drivers/gpu/drm/i915/intel_display.h
+++ b/drivers/gpu/drm/i915/intel_display.h
@@ -43,6 +43,11 @@ enum i915_gpio {
43 GPIOM, 43 GPIOM,
44}; 44};
45 45
46/*
47 * Keep the pipe enum values fixed: the code assumes that PIPE_A=0, the
48 * rest have consecutive values and match the enum values of transcoders
49 * with a 1:1 transcoder -> pipe mapping.
50 */
46enum pipe { 51enum pipe {
47 INVALID_PIPE = -1, 52 INVALID_PIPE = -1,
48 53
@@ -57,12 +62,25 @@ enum pipe {
57#define pipe_name(p) ((p) + 'A') 62#define pipe_name(p) ((p) + 'A')
58 63
59enum transcoder { 64enum transcoder {
60 TRANSCODER_A = 0, 65 /*
61 TRANSCODER_B, 66 * The following transcoders have a 1:1 transcoder -> pipe mapping,
62 TRANSCODER_C, 67 * keep their values fixed: the code assumes that TRANSCODER_A=0, the
68 * rest have consecutive values and match the enum values of the pipes
69 * they map to.
70 */
71 TRANSCODER_A = PIPE_A,
72 TRANSCODER_B = PIPE_B,
73 TRANSCODER_C = PIPE_C,
74
75 /*
76 * The following transcoders can map to any pipe, their enum value
77 * doesn't need to stay fixed.
78 */
63 TRANSCODER_EDP, 79 TRANSCODER_EDP,
64 TRANSCODER_DSI_A, 80 TRANSCODER_DSI_0,
65 TRANSCODER_DSI_C, 81 TRANSCODER_DSI_1,
82 TRANSCODER_DSI_A = TRANSCODER_DSI_0, /* legacy DSI */
83 TRANSCODER_DSI_C = TRANSCODER_DSI_1, /* legacy DSI */
66 84
67 I915_MAX_TRANSCODERS 85 I915_MAX_TRANSCODERS
68}; 86};
@@ -120,6 +138,9 @@ enum plane_id {
120 PLANE_SPRITE0, 138 PLANE_SPRITE0,
121 PLANE_SPRITE1, 139 PLANE_SPRITE1,
122 PLANE_SPRITE2, 140 PLANE_SPRITE2,
141 PLANE_SPRITE3,
142 PLANE_SPRITE4,
143 PLANE_SPRITE5,
123 PLANE_CURSOR, 144 PLANE_CURSOR,
124 145
125 I915_MAX_PLANES, 146 I915_MAX_PLANES,
@@ -363,7 +384,7 @@ struct intel_link_m_n {
363 (__dev_priv)->power_domains.power_well_count; \ 384 (__dev_priv)->power_domains.power_well_count; \
364 (__power_well)++) 385 (__power_well)++)
365 386
366#define for_each_power_well_rev(__dev_priv, __power_well) \ 387#define for_each_power_well_reverse(__dev_priv, __power_well) \
367 for ((__power_well) = (__dev_priv)->power_domains.power_wells + \ 388 for ((__power_well) = (__dev_priv)->power_domains.power_wells + \
368 (__dev_priv)->power_domains.power_well_count - 1; \ 389 (__dev_priv)->power_domains.power_well_count - 1; \
369 (__power_well) - (__dev_priv)->power_domains.power_wells >= 0; \ 390 (__power_well) - (__dev_priv)->power_domains.power_wells >= 0; \
@@ -373,8 +394,8 @@ struct intel_link_m_n {
373 for_each_power_well(__dev_priv, __power_well) \ 394 for_each_power_well(__dev_priv, __power_well) \
374 for_each_if((__power_well)->desc->domains & (__domain_mask)) 395 for_each_if((__power_well)->desc->domains & (__domain_mask))
375 396
376#define for_each_power_domain_well_rev(__dev_priv, __power_well, __domain_mask) \ 397#define for_each_power_domain_well_reverse(__dev_priv, __power_well, __domain_mask) \
377 for_each_power_well_rev(__dev_priv, __power_well) \ 398 for_each_power_well_reverse(__dev_priv, __power_well) \
378 for_each_if((__power_well)->desc->domains & (__domain_mask)) 399 for_each_if((__power_well)->desc->domains & (__domain_mask))
379 400
380#define for_each_new_intel_plane_in_state(__state, plane, new_plane_state, __i) \ 401#define for_each_new_intel_plane_in_state(__state, plane, new_plane_state, __i) \
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 13f9b56a9ce7..7699f9b7b2d2 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -45,6 +45,17 @@
45 45
46#define DP_DPRX_ESI_LEN 14 46#define DP_DPRX_ESI_LEN 14
47 47
48/* DP DSC small joiner has 2 FIFOs each of 640 x 6 bytes */
49#define DP_DSC_MAX_SMALL_JOINER_RAM_BUFFER 61440
50
51/* DP DSC throughput values used for slice count calculations KPixels/s */
52#define DP_DSC_PEAK_PIXEL_RATE 2720000
53#define DP_DSC_MAX_ENC_THROUGHPUT_0 340000
54#define DP_DSC_MAX_ENC_THROUGHPUT_1 400000
55
56/* DP DSC FEC Overhead factor = (100 - 2.4)/100 */
57#define DP_DSC_FEC_OVERHEAD_FACTOR 976
58
48/* Compliance test status bits */ 59/* Compliance test status bits */
49#define INTEL_DP_RESOLUTION_SHIFT_MASK 0 60#define INTEL_DP_RESOLUTION_SHIFT_MASK 0
50#define INTEL_DP_RESOLUTION_PREFERRED (1 << INTEL_DP_RESOLUTION_SHIFT_MASK) 61#define INTEL_DP_RESOLUTION_PREFERRED (1 << INTEL_DP_RESOLUTION_SHIFT_MASK)
@@ -93,6 +104,14 @@ static const struct dp_link_dpll chv_dpll[] = {
93 { .p1 = 4, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6c00000 } }, 104 { .p1 = 4, .p2 = 1, .n = 1, .m1 = 2, .m2 = 0x6c00000 } },
94}; 105};
95 106
107/* Constants for DP DSC configurations */
108static const u8 valid_dsc_bpp[] = {6, 8, 10, 12, 15};
109
110/* With Single pipe configuration, HW is capable of supporting maximum
111 * of 4 slices per line.
112 */
113static const u8 valid_dsc_slicecount[] = {1, 2, 4};
114
96/** 115/**
97 * intel_dp_is_edp - is the given port attached to an eDP panel (either CPU or PCH) 116 * intel_dp_is_edp - is the given port attached to an eDP panel (either CPU or PCH)
98 * @intel_dp: DP struct 117 * @intel_dp: DP struct
@@ -222,138 +241,6 @@ intel_dp_link_required(int pixel_clock, int bpp)
222 return DIV_ROUND_UP(pixel_clock * bpp, 8); 241 return DIV_ROUND_UP(pixel_clock * bpp, 8);
223} 242}
224 243
225void icl_program_mg_dp_mode(struct intel_dp *intel_dp)
226{
227 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
228 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
229 enum port port = intel_dig_port->base.port;
230 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
231 u32 ln0, ln1, lane_info;
232
233 if (tc_port == PORT_TC_NONE || intel_dig_port->tc_type == TC_PORT_TBT)
234 return;
235
236 ln0 = I915_READ(MG_DP_MODE(port, 0));
237 ln1 = I915_READ(MG_DP_MODE(port, 1));
238
239 switch (intel_dig_port->tc_type) {
240 case TC_PORT_TYPEC:
241 ln0 &= ~(MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE);
242 ln1 &= ~(MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE);
243
244 lane_info = (I915_READ(PORT_TX_DFLEXDPSP) &
245 DP_LANE_ASSIGNMENT_MASK(tc_port)) >>
246 DP_LANE_ASSIGNMENT_SHIFT(tc_port);
247
248 switch (lane_info) {
249 case 0x1:
250 case 0x4:
251 break;
252 case 0x2:
253 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE;
254 break;
255 case 0x3:
256 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE |
257 MG_DP_MODE_CFG_DP_X2_MODE;
258 break;
259 case 0x8:
260 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE;
261 break;
262 case 0xC:
263 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE |
264 MG_DP_MODE_CFG_DP_X2_MODE;
265 break;
266 case 0xF:
267 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE |
268 MG_DP_MODE_CFG_DP_X2_MODE;
269 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE |
270 MG_DP_MODE_CFG_DP_X2_MODE;
271 break;
272 default:
273 MISSING_CASE(lane_info);
274 }
275 break;
276
277 case TC_PORT_LEGACY:
278 ln0 |= MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE;
279 ln1 |= MG_DP_MODE_CFG_DP_X1_MODE | MG_DP_MODE_CFG_DP_X2_MODE;
280 break;
281
282 default:
283 MISSING_CASE(intel_dig_port->tc_type);
284 return;
285 }
286
287 I915_WRITE(MG_DP_MODE(port, 0), ln0);
288 I915_WRITE(MG_DP_MODE(port, 1), ln1);
289}
290
291void icl_enable_phy_clock_gating(struct intel_digital_port *dig_port)
292{
293 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
294 enum port port = dig_port->base.port;
295 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
296 i915_reg_t mg_regs[2] = { MG_DP_MODE(port, 0), MG_DP_MODE(port, 1) };
297 u32 val;
298 int i;
299
300 if (tc_port == PORT_TC_NONE)
301 return;
302
303 for (i = 0; i < ARRAY_SIZE(mg_regs); i++) {
304 val = I915_READ(mg_regs[i]);
305 val |= MG_DP_MODE_CFG_TR2PWR_GATING |
306 MG_DP_MODE_CFG_TRPWR_GATING |
307 MG_DP_MODE_CFG_CLNPWR_GATING |
308 MG_DP_MODE_CFG_DIGPWR_GATING |
309 MG_DP_MODE_CFG_GAONPWR_GATING;
310 I915_WRITE(mg_regs[i], val);
311 }
312
313 val = I915_READ(MG_MISC_SUS0(tc_port));
314 val |= MG_MISC_SUS0_SUSCLK_DYNCLKGATE_MODE(3) |
315 MG_MISC_SUS0_CFG_TR2PWR_GATING |
316 MG_MISC_SUS0_CFG_CL2PWR_GATING |
317 MG_MISC_SUS0_CFG_GAONPWR_GATING |
318 MG_MISC_SUS0_CFG_TRPWR_GATING |
319 MG_MISC_SUS0_CFG_CL1PWR_GATING |
320 MG_MISC_SUS0_CFG_DGPWR_GATING;
321 I915_WRITE(MG_MISC_SUS0(tc_port), val);
322}
323
324void icl_disable_phy_clock_gating(struct intel_digital_port *dig_port)
325{
326 struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
327 enum port port = dig_port->base.port;
328 enum tc_port tc_port = intel_port_to_tc(dev_priv, port);
329 i915_reg_t mg_regs[2] = { MG_DP_MODE(port, 0), MG_DP_MODE(port, 1) };
330 u32 val;
331 int i;
332
333 if (tc_port == PORT_TC_NONE)
334 return;
335
336 for (i = 0; i < ARRAY_SIZE(mg_regs); i++) {
337 val = I915_READ(mg_regs[i]);
338 val &= ~(MG_DP_MODE_CFG_TR2PWR_GATING |
339 MG_DP_MODE_CFG_TRPWR_GATING |
340 MG_DP_MODE_CFG_CLNPWR_GATING |
341 MG_DP_MODE_CFG_DIGPWR_GATING |
342 MG_DP_MODE_CFG_GAONPWR_GATING);
343 I915_WRITE(mg_regs[i], val);
344 }
345
346 val = I915_READ(MG_MISC_SUS0(tc_port));
347 val &= ~(MG_MISC_SUS0_SUSCLK_DYNCLKGATE_MODE_MASK |
348 MG_MISC_SUS0_CFG_TR2PWR_GATING |
349 MG_MISC_SUS0_CFG_CL2PWR_GATING |
350 MG_MISC_SUS0_CFG_GAONPWR_GATING |
351 MG_MISC_SUS0_CFG_TRPWR_GATING |
352 MG_MISC_SUS0_CFG_CL1PWR_GATING |
353 MG_MISC_SUS0_CFG_DGPWR_GATING);
354 I915_WRITE(MG_MISC_SUS0(tc_port), val);
355}
356
357int 244int
358intel_dp_max_data_rate(int max_link_clock, int max_lanes) 245intel_dp_max_data_rate(int max_link_clock, int max_lanes)
359{ 246{
@@ -455,7 +342,7 @@ intel_dp_set_source_rates(struct intel_dp *intel_dp)
455 if (INTEL_GEN(dev_priv) >= 10) { 342 if (INTEL_GEN(dev_priv) >= 10) {
456 source_rates = cnl_rates; 343 source_rates = cnl_rates;
457 size = ARRAY_SIZE(cnl_rates); 344 size = ARRAY_SIZE(cnl_rates);
458 if (INTEL_GEN(dev_priv) == 10) 345 if (IS_GEN10(dev_priv))
459 max_rate = cnl_max_source_rate(intel_dp); 346 max_rate = cnl_max_source_rate(intel_dp);
460 else 347 else
461 max_rate = icl_max_source_rate(intel_dp); 348 max_rate = icl_max_source_rate(intel_dp);
@@ -616,9 +503,12 @@ intel_dp_mode_valid(struct drm_connector *connector,
616 struct intel_dp *intel_dp = intel_attached_dp(connector); 503 struct intel_dp *intel_dp = intel_attached_dp(connector);
617 struct intel_connector *intel_connector = to_intel_connector(connector); 504 struct intel_connector *intel_connector = to_intel_connector(connector);
618 struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode; 505 struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
506 struct drm_i915_private *dev_priv = to_i915(connector->dev);
619 int target_clock = mode->clock; 507 int target_clock = mode->clock;
620 int max_rate, mode_rate, max_lanes, max_link_clock; 508 int max_rate, mode_rate, max_lanes, max_link_clock;
621 int max_dotclk; 509 int max_dotclk;
510 u16 dsc_max_output_bpp = 0;
511 u8 dsc_slice_count = 0;
622 512
623 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) 513 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
624 return MODE_NO_DBLESCAN; 514 return MODE_NO_DBLESCAN;
@@ -641,7 +531,33 @@ intel_dp_mode_valid(struct drm_connector *connector,
641 max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes); 531 max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes);
642 mode_rate = intel_dp_link_required(target_clock, 18); 532 mode_rate = intel_dp_link_required(target_clock, 18);
643 533
644 if (mode_rate > max_rate || target_clock > max_dotclk) 534 /*
535 * Output bpp is stored in 6.4 format so right shift by 4 to get the
536 * integer value since we support only integer values of bpp.
537 */
538 if ((INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) &&
539 drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
540 if (intel_dp_is_edp(intel_dp)) {
541 dsc_max_output_bpp =
542 drm_edp_dsc_sink_output_bpp(intel_dp->dsc_dpcd) >> 4;
543 dsc_slice_count =
544 drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd,
545 true);
546 } else {
547 dsc_max_output_bpp =
548 intel_dp_dsc_get_output_bpp(max_link_clock,
549 max_lanes,
550 target_clock,
551 mode->hdisplay) >> 4;
552 dsc_slice_count =
553 intel_dp_dsc_get_slice_count(intel_dp,
554 target_clock,
555 mode->hdisplay);
556 }
557 }
558
559 if ((mode_rate > max_rate && !(dsc_max_output_bpp && dsc_slice_count)) ||
560 target_clock > max_dotclk)
645 return MODE_CLOCK_HIGH; 561 return MODE_CLOCK_HIGH;
646 562
647 if (mode->clock < 10000) 563 if (mode->clock < 10000)
@@ -690,7 +606,8 @@ static void pps_lock(struct intel_dp *intel_dp)
690 * See intel_power_sequencer_reset() why we need 606 * See intel_power_sequencer_reset() why we need
691 * a power domain reference here. 607 * a power domain reference here.
692 */ 608 */
693 intel_display_power_get(dev_priv, intel_dp->aux_power_domain); 609 intel_display_power_get(dev_priv,
610 intel_aux_power_domain(dp_to_dig_port(intel_dp)));
694 611
695 mutex_lock(&dev_priv->pps_mutex); 612 mutex_lock(&dev_priv->pps_mutex);
696} 613}
@@ -701,7 +618,8 @@ static void pps_unlock(struct intel_dp *intel_dp)
701 618
702 mutex_unlock(&dev_priv->pps_mutex); 619 mutex_unlock(&dev_priv->pps_mutex);
703 620
704 intel_display_power_put(dev_priv, intel_dp->aux_power_domain); 621 intel_display_power_put(dev_priv,
622 intel_aux_power_domain(dp_to_dig_port(intel_dp)));
705} 623}
706 624
707static void 625static void
@@ -1156,6 +1074,7 @@ static uint32_t g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
1156static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index) 1074static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
1157{ 1075{
1158 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 1076 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1077 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1159 1078
1160 if (index) 1079 if (index)
1161 return 0; 1080 return 0;
@@ -1165,7 +1084,7 @@ static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
1165 * like to run at 2MHz. So, take the cdclk or PCH rawclk value and 1084 * like to run at 2MHz. So, take the cdclk or PCH rawclk value and
1166 * divide by 2000 and use that 1085 * divide by 2000 and use that
1167 */ 1086 */
1168 if (intel_dp->aux_ch == AUX_CH_A) 1087 if (dig_port->aux_ch == AUX_CH_A)
1169 return DIV_ROUND_CLOSEST(dev_priv->cdclk.hw.cdclk, 2000); 1088 return DIV_ROUND_CLOSEST(dev_priv->cdclk.hw.cdclk, 2000);
1170 else 1089 else
1171 return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000); 1090 return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000);
@@ -1174,8 +1093,9 @@ static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
1174static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index) 1093static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
1175{ 1094{
1176 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 1095 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1096 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1177 1097
1178 if (intel_dp->aux_ch != AUX_CH_A && HAS_PCH_LPT_H(dev_priv)) { 1098 if (dig_port->aux_ch != AUX_CH_A && HAS_PCH_LPT_H(dev_priv)) {
1179 /* Workaround for non-ULT HSW */ 1099 /* Workaround for non-ULT HSW */
1180 switch (index) { 1100 switch (index) {
1181 case 0: return 63; 1101 case 0: return 63;
@@ -1503,80 +1423,12 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
1503 return ret; 1423 return ret;
1504} 1424}
1505 1425
1506static enum aux_ch intel_aux_ch(struct intel_dp *intel_dp)
1507{
1508 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
1509 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1510 enum port port = encoder->port;
1511 const struct ddi_vbt_port_info *info =
1512 &dev_priv->vbt.ddi_port_info[port];
1513 enum aux_ch aux_ch;
1514
1515 if (!info->alternate_aux_channel) {
1516 aux_ch = (enum aux_ch) port;
1517
1518 DRM_DEBUG_KMS("using AUX %c for port %c (platform default)\n",
1519 aux_ch_name(aux_ch), port_name(port));
1520 return aux_ch;
1521 }
1522
1523 switch (info->alternate_aux_channel) {
1524 case DP_AUX_A:
1525 aux_ch = AUX_CH_A;
1526 break;
1527 case DP_AUX_B:
1528 aux_ch = AUX_CH_B;
1529 break;
1530 case DP_AUX_C:
1531 aux_ch = AUX_CH_C;
1532 break;
1533 case DP_AUX_D:
1534 aux_ch = AUX_CH_D;
1535 break;
1536 case DP_AUX_E:
1537 aux_ch = AUX_CH_E;
1538 break;
1539 case DP_AUX_F:
1540 aux_ch = AUX_CH_F;
1541 break;
1542 default:
1543 MISSING_CASE(info->alternate_aux_channel);
1544 aux_ch = AUX_CH_A;
1545 break;
1546 }
1547
1548 DRM_DEBUG_KMS("using AUX %c for port %c (VBT)\n",
1549 aux_ch_name(aux_ch), port_name(port));
1550
1551 return aux_ch;
1552}
1553
1554static enum intel_display_power_domain
1555intel_aux_power_domain(struct intel_dp *intel_dp)
1556{
1557 switch (intel_dp->aux_ch) {
1558 case AUX_CH_A:
1559 return POWER_DOMAIN_AUX_A;
1560 case AUX_CH_B:
1561 return POWER_DOMAIN_AUX_B;
1562 case AUX_CH_C:
1563 return POWER_DOMAIN_AUX_C;
1564 case AUX_CH_D:
1565 return POWER_DOMAIN_AUX_D;
1566 case AUX_CH_E:
1567 return POWER_DOMAIN_AUX_E;
1568 case AUX_CH_F:
1569 return POWER_DOMAIN_AUX_F;
1570 default:
1571 MISSING_CASE(intel_dp->aux_ch);
1572 return POWER_DOMAIN_AUX_A;
1573 }
1574}
1575 1426
1576static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp) 1427static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)
1577{ 1428{
1578 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 1429 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1579 enum aux_ch aux_ch = intel_dp->aux_ch; 1430 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1431 enum aux_ch aux_ch = dig_port->aux_ch;
1580 1432
1581 switch (aux_ch) { 1433 switch (aux_ch) {
1582 case AUX_CH_B: 1434 case AUX_CH_B:
@@ -1592,7 +1444,8 @@ static i915_reg_t g4x_aux_ctl_reg(struct intel_dp *intel_dp)
1592static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int index) 1444static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int index)
1593{ 1445{
1594 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 1446 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1595 enum aux_ch aux_ch = intel_dp->aux_ch; 1447 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1448 enum aux_ch aux_ch = dig_port->aux_ch;
1596 1449
1597 switch (aux_ch) { 1450 switch (aux_ch) {
1598 case AUX_CH_B: 1451 case AUX_CH_B:
@@ -1608,7 +1461,8 @@ static i915_reg_t g4x_aux_data_reg(struct intel_dp *intel_dp, int index)
1608static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp) 1461static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp)
1609{ 1462{
1610 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 1463 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1611 enum aux_ch aux_ch = intel_dp->aux_ch; 1464 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1465 enum aux_ch aux_ch = dig_port->aux_ch;
1612 1466
1613 switch (aux_ch) { 1467 switch (aux_ch) {
1614 case AUX_CH_A: 1468 case AUX_CH_A:
@@ -1626,7 +1480,8 @@ static i915_reg_t ilk_aux_ctl_reg(struct intel_dp *intel_dp)
1626static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int index) 1480static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int index)
1627{ 1481{
1628 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 1482 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1629 enum aux_ch aux_ch = intel_dp->aux_ch; 1483 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1484 enum aux_ch aux_ch = dig_port->aux_ch;
1630 1485
1631 switch (aux_ch) { 1486 switch (aux_ch) {
1632 case AUX_CH_A: 1487 case AUX_CH_A:
@@ -1644,7 +1499,8 @@ static i915_reg_t ilk_aux_data_reg(struct intel_dp *intel_dp, int index)
1644static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp) 1499static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp)
1645{ 1500{
1646 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 1501 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1647 enum aux_ch aux_ch = intel_dp->aux_ch; 1502 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1503 enum aux_ch aux_ch = dig_port->aux_ch;
1648 1504
1649 switch (aux_ch) { 1505 switch (aux_ch) {
1650 case AUX_CH_A: 1506 case AUX_CH_A:
@@ -1663,7 +1519,8 @@ static i915_reg_t skl_aux_ctl_reg(struct intel_dp *intel_dp)
1663static i915_reg_t skl_aux_data_reg(struct intel_dp *intel_dp, int index) 1519static i915_reg_t skl_aux_data_reg(struct intel_dp *intel_dp, int index)
1664{ 1520{
1665 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 1521 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1666 enum aux_ch aux_ch = intel_dp->aux_ch; 1522 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1523 enum aux_ch aux_ch = dig_port->aux_ch;
1667 1524
1668 switch (aux_ch) { 1525 switch (aux_ch) {
1669 case AUX_CH_A: 1526 case AUX_CH_A:
@@ -1689,10 +1546,8 @@ static void
1689intel_dp_aux_init(struct intel_dp *intel_dp) 1546intel_dp_aux_init(struct intel_dp *intel_dp)
1690{ 1547{
1691 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 1548 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
1692 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 1549 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1693 1550 struct intel_encoder *encoder = &dig_port->base;
1694 intel_dp->aux_ch = intel_aux_ch(intel_dp);
1695 intel_dp->aux_power_domain = intel_aux_power_domain(intel_dp);
1696 1551
1697 if (INTEL_GEN(dev_priv) >= 9) { 1552 if (INTEL_GEN(dev_priv) >= 9) {
1698 intel_dp->aux_ch_ctl_reg = skl_aux_ctl_reg; 1553 intel_dp->aux_ch_ctl_reg = skl_aux_ctl_reg;
@@ -1951,6 +1806,42 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
1951 return false; 1806 return false;
1952} 1807}
1953 1808
1809/* Optimize link config in order: max bpp, min lanes, min clock */
1810static bool
1811intel_dp_compute_link_config_fast(struct intel_dp *intel_dp,
1812 struct intel_crtc_state *pipe_config,
1813 const struct link_config_limits *limits)
1814{
1815 struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
1816 int bpp, clock, lane_count;
1817 int mode_rate, link_clock, link_avail;
1818
1819 for (bpp = limits->max_bpp; bpp >= limits->min_bpp; bpp -= 2 * 3) {
1820 mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock,
1821 bpp);
1822
1823 for (lane_count = limits->min_lane_count;
1824 lane_count <= limits->max_lane_count;
1825 lane_count <<= 1) {
1826 for (clock = limits->min_clock; clock <= limits->max_clock; clock++) {
1827 link_clock = intel_dp->common_rates[clock];
1828 link_avail = intel_dp_max_data_rate(link_clock,
1829 lane_count);
1830
1831 if (mode_rate <= link_avail) {
1832 pipe_config->lane_count = lane_count;
1833 pipe_config->pipe_bpp = bpp;
1834 pipe_config->port_clock = link_clock;
1835
1836 return true;
1837 }
1838 }
1839 }
1840 }
1841
1842 return false;
1843}
1844
1954static bool 1845static bool
1955intel_dp_compute_link_config(struct intel_encoder *encoder, 1846intel_dp_compute_link_config(struct intel_encoder *encoder,
1956 struct intel_crtc_state *pipe_config) 1847 struct intel_crtc_state *pipe_config)
@@ -1975,13 +1866,15 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
1975 limits.min_bpp = 6 * 3; 1866 limits.min_bpp = 6 * 3;
1976 limits.max_bpp = intel_dp_compute_bpp(intel_dp, pipe_config); 1867 limits.max_bpp = intel_dp_compute_bpp(intel_dp, pipe_config);
1977 1868
1978 if (intel_dp_is_edp(intel_dp)) { 1869 if (intel_dp_is_edp(intel_dp) && intel_dp->edp_dpcd[0] < DP_EDP_14) {
1979 /* 1870 /*
1980 * Use the maximum clock and number of lanes the eDP panel 1871 * Use the maximum clock and number of lanes the eDP panel
1981 * advertizes being capable of. The panels are generally 1872 * advertizes being capable of. The eDP 1.3 and earlier panels
1982 * designed to support only a single clock and lane 1873 * are generally designed to support only a single clock and
1983 * configuration, and typically these values correspond to the 1874 * lane configuration, and typically these values correspond to
1984 * native resolution of the panel. 1875 * the native resolution of the panel. With eDP 1.4 rate select
1876 * and DSC, this is decreasingly the case, and we need to be
1877 * able to select less than maximum link config.
1985 */ 1878 */
1986 limits.min_lane_count = limits.max_lane_count; 1879 limits.min_lane_count = limits.max_lane_count;
1987 limits.min_clock = limits.max_clock; 1880 limits.min_clock = limits.max_clock;
@@ -1995,12 +1888,25 @@ intel_dp_compute_link_config(struct intel_encoder *encoder,
1995 intel_dp->common_rates[limits.max_clock], 1888 intel_dp->common_rates[limits.max_clock],
1996 limits.max_bpp, adjusted_mode->crtc_clock); 1889 limits.max_bpp, adjusted_mode->crtc_clock);
1997 1890
1998 /* 1891 if (intel_dp_is_edp(intel_dp)) {
1999 * Optimize for slow and wide. This is the place to add alternative 1892 /*
2000 * optimization policy. 1893 * Optimize for fast and narrow. eDP 1.3 section 3.3 and eDP 1.4
2001 */ 1894 * section A.1: "It is recommended that the minimum number of
2002 if (!intel_dp_compute_link_config_wide(intel_dp, pipe_config, &limits)) 1895 * lanes be used, using the minimum link rate allowed for that
2003 return false; 1896 * lane configuration."
1897 *
1898 * Note that we use the max clock and lane count for eDP 1.3 and
1899 * earlier, and fast vs. wide is irrelevant.
1900 */
1901 if (!intel_dp_compute_link_config_fast(intel_dp, pipe_config,
1902 &limits))
1903 return false;
1904 } else {
1905 /* Optimize for slow and wide. */
1906 if (!intel_dp_compute_link_config_wide(intel_dp, pipe_config,
1907 &limits))
1908 return false;
1909 }
2004 1910
2005 DRM_DEBUG_KMS("DP lane count %d clock %d bpp %d\n", 1911 DRM_DEBUG_KMS("DP lane count %d clock %d bpp %d\n",
2006 pipe_config->lane_count, pipe_config->port_clock, 1912 pipe_config->lane_count, pipe_config->port_clock,
@@ -2023,6 +1929,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
2023 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1929 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2024 struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; 1930 struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
2025 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); 1931 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
1932 struct intel_lspcon *lspcon = enc_to_intel_lspcon(&encoder->base);
2026 enum port port = encoder->port; 1933 enum port port = encoder->port;
2027 struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc); 1934 struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
2028 struct intel_connector *intel_connector = intel_dp->attached_connector; 1935 struct intel_connector *intel_connector = intel_dp->attached_connector;
@@ -2034,6 +1941,10 @@ intel_dp_compute_config(struct intel_encoder *encoder,
2034 if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv) && port != PORT_A) 1941 if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv) && port != PORT_A)
2035 pipe_config->has_pch_encoder = true; 1942 pipe_config->has_pch_encoder = true;
2036 1943
1944 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
1945 if (lspcon->active)
1946 lspcon_ycbcr420_config(&intel_connector->base, pipe_config);
1947
2037 pipe_config->has_drrs = false; 1948 pipe_config->has_drrs = false;
2038 if (IS_G4X(dev_priv) || port == PORT_A) 1949 if (IS_G4X(dev_priv) || port == PORT_A)
2039 pipe_config->has_audio = false; 1950 pipe_config->has_audio = false;
@@ -2338,7 +2249,8 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
2338 if (edp_have_panel_vdd(intel_dp)) 2249 if (edp_have_panel_vdd(intel_dp))
2339 return need_to_disable; 2250 return need_to_disable;
2340 2251
2341 intel_display_power_get(dev_priv, intel_dp->aux_power_domain); 2252 intel_display_power_get(dev_priv,
2253 intel_aux_power_domain(intel_dig_port));
2342 2254
2343 DRM_DEBUG_KMS("Turning eDP port %c VDD on\n", 2255 DRM_DEBUG_KMS("Turning eDP port %c VDD on\n",
2344 port_name(intel_dig_port->base.port)); 2256 port_name(intel_dig_port->base.port));
@@ -2424,7 +2336,8 @@ static void edp_panel_vdd_off_sync(struct intel_dp *intel_dp)
2424 if ((pp & PANEL_POWER_ON) == 0) 2336 if ((pp & PANEL_POWER_ON) == 0)
2425 intel_dp->panel_power_off_time = ktime_get_boottime(); 2337 intel_dp->panel_power_off_time = ktime_get_boottime();
2426 2338
2427 intel_display_power_put(dev_priv, intel_dp->aux_power_domain); 2339 intel_display_power_put(dev_priv,
2340 intel_aux_power_domain(intel_dig_port));
2428} 2341}
2429 2342
2430static void edp_panel_vdd_work(struct work_struct *__work) 2343static void edp_panel_vdd_work(struct work_struct *__work)
@@ -2537,6 +2450,7 @@ void intel_edp_panel_on(struct intel_dp *intel_dp)
2537static void edp_panel_off(struct intel_dp *intel_dp) 2450static void edp_panel_off(struct intel_dp *intel_dp)
2538{ 2451{
2539 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 2452 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
2453 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
2540 u32 pp; 2454 u32 pp;
2541 i915_reg_t pp_ctrl_reg; 2455 i915_reg_t pp_ctrl_reg;
2542 2456
@@ -2546,10 +2460,10 @@ static void edp_panel_off(struct intel_dp *intel_dp)
2546 return; 2460 return;
2547 2461
2548 DRM_DEBUG_KMS("Turn eDP port %c panel power off\n", 2462 DRM_DEBUG_KMS("Turn eDP port %c panel power off\n",
2549 port_name(dp_to_dig_port(intel_dp)->base.port)); 2463 port_name(dig_port->base.port));
2550 2464
2551 WARN(!intel_dp->want_panel_vdd, "Need eDP port %c VDD to turn off panel\n", 2465 WARN(!intel_dp->want_panel_vdd, "Need eDP port %c VDD to turn off panel\n",
2552 port_name(dp_to_dig_port(intel_dp)->base.port)); 2466 port_name(dig_port->base.port));
2553 2467
2554 pp = ironlake_get_pp_control(intel_dp); 2468 pp = ironlake_get_pp_control(intel_dp);
2555 /* We need to switch off panel power _and_ force vdd, for otherwise some 2469 /* We need to switch off panel power _and_ force vdd, for otherwise some
@@ -2568,7 +2482,7 @@ static void edp_panel_off(struct intel_dp *intel_dp)
2568 intel_dp->panel_power_off_time = ktime_get_boottime(); 2482 intel_dp->panel_power_off_time = ktime_get_boottime();
2569 2483
2570 /* We got a reference when we enabled the VDD. */ 2484 /* We got a reference when we enabled the VDD. */
2571 intel_display_power_put(dev_priv, intel_dp->aux_power_domain); 2485 intel_display_power_put(dev_priv, intel_aux_power_domain(dig_port));
2572} 2486}
2573 2487
2574void intel_edp_panel_off(struct intel_dp *intel_dp) 2488void intel_edp_panel_off(struct intel_dp *intel_dp)
@@ -3900,6 +3814,41 @@ intel_dp_read_dpcd(struct intel_dp *intel_dp)
3900 return intel_dp->dpcd[DP_DPCD_REV] != 0; 3814 return intel_dp->dpcd[DP_DPCD_REV] != 0;
3901} 3815}
3902 3816
3817static void intel_dp_get_dsc_sink_cap(struct intel_dp *intel_dp)
3818{
3819 /*
3820 * Clear the cached register set to avoid using stale values
3821 * for the sinks that do not support DSC.
3822 */
3823 memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd));
3824
3825 /* Clear fec_capable to avoid using stale values */
3826 intel_dp->fec_capable = 0;
3827
3828 /* Cache the DSC DPCD if eDP or DP rev >= 1.4 */
3829 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x14 ||
3830 intel_dp->edp_dpcd[0] >= DP_EDP_14) {
3831 if (drm_dp_dpcd_read(&intel_dp->aux, DP_DSC_SUPPORT,
3832 intel_dp->dsc_dpcd,
3833 sizeof(intel_dp->dsc_dpcd)) < 0)
3834 DRM_ERROR("Failed to read DPCD register 0x%x\n",
3835 DP_DSC_SUPPORT);
3836
3837 DRM_DEBUG_KMS("DSC DPCD: %*ph\n",
3838 (int)sizeof(intel_dp->dsc_dpcd),
3839 intel_dp->dsc_dpcd);
3840 /* FEC is supported only on DP 1.4 */
3841 if (!intel_dp_is_edp(intel_dp)) {
3842 if (drm_dp_dpcd_readb(&intel_dp->aux, DP_FEC_CAPABILITY,
3843 &intel_dp->fec_capable) < 0)
3844 DRM_ERROR("Failed to read FEC DPCD register\n");
3845
3846 DRM_DEBUG_KMS("FEC CAPABILITY: %x\n",
3847 intel_dp->fec_capable);
3848 }
3849 }
3850}
3851
3903static bool 3852static bool
3904intel_edp_init_dpcd(struct intel_dp *intel_dp) 3853intel_edp_init_dpcd(struct intel_dp *intel_dp)
3905{ 3854{
@@ -3976,6 +3925,10 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
3976 3925
3977 intel_dp_set_common_rates(intel_dp); 3926 intel_dp_set_common_rates(intel_dp);
3978 3927
3928 /* Read the eDP DSC DPCD registers */
3929 if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
3930 intel_dp_get_dsc_sink_cap(intel_dp);
3931
3979 return true; 3932 return true;
3980} 3933}
3981 3934
@@ -4029,16 +3982,10 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
4029} 3982}
4030 3983
4031static bool 3984static bool
4032intel_dp_can_mst(struct intel_dp *intel_dp) 3985intel_dp_sink_can_mst(struct intel_dp *intel_dp)
4033{ 3986{
4034 u8 mstm_cap; 3987 u8 mstm_cap;
4035 3988
4036 if (!i915_modparams.enable_dp_mst)
4037 return false;
4038
4039 if (!intel_dp->can_mst)
4040 return false;
4041
4042 if (intel_dp->dpcd[DP_DPCD_REV] < 0x12) 3989 if (intel_dp->dpcd[DP_DPCD_REV] < 0x12)
4043 return false; 3990 return false;
4044 3991
@@ -4048,34 +3995,36 @@ intel_dp_can_mst(struct intel_dp *intel_dp)
4048 return mstm_cap & DP_MST_CAP; 3995 return mstm_cap & DP_MST_CAP;
4049} 3996}
4050 3997
3998static bool
3999intel_dp_can_mst(struct intel_dp *intel_dp)
4000{
4001 return i915_modparams.enable_dp_mst &&
4002 intel_dp->can_mst &&
4003 intel_dp_sink_can_mst(intel_dp);
4004}
4005
4051static void 4006static void
4052intel_dp_configure_mst(struct intel_dp *intel_dp) 4007intel_dp_configure_mst(struct intel_dp *intel_dp)
4053{ 4008{
4054 if (!i915_modparams.enable_dp_mst) 4009 struct intel_encoder *encoder =
4055 return; 4010 &dp_to_dig_port(intel_dp)->base;
4011 bool sink_can_mst = intel_dp_sink_can_mst(intel_dp);
4012
4013 DRM_DEBUG_KMS("MST support? port %c: %s, sink: %s, modparam: %s\n",
4014 port_name(encoder->port), yesno(intel_dp->can_mst),
4015 yesno(sink_can_mst), yesno(i915_modparams.enable_dp_mst));
4056 4016
4057 if (!intel_dp->can_mst) 4017 if (!intel_dp->can_mst)
4058 return; 4018 return;
4059 4019
4060 intel_dp->is_mst = intel_dp_can_mst(intel_dp); 4020 intel_dp->is_mst = sink_can_mst &&
4061 4021 i915_modparams.enable_dp_mst;
4062 if (intel_dp->is_mst)
4063 DRM_DEBUG_KMS("Sink is MST capable\n");
4064 else
4065 DRM_DEBUG_KMS("Sink is not MST capable\n");
4066 4022
4067 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, 4023 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
4068 intel_dp->is_mst); 4024 intel_dp->is_mst);
4069} 4025}
4070 4026
4071static bool 4027static bool
4072intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector)
4073{
4074 return drm_dp_dpcd_readb(&intel_dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR,
4075 sink_irq_vector) == 1;
4076}
4077
4078static bool
4079intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector) 4028intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector)
4080{ 4029{
4081 return drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT_ESI, 4030 return drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT_ESI,
@@ -4083,6 +4032,91 @@ intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector)
4083 DP_DPRX_ESI_LEN; 4032 DP_DPRX_ESI_LEN;
4084} 4033}
4085 4034
4035u16 intel_dp_dsc_get_output_bpp(int link_clock, uint8_t lane_count,
4036 int mode_clock, int mode_hdisplay)
4037{
4038 u16 bits_per_pixel, max_bpp_small_joiner_ram;
4039 int i;
4040
4041 /*
4042 * Available Link Bandwidth(Kbits/sec) = (NumberOfLanes)*
4043 * (LinkSymbolClock)* 8 * ((100-FECOverhead)/100)*(TimeSlotsPerMTP)
4044 * FECOverhead = 2.4%, for SST -> TimeSlotsPerMTP is 1,
4045 * for MST -> TimeSlotsPerMTP has to be calculated
4046 */
4047 bits_per_pixel = (link_clock * lane_count * 8 *
4048 DP_DSC_FEC_OVERHEAD_FACTOR) /
4049 mode_clock;
4050
4051 /* Small Joiner Check: output bpp <= joiner RAM (bits) / Horiz. width */
4052 max_bpp_small_joiner_ram = DP_DSC_MAX_SMALL_JOINER_RAM_BUFFER /
4053 mode_hdisplay;
4054
4055 /*
4056 * Greatest allowed DSC BPP = MIN (output BPP from avaialble Link BW
4057 * check, output bpp from small joiner RAM check)
4058 */
4059 bits_per_pixel = min(bits_per_pixel, max_bpp_small_joiner_ram);
4060
4061 /* Error out if the max bpp is less than smallest allowed valid bpp */
4062 if (bits_per_pixel < valid_dsc_bpp[0]) {
4063 DRM_DEBUG_KMS("Unsupported BPP %d\n", bits_per_pixel);
4064 return 0;
4065 }
4066
4067 /* Find the nearest match in the array of known BPPs from VESA */
4068 for (i = 0; i < ARRAY_SIZE(valid_dsc_bpp) - 1; i++) {
4069 if (bits_per_pixel < valid_dsc_bpp[i + 1])
4070 break;
4071 }
4072 bits_per_pixel = valid_dsc_bpp[i];
4073
4074 /*
4075 * Compressed BPP in U6.4 format so multiply by 16, for Gen 11,
4076 * fractional part is 0
4077 */
4078 return bits_per_pixel << 4;
4079}
4080
4081u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
4082 int mode_clock,
4083 int mode_hdisplay)
4084{
4085 u8 min_slice_count, i;
4086 int max_slice_width;
4087
4088 if (mode_clock <= DP_DSC_PEAK_PIXEL_RATE)
4089 min_slice_count = DIV_ROUND_UP(mode_clock,
4090 DP_DSC_MAX_ENC_THROUGHPUT_0);
4091 else
4092 min_slice_count = DIV_ROUND_UP(mode_clock,
4093 DP_DSC_MAX_ENC_THROUGHPUT_1);
4094
4095 max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd);
4096 if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) {
4097 DRM_DEBUG_KMS("Unsupported slice width %d by DP DSC Sink device\n",
4098 max_slice_width);
4099 return 0;
4100 }
4101 /* Also take into account max slice width */
4102 min_slice_count = min_t(uint8_t, min_slice_count,
4103 DIV_ROUND_UP(mode_hdisplay,
4104 max_slice_width));
4105
4106 /* Find the closest match to the valid slice count values */
4107 for (i = 0; i < ARRAY_SIZE(valid_dsc_slicecount); i++) {
4108 if (valid_dsc_slicecount[i] >
4109 drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd,
4110 false))
4111 break;
4112 if (min_slice_count <= valid_dsc_slicecount[i])
4113 return valid_dsc_slicecount[i];
4114 }
4115
4116 DRM_DEBUG_KMS("Unsupported Slice Count %d\n", min_slice_count);
4117 return 0;
4118}
4119
4086static uint8_t intel_dp_autotest_link_training(struct intel_dp *intel_dp) 4120static uint8_t intel_dp_autotest_link_training(struct intel_dp *intel_dp)
4087{ 4121{
4088 int status = 0; 4122 int status = 0;
@@ -4403,7 +4437,7 @@ int intel_dp_retrain_link(struct intel_encoder *encoder,
4403 4437
4404 /* Suppress underruns caused by re-training */ 4438 /* Suppress underruns caused by re-training */
4405 intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false); 4439 intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false);
4406 if (crtc->config->has_pch_encoder) 4440 if (crtc_state->has_pch_encoder)
4407 intel_set_pch_fifo_underrun_reporting(dev_priv, 4441 intel_set_pch_fifo_underrun_reporting(dev_priv,
4408 intel_crtc_pch_transcoder(crtc), false); 4442 intel_crtc_pch_transcoder(crtc), false);
4409 4443
@@ -4414,7 +4448,7 @@ int intel_dp_retrain_link(struct intel_encoder *encoder,
4414 intel_wait_for_vblank(dev_priv, crtc->pipe); 4448 intel_wait_for_vblank(dev_priv, crtc->pipe);
4415 4449
4416 intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true); 4450 intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true);
4417 if (crtc->config->has_pch_encoder) 4451 if (crtc_state->has_pch_encoder)
4418 intel_set_pch_fifo_underrun_reporting(dev_priv, 4452 intel_set_pch_fifo_underrun_reporting(dev_priv,
4419 intel_crtc_pch_transcoder(crtc), true); 4453 intel_crtc_pch_transcoder(crtc), true);
4420 4454
@@ -4462,6 +4496,29 @@ static bool intel_dp_hotplug(struct intel_encoder *encoder,
4462 return changed; 4496 return changed;
4463} 4497}
4464 4498
4499static void intel_dp_check_service_irq(struct intel_dp *intel_dp)
4500{
4501 u8 val;
4502
4503 if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
4504 return;
4505
4506 if (drm_dp_dpcd_readb(&intel_dp->aux,
4507 DP_DEVICE_SERVICE_IRQ_VECTOR, &val) != 1 || !val)
4508 return;
4509
4510 drm_dp_dpcd_writeb(&intel_dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR, val);
4511
4512 if (val & DP_AUTOMATED_TEST_REQUEST)
4513 intel_dp_handle_test_request(intel_dp);
4514
4515 if (val & DP_CP_IRQ)
4516 intel_hdcp_check_link(intel_dp->attached_connector);
4517
4518 if (val & DP_SINK_SPECIFIC_IRQ)
4519 DRM_DEBUG_DRIVER("Sink specific irq unhandled\n");
4520}
4521
4465/* 4522/*
4466 * According to DP spec 4523 * According to DP spec
4467 * 5.1.2: 4524 * 5.1.2:
@@ -4479,7 +4536,6 @@ static bool
4479intel_dp_short_pulse(struct intel_dp *intel_dp) 4536intel_dp_short_pulse(struct intel_dp *intel_dp)
4480{ 4537{
4481 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 4538 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
4482 u8 sink_irq_vector = 0;
4483 u8 old_sink_count = intel_dp->sink_count; 4539 u8 old_sink_count = intel_dp->sink_count;
4484 bool ret; 4540 bool ret;
4485 4541
@@ -4502,20 +4558,7 @@ intel_dp_short_pulse(struct intel_dp *intel_dp)
4502 return false; 4558 return false;
4503 } 4559 }
4504 4560
4505 /* Try to read the source of the interrupt */ 4561 intel_dp_check_service_irq(intel_dp);
4506 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
4507 intel_dp_get_sink_irq(intel_dp, &sink_irq_vector) &&
4508 sink_irq_vector != 0) {
4509 /* Clear interrupt source */
4510 drm_dp_dpcd_writeb(&intel_dp->aux,
4511 DP_DEVICE_SERVICE_IRQ_VECTOR,
4512 sink_irq_vector);
4513
4514 if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST)
4515 intel_dp_handle_test_request(intel_dp);
4516 if (sink_irq_vector & (DP_CP_IRQ | DP_SINK_SPECIFIC_IRQ))
4517 DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n");
4518 }
4519 4562
4520 /* Handle CEC interrupts, if any */ 4563 /* Handle CEC interrupts, if any */
4521 drm_dp_cec_irq(&intel_dp->aux); 4564 drm_dp_cec_irq(&intel_dp->aux);
@@ -4810,6 +4853,9 @@ static void icl_update_tc_port_type(struct drm_i915_private *dev_priv,
4810 type_str); 4853 type_str);
4811} 4854}
4812 4855
4856static void icl_tc_phy_disconnect(struct drm_i915_private *dev_priv,
4857 struct intel_digital_port *dig_port);
4858
4813/* 4859/*
4814 * This function implements the first part of the Connect Flow described by our 4860 * This function implements the first part of the Connect Flow described by our
4815 * specification, Gen11 TypeC Programming chapter. The rest of the flow (reading 4861 * specification, Gen11 TypeC Programming chapter. The rest of the flow (reading
@@ -4864,9 +4910,7 @@ static bool icl_tc_phy_connect(struct drm_i915_private *dev_priv,
4864 if (dig_port->tc_type == TC_PORT_TYPEC && 4910 if (dig_port->tc_type == TC_PORT_TYPEC &&
4865 !(I915_READ(PORT_TX_DFLEXDPSP) & TC_LIVE_STATE_TC(tc_port))) { 4911 !(I915_READ(PORT_TX_DFLEXDPSP) & TC_LIVE_STATE_TC(tc_port))) {
4866 DRM_DEBUG_KMS("TC PHY %d sudden disconnect.\n", tc_port); 4912 DRM_DEBUG_KMS("TC PHY %d sudden disconnect.\n", tc_port);
4867 val = I915_READ(PORT_TX_DFLEXDPCSSS); 4913 icl_tc_phy_disconnect(dev_priv, dig_port);
4868 val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(tc_port);
4869 I915_WRITE(PORT_TX_DFLEXDPCSSS, val);
4870 return false; 4914 return false;
4871 } 4915 }
4872 4916
@@ -4881,21 +4925,24 @@ static void icl_tc_phy_disconnect(struct drm_i915_private *dev_priv,
4881 struct intel_digital_port *dig_port) 4925 struct intel_digital_port *dig_port)
4882{ 4926{
4883 enum tc_port tc_port = intel_port_to_tc(dev_priv, dig_port->base.port); 4927 enum tc_port tc_port = intel_port_to_tc(dev_priv, dig_port->base.port);
4884 u32 val;
4885 4928
4886 if (dig_port->tc_type != TC_PORT_LEGACY && 4929 if (dig_port->tc_type == TC_PORT_UNKNOWN)
4887 dig_port->tc_type != TC_PORT_TYPEC)
4888 return; 4930 return;
4889 4931
4890 /* 4932 /*
4891 * This function may be called many times in a row without an HPD event 4933 * TBT disconnection flow is read the live status, what was done in
4892 * in between, so try to avoid the write when we can. 4934 * caller.
4893 */ 4935 */
4894 val = I915_READ(PORT_TX_DFLEXDPCSSS); 4936 if (dig_port->tc_type == TC_PORT_TYPEC ||
4895 if (val & DP_PHY_MODE_STATUS_NOT_SAFE(tc_port)) { 4937 dig_port->tc_type == TC_PORT_LEGACY) {
4938 u32 val;
4939
4940 val = I915_READ(PORT_TX_DFLEXDPCSSS);
4896 val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(tc_port); 4941 val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(tc_port);
4897 I915_WRITE(PORT_TX_DFLEXDPCSSS, val); 4942 I915_WRITE(PORT_TX_DFLEXDPCSSS, val);
4898 } 4943 }
4944
4945 dig_port->tc_type = TC_PORT_UNKNOWN;
4899} 4946}
4900 4947
4901/* 4948/*
@@ -4945,19 +4992,14 @@ static bool icl_digital_port_connected(struct intel_encoder *encoder)
4945 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 4992 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
4946 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base); 4993 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
4947 4994
4948 switch (encoder->hpd_pin) { 4995 if (intel_port_is_combophy(dev_priv, encoder->port))
4949 case HPD_PORT_A:
4950 case HPD_PORT_B:
4951 return icl_combo_port_connected(dev_priv, dig_port); 4996 return icl_combo_port_connected(dev_priv, dig_port);
4952 case HPD_PORT_C: 4997 else if (intel_port_is_tc(dev_priv, encoder->port))
4953 case HPD_PORT_D:
4954 case HPD_PORT_E:
4955 case HPD_PORT_F:
4956 return icl_tc_port_connected(dev_priv, dig_port); 4998 return icl_tc_port_connected(dev_priv, dig_port);
4957 default: 4999 else
4958 MISSING_CASE(encoder->hpd_pin); 5000 MISSING_CASE(encoder->hpd_pin);
4959 return false; 5001
4960 } 5002 return false;
4961} 5003}
4962 5004
4963/* 5005/*
@@ -4982,20 +5024,23 @@ bool intel_digital_port_connected(struct intel_encoder *encoder)
4982 return g4x_digital_port_connected(encoder); 5024 return g4x_digital_port_connected(encoder);
4983 } 5025 }
4984 5026
4985 if (IS_GEN5(dev_priv)) 5027 if (INTEL_GEN(dev_priv) >= 11)
4986 return ilk_digital_port_connected(encoder); 5028 return icl_digital_port_connected(encoder);
4987 else if (IS_GEN6(dev_priv)) 5029 else if (IS_GEN10(dev_priv) || IS_GEN9_BC(dev_priv))
4988 return snb_digital_port_connected(encoder); 5030 return spt_digital_port_connected(encoder);
4989 else if (IS_GEN7(dev_priv))
4990 return ivb_digital_port_connected(encoder);
4991 else if (IS_GEN8(dev_priv))
4992 return bdw_digital_port_connected(encoder);
4993 else if (IS_GEN9_LP(dev_priv)) 5031 else if (IS_GEN9_LP(dev_priv))
4994 return bxt_digital_port_connected(encoder); 5032 return bxt_digital_port_connected(encoder);
4995 else if (IS_GEN9_BC(dev_priv) || IS_GEN10(dev_priv)) 5033 else if (IS_GEN8(dev_priv))
4996 return spt_digital_port_connected(encoder); 5034 return bdw_digital_port_connected(encoder);
4997 else 5035 else if (IS_GEN7(dev_priv))
4998 return icl_digital_port_connected(encoder); 5036 return ivb_digital_port_connected(encoder);
5037 else if (IS_GEN6(dev_priv))
5038 return snb_digital_port_connected(encoder);
5039 else if (IS_GEN5(dev_priv))
5040 return ilk_digital_port_connected(encoder);
5041
5042 MISSING_CASE(INTEL_GEN(dev_priv));
5043 return false;
4999} 5044}
5000 5045
5001static struct edid * 5046static struct edid *
@@ -5042,28 +5087,35 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
5042} 5087}
5043 5088
5044static int 5089static int
5045intel_dp_long_pulse(struct intel_connector *connector, 5090intel_dp_detect(struct drm_connector *connector,
5046 struct drm_modeset_acquire_ctx *ctx) 5091 struct drm_modeset_acquire_ctx *ctx,
5092 bool force)
5047{ 5093{
5048 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); 5094 struct drm_i915_private *dev_priv = to_i915(connector->dev);
5049 struct intel_dp *intel_dp = intel_attached_dp(&connector->base); 5095 struct intel_dp *intel_dp = intel_attached_dp(connector);
5096 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
5097 struct intel_encoder *encoder = &dig_port->base;
5050 enum drm_connector_status status; 5098 enum drm_connector_status status;
5051 u8 sink_irq_vector = 0; 5099 enum intel_display_power_domain aux_domain =
5100 intel_aux_power_domain(dig_port);
5052 5101
5102 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
5103 connector->base.id, connector->name);
5053 WARN_ON(!drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex)); 5104 WARN_ON(!drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex));
5054 5105
5055 intel_display_power_get(dev_priv, intel_dp->aux_power_domain); 5106 intel_display_power_get(dev_priv, aux_domain);
5056 5107
5057 /* Can't disconnect eDP */ 5108 /* Can't disconnect eDP */
5058 if (intel_dp_is_edp(intel_dp)) 5109 if (intel_dp_is_edp(intel_dp))
5059 status = edp_detect(intel_dp); 5110 status = edp_detect(intel_dp);
5060 else if (intel_digital_port_connected(&dp_to_dig_port(intel_dp)->base)) 5111 else if (intel_digital_port_connected(encoder))
5061 status = intel_dp_detect_dpcd(intel_dp); 5112 status = intel_dp_detect_dpcd(intel_dp);
5062 else 5113 else
5063 status = connector_status_disconnected; 5114 status = connector_status_disconnected;
5064 5115
5065 if (status == connector_status_disconnected) { 5116 if (status == connector_status_disconnected) {
5066 memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance)); 5117 memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
5118 memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd));
5067 5119
5068 if (intel_dp->is_mst) { 5120 if (intel_dp->is_mst) {
5069 DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n", 5121 DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
@@ -5089,6 +5141,10 @@ intel_dp_long_pulse(struct intel_connector *connector,
5089 5141
5090 intel_dp_print_rates(intel_dp); 5142 intel_dp_print_rates(intel_dp);
5091 5143
5144 /* Read DP Sink DSC Cap DPCD regs for DP v1.4 */
5145 if (INTEL_GEN(dev_priv) >= 11)
5146 intel_dp_get_dsc_sink_cap(intel_dp);
5147
5092 drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc, 5148 drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc,
5093 drm_dp_is_branch(intel_dp->dpcd)); 5149 drm_dp_is_branch(intel_dp->dpcd));
5094 5150
@@ -5109,9 +5165,13 @@ intel_dp_long_pulse(struct intel_connector *connector,
5109 * with an IRQ_HPD, so force a link status check. 5165 * with an IRQ_HPD, so force a link status check.
5110 */ 5166 */
5111 if (!intel_dp_is_edp(intel_dp)) { 5167 if (!intel_dp_is_edp(intel_dp)) {
5112 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 5168 int ret;
5113 5169
5114 intel_dp_retrain_link(encoder, ctx); 5170 ret = intel_dp_retrain_link(encoder, ctx);
5171 if (ret) {
5172 intel_display_power_put(dev_priv, aux_domain);
5173 return ret;
5174 }
5115 } 5175 }
5116 5176
5117 /* 5177 /*
@@ -5123,61 +5183,17 @@ intel_dp_long_pulse(struct intel_connector *connector,
5123 intel_dp->aux.i2c_defer_count = 0; 5183 intel_dp->aux.i2c_defer_count = 0;
5124 5184
5125 intel_dp_set_edid(intel_dp); 5185 intel_dp_set_edid(intel_dp);
5126 if (intel_dp_is_edp(intel_dp) || connector->detect_edid) 5186 if (intel_dp_is_edp(intel_dp) ||
5187 to_intel_connector(connector)->detect_edid)
5127 status = connector_status_connected; 5188 status = connector_status_connected;
5128 intel_dp->detect_done = true;
5129 5189
5130 /* Try to read the source of the interrupt */ 5190 intel_dp_check_service_irq(intel_dp);
5131 if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
5132 intel_dp_get_sink_irq(intel_dp, &sink_irq_vector) &&
5133 sink_irq_vector != 0) {
5134 /* Clear interrupt source */
5135 drm_dp_dpcd_writeb(&intel_dp->aux,
5136 DP_DEVICE_SERVICE_IRQ_VECTOR,
5137 sink_irq_vector);
5138
5139 if (sink_irq_vector & DP_AUTOMATED_TEST_REQUEST)
5140 intel_dp_handle_test_request(intel_dp);
5141 if (sink_irq_vector & (DP_CP_IRQ | DP_SINK_SPECIFIC_IRQ))
5142 DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n");
5143 }
5144 5191
5145out: 5192out:
5146 if (status != connector_status_connected && !intel_dp->is_mst) 5193 if (status != connector_status_connected && !intel_dp->is_mst)
5147 intel_dp_unset_edid(intel_dp); 5194 intel_dp_unset_edid(intel_dp);
5148 5195
5149 intel_display_power_put(dev_priv, intel_dp->aux_power_domain); 5196 intel_display_power_put(dev_priv, aux_domain);
5150 return status;
5151}
5152
5153static int
5154intel_dp_detect(struct drm_connector *connector,
5155 struct drm_modeset_acquire_ctx *ctx,
5156 bool force)
5157{
5158 struct intel_dp *intel_dp = intel_attached_dp(connector);
5159 int status = connector->status;
5160
5161 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
5162 connector->base.id, connector->name);
5163
5164 /* If full detect is not performed yet, do a full detect */
5165 if (!intel_dp->detect_done) {
5166 struct drm_crtc *crtc;
5167 int ret;
5168
5169 crtc = connector->state->crtc;
5170 if (crtc) {
5171 ret = drm_modeset_lock(&crtc->mutex, ctx);
5172 if (ret)
5173 return ret;
5174 }
5175
5176 status = intel_dp_long_pulse(intel_dp->attached_connector, ctx);
5177 }
5178
5179 intel_dp->detect_done = false;
5180
5181 return status; 5197 return status;
5182} 5198}
5183 5199
@@ -5185,8 +5201,11 @@ static void
5185intel_dp_force(struct drm_connector *connector) 5201intel_dp_force(struct drm_connector *connector)
5186{ 5202{
5187 struct intel_dp *intel_dp = intel_attached_dp(connector); 5203 struct intel_dp *intel_dp = intel_attached_dp(connector);
5188 struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base; 5204 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
5205 struct intel_encoder *intel_encoder = &dig_port->base;
5189 struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev); 5206 struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
5207 enum intel_display_power_domain aux_domain =
5208 intel_aux_power_domain(dig_port);
5190 5209
5191 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", 5210 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
5192 connector->base.id, connector->name); 5211 connector->base.id, connector->name);
@@ -5195,11 +5214,11 @@ intel_dp_force(struct drm_connector *connector)
5195 if (connector->status != connector_status_connected) 5214 if (connector->status != connector_status_connected)
5196 return; 5215 return;
5197 5216
5198 intel_display_power_get(dev_priv, intel_dp->aux_power_domain); 5217 intel_display_power_get(dev_priv, aux_domain);
5199 5218
5200 intel_dp_set_edid(intel_dp); 5219 intel_dp_set_edid(intel_dp);
5201 5220
5202 intel_display_power_put(dev_priv, intel_dp->aux_power_domain); 5221 intel_display_power_put(dev_priv, aux_domain);
5203} 5222}
5204 5223
5205static int intel_dp_get_modes(struct drm_connector *connector) 5224static int intel_dp_get_modes(struct drm_connector *connector)
@@ -5264,27 +5283,6 @@ intel_dp_connector_unregister(struct drm_connector *connector)
5264 intel_connector_unregister(connector); 5283 intel_connector_unregister(connector);
5265} 5284}
5266 5285
5267static void
5268intel_dp_connector_destroy(struct drm_connector *connector)
5269{
5270 struct intel_connector *intel_connector = to_intel_connector(connector);
5271
5272 kfree(intel_connector->detect_edid);
5273
5274 if (!IS_ERR_OR_NULL(intel_connector->edid))
5275 kfree(intel_connector->edid);
5276
5277 /*
5278 * Can't call intel_dp_is_edp() since the encoder may have been
5279 * destroyed already.
5280 */
5281 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
5282 intel_panel_fini(&intel_connector->panel);
5283
5284 drm_connector_cleanup(connector);
5285 kfree(connector);
5286}
5287
5288void intel_dp_encoder_destroy(struct drm_encoder *encoder) 5286void intel_dp_encoder_destroy(struct drm_encoder *encoder)
5289{ 5287{
5290 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); 5288 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
@@ -5348,7 +5346,8 @@ int intel_dp_hdcp_write_an_aksv(struct intel_digital_port *intel_dig_port,
5348 dpcd_ret = drm_dp_dpcd_write(&intel_dig_port->dp.aux, DP_AUX_HDCP_AN, 5346 dpcd_ret = drm_dp_dpcd_write(&intel_dig_port->dp.aux, DP_AUX_HDCP_AN,
5349 an, DRM_HDCP_AN_LEN); 5347 an, DRM_HDCP_AN_LEN);
5350 if (dpcd_ret != DRM_HDCP_AN_LEN) { 5348 if (dpcd_ret != DRM_HDCP_AN_LEN) {
5351 DRM_ERROR("Failed to write An over DP/AUX (%zd)\n", dpcd_ret); 5349 DRM_DEBUG_KMS("Failed to write An over DP/AUX (%zd)\n",
5350 dpcd_ret);
5352 return dpcd_ret >= 0 ? -EIO : dpcd_ret; 5351 return dpcd_ret >= 0 ? -EIO : dpcd_ret;
5353 } 5352 }
5354 5353
@@ -5364,10 +5363,10 @@ int intel_dp_hdcp_write_an_aksv(struct intel_digital_port *intel_dig_port,
5364 rxbuf, sizeof(rxbuf), 5363 rxbuf, sizeof(rxbuf),
5365 DP_AUX_CH_CTL_AUX_AKSV_SELECT); 5364 DP_AUX_CH_CTL_AUX_AKSV_SELECT);
5366 if (ret < 0) { 5365 if (ret < 0) {
5367 DRM_ERROR("Write Aksv over DP/AUX failed (%d)\n", ret); 5366 DRM_DEBUG_KMS("Write Aksv over DP/AUX failed (%d)\n", ret);
5368 return ret; 5367 return ret;
5369 } else if (ret == 0) { 5368 } else if (ret == 0) {
5370 DRM_ERROR("Aksv write over DP/AUX was empty\n"); 5369 DRM_DEBUG_KMS("Aksv write over DP/AUX was empty\n");
5371 return -EIO; 5370 return -EIO;
5372 } 5371 }
5373 5372
@@ -5382,7 +5381,7 @@ static int intel_dp_hdcp_read_bksv(struct intel_digital_port *intel_dig_port,
5382 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BKSV, bksv, 5381 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BKSV, bksv,
5383 DRM_HDCP_KSV_LEN); 5382 DRM_HDCP_KSV_LEN);
5384 if (ret != DRM_HDCP_KSV_LEN) { 5383 if (ret != DRM_HDCP_KSV_LEN) {
5385 DRM_ERROR("Read Bksv from DP/AUX failed (%zd)\n", ret); 5384 DRM_DEBUG_KMS("Read Bksv from DP/AUX failed (%zd)\n", ret);
5386 return ret >= 0 ? -EIO : ret; 5385 return ret >= 0 ? -EIO : ret;
5387 } 5386 }
5388 return 0; 5387 return 0;
@@ -5400,7 +5399,7 @@ static int intel_dp_hdcp_read_bstatus(struct intel_digital_port *intel_dig_port,
5400 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BINFO, 5399 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BINFO,
5401 bstatus, DRM_HDCP_BSTATUS_LEN); 5400 bstatus, DRM_HDCP_BSTATUS_LEN);
5402 if (ret != DRM_HDCP_BSTATUS_LEN) { 5401 if (ret != DRM_HDCP_BSTATUS_LEN) {
5403 DRM_ERROR("Read bstatus from DP/AUX failed (%zd)\n", ret); 5402 DRM_DEBUG_KMS("Read bstatus from DP/AUX failed (%zd)\n", ret);
5404 return ret >= 0 ? -EIO : ret; 5403 return ret >= 0 ? -EIO : ret;
5405 } 5404 }
5406 return 0; 5405 return 0;
@@ -5415,7 +5414,7 @@ int intel_dp_hdcp_read_bcaps(struct intel_digital_port *intel_dig_port,
5415 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BCAPS, 5414 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BCAPS,
5416 bcaps, 1); 5415 bcaps, 1);
5417 if (ret != 1) { 5416 if (ret != 1) {
5418 DRM_ERROR("Read bcaps from DP/AUX failed (%zd)\n", ret); 5417 DRM_DEBUG_KMS("Read bcaps from DP/AUX failed (%zd)\n", ret);
5419 return ret >= 0 ? -EIO : ret; 5418 return ret >= 0 ? -EIO : ret;
5420 } 5419 }
5421 5420
@@ -5445,7 +5444,7 @@ int intel_dp_hdcp_read_ri_prime(struct intel_digital_port *intel_dig_port,
5445 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_RI_PRIME, 5444 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_RI_PRIME,
5446 ri_prime, DRM_HDCP_RI_LEN); 5445 ri_prime, DRM_HDCP_RI_LEN);
5447 if (ret != DRM_HDCP_RI_LEN) { 5446 if (ret != DRM_HDCP_RI_LEN) {
5448 DRM_ERROR("Read Ri' from DP/AUX failed (%zd)\n", ret); 5447 DRM_DEBUG_KMS("Read Ri' from DP/AUX failed (%zd)\n", ret);
5449 return ret >= 0 ? -EIO : ret; 5448 return ret >= 0 ? -EIO : ret;
5450 } 5449 }
5451 return 0; 5450 return 0;
@@ -5460,7 +5459,7 @@ int intel_dp_hdcp_read_ksv_ready(struct intel_digital_port *intel_dig_port,
5460 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BSTATUS, 5459 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BSTATUS,
5461 &bstatus, 1); 5460 &bstatus, 1);
5462 if (ret != 1) { 5461 if (ret != 1) {
5463 DRM_ERROR("Read bstatus from DP/AUX failed (%zd)\n", ret); 5462 DRM_DEBUG_KMS("Read bstatus from DP/AUX failed (%zd)\n", ret);
5464 return ret >= 0 ? -EIO : ret; 5463 return ret >= 0 ? -EIO : ret;
5465 } 5464 }
5466 *ksv_ready = bstatus & DP_BSTATUS_READY; 5465 *ksv_ready = bstatus & DP_BSTATUS_READY;
@@ -5482,8 +5481,8 @@ int intel_dp_hdcp_read_ksv_fifo(struct intel_digital_port *intel_dig_port,
5482 ksv_fifo + i * DRM_HDCP_KSV_LEN, 5481 ksv_fifo + i * DRM_HDCP_KSV_LEN,
5483 len); 5482 len);
5484 if (ret != len) { 5483 if (ret != len) {
5485 DRM_ERROR("Read ksv[%d] from DP/AUX failed (%zd)\n", i, 5484 DRM_DEBUG_KMS("Read ksv[%d] from DP/AUX failed (%zd)\n",
5486 ret); 5485 i, ret);
5487 return ret >= 0 ? -EIO : ret; 5486 return ret >= 0 ? -EIO : ret;
5488 } 5487 }
5489 } 5488 }
@@ -5503,7 +5502,7 @@ int intel_dp_hdcp_read_v_prime_part(struct intel_digital_port *intel_dig_port,
5503 DP_AUX_HDCP_V_PRIME(i), part, 5502 DP_AUX_HDCP_V_PRIME(i), part,
5504 DRM_HDCP_V_PRIME_PART_LEN); 5503 DRM_HDCP_V_PRIME_PART_LEN);
5505 if (ret != DRM_HDCP_V_PRIME_PART_LEN) { 5504 if (ret != DRM_HDCP_V_PRIME_PART_LEN) {
5506 DRM_ERROR("Read v'[%d] from DP/AUX failed (%zd)\n", i, ret); 5505 DRM_DEBUG_KMS("Read v'[%d] from DP/AUX failed (%zd)\n", i, ret);
5507 return ret >= 0 ? -EIO : ret; 5506 return ret >= 0 ? -EIO : ret;
5508 } 5507 }
5509 return 0; 5508 return 0;
@@ -5526,7 +5525,7 @@ bool intel_dp_hdcp_check_link(struct intel_digital_port *intel_dig_port)
5526 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BSTATUS, 5525 ret = drm_dp_dpcd_read(&intel_dig_port->dp.aux, DP_AUX_HDCP_BSTATUS,
5527 &bstatus, 1); 5526 &bstatus, 1);
5528 if (ret != 1) { 5527 if (ret != 1) {
5529 DRM_ERROR("Read bstatus from DP/AUX failed (%zd)\n", ret); 5528 DRM_DEBUG_KMS("Read bstatus from DP/AUX failed (%zd)\n", ret);
5530 return false; 5529 return false;
5531 } 5530 }
5532 5531
@@ -5565,6 +5564,7 @@ static const struct intel_hdcp_shim intel_dp_hdcp_shim = {
5565static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp) 5564static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
5566{ 5565{
5567 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 5566 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
5567 struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
5568 5568
5569 lockdep_assert_held(&dev_priv->pps_mutex); 5569 lockdep_assert_held(&dev_priv->pps_mutex);
5570 5570
@@ -5578,7 +5578,7 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
5578 * indefinitely. 5578 * indefinitely.
5579 */ 5579 */
5580 DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n"); 5580 DRM_DEBUG_KMS("VDD left on by BIOS, adjusting state tracking\n");
5581 intel_display_power_get(dev_priv, intel_dp->aux_power_domain); 5581 intel_display_power_get(dev_priv, intel_aux_power_domain(dig_port));
5582 5582
5583 edp_panel_vdd_schedule_off(intel_dp); 5583 edp_panel_vdd_schedule_off(intel_dp);
5584} 5584}
@@ -5631,7 +5631,7 @@ static const struct drm_connector_funcs intel_dp_connector_funcs = {
5631 .atomic_set_property = intel_digital_connector_atomic_set_property, 5631 .atomic_set_property = intel_digital_connector_atomic_set_property,
5632 .late_register = intel_dp_connector_register, 5632 .late_register = intel_dp_connector_register,
5633 .early_unregister = intel_dp_connector_unregister, 5633 .early_unregister = intel_dp_connector_unregister,
5634 .destroy = intel_dp_connector_destroy, 5634 .destroy = intel_connector_destroy,
5635 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 5635 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
5636 .atomic_duplicate_state = intel_digital_connector_duplicate_state, 5636 .atomic_duplicate_state = intel_digital_connector_duplicate_state,
5637}; 5637};
@@ -5673,11 +5673,11 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
5673 5673
5674 if (long_hpd) { 5674 if (long_hpd) {
5675 intel_dp->reset_link_params = true; 5675 intel_dp->reset_link_params = true;
5676 intel_dp->detect_done = false;
5677 return IRQ_NONE; 5676 return IRQ_NONE;
5678 } 5677 }
5679 5678
5680 intel_display_power_get(dev_priv, intel_dp->aux_power_domain); 5679 intel_display_power_get(dev_priv,
5680 intel_aux_power_domain(intel_dig_port));
5681 5681
5682 if (intel_dp->is_mst) { 5682 if (intel_dp->is_mst) {
5683 if (intel_dp_check_mst_status(intel_dp) == -EINVAL) { 5683 if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
@@ -5690,7 +5690,6 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
5690 intel_dp->is_mst = false; 5690 intel_dp->is_mst = false;
5691 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, 5691 drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
5692 intel_dp->is_mst); 5692 intel_dp->is_mst);
5693 intel_dp->detect_done = false;
5694 goto put_power; 5693 goto put_power;
5695 } 5694 }
5696 } 5695 }
@@ -5700,19 +5699,15 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
5700 5699
5701 handled = intel_dp_short_pulse(intel_dp); 5700 handled = intel_dp_short_pulse(intel_dp);
5702 5701
5703 /* Short pulse can signify loss of hdcp authentication */ 5702 if (!handled)
5704 intel_hdcp_check_link(intel_dp->attached_connector);
5705
5706 if (!handled) {
5707 intel_dp->detect_done = false;
5708 goto put_power; 5703 goto put_power;
5709 }
5710 } 5704 }
5711 5705
5712 ret = IRQ_HANDLED; 5706 ret = IRQ_HANDLED;
5713 5707
5714put_power: 5708put_power:
5715 intel_display_power_put(dev_priv, intel_dp->aux_power_domain); 5709 intel_display_power_put(dev_priv,
5710 intel_aux_power_domain(intel_dig_port));
5716 5711
5717 return ret; 5712 return ret;
5718} 5713}
@@ -5743,6 +5738,10 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect
5743 intel_attach_force_audio_property(connector); 5738 intel_attach_force_audio_property(connector);
5744 5739
5745 intel_attach_broadcast_rgb_property(connector); 5740 intel_attach_broadcast_rgb_property(connector);
5741 if (HAS_GMCH_DISPLAY(dev_priv))
5742 drm_connector_attach_max_bpc_property(connector, 6, 10);
5743 else if (INTEL_GEN(dev_priv) >= 5)
5744 drm_connector_attach_max_bpc_property(connector, 6, 12);
5746 5745
5747 if (intel_dp_is_edp(intel_dp)) { 5746 if (intel_dp_is_edp(intel_dp)) {
5748 u32 allowed_scalers; 5747 u32 allowed_scalers;
@@ -6099,10 +6098,10 @@ static void intel_dp_set_drrs_state(struct drm_i915_private *dev_priv,
6099 if (INTEL_GEN(dev_priv) >= 8 && !IS_CHERRYVIEW(dev_priv)) { 6098 if (INTEL_GEN(dev_priv) >= 8 && !IS_CHERRYVIEW(dev_priv)) {
6100 switch (index) { 6099 switch (index) {
6101 case DRRS_HIGH_RR: 6100 case DRRS_HIGH_RR:
6102 intel_dp_set_m_n(intel_crtc, M1_N1); 6101 intel_dp_set_m_n(crtc_state, M1_N1);
6103 break; 6102 break;
6104 case DRRS_LOW_RR: 6103 case DRRS_LOW_RR:
6105 intel_dp_set_m_n(intel_crtc, M2_N2); 6104 intel_dp_set_m_n(crtc_state, M2_N2);
6106 break; 6105 break;
6107 case DRRS_MAX_RR: 6106 case DRRS_MAX_RR:
6108 default: 6107 default:
@@ -6422,6 +6421,8 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
6422 if (!intel_dp_is_edp(intel_dp)) 6421 if (!intel_dp_is_edp(intel_dp))
6423 return true; 6422 return true;
6424 6423
6424 INIT_DELAYED_WORK(&intel_dp->panel_vdd_work, edp_panel_vdd_work);
6425
6425 /* 6426 /*
6426 * On IBX/CPT we may get here with LVDS already registered. Since the 6427 * On IBX/CPT we may get here with LVDS already registered. Since the
6427 * driver uses the only internal power sequencer available for both 6428 * driver uses the only internal power sequencer available for both
@@ -6514,6 +6515,10 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
6514 intel_connector->panel.backlight.power = intel_edp_backlight_power; 6515 intel_connector->panel.backlight.power = intel_edp_backlight_power;
6515 intel_panel_setup_backlight(connector, pipe); 6516 intel_panel_setup_backlight(connector, pipe);
6516 6517
6518 if (fixed_mode)
6519 drm_connector_init_panel_orientation_property(
6520 connector, fixed_mode->hdisplay, fixed_mode->vdisplay);
6521
6517 return true; 6522 return true;
6518 6523
6519out_vdd_off: 6524out_vdd_off:
@@ -6624,9 +6629,6 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
6624 6629
6625 intel_dp_aux_init(intel_dp); 6630 intel_dp_aux_init(intel_dp);
6626 6631
6627 INIT_DELAYED_WORK(&intel_dp->panel_vdd_work,
6628 edp_panel_vdd_work);
6629
6630 intel_connector_attach_encoder(intel_connector, intel_encoder); 6632 intel_connector_attach_encoder(intel_connector, intel_encoder);
6631 6633
6632 if (HAS_DDI(dev_priv)) 6634 if (HAS_DDI(dev_priv))
@@ -6743,6 +6745,7 @@ bool intel_dp_init(struct drm_i915_private *dev_priv,
6743 if (port != PORT_A) 6745 if (port != PORT_A)
6744 intel_infoframe_init(intel_dig_port); 6746 intel_infoframe_init(intel_dig_port);
6745 6747
6748 intel_dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port);
6746 if (!intel_dp_init_connector(intel_dig_port, intel_connector)) 6749 if (!intel_dp_init_connector(intel_dig_port, intel_connector))
6747 goto err_init_connector; 6750 goto err_init_connector;
6748 6751
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
index 1b00f8ea145b..4de247ddf05f 100644
--- a/drivers/gpu/drm/i915/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/intel_dp_mst.c
@@ -51,6 +51,7 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
51 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) 51 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
52 return false; 52 return false;
53 53
54 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
54 pipe_config->has_pch_encoder = false; 55 pipe_config->has_pch_encoder = false;
55 bpp = 24; 56 bpp = 24;
56 if (intel_dp->compliance.test_data.bpc) { 57 if (intel_dp->compliance.test_data.bpc) {
@@ -208,12 +209,25 @@ static void intel_mst_pre_pll_enable_dp(struct intel_encoder *encoder,
208 struct intel_digital_port *intel_dig_port = intel_mst->primary; 209 struct intel_digital_port *intel_dig_port = intel_mst->primary;
209 struct intel_dp *intel_dp = &intel_dig_port->dp; 210 struct intel_dp *intel_dp = &intel_dig_port->dp;
210 211
211 if (intel_dp->active_mst_links == 0 && 212 if (intel_dp->active_mst_links == 0)
212 intel_dig_port->base.pre_pll_enable)
213 intel_dig_port->base.pre_pll_enable(&intel_dig_port->base, 213 intel_dig_port->base.pre_pll_enable(&intel_dig_port->base,
214 pipe_config, NULL); 214 pipe_config, NULL);
215} 215}
216 216
217static void intel_mst_post_pll_disable_dp(struct intel_encoder *encoder,
218 const struct intel_crtc_state *old_crtc_state,
219 const struct drm_connector_state *old_conn_state)
220{
221 struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
222 struct intel_digital_port *intel_dig_port = intel_mst->primary;
223 struct intel_dp *intel_dp = &intel_dig_port->dp;
224
225 if (intel_dp->active_mst_links == 0)
226 intel_dig_port->base.post_pll_disable(&intel_dig_port->base,
227 old_crtc_state,
228 old_conn_state);
229}
230
217static void intel_mst_pre_enable_dp(struct intel_encoder *encoder, 231static void intel_mst_pre_enable_dp(struct intel_encoder *encoder,
218 const struct intel_crtc_state *pipe_config, 232 const struct intel_crtc_state *pipe_config,
219 const struct drm_connector_state *conn_state) 233 const struct drm_connector_state *conn_state)
@@ -335,24 +349,12 @@ intel_dp_mst_detect(struct drm_connector *connector, bool force)
335 intel_connector->port); 349 intel_connector->port);
336} 350}
337 351
338static void
339intel_dp_mst_connector_destroy(struct drm_connector *connector)
340{
341 struct intel_connector *intel_connector = to_intel_connector(connector);
342
343 if (!IS_ERR_OR_NULL(intel_connector->edid))
344 kfree(intel_connector->edid);
345
346 drm_connector_cleanup(connector);
347 kfree(connector);
348}
349
350static const struct drm_connector_funcs intel_dp_mst_connector_funcs = { 352static const struct drm_connector_funcs intel_dp_mst_connector_funcs = {
351 .detect = intel_dp_mst_detect, 353 .detect = intel_dp_mst_detect,
352 .fill_modes = drm_helper_probe_single_connector_modes, 354 .fill_modes = drm_helper_probe_single_connector_modes,
353 .late_register = intel_connector_register, 355 .late_register = intel_connector_register,
354 .early_unregister = intel_connector_unregister, 356 .early_unregister = intel_connector_unregister,
355 .destroy = intel_dp_mst_connector_destroy, 357 .destroy = intel_connector_destroy,
356 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 358 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
357 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 359 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
358}; 360};
@@ -452,6 +454,10 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
452 if (!intel_connector) 454 if (!intel_connector)
453 return NULL; 455 return NULL;
454 456
457 intel_connector->get_hw_state = intel_dp_mst_get_hw_state;
458 intel_connector->mst_port = intel_dp;
459 intel_connector->port = port;
460
455 connector = &intel_connector->base; 461 connector = &intel_connector->base;
456 ret = drm_connector_init(dev, connector, &intel_dp_mst_connector_funcs, 462 ret = drm_connector_init(dev, connector, &intel_dp_mst_connector_funcs,
457 DRM_MODE_CONNECTOR_DisplayPort); 463 DRM_MODE_CONNECTOR_DisplayPort);
@@ -462,10 +468,6 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
462 468
463 drm_connector_helper_add(connector, &intel_dp_mst_connector_helper_funcs); 469 drm_connector_helper_add(connector, &intel_dp_mst_connector_helper_funcs);
464 470
465 intel_connector->get_hw_state = intel_dp_mst_get_hw_state;
466 intel_connector->mst_port = intel_dp;
467 intel_connector->port = port;
468
469 for_each_pipe(dev_priv, pipe) { 471 for_each_pipe(dev_priv, pipe) {
470 struct drm_encoder *enc = 472 struct drm_encoder *enc =
471 &intel_dp->mst_encoders[pipe]->base.base; 473 &intel_dp->mst_encoders[pipe]->base.base;
@@ -560,6 +562,7 @@ intel_dp_create_fake_mst_encoder(struct intel_digital_port *intel_dig_port, enum
560 intel_encoder->disable = intel_mst_disable_dp; 562 intel_encoder->disable = intel_mst_disable_dp;
561 intel_encoder->post_disable = intel_mst_post_disable_dp; 563 intel_encoder->post_disable = intel_mst_post_disable_dp;
562 intel_encoder->pre_pll_enable = intel_mst_pre_pll_enable_dp; 564 intel_encoder->pre_pll_enable = intel_mst_pre_pll_enable_dp;
565 intel_encoder->post_pll_disable = intel_mst_post_pll_disable_dp;
563 intel_encoder->pre_enable = intel_mst_pre_enable_dp; 566 intel_encoder->pre_enable = intel_mst_pre_enable_dp;
564 intel_encoder->enable = intel_mst_enable_dp; 567 intel_encoder->enable = intel_mst_enable_dp;
565 intel_encoder->get_hw_state = intel_dp_mst_enc_get_hw_state; 568 intel_encoder->get_hw_state = intel_dp_mst_enc_get_hw_state;
diff --git a/drivers/gpu/drm/i915/intel_dpio_phy.c b/drivers/gpu/drm/i915/intel_dpio_phy.c
index 00b3ab656b06..3c7f10d17658 100644
--- a/drivers/gpu/drm/i915/intel_dpio_phy.c
+++ b/drivers/gpu/drm/i915/intel_dpio_phy.c
@@ -748,7 +748,7 @@ void chv_data_lane_soft_reset(struct intel_encoder *encoder,
748 val |= DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET; 748 val |= DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET;
749 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val); 749 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
750 750
751 if (crtc->config->lane_count > 2) { 751 if (crtc_state->lane_count > 2) {
752 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch)); 752 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
753 if (reset) 753 if (reset)
754 val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET); 754 val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
@@ -765,7 +765,7 @@ void chv_data_lane_soft_reset(struct intel_encoder *encoder,
765 val |= DPIO_PCS_CLK_SOFT_RESET; 765 val |= DPIO_PCS_CLK_SOFT_RESET;
766 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val); 766 vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
767 767
768 if (crtc->config->lane_count > 2) { 768 if (crtc_state->lane_count > 2) {
769 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch)); 769 val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch));
770 val |= CHV_PCS_REQ_SOFTRESET_EN; 770 val |= CHV_PCS_REQ_SOFTRESET_EN;
771 if (reset) 771 if (reset)
diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.c b/drivers/gpu/drm/i915/intel_dpll_mgr.c
index e6cac9225536..901e15063b24 100644
--- a/drivers/gpu/drm/i915/intel_dpll_mgr.c
+++ b/drivers/gpu/drm/i915/intel_dpll_mgr.c
@@ -126,16 +126,16 @@ void assert_shared_dpll(struct drm_i915_private *dev_priv,
126 126
127/** 127/**
128 * intel_prepare_shared_dpll - call a dpll's prepare hook 128 * intel_prepare_shared_dpll - call a dpll's prepare hook
129 * @crtc: CRTC which has a shared dpll 129 * @crtc_state: CRTC, and its state, which has a shared dpll
130 * 130 *
131 * This calls the PLL's prepare hook if it has one and if the PLL is not 131 * This calls the PLL's prepare hook if it has one and if the PLL is not
132 * already enabled. The prepare hook is platform specific. 132 * already enabled. The prepare hook is platform specific.
133 */ 133 */
134void intel_prepare_shared_dpll(struct intel_crtc *crtc) 134void intel_prepare_shared_dpll(const struct intel_crtc_state *crtc_state)
135{ 135{
136 struct drm_device *dev = crtc->base.dev; 136 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
137 struct drm_i915_private *dev_priv = to_i915(dev); 137 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
138 struct intel_shared_dpll *pll = crtc->config->shared_dpll; 138 struct intel_shared_dpll *pll = crtc_state->shared_dpll;
139 139
140 if (WARN_ON(pll == NULL)) 140 if (WARN_ON(pll == NULL))
141 return; 141 return;
@@ -154,15 +154,15 @@ void intel_prepare_shared_dpll(struct intel_crtc *crtc)
154 154
155/** 155/**
156 * intel_enable_shared_dpll - enable a CRTC's shared DPLL 156 * intel_enable_shared_dpll - enable a CRTC's shared DPLL
157 * @crtc: CRTC which has a shared DPLL 157 * @crtc_state: CRTC, and its state, which has a shared DPLL
158 * 158 *
159 * Enable the shared DPLL used by @crtc. 159 * Enable the shared DPLL used by @crtc.
160 */ 160 */
161void intel_enable_shared_dpll(struct intel_crtc *crtc) 161void intel_enable_shared_dpll(const struct intel_crtc_state *crtc_state)
162{ 162{
163 struct drm_device *dev = crtc->base.dev; 163 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
164 struct drm_i915_private *dev_priv = to_i915(dev); 164 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
165 struct intel_shared_dpll *pll = crtc->config->shared_dpll; 165 struct intel_shared_dpll *pll = crtc_state->shared_dpll;
166 unsigned int crtc_mask = drm_crtc_mask(&crtc->base); 166 unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
167 unsigned int old_mask; 167 unsigned int old_mask;
168 168
@@ -199,14 +199,15 @@ out:
199 199
200/** 200/**
201 * intel_disable_shared_dpll - disable a CRTC's shared DPLL 201 * intel_disable_shared_dpll - disable a CRTC's shared DPLL
202 * @crtc: CRTC which has a shared DPLL 202 * @crtc_state: CRTC, and its state, which has a shared DPLL
203 * 203 *
204 * Disable the shared DPLL used by @crtc. 204 * Disable the shared DPLL used by @crtc.
205 */ 205 */
206void intel_disable_shared_dpll(struct intel_crtc *crtc) 206void intel_disable_shared_dpll(const struct intel_crtc_state *crtc_state)
207{ 207{
208 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
208 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 209 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
209 struct intel_shared_dpll *pll = crtc->config->shared_dpll; 210 struct intel_shared_dpll *pll = crtc_state->shared_dpll;
210 unsigned int crtc_mask = drm_crtc_mask(&crtc->base); 211 unsigned int crtc_mask = drm_crtc_mask(&crtc->base);
211 212
212 /* PCH only available on ILK+ */ 213 /* PCH only available on ILK+ */
@@ -409,14 +410,6 @@ static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv,
409 struct intel_shared_dpll *pll) 410 struct intel_shared_dpll *pll)
410{ 411{
411 const enum intel_dpll_id id = pll->info->id; 412 const enum intel_dpll_id id = pll->info->id;
412 struct drm_device *dev = &dev_priv->drm;
413 struct intel_crtc *crtc;
414
415 /* Make sure no transcoder isn't still depending on us. */
416 for_each_intel_crtc(dev, crtc) {
417 if (crtc->config->shared_dpll == pll)
418 assert_pch_transcoder_disabled(dev_priv, crtc->pipe);
419 }
420 413
421 I915_WRITE(PCH_DPLL(id), 0); 414 I915_WRITE(PCH_DPLL(id), 0);
422 POSTING_READ(PCH_DPLL(id)); 415 POSTING_READ(PCH_DPLL(id));
@@ -2628,11 +2621,16 @@ static enum port icl_mg_pll_id_to_port(enum intel_dpll_id id)
2628 return id - DPLL_ID_ICL_MGPLL1 + PORT_C; 2621 return id - DPLL_ID_ICL_MGPLL1 + PORT_C;
2629} 2622}
2630 2623
2631static enum intel_dpll_id icl_port_to_mg_pll_id(enum port port) 2624enum intel_dpll_id icl_port_to_mg_pll_id(enum port port)
2632{ 2625{
2633 return port - PORT_C + DPLL_ID_ICL_MGPLL1; 2626 return port - PORT_C + DPLL_ID_ICL_MGPLL1;
2634} 2627}
2635 2628
2629bool intel_dpll_is_combophy(enum intel_dpll_id id)
2630{
2631 return id == DPLL_ID_ICL_DPLL0 || id == DPLL_ID_ICL_DPLL1;
2632}
2633
2636static bool icl_mg_pll_find_divisors(int clock_khz, bool is_dp, bool use_ssc, 2634static bool icl_mg_pll_find_divisors(int clock_khz, bool is_dp, bool use_ssc,
2637 uint32_t *target_dco_khz, 2635 uint32_t *target_dco_khz,
2638 struct intel_dpll_hw_state *state) 2636 struct intel_dpll_hw_state *state)
@@ -2874,8 +2872,8 @@ static struct intel_shared_dpll *
2874icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state, 2872icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
2875 struct intel_encoder *encoder) 2873 struct intel_encoder *encoder)
2876{ 2874{
2877 struct intel_digital_port *intel_dig_port = 2875 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2878 enc_to_dig_port(&encoder->base); 2876 struct intel_digital_port *intel_dig_port;
2879 struct intel_shared_dpll *pll; 2877 struct intel_shared_dpll *pll;
2880 struct intel_dpll_hw_state pll_state = {}; 2878 struct intel_dpll_hw_state pll_state = {};
2881 enum port port = encoder->port; 2879 enum port port = encoder->port;
@@ -2883,18 +2881,21 @@ icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
2883 int clock = crtc_state->port_clock; 2881 int clock = crtc_state->port_clock;
2884 bool ret; 2882 bool ret;
2885 2883
2886 switch (port) { 2884 if (intel_port_is_combophy(dev_priv, port)) {
2887 case PORT_A:
2888 case PORT_B:
2889 min = DPLL_ID_ICL_DPLL0; 2885 min = DPLL_ID_ICL_DPLL0;
2890 max = DPLL_ID_ICL_DPLL1; 2886 max = DPLL_ID_ICL_DPLL1;
2891 ret = icl_calc_dpll_state(crtc_state, encoder, clock, 2887 ret = icl_calc_dpll_state(crtc_state, encoder, clock,
2892 &pll_state); 2888 &pll_state);
2893 break; 2889 } else if (intel_port_is_tc(dev_priv, port)) {
2894 case PORT_C: 2890 if (encoder->type == INTEL_OUTPUT_DP_MST) {
2895 case PORT_D: 2891 struct intel_dp_mst_encoder *mst_encoder;
2896 case PORT_E: 2892
2897 case PORT_F: 2893 mst_encoder = enc_to_mst(&encoder->base);
2894 intel_dig_port = mst_encoder->primary;
2895 } else {
2896 intel_dig_port = enc_to_dig_port(&encoder->base);
2897 }
2898
2898 if (intel_dig_port->tc_type == TC_PORT_TBT) { 2899 if (intel_dig_port->tc_type == TC_PORT_TBT) {
2899 min = DPLL_ID_ICL_TBTPLL; 2900 min = DPLL_ID_ICL_TBTPLL;
2900 max = min; 2901 max = min;
@@ -2906,8 +2907,7 @@ icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
2906 ret = icl_calc_mg_pll_state(crtc_state, encoder, clock, 2907 ret = icl_calc_mg_pll_state(crtc_state, encoder, clock,
2907 &pll_state); 2908 &pll_state);
2908 } 2909 }
2909 break; 2910 } else {
2910 default:
2911 MISSING_CASE(port); 2911 MISSING_CASE(port);
2912 return NULL; 2912 return NULL;
2913 } 2913 }
@@ -2932,21 +2932,16 @@ icl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
2932 2932
2933static i915_reg_t icl_pll_id_to_enable_reg(enum intel_dpll_id id) 2933static i915_reg_t icl_pll_id_to_enable_reg(enum intel_dpll_id id)
2934{ 2934{
2935 switch (id) { 2935 if (intel_dpll_is_combophy(id))
2936 default:
2937 MISSING_CASE(id);
2938 /* fall through */
2939 case DPLL_ID_ICL_DPLL0:
2940 case DPLL_ID_ICL_DPLL1:
2941 return CNL_DPLL_ENABLE(id); 2936 return CNL_DPLL_ENABLE(id);
2942 case DPLL_ID_ICL_TBTPLL: 2937 else if (id == DPLL_ID_ICL_TBTPLL)
2943 return TBT_PLL_ENABLE; 2938 return TBT_PLL_ENABLE;
2944 case DPLL_ID_ICL_MGPLL1: 2939 else
2945 case DPLL_ID_ICL_MGPLL2: 2940 /*
2946 case DPLL_ID_ICL_MGPLL3: 2941 * TODO: Make MG_PLL macros use
2947 case DPLL_ID_ICL_MGPLL4: 2942 * tc port id instead of port id
2943 */
2948 return MG_PLL_ENABLE(icl_mg_pll_id_to_port(id)); 2944 return MG_PLL_ENABLE(icl_mg_pll_id_to_port(id));
2949 }
2950} 2945}
2951 2946
2952static bool icl_pll_get_hw_state(struct drm_i915_private *dev_priv, 2947static bool icl_pll_get_hw_state(struct drm_i915_private *dev_priv,
@@ -2965,17 +2960,11 @@ static bool icl_pll_get_hw_state(struct drm_i915_private *dev_priv,
2965 if (!(val & PLL_ENABLE)) 2960 if (!(val & PLL_ENABLE))
2966 goto out; 2961 goto out;
2967 2962
2968 switch (id) { 2963 if (intel_dpll_is_combophy(id) ||
2969 case DPLL_ID_ICL_DPLL0: 2964 id == DPLL_ID_ICL_TBTPLL) {
2970 case DPLL_ID_ICL_DPLL1:
2971 case DPLL_ID_ICL_TBTPLL:
2972 hw_state->cfgcr0 = I915_READ(ICL_DPLL_CFGCR0(id)); 2965 hw_state->cfgcr0 = I915_READ(ICL_DPLL_CFGCR0(id));
2973 hw_state->cfgcr1 = I915_READ(ICL_DPLL_CFGCR1(id)); 2966 hw_state->cfgcr1 = I915_READ(ICL_DPLL_CFGCR1(id));
2974 break; 2967 } else {
2975 case DPLL_ID_ICL_MGPLL1:
2976 case DPLL_ID_ICL_MGPLL2:
2977 case DPLL_ID_ICL_MGPLL3:
2978 case DPLL_ID_ICL_MGPLL4:
2979 port = icl_mg_pll_id_to_port(id); 2968 port = icl_mg_pll_id_to_port(id);
2980 hw_state->mg_refclkin_ctl = I915_READ(MG_REFCLKIN_CTL(port)); 2969 hw_state->mg_refclkin_ctl = I915_READ(MG_REFCLKIN_CTL(port));
2981 hw_state->mg_refclkin_ctl &= MG_REFCLKIN_CTL_OD_2_MUX_MASK; 2970 hw_state->mg_refclkin_ctl &= MG_REFCLKIN_CTL_OD_2_MUX_MASK;
@@ -3013,9 +3002,6 @@ static bool icl_pll_get_hw_state(struct drm_i915_private *dev_priv,
3013 3002
3014 hw_state->mg_pll_tdc_coldst_bias &= hw_state->mg_pll_tdc_coldst_bias_mask; 3003 hw_state->mg_pll_tdc_coldst_bias &= hw_state->mg_pll_tdc_coldst_bias_mask;
3015 hw_state->mg_pll_bias &= hw_state->mg_pll_bias_mask; 3004 hw_state->mg_pll_bias &= hw_state->mg_pll_bias_mask;
3016 break;
3017 default:
3018 MISSING_CASE(id);
3019 } 3005 }
3020 3006
3021 ret = true; 3007 ret = true;
@@ -3104,21 +3090,10 @@ static void icl_pll_enable(struct drm_i915_private *dev_priv,
3104 PLL_POWER_STATE, 1)) 3090 PLL_POWER_STATE, 1))
3105 DRM_ERROR("PLL %d Power not enabled\n", id); 3091 DRM_ERROR("PLL %d Power not enabled\n", id);
3106 3092
3107 switch (id) { 3093 if (intel_dpll_is_combophy(id) || id == DPLL_ID_ICL_TBTPLL)
3108 case DPLL_ID_ICL_DPLL0:
3109 case DPLL_ID_ICL_DPLL1:
3110 case DPLL_ID_ICL_TBTPLL:
3111 icl_dpll_write(dev_priv, pll); 3094 icl_dpll_write(dev_priv, pll);
3112 break; 3095 else
3113 case DPLL_ID_ICL_MGPLL1:
3114 case DPLL_ID_ICL_MGPLL2:
3115 case DPLL_ID_ICL_MGPLL3:
3116 case DPLL_ID_ICL_MGPLL4:
3117 icl_mg_pll_write(dev_priv, pll); 3096 icl_mg_pll_write(dev_priv, pll);
3118 break;
3119 default:
3120 MISSING_CASE(id);
3121 }
3122 3097
3123 /* 3098 /*
3124 * DVFS pre sequence would be here, but in our driver the cdclk code 3099 * DVFS pre sequence would be here, but in our driver the cdclk code
diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.h b/drivers/gpu/drm/i915/intel_dpll_mgr.h
index bf0de8a4dc63..a033d8f06d4a 100644
--- a/drivers/gpu/drm/i915/intel_dpll_mgr.h
+++ b/drivers/gpu/drm/i915/intel_dpll_mgr.h
@@ -334,9 +334,9 @@ struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc,
334void intel_release_shared_dpll(struct intel_shared_dpll *dpll, 334void intel_release_shared_dpll(struct intel_shared_dpll *dpll,
335 struct intel_crtc *crtc, 335 struct intel_crtc *crtc,
336 struct drm_atomic_state *state); 336 struct drm_atomic_state *state);
337void intel_prepare_shared_dpll(struct intel_crtc *crtc); 337void intel_prepare_shared_dpll(const struct intel_crtc_state *crtc_state);
338void intel_enable_shared_dpll(struct intel_crtc *crtc); 338void intel_enable_shared_dpll(const struct intel_crtc_state *crtc_state);
339void intel_disable_shared_dpll(struct intel_crtc *crtc); 339void intel_disable_shared_dpll(const struct intel_crtc_state *crtc_state);
340void intel_shared_dpll_swap_state(struct drm_atomic_state *state); 340void intel_shared_dpll_swap_state(struct drm_atomic_state *state);
341void intel_shared_dpll_init(struct drm_device *dev); 341void intel_shared_dpll_init(struct drm_device *dev);
342 342
@@ -345,5 +345,7 @@ void intel_dpll_dump_hw_state(struct drm_i915_private *dev_priv,
345int icl_calc_dp_combo_pll_link(struct drm_i915_private *dev_priv, 345int icl_calc_dp_combo_pll_link(struct drm_i915_private *dev_priv,
346 uint32_t pll_id); 346 uint32_t pll_id);
347int cnl_hdmi_pll_ref_clock(struct drm_i915_private *dev_priv); 347int cnl_hdmi_pll_ref_clock(struct drm_i915_private *dev_priv);
348enum intel_dpll_id icl_port_to_mg_pll_id(enum port port);
349bool intel_dpll_is_combophy(enum intel_dpll_id id);
348 350
349#endif /* _INTEL_DPLL_MGR_H_ */ 351#endif /* _INTEL_DPLL_MGR_H_ */
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index f8dc84b2d2d3..a7d9ac912125 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -381,6 +381,15 @@ struct intel_hdcp_shim {
381 bool *hdcp_capable); 381 bool *hdcp_capable);
382}; 382};
383 383
384struct intel_hdcp {
385 const struct intel_hdcp_shim *shim;
386 /* Mutex for hdcp state of the connector */
387 struct mutex mutex;
388 u64 value;
389 struct delayed_work check_work;
390 struct work_struct prop_work;
391};
392
384struct intel_connector { 393struct intel_connector {
385 struct drm_connector base; 394 struct drm_connector base;
386 /* 395 /*
@@ -413,11 +422,7 @@ struct intel_connector {
413 /* Work struct to schedule a uevent on link train failure */ 422 /* Work struct to schedule a uevent on link train failure */
414 struct work_struct modeset_retry_work; 423 struct work_struct modeset_retry_work;
415 424
416 const struct intel_hdcp_shim *hdcp_shim; 425 struct intel_hdcp hdcp;
417 struct mutex hdcp_mutex;
418 uint64_t hdcp_value; /* protected by hdcp_mutex */
419 struct delayed_work hdcp_check_work;
420 struct work_struct hdcp_prop_work;
421}; 426};
422 427
423struct intel_digital_connector_state { 428struct intel_digital_connector_state {
@@ -539,6 +544,26 @@ struct intel_plane_state {
539 */ 544 */
540 int scaler_id; 545 int scaler_id;
541 546
547 /*
548 * linked_plane:
549 *
550 * ICL planar formats require 2 planes that are updated as pairs.
551 * This member is used to make sure the other plane is also updated
552 * when required, and for update_slave() to find the correct
553 * plane_state to pass as argument.
554 */
555 struct intel_plane *linked_plane;
556
557 /*
558 * slave:
559 * If set don't update use the linked plane's state for updating
560 * this plane during atomic commit with the update_slave() callback.
561 *
562 * It's also used by the watermark code to ignore wm calculations on
563 * this plane. They're calculated by the linked plane's wm code.
564 */
565 u32 slave;
566
542 struct drm_intel_sprite_colorkey ckey; 567 struct drm_intel_sprite_colorkey ckey;
543}; 568};
544 569
@@ -547,6 +572,7 @@ struct intel_initial_plane_config {
547 unsigned int tiling; 572 unsigned int tiling;
548 int size; 573 int size;
549 u32 base; 574 u32 base;
575 u8 rotation;
550}; 576};
551 577
552#define SKL_MIN_SRC_W 8 578#define SKL_MIN_SRC_W 8
@@ -712,6 +738,13 @@ struct intel_crtc_wm_state {
712 bool need_postvbl_update; 738 bool need_postvbl_update;
713}; 739};
714 740
741enum intel_output_format {
742 INTEL_OUTPUT_FORMAT_INVALID,
743 INTEL_OUTPUT_FORMAT_RGB,
744 INTEL_OUTPUT_FORMAT_YCBCR420,
745 INTEL_OUTPUT_FORMAT_YCBCR444,
746};
747
715struct intel_crtc_state { 748struct intel_crtc_state {
716 struct drm_crtc_state base; 749 struct drm_crtc_state base;
717 750
@@ -899,8 +932,11 @@ struct intel_crtc_state {
899 /* HDMI High TMDS char rate ratio */ 932 /* HDMI High TMDS char rate ratio */
900 bool hdmi_high_tmds_clock_ratio; 933 bool hdmi_high_tmds_clock_ratio;
901 934
902 /* output format is YCBCR 4:2:0 */ 935 /* Output format RGB/YCBCR etc */
903 bool ycbcr420; 936 enum intel_output_format output_format;
937
938 /* Output down scaling is done in LSPCON device */
939 bool lspcon_downsampling;
904}; 940};
905 941
906struct intel_crtc { 942struct intel_crtc {
@@ -973,6 +1009,9 @@ struct intel_plane {
973 void (*update_plane)(struct intel_plane *plane, 1009 void (*update_plane)(struct intel_plane *plane,
974 const struct intel_crtc_state *crtc_state, 1010 const struct intel_crtc_state *crtc_state,
975 const struct intel_plane_state *plane_state); 1011 const struct intel_plane_state *plane_state);
1012 void (*update_slave)(struct intel_plane *plane,
1013 const struct intel_crtc_state *crtc_state,
1014 const struct intel_plane_state *plane_state);
976 void (*disable_plane)(struct intel_plane *plane, 1015 void (*disable_plane)(struct intel_plane *plane,
977 struct intel_crtc *crtc); 1016 struct intel_crtc *crtc);
978 bool (*get_hw_state)(struct intel_plane *plane, enum pipe *pipe); 1017 bool (*get_hw_state)(struct intel_plane *plane, enum pipe *pipe);
@@ -1070,13 +1109,13 @@ struct intel_dp {
1070 bool link_mst; 1109 bool link_mst;
1071 bool link_trained; 1110 bool link_trained;
1072 bool has_audio; 1111 bool has_audio;
1073 bool detect_done;
1074 bool reset_link_params; 1112 bool reset_link_params;
1075 enum aux_ch aux_ch;
1076 uint8_t dpcd[DP_RECEIVER_CAP_SIZE]; 1113 uint8_t dpcd[DP_RECEIVER_CAP_SIZE];
1077 uint8_t psr_dpcd[EDP_PSR_RECEIVER_CAP_SIZE]; 1114 uint8_t psr_dpcd[EDP_PSR_RECEIVER_CAP_SIZE];
1078 uint8_t downstream_ports[DP_MAX_DOWNSTREAM_PORTS]; 1115 uint8_t downstream_ports[DP_MAX_DOWNSTREAM_PORTS];
1079 uint8_t edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE]; 1116 uint8_t edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE];
1117 u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE];
1118 u8 fec_capable;
1080 /* source rates */ 1119 /* source rates */
1081 int num_source_rates; 1120 int num_source_rates;
1082 const int *source_rates; 1121 const int *source_rates;
@@ -1094,7 +1133,6 @@ struct intel_dp {
1094 /* sink or branch descriptor */ 1133 /* sink or branch descriptor */
1095 struct drm_dp_desc desc; 1134 struct drm_dp_desc desc;
1096 struct drm_dp_aux aux; 1135 struct drm_dp_aux aux;
1097 enum intel_display_power_domain aux_power_domain;
1098 uint8_t train_set[4]; 1136 uint8_t train_set[4];
1099 int panel_power_up_delay; 1137 int panel_power_up_delay;
1100 int panel_power_down_delay; 1138 int panel_power_down_delay;
@@ -1156,9 +1194,15 @@ struct intel_dp {
1156 struct intel_dp_compliance compliance; 1194 struct intel_dp_compliance compliance;
1157}; 1195};
1158 1196
1197enum lspcon_vendor {
1198 LSPCON_VENDOR_MCA,
1199 LSPCON_VENDOR_PARADE
1200};
1201
1159struct intel_lspcon { 1202struct intel_lspcon {
1160 bool active; 1203 bool active;
1161 enum drm_lspcon_mode mode; 1204 enum drm_lspcon_mode mode;
1205 enum lspcon_vendor vendor;
1162}; 1206};
1163 1207
1164struct intel_digital_port { 1208struct intel_digital_port {
@@ -1170,18 +1214,20 @@ struct intel_digital_port {
1170 enum irqreturn (*hpd_pulse)(struct intel_digital_port *, bool); 1214 enum irqreturn (*hpd_pulse)(struct intel_digital_port *, bool);
1171 bool release_cl2_override; 1215 bool release_cl2_override;
1172 uint8_t max_lanes; 1216 uint8_t max_lanes;
1217 /* Used for DP and ICL+ TypeC/DP and TypeC/HDMI ports. */
1218 enum aux_ch aux_ch;
1173 enum intel_display_power_domain ddi_io_power_domain; 1219 enum intel_display_power_domain ddi_io_power_domain;
1174 enum tc_port_type tc_type; 1220 enum tc_port_type tc_type;
1175 1221
1176 void (*write_infoframe)(struct drm_encoder *encoder, 1222 void (*write_infoframe)(struct intel_encoder *encoder,
1177 const struct intel_crtc_state *crtc_state, 1223 const struct intel_crtc_state *crtc_state,
1178 unsigned int type, 1224 unsigned int type,
1179 const void *frame, ssize_t len); 1225 const void *frame, ssize_t len);
1180 void (*set_infoframes)(struct drm_encoder *encoder, 1226 void (*set_infoframes)(struct intel_encoder *encoder,
1181 bool enable, 1227 bool enable,
1182 const struct intel_crtc_state *crtc_state, 1228 const struct intel_crtc_state *crtc_state,
1183 const struct drm_connector_state *conn_state); 1229 const struct drm_connector_state *conn_state);
1184 bool (*infoframe_enabled)(struct drm_encoder *encoder, 1230 bool (*infoframe_enabled)(struct intel_encoder *encoder,
1185 const struct intel_crtc_state *pipe_config); 1231 const struct intel_crtc_state *pipe_config);
1186}; 1232};
1187 1233
@@ -1281,6 +1327,12 @@ enc_to_dig_port(struct drm_encoder *encoder)
1281 return NULL; 1327 return NULL;
1282} 1328}
1283 1329
1330static inline struct intel_digital_port *
1331conn_to_dig_port(struct intel_connector *connector)
1332{
1333 return enc_to_dig_port(&intel_attached_encoder(&connector->base)->base);
1334}
1335
1284static inline struct intel_dp_mst_encoder * 1336static inline struct intel_dp_mst_encoder *
1285enc_to_mst(struct drm_encoder *encoder) 1337enc_to_mst(struct drm_encoder *encoder)
1286{ 1338{
@@ -1306,6 +1358,12 @@ static inline bool intel_encoder_is_dp(struct intel_encoder *encoder)
1306 } 1358 }
1307} 1359}
1308 1360
1361static inline struct intel_lspcon *
1362enc_to_intel_lspcon(struct drm_encoder *encoder)
1363{
1364 return &enc_to_dig_port(encoder)->lspcon;
1365}
1366
1309static inline struct intel_digital_port * 1367static inline struct intel_digital_port *
1310dp_to_dig_port(struct intel_dp *intel_dp) 1368dp_to_dig_port(struct intel_dp *intel_dp)
1311{ 1369{
@@ -1331,6 +1389,27 @@ hdmi_to_dig_port(struct intel_hdmi *intel_hdmi)
1331} 1389}
1332 1390
1333static inline struct intel_plane_state * 1391static inline struct intel_plane_state *
1392intel_atomic_get_plane_state(struct intel_atomic_state *state,
1393 struct intel_plane *plane)
1394{
1395 struct drm_plane_state *ret =
1396 drm_atomic_get_plane_state(&state->base, &plane->base);
1397
1398 if (IS_ERR(ret))
1399 return ERR_CAST(ret);
1400
1401 return to_intel_plane_state(ret);
1402}
1403
1404static inline struct intel_plane_state *
1405intel_atomic_get_old_plane_state(struct intel_atomic_state *state,
1406 struct intel_plane *plane)
1407{
1408 return to_intel_plane_state(drm_atomic_get_old_plane_state(&state->base,
1409 &plane->base));
1410}
1411
1412static inline struct intel_plane_state *
1334intel_atomic_get_new_plane_state(struct intel_atomic_state *state, 1413intel_atomic_get_new_plane_state(struct intel_atomic_state *state,
1335 struct intel_plane *plane) 1414 struct intel_plane *plane)
1336{ 1415{
@@ -1444,6 +1523,7 @@ void icl_map_plls_to_ports(struct drm_crtc *crtc,
1444void icl_unmap_plls_to_ports(struct drm_crtc *crtc, 1523void icl_unmap_plls_to_ports(struct drm_crtc *crtc,
1445 struct intel_crtc_state *crtc_state, 1524 struct intel_crtc_state *crtc_state,
1446 struct drm_atomic_state *old_state); 1525 struct drm_atomic_state *old_state);
1526void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder);
1447 1527
1448unsigned int intel_fb_align_height(const struct drm_framebuffer *fb, 1528unsigned int intel_fb_align_height(const struct drm_framebuffer *fb,
1449 int color_plane, unsigned int height); 1529 int color_plane, unsigned int height);
@@ -1488,7 +1568,6 @@ void intel_dump_cdclk_state(const struct intel_cdclk_state *cdclk_state,
1488void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe); 1568void i830_enable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe);
1489void i830_disable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe); 1569void i830_disable_pipe(struct drm_i915_private *dev_priv, enum pipe pipe);
1490enum pipe intel_crtc_pch_transcoder(struct intel_crtc *crtc); 1570enum pipe intel_crtc_pch_transcoder(struct intel_crtc *crtc);
1491void intel_update_rawclk(struct drm_i915_private *dev_priv);
1492int vlv_get_hpll_vco(struct drm_i915_private *dev_priv); 1571int vlv_get_hpll_vco(struct drm_i915_private *dev_priv);
1493int vlv_get_cck_clock(struct drm_i915_private *dev_priv, 1572int vlv_get_cck_clock(struct drm_i915_private *dev_priv,
1494 const char *name, u32 reg, int ref_freq); 1573 const char *name, u32 reg, int ref_freq);
@@ -1509,20 +1588,12 @@ void intel_mark_idle(struct drm_i915_private *dev_priv);
1509int intel_display_suspend(struct drm_device *dev); 1588int intel_display_suspend(struct drm_device *dev);
1510void intel_pps_unlock_regs_wa(struct drm_i915_private *dev_priv); 1589void intel_pps_unlock_regs_wa(struct drm_i915_private *dev_priv);
1511void intel_encoder_destroy(struct drm_encoder *encoder); 1590void intel_encoder_destroy(struct drm_encoder *encoder);
1512int intel_connector_init(struct intel_connector *);
1513struct intel_connector *intel_connector_alloc(void);
1514void intel_connector_free(struct intel_connector *connector);
1515bool intel_connector_get_hw_state(struct intel_connector *connector);
1516void intel_connector_attach_encoder(struct intel_connector *connector,
1517 struct intel_encoder *encoder);
1518struct drm_display_mode * 1591struct drm_display_mode *
1519intel_encoder_current_mode(struct intel_encoder *encoder); 1592intel_encoder_current_mode(struct intel_encoder *encoder);
1520bool intel_port_is_combophy(struct drm_i915_private *dev_priv, enum port port); 1593bool intel_port_is_combophy(struct drm_i915_private *dev_priv, enum port port);
1521bool intel_port_is_tc(struct drm_i915_private *dev_priv, enum port port); 1594bool intel_port_is_tc(struct drm_i915_private *dev_priv, enum port port);
1522enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv, 1595enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv,
1523 enum port port); 1596 enum port port);
1524
1525enum pipe intel_get_pipe_from_connector(struct intel_connector *connector);
1526int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data, 1597int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data,
1527 struct drm_file *file_priv); 1598 struct drm_file *file_priv);
1528enum transcoder intel_pipe_to_cpu_transcoder(struct drm_i915_private *dev_priv, 1599enum transcoder intel_pipe_to_cpu_transcoder(struct drm_i915_private *dev_priv,
@@ -1628,9 +1699,11 @@ void bxt_enable_dc9(struct drm_i915_private *dev_priv);
1628void bxt_disable_dc9(struct drm_i915_private *dev_priv); 1699void bxt_disable_dc9(struct drm_i915_private *dev_priv);
1629void gen9_enable_dc5(struct drm_i915_private *dev_priv); 1700void gen9_enable_dc5(struct drm_i915_private *dev_priv);
1630unsigned int skl_cdclk_get_vco(unsigned int freq); 1701unsigned int skl_cdclk_get_vco(unsigned int freq);
1702void skl_enable_dc6(struct drm_i915_private *dev_priv);
1631void intel_dp_get_m_n(struct intel_crtc *crtc, 1703void intel_dp_get_m_n(struct intel_crtc *crtc,
1632 struct intel_crtc_state *pipe_config); 1704 struct intel_crtc_state *pipe_config);
1633void intel_dp_set_m_n(struct intel_crtc *crtc, enum link_m_n_set m_n); 1705void intel_dp_set_m_n(const struct intel_crtc_state *crtc_state,
1706 enum link_m_n_set m_n);
1634int intel_dotclock_calculate(int link_freq, const struct intel_link_m_n *m_n); 1707int intel_dotclock_calculate(int link_freq, const struct intel_link_m_n *m_n);
1635bool bxt_find_best_dpll(struct intel_crtc_state *crtc_state, int target_clock, 1708bool bxt_find_best_dpll(struct intel_crtc_state *crtc_state, int target_clock,
1636 struct dpll *best_clock); 1709 struct dpll *best_clock);
@@ -1641,12 +1714,14 @@ bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state);
1641void hsw_enable_ips(const struct intel_crtc_state *crtc_state); 1714void hsw_enable_ips(const struct intel_crtc_state *crtc_state);
1642void hsw_disable_ips(const struct intel_crtc_state *crtc_state); 1715void hsw_disable_ips(const struct intel_crtc_state *crtc_state);
1643enum intel_display_power_domain intel_port_to_power_domain(enum port port); 1716enum intel_display_power_domain intel_port_to_power_domain(enum port port);
1717enum intel_display_power_domain
1718intel_aux_power_domain(struct intel_digital_port *dig_port);
1644void intel_mode_from_pipe_config(struct drm_display_mode *mode, 1719void intel_mode_from_pipe_config(struct drm_display_mode *mode,
1645 struct intel_crtc_state *pipe_config); 1720 struct intel_crtc_state *pipe_config);
1646void intel_crtc_arm_fifo_underrun(struct intel_crtc *crtc, 1721void intel_crtc_arm_fifo_underrun(struct intel_crtc *crtc,
1647 struct intel_crtc_state *crtc_state); 1722 struct intel_crtc_state *crtc_state);
1648 1723
1649u16 skl_scaler_calc_phase(int sub, bool chroma_center); 1724u16 skl_scaler_calc_phase(int sub, int scale, bool chroma_center);
1650int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state); 1725int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state);
1651int skl_max_scale(const struct intel_crtc_state *crtc_state, 1726int skl_max_scale(const struct intel_crtc_state *crtc_state,
1652 u32 pixel_format); 1727 u32 pixel_format);
@@ -1670,6 +1745,24 @@ unsigned int i9xx_plane_max_stride(struct intel_plane *plane,
1670 u32 pixel_format, u64 modifier, 1745 u32 pixel_format, u64 modifier,
1671 unsigned int rotation); 1746 unsigned int rotation);
1672 1747
1748/* intel_connector.c */
1749int intel_connector_init(struct intel_connector *connector);
1750struct intel_connector *intel_connector_alloc(void);
1751void intel_connector_free(struct intel_connector *connector);
1752void intel_connector_destroy(struct drm_connector *connector);
1753int intel_connector_register(struct drm_connector *connector);
1754void intel_connector_unregister(struct drm_connector *connector);
1755void intel_connector_attach_encoder(struct intel_connector *connector,
1756 struct intel_encoder *encoder);
1757bool intel_connector_get_hw_state(struct intel_connector *connector);
1758enum pipe intel_connector_get_pipe(struct intel_connector *connector);
1759int intel_connector_update_modes(struct drm_connector *connector,
1760 struct edid *edid);
1761int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
1762void intel_attach_force_audio_property(struct drm_connector *connector);
1763void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
1764void intel_attach_aspect_ratio_property(struct drm_connector *connector);
1765
1673/* intel_csr.c */ 1766/* intel_csr.c */
1674void intel_csr_ucode_init(struct drm_i915_private *); 1767void intel_csr_ucode_init(struct drm_i915_private *);
1675void intel_csr_load_program(struct drm_i915_private *); 1768void intel_csr_load_program(struct drm_i915_private *);
@@ -1728,9 +1821,6 @@ void intel_edp_drrs_invalidate(struct drm_i915_private *dev_priv,
1728 unsigned int frontbuffer_bits); 1821 unsigned int frontbuffer_bits);
1729void intel_edp_drrs_flush(struct drm_i915_private *dev_priv, 1822void intel_edp_drrs_flush(struct drm_i915_private *dev_priv,
1730 unsigned int frontbuffer_bits); 1823 unsigned int frontbuffer_bits);
1731void icl_program_mg_dp_mode(struct intel_dp *intel_dp);
1732void icl_enable_phy_clock_gating(struct intel_digital_port *dig_port);
1733void icl_disable_phy_clock_gating(struct intel_digital_port *dig_port);
1734 1824
1735void 1825void
1736intel_dp_program_link_training_pattern(struct intel_dp *intel_dp, 1826intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
@@ -1748,6 +1838,10 @@ bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp);
1748bool intel_dp_source_supports_hbr3(struct intel_dp *intel_dp); 1838bool intel_dp_source_supports_hbr3(struct intel_dp *intel_dp);
1749bool 1839bool
1750intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE]); 1840intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE]);
1841uint16_t intel_dp_dsc_get_output_bpp(int link_clock, uint8_t lane_count,
1842 int mode_clock, int mode_hdisplay);
1843uint8_t intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp, int mode_clock,
1844 int mode_hdisplay);
1751 1845
1752static inline unsigned int intel_dp_unused_lane_mask(int lane_count) 1846static inline unsigned int intel_dp_unused_lane_mask(int lane_count)
1753{ 1847{
@@ -1768,6 +1862,9 @@ void intel_dp_mst_encoder_cleanup(struct intel_digital_port *intel_dig_port);
1768/* vlv_dsi.c */ 1862/* vlv_dsi.c */
1769void vlv_dsi_init(struct drm_i915_private *dev_priv); 1863void vlv_dsi_init(struct drm_i915_private *dev_priv);
1770 1864
1865/* icl_dsi.c */
1866void icl_dsi_init(struct drm_i915_private *dev_priv);
1867
1771/* intel_dsi_dcs_backlight.c */ 1868/* intel_dsi_dcs_backlight.c */
1772int intel_dsi_dcs_init_backlight_funcs(struct intel_connector *intel_connector); 1869int intel_dsi_dcs_init_backlight_funcs(struct intel_connector *intel_connector);
1773 1870
@@ -1858,7 +1955,6 @@ bool intel_hdmi_handle_sink_scrambling(struct intel_encoder *encoder,
1858void intel_dp_dual_mode_set_tmds_output(struct intel_hdmi *hdmi, bool enable); 1955void intel_dp_dual_mode_set_tmds_output(struct intel_hdmi *hdmi, bool enable);
1859void intel_infoframe_init(struct intel_digital_port *intel_dig_port); 1956void intel_infoframe_init(struct intel_digital_port *intel_dig_port);
1860 1957
1861
1862/* intel_lvds.c */ 1958/* intel_lvds.c */
1863bool intel_lvds_port_enabled(struct drm_i915_private *dev_priv, 1959bool intel_lvds_port_enabled(struct drm_i915_private *dev_priv,
1864 i915_reg_t lvds_reg, enum pipe *pipe); 1960 i915_reg_t lvds_reg, enum pipe *pipe);
@@ -1866,19 +1962,9 @@ void intel_lvds_init(struct drm_i915_private *dev_priv);
1866struct intel_encoder *intel_get_lvds_encoder(struct drm_device *dev); 1962struct intel_encoder *intel_get_lvds_encoder(struct drm_device *dev);
1867bool intel_is_dual_link_lvds(struct drm_device *dev); 1963bool intel_is_dual_link_lvds(struct drm_device *dev);
1868 1964
1869
1870/* intel_modes.c */
1871int intel_connector_update_modes(struct drm_connector *connector,
1872 struct edid *edid);
1873int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter);
1874void intel_attach_force_audio_property(struct drm_connector *connector);
1875void intel_attach_broadcast_rgb_property(struct drm_connector *connector);
1876void intel_attach_aspect_ratio_property(struct drm_connector *connector);
1877
1878
1879/* intel_overlay.c */ 1965/* intel_overlay.c */
1880void intel_setup_overlay(struct drm_i915_private *dev_priv); 1966void intel_overlay_setup(struct drm_i915_private *dev_priv);
1881void intel_cleanup_overlay(struct drm_i915_private *dev_priv); 1967void intel_overlay_cleanup(struct drm_i915_private *dev_priv);
1882int intel_overlay_switch_off(struct intel_overlay *overlay); 1968int intel_overlay_switch_off(struct intel_overlay *overlay);
1883int intel_overlay_put_image_ioctl(struct drm_device *dev, void *data, 1969int intel_overlay_put_image_ioctl(struct drm_device *dev, void *data,
1884 struct drm_file *file_priv); 1970 struct drm_file *file_priv);
@@ -1907,7 +1993,6 @@ int intel_panel_setup_backlight(struct drm_connector *connector,
1907void intel_panel_enable_backlight(const struct intel_crtc_state *crtc_state, 1993void intel_panel_enable_backlight(const struct intel_crtc_state *crtc_state,
1908 const struct drm_connector_state *conn_state); 1994 const struct drm_connector_state *conn_state);
1909void intel_panel_disable_backlight(const struct drm_connector_state *old_conn_state); 1995void intel_panel_disable_backlight(const struct drm_connector_state *old_conn_state);
1910void intel_panel_destroy_backlight(struct drm_connector *connector);
1911extern struct drm_display_mode *intel_find_panel_downclock( 1996extern struct drm_display_mode *intel_find_panel_downclock(
1912 struct drm_i915_private *dev_priv, 1997 struct drm_i915_private *dev_priv,
1913 struct drm_display_mode *fixed_mode, 1998 struct drm_display_mode *fixed_mode,
@@ -1936,6 +2021,7 @@ int intel_hdcp_enable(struct intel_connector *connector);
1936int intel_hdcp_disable(struct intel_connector *connector); 2021int intel_hdcp_disable(struct intel_connector *connector);
1937int intel_hdcp_check_link(struct intel_connector *connector); 2022int intel_hdcp_check_link(struct intel_connector *connector);
1938bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port); 2023bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port);
2024bool intel_hdcp_capable(struct intel_connector *connector);
1939 2025
1940/* intel_psr.c */ 2026/* intel_psr.c */
1941#define CAN_PSR(dev_priv) (HAS_PSR(dev_priv) && dev_priv->psr.sink_support) 2027#define CAN_PSR(dev_priv) (HAS_PSR(dev_priv) && dev_priv->psr.sink_support)
@@ -1962,11 +2048,16 @@ void intel_psr_short_pulse(struct intel_dp *intel_dp);
1962int intel_psr_wait_for_idle(const struct intel_crtc_state *new_crtc_state, 2048int intel_psr_wait_for_idle(const struct intel_crtc_state *new_crtc_state,
1963 u32 *out_value); 2049 u32 *out_value);
1964 2050
2051/* intel_quirks.c */
2052void intel_init_quirks(struct drm_i915_private *dev_priv);
2053
1965/* intel_runtime_pm.c */ 2054/* intel_runtime_pm.c */
1966int intel_power_domains_init(struct drm_i915_private *); 2055int intel_power_domains_init(struct drm_i915_private *);
1967void intel_power_domains_cleanup(struct drm_i915_private *dev_priv); 2056void intel_power_domains_cleanup(struct drm_i915_private *dev_priv);
1968void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume); 2057void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume);
1969void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv); 2058void intel_power_domains_fini_hw(struct drm_i915_private *dev_priv);
2059void icl_display_core_init(struct drm_i915_private *dev_priv, bool resume);
2060void icl_display_core_uninit(struct drm_i915_private *dev_priv);
1970void intel_power_domains_enable(struct drm_i915_private *dev_priv); 2061void intel_power_domains_enable(struct drm_i915_private *dev_priv);
1971void intel_power_domains_disable(struct drm_i915_private *dev_priv); 2062void intel_power_domains_disable(struct drm_i915_private *dev_priv);
1972 2063
@@ -2101,10 +2192,9 @@ int intel_enable_sagv(struct drm_i915_private *dev_priv);
2101int intel_disable_sagv(struct drm_i915_private *dev_priv); 2192int intel_disable_sagv(struct drm_i915_private *dev_priv);
2102bool skl_wm_level_equals(const struct skl_wm_level *l1, 2193bool skl_wm_level_equals(const struct skl_wm_level *l1,
2103 const struct skl_wm_level *l2); 2194 const struct skl_wm_level *l2);
2104bool skl_ddb_allocation_overlaps(struct drm_i915_private *dev_priv, 2195bool skl_ddb_allocation_overlaps(const struct skl_ddb_entry *ddb,
2105 const struct skl_ddb_entry **entries, 2196 const struct skl_ddb_entry entries[],
2106 const struct skl_ddb_entry *ddb, 2197 int num_entries, int ignore_idx);
2107 int ignore);
2108bool ilk_disable_lp_wm(struct drm_device *dev); 2198bool ilk_disable_lp_wm(struct drm_device *dev);
2109int skl_check_pipe_max_pixel_rate(struct intel_crtc *intel_crtc, 2199int skl_check_pipe_max_pixel_rate(struct intel_crtc *intel_crtc,
2110 struct intel_crtc_state *cstate); 2200 struct intel_crtc_state *cstate);
@@ -2127,23 +2217,29 @@ int intel_sprite_set_colorkey_ioctl(struct drm_device *dev, void *data,
2127 struct drm_file *file_priv); 2217 struct drm_file *file_priv);
2128void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state); 2218void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state);
2129void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state); 2219void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state);
2130void skl_update_plane(struct intel_plane *plane,
2131 const struct intel_crtc_state *crtc_state,
2132 const struct intel_plane_state *plane_state);
2133void skl_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc);
2134bool skl_plane_get_hw_state(struct intel_plane *plane, enum pipe *pipe);
2135bool skl_plane_has_ccs(struct drm_i915_private *dev_priv,
2136 enum pipe pipe, enum plane_id plane_id);
2137bool skl_plane_has_planar(struct drm_i915_private *dev_priv,
2138 enum pipe pipe, enum plane_id plane_id);
2139unsigned int skl_plane_max_stride(struct intel_plane *plane,
2140 u32 pixel_format, u64 modifier,
2141 unsigned int rotation);
2142int skl_plane_check(struct intel_crtc_state *crtc_state,
2143 struct intel_plane_state *plane_state);
2144int intel_plane_check_stride(const struct intel_plane_state *plane_state); 2220int intel_plane_check_stride(const struct intel_plane_state *plane_state);
2145int intel_plane_check_src_coordinates(struct intel_plane_state *plane_state); 2221int intel_plane_check_src_coordinates(struct intel_plane_state *plane_state);
2146int chv_plane_check_rotation(const struct intel_plane_state *plane_state); 2222int chv_plane_check_rotation(const struct intel_plane_state *plane_state);
2223struct intel_plane *
2224skl_universal_plane_create(struct drm_i915_private *dev_priv,
2225 enum pipe pipe, enum plane_id plane_id);
2226
2227static inline bool icl_is_nv12_y_plane(enum plane_id id)
2228{
2229 /* Don't need to do a gen check, these planes are only available on gen11 */
2230 if (id == PLANE_SPRITE4 || id == PLANE_SPRITE5)
2231 return true;
2232
2233 return false;
2234}
2235
2236static inline bool icl_is_hdr_plane(struct intel_plane *plane)
2237{
2238 if (INTEL_GEN(to_i915(plane->base.dev)) < 11)
2239 return false;
2240
2241 return plane->id < PLANE_SPRITE2;
2242}
2147 2243
2148/* intel_tv.c */ 2244/* intel_tv.c */
2149void intel_tv_init(struct drm_i915_private *dev_priv); 2245void intel_tv_init(struct drm_i915_private *dev_priv);
@@ -2185,11 +2281,16 @@ int intel_atomic_setup_scalers(struct drm_i915_private *dev_priv,
2185 struct intel_crtc_state *crtc_state); 2281 struct intel_crtc_state *crtc_state);
2186 2282
2187/* intel_atomic_plane.c */ 2283/* intel_atomic_plane.c */
2188struct intel_plane_state *intel_create_plane_state(struct drm_plane *plane); 2284struct intel_plane *intel_plane_alloc(void);
2285void intel_plane_free(struct intel_plane *plane);
2189struct drm_plane_state *intel_plane_duplicate_state(struct drm_plane *plane); 2286struct drm_plane_state *intel_plane_duplicate_state(struct drm_plane *plane);
2190void intel_plane_destroy_state(struct drm_plane *plane, 2287void intel_plane_destroy_state(struct drm_plane *plane,
2191 struct drm_plane_state *state); 2288 struct drm_plane_state *state);
2192extern const struct drm_plane_helper_funcs intel_plane_helper_funcs; 2289extern const struct drm_plane_helper_funcs intel_plane_helper_funcs;
2290void intel_update_planes_on_crtc(struct intel_atomic_state *old_state,
2291 struct intel_crtc *crtc,
2292 struct intel_crtc_state *old_crtc_state,
2293 struct intel_crtc_state *new_crtc_state);
2193int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_state, 2294int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_state,
2194 struct intel_crtc_state *crtc_state, 2295 struct intel_crtc_state *crtc_state,
2195 const struct intel_plane_state *old_plane_state, 2296 const struct intel_plane_state *old_plane_state,
@@ -2205,6 +2306,18 @@ void intel_color_load_luts(struct drm_crtc_state *crtc_state);
2205bool lspcon_init(struct intel_digital_port *intel_dig_port); 2306bool lspcon_init(struct intel_digital_port *intel_dig_port);
2206void lspcon_resume(struct intel_lspcon *lspcon); 2307void lspcon_resume(struct intel_lspcon *lspcon);
2207void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon); 2308void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon);
2309void lspcon_write_infoframe(struct intel_encoder *encoder,
2310 const struct intel_crtc_state *crtc_state,
2311 unsigned int type,
2312 const void *buf, ssize_t len);
2313void lspcon_set_infoframes(struct intel_encoder *encoder,
2314 bool enable,
2315 const struct intel_crtc_state *crtc_state,
2316 const struct drm_connector_state *conn_state);
2317bool lspcon_infoframe_enabled(struct intel_encoder *encoder,
2318 const struct intel_crtc_state *pipe_config);
2319void lspcon_ycbcr420_config(struct drm_connector *connector,
2320 struct intel_crtc_state *crtc_state);
2208 2321
2209/* intel_pipe_crc.c */ 2322/* intel_pipe_crc.c */
2210#ifdef CONFIG_DEBUG_FS 2323#ifdef CONFIG_DEBUG_FS
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
new file mode 100644
index 000000000000..5fec02aceaed
--- /dev/null
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -0,0 +1,128 @@
1// SPDX-License-Identifier: MIT
2/*
3 * Copyright © 2018 Intel Corporation
4 */
5
6#include <drm/drm_mipi_dsi.h>
7#include "intel_dsi.h"
8
9int intel_dsi_bitrate(const struct intel_dsi *intel_dsi)
10{
11 int bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
12
13 if (WARN_ON(bpp < 0))
14 bpp = 16;
15
16 return intel_dsi->pclk * bpp / intel_dsi->lane_count;
17}
18
19int intel_dsi_tlpx_ns(const struct intel_dsi *intel_dsi)
20{
21 switch (intel_dsi->escape_clk_div) {
22 default:
23 case 0:
24 return 50;
25 case 1:
26 return 100;
27 case 2:
28 return 200;
29 }
30}
31
32int intel_dsi_get_modes(struct drm_connector *connector)
33{
34 struct intel_connector *intel_connector = to_intel_connector(connector);
35 struct drm_display_mode *mode;
36
37 DRM_DEBUG_KMS("\n");
38
39 if (!intel_connector->panel.fixed_mode) {
40 DRM_DEBUG_KMS("no fixed mode\n");
41 return 0;
42 }
43
44 mode = drm_mode_duplicate(connector->dev,
45 intel_connector->panel.fixed_mode);
46 if (!mode) {
47 DRM_DEBUG_KMS("drm_mode_duplicate failed\n");
48 return 0;
49 }
50
51 drm_mode_probed_add(connector, mode);
52 return 1;
53}
54
55enum drm_mode_status intel_dsi_mode_valid(struct drm_connector *connector,
56 struct drm_display_mode *mode)
57{
58 struct intel_connector *intel_connector = to_intel_connector(connector);
59 const struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
60 int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
61
62 DRM_DEBUG_KMS("\n");
63
64 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
65 return MODE_NO_DBLESCAN;
66
67 if (fixed_mode) {
68 if (mode->hdisplay > fixed_mode->hdisplay)
69 return MODE_PANEL;
70 if (mode->vdisplay > fixed_mode->vdisplay)
71 return MODE_PANEL;
72 if (fixed_mode->clock > max_dotclk)
73 return MODE_CLOCK_HIGH;
74 }
75
76 return MODE_OK;
77}
78
79struct intel_dsi_host *intel_dsi_host_init(struct intel_dsi *intel_dsi,
80 const struct mipi_dsi_host_ops *funcs,
81 enum port port)
82{
83 struct intel_dsi_host *host;
84 struct mipi_dsi_device *device;
85
86 host = kzalloc(sizeof(*host), GFP_KERNEL);
87 if (!host)
88 return NULL;
89
90 host->base.ops = funcs;
91 host->intel_dsi = intel_dsi;
92 host->port = port;
93
94 /*
95 * We should call mipi_dsi_host_register(&host->base) here, but we don't
96 * have a host->dev, and we don't have OF stuff either. So just use the
97 * dsi framework as a library and hope for the best. Create the dsi
98 * devices by ourselves here too. Need to be careful though, because we
99 * don't initialize any of the driver model devices here.
100 */
101 device = kzalloc(sizeof(*device), GFP_KERNEL);
102 if (!device) {
103 kfree(host);
104 return NULL;
105 }
106
107 device->host = &host->base;
108 host->device = device;
109
110 return host;
111}
112
113enum drm_panel_orientation
114intel_dsi_get_panel_orientation(struct intel_connector *connector)
115{
116 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
117 enum drm_panel_orientation orientation;
118
119 orientation = dev_priv->vbt.dsi.orientation;
120 if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
121 return orientation;
122
123 orientation = dev_priv->vbt.orientation;
124 if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
125 return orientation;
126
127 return DRM_MODE_PANEL_ORIENTATION_NORMAL;
128}
diff --git a/drivers/gpu/drm/i915/intel_dsi.h b/drivers/gpu/drm/i915/intel_dsi.h
index ad7c1cb32983..ee93137f4433 100644
--- a/drivers/gpu/drm/i915/intel_dsi.h
+++ b/drivers/gpu/drm/i915/intel_dsi.h
@@ -81,14 +81,21 @@ struct intel_dsi {
81 u16 dcs_backlight_ports; 81 u16 dcs_backlight_ports;
82 u16 dcs_cabc_ports; 82 u16 dcs_cabc_ports;
83 83
84 /* RGB or BGR */
85 bool bgr_enabled;
86
84 u8 pixel_overlap; 87 u8 pixel_overlap;
85 u32 port_bits; 88 u32 port_bits;
86 u32 bw_timer; 89 u32 bw_timer;
87 u32 dphy_reg; 90 u32 dphy_reg;
91
92 /* data lanes dphy timing */
93 u32 dphy_data_lane_reg;
88 u32 video_frmt_cfg_bits; 94 u32 video_frmt_cfg_bits;
89 u16 lp_byte_clk; 95 u16 lp_byte_clk;
90 96
91 /* timeouts in byte clocks */ 97 /* timeouts in byte clocks */
98 u16 hs_tx_timeout;
92 u16 lp_rx_timeout; 99 u16 lp_rx_timeout;
93 u16 turn_arnd_val; 100 u16 turn_arnd_val;
94 u16 rst_timer_val; 101 u16 rst_timer_val;
@@ -129,9 +136,31 @@ static inline struct intel_dsi *enc_to_intel_dsi(struct drm_encoder *encoder)
129 return container_of(encoder, struct intel_dsi, base.base); 136 return container_of(encoder, struct intel_dsi, base.base);
130} 137}
131 138
139static inline bool is_vid_mode(struct intel_dsi *intel_dsi)
140{
141 return intel_dsi->operation_mode == INTEL_DSI_VIDEO_MODE;
142}
143
144static inline bool is_cmd_mode(struct intel_dsi *intel_dsi)
145{
146 return intel_dsi->operation_mode == INTEL_DSI_COMMAND_MODE;
147}
148
149/* intel_dsi.c */
150int intel_dsi_bitrate(const struct intel_dsi *intel_dsi);
151int intel_dsi_tlpx_ns(const struct intel_dsi *intel_dsi);
152enum drm_panel_orientation
153intel_dsi_get_panel_orientation(struct intel_connector *connector);
154
132/* vlv_dsi.c */ 155/* vlv_dsi.c */
133void vlv_dsi_wait_for_fifo_empty(struct intel_dsi *intel_dsi, enum port port); 156void vlv_dsi_wait_for_fifo_empty(struct intel_dsi *intel_dsi, enum port port);
134enum mipi_dsi_pixel_format pixel_format_from_register_bits(u32 fmt); 157enum mipi_dsi_pixel_format pixel_format_from_register_bits(u32 fmt);
158int intel_dsi_get_modes(struct drm_connector *connector);
159enum drm_mode_status intel_dsi_mode_valid(struct drm_connector *connector,
160 struct drm_display_mode *mode);
161struct intel_dsi_host *intel_dsi_host_init(struct intel_dsi *intel_dsi,
162 const struct mipi_dsi_host_ops *funcs,
163 enum port port);
135 164
136/* vlv_dsi_pll.c */ 165/* vlv_dsi_pll.c */
137int vlv_dsi_pll_compute(struct intel_encoder *encoder, 166int vlv_dsi_pll_compute(struct intel_encoder *encoder,
@@ -158,5 +187,6 @@ bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id);
158int intel_dsi_vbt_get_modes(struct intel_dsi *intel_dsi); 187int intel_dsi_vbt_get_modes(struct intel_dsi *intel_dsi);
159void intel_dsi_vbt_exec_sequence(struct intel_dsi *intel_dsi, 188void intel_dsi_vbt_exec_sequence(struct intel_dsi *intel_dsi,
160 enum mipi_seq seq_id); 189 enum mipi_seq seq_id);
190void intel_dsi_msleep(struct intel_dsi *intel_dsi, int msec);
161 191
162#endif /* _INTEL_DSI_H */ 192#endif /* _INTEL_DSI_H */
diff --git a/drivers/gpu/drm/i915/intel_dsi_vbt.c b/drivers/gpu/drm/i915/intel_dsi_vbt.c
index ac83d6b89ae0..a72de81f4832 100644
--- a/drivers/gpu/drm/i915/intel_dsi_vbt.c
+++ b/drivers/gpu/drm/i915/intel_dsi_vbt.c
@@ -111,6 +111,7 @@ static inline enum port intel_dsi_seq_port_to_port(u8 port)
111static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi, 111static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi,
112 const u8 *data) 112 const u8 *data)
113{ 113{
114 struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev);
114 struct mipi_dsi_device *dsi_device; 115 struct mipi_dsi_device *dsi_device;
115 u8 type, flags, seq_port; 116 u8 type, flags, seq_port;
116 u16 len; 117 u16 len;
@@ -181,7 +182,8 @@ static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi,
181 break; 182 break;
182 } 183 }
183 184
184 vlv_dsi_wait_for_fifo_empty(intel_dsi, port); 185 if (!IS_ICELAKE(dev_priv))
186 vlv_dsi_wait_for_fifo_empty(intel_dsi, port);
185 187
186out: 188out:
187 data += len; 189 data += len;
@@ -481,6 +483,17 @@ void intel_dsi_vbt_exec_sequence(struct intel_dsi *intel_dsi,
481 } 483 }
482} 484}
483 485
486void intel_dsi_msleep(struct intel_dsi *intel_dsi, int msec)
487{
488 struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev);
489
490 /* For v3 VBTs in vid-mode the delays are part of the VBT sequences */
491 if (is_vid_mode(intel_dsi) && dev_priv->vbt.dsi.seq_version >= 3)
492 return;
493
494 msleep(msec);
495}
496
484int intel_dsi_vbt_get_modes(struct intel_dsi *intel_dsi) 497int intel_dsi_vbt_get_modes(struct intel_dsi *intel_dsi)
485{ 498{
486 struct intel_connector *connector = intel_dsi->attached_connector; 499 struct intel_connector *connector = intel_dsi->attached_connector;
@@ -499,110 +512,125 @@ int intel_dsi_vbt_get_modes(struct intel_dsi *intel_dsi)
499 return 1; 512 return 1;
500} 513}
501 514
502bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id) 515#define ICL_PREPARE_CNT_MAX 0x7
516#define ICL_CLK_ZERO_CNT_MAX 0xf
517#define ICL_TRAIL_CNT_MAX 0x7
518#define ICL_TCLK_PRE_CNT_MAX 0x3
519#define ICL_TCLK_POST_CNT_MAX 0x7
520#define ICL_HS_ZERO_CNT_MAX 0xf
521#define ICL_EXIT_ZERO_CNT_MAX 0x7
522
523static void icl_dphy_param_init(struct intel_dsi *intel_dsi)
503{ 524{
504 struct drm_device *dev = intel_dsi->base.base.dev; 525 struct drm_device *dev = intel_dsi->base.base.dev;
505 struct drm_i915_private *dev_priv = to_i915(dev); 526 struct drm_i915_private *dev_priv = to_i915(dev);
506 struct mipi_config *mipi_config = dev_priv->vbt.dsi.config; 527 struct mipi_config *mipi_config = dev_priv->vbt.dsi.config;
507 struct mipi_pps_data *pps = dev_priv->vbt.dsi.pps; 528 u32 tlpx_ns;
508 struct drm_display_mode *mode = dev_priv->vbt.lfp_lvds_vbt_mode;
509 u32 bpp;
510 u32 tlpx_ns, extra_byte_count, bitrate, tlpx_ui;
511 u32 ui_num, ui_den;
512 u32 prepare_cnt, exit_zero_cnt, clk_zero_cnt, trail_cnt; 529 u32 prepare_cnt, exit_zero_cnt, clk_zero_cnt, trail_cnt;
513 u32 ths_prepare_ns, tclk_trail_ns; 530 u32 ths_prepare_ns, tclk_trail_ns;
514 u32 tclk_prepare_clkzero, ths_prepare_hszero; 531 u32 hs_zero_cnt;
515 u32 lp_to_hs_switch, hs_to_lp_switch; 532 u32 tclk_pre_cnt, tclk_post_cnt;
516 u32 pclk, computed_ddr;
517 u32 mul;
518 u16 burst_mode_ratio;
519 enum port port;
520 533
521 DRM_DEBUG_KMS("\n"); 534 tlpx_ns = intel_dsi_tlpx_ns(intel_dsi);
522 535
523 intel_dsi->eotp_pkt = mipi_config->eot_pkt_disabled ? 0 : 1; 536 tclk_trail_ns = max(mipi_config->tclk_trail, mipi_config->ths_trail);
524 intel_dsi->clock_stop = mipi_config->enable_clk_stop ? 1 : 0; 537 ths_prepare_ns = max(mipi_config->ths_prepare,
525 intel_dsi->lane_count = mipi_config->lane_cnt + 1; 538 mipi_config->tclk_prepare);
526 intel_dsi->pixel_format =
527 pixel_format_from_register_bits(
528 mipi_config->videomode_color_format << 7);
529 bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
530
531 intel_dsi->dual_link = mipi_config->dual_link;
532 intel_dsi->pixel_overlap = mipi_config->pixel_overlap;
533 intel_dsi->operation_mode = mipi_config->is_cmd_mode;
534 intel_dsi->video_mode_format = mipi_config->video_transfer_mode;
535 intel_dsi->escape_clk_div = mipi_config->byte_clk_sel;
536 intel_dsi->lp_rx_timeout = mipi_config->lp_rx_timeout;
537 intel_dsi->turn_arnd_val = mipi_config->turn_around_timeout;
538 intel_dsi->rst_timer_val = mipi_config->device_reset_timer;
539 intel_dsi->init_count = mipi_config->master_init_timer;
540 intel_dsi->bw_timer = mipi_config->dbi_bw_timer;
541 intel_dsi->video_frmt_cfg_bits =
542 mipi_config->bta_enabled ? DISABLE_VIDEO_BTA : 0;
543
544 pclk = mode->clock;
545 539
546 /* In dual link mode each port needs half of pixel clock */ 540 /*
547 if (intel_dsi->dual_link) { 541 * prepare cnt in escape clocks
548 pclk = pclk / 2; 542 * this field represents a hexadecimal value with a precision
543 * of 1.2 – i.e. the most significant bit is the integer
544 * and the least significant 2 bits are fraction bits.
545 * so, the field can represent a range of 0.25 to 1.75
546 */
547 prepare_cnt = DIV_ROUND_UP(ths_prepare_ns * 4, tlpx_ns);
548 if (prepare_cnt > ICL_PREPARE_CNT_MAX) {
549 DRM_DEBUG_KMS("prepare_cnt out of range (%d)\n", prepare_cnt);
550 prepare_cnt = ICL_PREPARE_CNT_MAX;
551 }
549 552
550 /* we can enable pixel_overlap if needed by panel. In this 553 /* clk zero count in escape clocks */
551 * case we need to increase the pixelclock for extra pixels 554 clk_zero_cnt = DIV_ROUND_UP(mipi_config->tclk_prepare_clkzero -
552 */ 555 ths_prepare_ns, tlpx_ns);
553 if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK) { 556 if (clk_zero_cnt > ICL_CLK_ZERO_CNT_MAX) {
554 pclk += DIV_ROUND_UP(mode->vtotal * 557 DRM_DEBUG_KMS("clk_zero_cnt out of range (%d)\n", clk_zero_cnt);
555 intel_dsi->pixel_overlap * 558 clk_zero_cnt = ICL_CLK_ZERO_CNT_MAX;
556 60, 1000);
557 }
558 } 559 }
559 560
560 /* Burst Mode Ratio 561 /* trail cnt in escape clocks*/
561 * Target ddr frequency from VBT / non burst ddr freq 562 trail_cnt = DIV_ROUND_UP(tclk_trail_ns, tlpx_ns);
562 * multiply by 100 to preserve remainder 563 if (trail_cnt > ICL_TRAIL_CNT_MAX) {
563 */ 564 DRM_DEBUG_KMS("trail_cnt out of range (%d)\n", trail_cnt);
564 if (intel_dsi->video_mode_format == VIDEO_MODE_BURST) { 565 trail_cnt = ICL_TRAIL_CNT_MAX;
565 if (mipi_config->target_burst_mode_freq) { 566 }
566 computed_ddr = (pclk * bpp) / intel_dsi->lane_count;
567 567
568 if (mipi_config->target_burst_mode_freq < 568 /* tclk pre count in escape clocks */
569 computed_ddr) { 569 tclk_pre_cnt = DIV_ROUND_UP(mipi_config->tclk_pre, tlpx_ns);
570 DRM_ERROR("Burst mode freq is less than computed\n"); 570 if (tclk_pre_cnt > ICL_TCLK_PRE_CNT_MAX) {
571 return false; 571 DRM_DEBUG_KMS("tclk_pre_cnt out of range (%d)\n", tclk_pre_cnt);
572 } 572 tclk_pre_cnt = ICL_TCLK_PRE_CNT_MAX;
573 }
573 574
574 burst_mode_ratio = DIV_ROUND_UP( 575 /* tclk post count in escape clocks */
575 mipi_config->target_burst_mode_freq * 100, 576 tclk_post_cnt = DIV_ROUND_UP(mipi_config->tclk_post, tlpx_ns);
576 computed_ddr); 577 if (tclk_post_cnt > ICL_TCLK_POST_CNT_MAX) {
578 DRM_DEBUG_KMS("tclk_post_cnt out of range (%d)\n", tclk_post_cnt);
579 tclk_post_cnt = ICL_TCLK_POST_CNT_MAX;
580 }
577 581
578 pclk = DIV_ROUND_UP(pclk * burst_mode_ratio, 100); 582 /* hs zero cnt in escape clocks */
579 } else { 583 hs_zero_cnt = DIV_ROUND_UP(mipi_config->ths_prepare_hszero -
580 DRM_ERROR("Burst mode target is not set\n"); 584 ths_prepare_ns, tlpx_ns);
581 return false; 585 if (hs_zero_cnt > ICL_HS_ZERO_CNT_MAX) {
582 } 586 DRM_DEBUG_KMS("hs_zero_cnt out of range (%d)\n", hs_zero_cnt);
583 } else 587 hs_zero_cnt = ICL_HS_ZERO_CNT_MAX;
584 burst_mode_ratio = 100; 588 }
585 589
586 intel_dsi->burst_mode_ratio = burst_mode_ratio; 590 /* hs exit zero cnt in escape clocks */
587 intel_dsi->pclk = pclk; 591 exit_zero_cnt = DIV_ROUND_UP(mipi_config->ths_exit, tlpx_ns);
592 if (exit_zero_cnt > ICL_EXIT_ZERO_CNT_MAX) {
593 DRM_DEBUG_KMS("exit_zero_cnt out of range (%d)\n", exit_zero_cnt);
594 exit_zero_cnt = ICL_EXIT_ZERO_CNT_MAX;
595 }
588 596
589 bitrate = (pclk * bpp) / intel_dsi->lane_count; 597 /* clock lane dphy timings */
598 intel_dsi->dphy_reg = (CLK_PREPARE_OVERRIDE |
599 CLK_PREPARE(prepare_cnt) |
600 CLK_ZERO_OVERRIDE |
601 CLK_ZERO(clk_zero_cnt) |
602 CLK_PRE_OVERRIDE |
603 CLK_PRE(tclk_pre_cnt) |
604 CLK_POST_OVERRIDE |
605 CLK_POST(tclk_post_cnt) |
606 CLK_TRAIL_OVERRIDE |
607 CLK_TRAIL(trail_cnt));
608
609 /* data lanes dphy timings */
610 intel_dsi->dphy_data_lane_reg = (HS_PREPARE_OVERRIDE |
611 HS_PREPARE(prepare_cnt) |
612 HS_ZERO_OVERRIDE |
613 HS_ZERO(hs_zero_cnt) |
614 HS_TRAIL_OVERRIDE |
615 HS_TRAIL(trail_cnt) |
616 HS_EXIT_OVERRIDE |
617 HS_EXIT(exit_zero_cnt));
618}
590 619
591 switch (intel_dsi->escape_clk_div) { 620static void vlv_dphy_param_init(struct intel_dsi *intel_dsi)
592 case 0: 621{
593 tlpx_ns = 50; 622 struct drm_device *dev = intel_dsi->base.base.dev;
594 break; 623 struct drm_i915_private *dev_priv = to_i915(dev);
595 case 1: 624 struct mipi_config *mipi_config = dev_priv->vbt.dsi.config;
596 tlpx_ns = 100; 625 u32 tlpx_ns, extra_byte_count, tlpx_ui;
597 break; 626 u32 ui_num, ui_den;
627 u32 prepare_cnt, exit_zero_cnt, clk_zero_cnt, trail_cnt;
628 u32 ths_prepare_ns, tclk_trail_ns;
629 u32 tclk_prepare_clkzero, ths_prepare_hszero;
630 u32 lp_to_hs_switch, hs_to_lp_switch;
631 u32 mul;
598 632
599 case 2: 633 tlpx_ns = intel_dsi_tlpx_ns(intel_dsi);
600 tlpx_ns = 200;
601 break;
602 default:
603 tlpx_ns = 50;
604 break;
605 }
606 634
607 switch (intel_dsi->lane_count) { 635 switch (intel_dsi->lane_count) {
608 case 1: 636 case 1:
@@ -620,7 +648,7 @@ bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id)
620 648
621 /* in Kbps */ 649 /* in Kbps */
622 ui_num = NS_KHZ_RATIO; 650 ui_num = NS_KHZ_RATIO;
623 ui_den = bitrate; 651 ui_den = intel_dsi_bitrate(intel_dsi);
624 652
625 tclk_prepare_clkzero = mipi_config->tclk_prepare_clkzero; 653 tclk_prepare_clkzero = mipi_config->tclk_prepare_clkzero;
626 ths_prepare_hszero = mipi_config->ths_prepare_hszero; 654 ths_prepare_hszero = mipi_config->ths_prepare_hszero;
@@ -746,6 +774,88 @@ bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id)
746 DIV_ROUND_UP(2 * tlpx_ui + trail_cnt * 2 + 8, 774 DIV_ROUND_UP(2 * tlpx_ui + trail_cnt * 2 + 8,
747 8); 775 8);
748 intel_dsi->clk_hs_to_lp_count += extra_byte_count; 776 intel_dsi->clk_hs_to_lp_count += extra_byte_count;
777}
778
779bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id)
780{
781 struct drm_device *dev = intel_dsi->base.base.dev;
782 struct drm_i915_private *dev_priv = to_i915(dev);
783 struct mipi_config *mipi_config = dev_priv->vbt.dsi.config;
784 struct mipi_pps_data *pps = dev_priv->vbt.dsi.pps;
785 struct drm_display_mode *mode = dev_priv->vbt.lfp_lvds_vbt_mode;
786 u16 burst_mode_ratio;
787 enum port port;
788
789 DRM_DEBUG_KMS("\n");
790
791 intel_dsi->eotp_pkt = mipi_config->eot_pkt_disabled ? 0 : 1;
792 intel_dsi->clock_stop = mipi_config->enable_clk_stop ? 1 : 0;
793 intel_dsi->lane_count = mipi_config->lane_cnt + 1;
794 intel_dsi->pixel_format =
795 pixel_format_from_register_bits(
796 mipi_config->videomode_color_format << 7);
797
798 intel_dsi->dual_link = mipi_config->dual_link;
799 intel_dsi->pixel_overlap = mipi_config->pixel_overlap;
800 intel_dsi->operation_mode = mipi_config->is_cmd_mode;
801 intel_dsi->video_mode_format = mipi_config->video_transfer_mode;
802 intel_dsi->escape_clk_div = mipi_config->byte_clk_sel;
803 intel_dsi->lp_rx_timeout = mipi_config->lp_rx_timeout;
804 intel_dsi->hs_tx_timeout = mipi_config->hs_tx_timeout;
805 intel_dsi->turn_arnd_val = mipi_config->turn_around_timeout;
806 intel_dsi->rst_timer_val = mipi_config->device_reset_timer;
807 intel_dsi->init_count = mipi_config->master_init_timer;
808 intel_dsi->bw_timer = mipi_config->dbi_bw_timer;
809 intel_dsi->video_frmt_cfg_bits =
810 mipi_config->bta_enabled ? DISABLE_VIDEO_BTA : 0;
811 intel_dsi->bgr_enabled = mipi_config->rgb_flip;
812
813 /* Starting point, adjusted depending on dual link and burst mode */
814 intel_dsi->pclk = mode->clock;
815
816 /* In dual link mode each port needs half of pixel clock */
817 if (intel_dsi->dual_link) {
818 intel_dsi->pclk /= 2;
819
820 /* we can enable pixel_overlap if needed by panel. In this
821 * case we need to increase the pixelclock for extra pixels
822 */
823 if (intel_dsi->dual_link == DSI_DUAL_LINK_FRONT_BACK) {
824 intel_dsi->pclk += DIV_ROUND_UP(mode->vtotal * intel_dsi->pixel_overlap * 60, 1000);
825 }
826 }
827
828 /* Burst Mode Ratio
829 * Target ddr frequency from VBT / non burst ddr freq
830 * multiply by 100 to preserve remainder
831 */
832 if (intel_dsi->video_mode_format == VIDEO_MODE_BURST) {
833 if (mipi_config->target_burst_mode_freq) {
834 u32 bitrate = intel_dsi_bitrate(intel_dsi);
835
836 if (mipi_config->target_burst_mode_freq < bitrate) {
837 DRM_ERROR("Burst mode freq is less than computed\n");
838 return false;
839 }
840
841 burst_mode_ratio = DIV_ROUND_UP(
842 mipi_config->target_burst_mode_freq * 100,
843 bitrate);
844
845 intel_dsi->pclk = DIV_ROUND_UP(intel_dsi->pclk * burst_mode_ratio, 100);
846 } else {
847 DRM_ERROR("Burst mode target is not set\n");
848 return false;
849 }
850 } else
851 burst_mode_ratio = 100;
852
853 intel_dsi->burst_mode_ratio = burst_mode_ratio;
854
855 if (IS_ICELAKE(dev_priv))
856 icl_dphy_param_init(intel_dsi);
857 else
858 vlv_dphy_param_init(intel_dsi);
749 859
750 DRM_DEBUG_KMS("Pclk %d\n", intel_dsi->pclk); 860 DRM_DEBUG_KMS("Pclk %d\n", intel_dsi->pclk);
751 DRM_DEBUG_KMS("Pixel overlap %d\n", intel_dsi->pixel_overlap); 861 DRM_DEBUG_KMS("Pixel overlap %d\n", intel_dsi->pixel_overlap);
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
index 4e142ff49708..0042a7f69387 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -256,6 +256,7 @@ static bool intel_dvo_compute_config(struct intel_encoder *encoder,
256 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) 256 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
257 return false; 257 return false;
258 258
259 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
259 return true; 260 return true;
260} 261}
261 262
@@ -333,18 +334,11 @@ static int intel_dvo_get_modes(struct drm_connector *connector)
333 return 0; 334 return 0;
334} 335}
335 336
336static void intel_dvo_destroy(struct drm_connector *connector)
337{
338 drm_connector_cleanup(connector);
339 intel_panel_fini(&to_intel_connector(connector)->panel);
340 kfree(connector);
341}
342
343static const struct drm_connector_funcs intel_dvo_connector_funcs = { 337static const struct drm_connector_funcs intel_dvo_connector_funcs = {
344 .detect = intel_dvo_detect, 338 .detect = intel_dvo_detect,
345 .late_register = intel_connector_register, 339 .late_register = intel_connector_register,
346 .early_unregister = intel_connector_unregister, 340 .early_unregister = intel_connector_unregister,
347 .destroy = intel_dvo_destroy, 341 .destroy = intel_connector_destroy,
348 .fill_modes = drm_helper_probe_single_connector_modes, 342 .fill_modes = drm_helper_probe_single_connector_modes,
349 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 343 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
350 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 344 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
index 217ed3ee1cab..759c0fd58f8c 100644
--- a/drivers/gpu/drm/i915/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/intel_engine_cs.c
@@ -273,13 +273,13 @@ intel_engine_setup(struct drm_i915_private *dev_priv,
273 BUILD_BUG_ON(MAX_ENGINE_CLASS >= BIT(GEN11_ENGINE_CLASS_WIDTH)); 273 BUILD_BUG_ON(MAX_ENGINE_CLASS >= BIT(GEN11_ENGINE_CLASS_WIDTH));
274 BUILD_BUG_ON(MAX_ENGINE_INSTANCE >= BIT(GEN11_ENGINE_INSTANCE_WIDTH)); 274 BUILD_BUG_ON(MAX_ENGINE_INSTANCE >= BIT(GEN11_ENGINE_INSTANCE_WIDTH));
275 275
276 if (GEM_WARN_ON(info->class > MAX_ENGINE_CLASS)) 276 if (GEM_DEBUG_WARN_ON(info->class > MAX_ENGINE_CLASS))
277 return -EINVAL; 277 return -EINVAL;
278 278
279 if (GEM_WARN_ON(info->instance > MAX_ENGINE_INSTANCE)) 279 if (GEM_DEBUG_WARN_ON(info->instance > MAX_ENGINE_INSTANCE))
280 return -EINVAL; 280 return -EINVAL;
281 281
282 if (GEM_WARN_ON(dev_priv->engine_class[info->class][info->instance])) 282 if (GEM_DEBUG_WARN_ON(dev_priv->engine_class[info->class][info->instance]))
283 return -EINVAL; 283 return -EINVAL;
284 284
285 GEM_BUG_ON(dev_priv->engine[id]); 285 GEM_BUG_ON(dev_priv->engine[id]);
@@ -335,7 +335,10 @@ int intel_engines_init_mmio(struct drm_i915_private *dev_priv)
335 335
336 WARN_ON(ring_mask == 0); 336 WARN_ON(ring_mask == 0);
337 WARN_ON(ring_mask & 337 WARN_ON(ring_mask &
338 GENMASK(sizeof(mask) * BITS_PER_BYTE - 1, I915_NUM_ENGINES)); 338 GENMASK(BITS_PER_TYPE(mask) - 1, I915_NUM_ENGINES));
339
340 if (i915_inject_load_failure())
341 return -ENODEV;
339 342
340 for (i = 0; i < ARRAY_SIZE(intel_engines); i++) { 343 for (i = 0; i < ARRAY_SIZE(intel_engines); i++) {
341 if (!HAS_ENGINE(dev_priv, i)) 344 if (!HAS_ENGINE(dev_priv, i))
@@ -399,7 +402,7 @@ int intel_engines_init(struct drm_i915_private *dev_priv)
399 err = -EINVAL; 402 err = -EINVAL;
400 err_id = id; 403 err_id = id;
401 404
402 if (GEM_WARN_ON(!init)) 405 if (GEM_DEBUG_WARN_ON(!init))
403 goto cleanup; 406 goto cleanup;
404 407
405 err = init(engine); 408 err = init(engine);
@@ -463,7 +466,7 @@ static void intel_engine_init_execlist(struct intel_engine_cs *engine)
463 struct intel_engine_execlists * const execlists = &engine->execlists; 466 struct intel_engine_execlists * const execlists = &engine->execlists;
464 467
465 execlists->port_mask = 1; 468 execlists->port_mask = 1;
466 BUILD_BUG_ON_NOT_POWER_OF_2(execlists_num_ports(execlists)); 469 GEM_BUG_ON(!is_power_of_2(execlists_num_ports(execlists)));
467 GEM_BUG_ON(execlists_num_ports(execlists) > EXECLIST_MAX_PORTS); 470 GEM_BUG_ON(execlists_num_ports(execlists) > EXECLIST_MAX_PORTS);
468 471
469 execlists->queue_priority = INT_MIN; 472 execlists->queue_priority = INT_MIN;
@@ -482,7 +485,7 @@ static void intel_engine_init_execlist(struct intel_engine_cs *engine)
482void intel_engine_setup_common(struct intel_engine_cs *engine) 485void intel_engine_setup_common(struct intel_engine_cs *engine)
483{ 486{
484 i915_timeline_init(engine->i915, &engine->timeline, engine->name); 487 i915_timeline_init(engine->i915, &engine->timeline, engine->name);
485 lockdep_set_subclass(&engine->timeline.lock, TIMELINE_ENGINE); 488 i915_timeline_set_subclass(&engine->timeline, TIMELINE_ENGINE);
486 489
487 intel_engine_init_execlist(engine); 490 intel_engine_init_execlist(engine);
488 intel_engine_init_hangcheck(engine); 491 intel_engine_init_hangcheck(engine);
@@ -809,7 +812,7 @@ u32 intel_calculate_mcr_s_ss_select(struct drm_i915_private *dev_priv)
809 u32 slice = fls(sseu->slice_mask); 812 u32 slice = fls(sseu->slice_mask);
810 u32 subslice = fls(sseu->subslice_mask[slice]); 813 u32 subslice = fls(sseu->subslice_mask[slice]);
811 814
812 if (INTEL_GEN(dev_priv) == 10) 815 if (IS_GEN10(dev_priv))
813 mcr_s_ss_select = GEN8_MCR_SLICE(slice) | 816 mcr_s_ss_select = GEN8_MCR_SLICE(slice) |
814 GEN8_MCR_SUBSLICE(subslice); 817 GEN8_MCR_SUBSLICE(subslice);
815 else if (INTEL_GEN(dev_priv) >= 11) 818 else if (INTEL_GEN(dev_priv) >= 11)
@@ -1534,10 +1537,10 @@ void intel_engine_dump(struct intel_engine_cs *engine,
1534 count = 0; 1537 count = 0;
1535 drm_printf(m, "\t\tQueue priority: %d\n", execlists->queue_priority); 1538 drm_printf(m, "\t\tQueue priority: %d\n", execlists->queue_priority);
1536 for (rb = rb_first_cached(&execlists->queue); rb; rb = rb_next(rb)) { 1539 for (rb = rb_first_cached(&execlists->queue); rb; rb = rb_next(rb)) {
1537 struct i915_priolist *p = 1540 struct i915_priolist *p = rb_entry(rb, typeof(*p), node);
1538 rb_entry(rb, typeof(*p), node); 1541 int i;
1539 1542
1540 list_for_each_entry(rq, &p->requests, sched.link) { 1543 priolist_for_each_request(rq, p, i) {
1541 if (count++ < MAX_REQUESTS_TO_SHOW - 1) 1544 if (count++ < MAX_REQUESTS_TO_SHOW - 1)
1542 print_request(m, rq, "\t\tQ "); 1545 print_request(m, rq, "\t\tQ ");
1543 else 1546 else
@@ -1559,8 +1562,10 @@ void intel_engine_dump(struct intel_engine_cs *engine,
1559 for (rb = rb_first(&b->waiters); rb; rb = rb_next(rb)) { 1562 for (rb = rb_first(&b->waiters); rb; rb = rb_next(rb)) {
1560 struct intel_wait *w = rb_entry(rb, typeof(*w), node); 1563 struct intel_wait *w = rb_entry(rb, typeof(*w), node);
1561 1564
1562 drm_printf(m, "\t%s [%d] waiting for %x\n", 1565 drm_printf(m, "\t%s [%d:%c] waiting for %x\n",
1563 w->tsk->comm, w->tsk->pid, w->seqno); 1566 w->tsk->comm, w->tsk->pid,
1567 task_state_to_char(w->tsk),
1568 w->seqno);
1564 } 1569 }
1565 spin_unlock(&b->rb_lock); 1570 spin_unlock(&b->rb_lock);
1566 local_irq_restore(flags); 1571 local_irq_restore(flags);
diff --git a/drivers/gpu/drm/i915/intel_fbc.c b/drivers/gpu/drm/i915/intel_fbc.c
index 74d425c700ef..14cbaf4a0e93 100644
--- a/drivers/gpu/drm/i915/intel_fbc.c
+++ b/drivers/gpu/drm/i915/intel_fbc.c
@@ -84,7 +84,7 @@ static int intel_fbc_calculate_cfb_size(struct drm_i915_private *dev_priv,
84 int lines; 84 int lines;
85 85
86 intel_fbc_get_plane_source_size(cache, NULL, &lines); 86 intel_fbc_get_plane_source_size(cache, NULL, &lines);
87 if (INTEL_GEN(dev_priv) == 7) 87 if (IS_GEN7(dev_priv))
88 lines = min(lines, 2048); 88 lines = min(lines, 2048);
89 else if (INTEL_GEN(dev_priv) >= 8) 89 else if (INTEL_GEN(dev_priv) >= 8)
90 lines = min(lines, 2560); 90 lines = min(lines, 2560);
@@ -674,6 +674,8 @@ static void intel_fbc_update_state_cache(struct intel_crtc *crtc,
674 cache->plane.adjusted_y = plane_state->color_plane[0].y; 674 cache->plane.adjusted_y = plane_state->color_plane[0].y;
675 cache->plane.y = plane_state->base.src.y1 >> 16; 675 cache->plane.y = plane_state->base.src.y1 >> 16;
676 676
677 cache->plane.pixel_blend_mode = plane_state->base.pixel_blend_mode;
678
677 if (!cache->plane.visible) 679 if (!cache->plane.visible)
678 return; 680 return;
679 681
@@ -748,6 +750,12 @@ static bool intel_fbc_can_activate(struct intel_crtc *crtc)
748 return false; 750 return false;
749 } 751 }
750 752
753 if (cache->plane.pixel_blend_mode != DRM_MODE_BLEND_PIXEL_NONE &&
754 cache->fb.format->has_alpha) {
755 fbc->no_fbc_reason = "per-pixel alpha blending is incompatible with FBC";
756 return false;
757 }
758
751 /* WaFbcExceedCdClockThreshold:hsw,bdw */ 759 /* WaFbcExceedCdClockThreshold:hsw,bdw */
752 if ((IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) && 760 if ((IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) &&
753 cache->crtc.hsw_bdw_pixel_rate >= dev_priv->cdclk.hw.cdclk * 95 / 100) { 761 cache->crtc.hsw_bdw_pixel_rate >= dev_priv->cdclk.hw.cdclk * 95 / 100) {
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index f99332972b7a..2480c7d6edee 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -593,7 +593,7 @@ static bool intel_fbdev_init_bios(struct drm_device *dev,
593 * pipe. Note we need to use the selected fb's pitch and bpp 593 * pipe. Note we need to use the selected fb's pitch and bpp
594 * rather than the current pipe's, since they differ. 594 * rather than the current pipe's, since they differ.
595 */ 595 */
596 cur_size = intel_crtc->config->base.adjusted_mode.crtc_hdisplay; 596 cur_size = crtc->state->adjusted_mode.crtc_hdisplay;
597 cur_size = cur_size * fb->base.format->cpp[0]; 597 cur_size = cur_size * fb->base.format->cpp[0];
598 if (fb->base.pitches[0] < cur_size) { 598 if (fb->base.pitches[0] < cur_size) {
599 DRM_DEBUG_KMS("fb not wide enough for plane %c (%d vs %d)\n", 599 DRM_DEBUG_KMS("fb not wide enough for plane %c (%d vs %d)\n",
@@ -603,13 +603,13 @@ static bool intel_fbdev_init_bios(struct drm_device *dev,
603 break; 603 break;
604 } 604 }
605 605
606 cur_size = intel_crtc->config->base.adjusted_mode.crtc_vdisplay; 606 cur_size = crtc->state->adjusted_mode.crtc_vdisplay;
607 cur_size = intel_fb_align_height(&fb->base, 0, cur_size); 607 cur_size = intel_fb_align_height(&fb->base, 0, cur_size);
608 cur_size *= fb->base.pitches[0]; 608 cur_size *= fb->base.pitches[0];
609 DRM_DEBUG_KMS("pipe %c area: %dx%d, bpp: %d, size: %d\n", 609 DRM_DEBUG_KMS("pipe %c area: %dx%d, bpp: %d, size: %d\n",
610 pipe_name(intel_crtc->pipe), 610 pipe_name(intel_crtc->pipe),
611 intel_crtc->config->base.adjusted_mode.crtc_hdisplay, 611 crtc->state->adjusted_mode.crtc_hdisplay,
612 intel_crtc->config->base.adjusted_mode.crtc_vdisplay, 612 crtc->state->adjusted_mode.crtc_vdisplay,
613 fb->base.format->cpp[0] * 8, 613 fb->base.format->cpp[0] * 8,
614 cur_size); 614 cur_size);
615 615
diff --git a/drivers/gpu/drm/i915/intel_guc.c b/drivers/gpu/drm/i915/intel_guc.c
index 230aea69385d..8660af3fd755 100644
--- a/drivers/gpu/drm/i915/intel_guc.c
+++ b/drivers/gpu/drm/i915/intel_guc.c
@@ -50,7 +50,8 @@ void intel_guc_init_send_regs(struct intel_guc *guc)
50 unsigned int i; 50 unsigned int i;
51 51
52 guc->send_regs.base = i915_mmio_reg_offset(SOFT_SCRATCH(0)); 52 guc->send_regs.base = i915_mmio_reg_offset(SOFT_SCRATCH(0));
53 guc->send_regs.count = SOFT_SCRATCH_COUNT - 1; 53 guc->send_regs.count = GUC_MAX_MMIO_MSG_LEN;
54 BUILD_BUG_ON(GUC_MAX_MMIO_MSG_LEN > SOFT_SCRATCH_COUNT);
54 55
55 for (i = 0; i < guc->send_regs.count; i++) { 56 for (i = 0; i < guc->send_regs.count; i++) {
56 fw_domains |= intel_uncore_forcewake_for_reg(dev_priv, 57 fw_domains |= intel_uncore_forcewake_for_reg(dev_priv,
@@ -521,6 +522,44 @@ int intel_guc_auth_huc(struct intel_guc *guc, u32 rsa_offset)
521 return intel_guc_send(guc, action, ARRAY_SIZE(action)); 522 return intel_guc_send(guc, action, ARRAY_SIZE(action));
522} 523}
523 524
525/*
526 * The ENTER/EXIT_S_STATE actions queue the save/restore operation in GuC FW and
527 * then return, so waiting on the H2G is not enough to guarantee GuC is done.
528 * When all the processing is done, GuC writes INTEL_GUC_SLEEP_STATE_SUCCESS to
529 * scratch register 14, so we can poll on that. Note that GuC does not ensure
530 * that the value in the register is different from
531 * INTEL_GUC_SLEEP_STATE_SUCCESS while the action is in progress so we need to
532 * take care of that ourselves as well.
533 */
534static int guc_sleep_state_action(struct intel_guc *guc,
535 const u32 *action, u32 len)
536{
537 struct drm_i915_private *dev_priv = guc_to_i915(guc);
538 int ret;
539 u32 status;
540
541 I915_WRITE(SOFT_SCRATCH(14), INTEL_GUC_SLEEP_STATE_INVALID_MASK);
542
543 ret = intel_guc_send(guc, action, len);
544 if (ret)
545 return ret;
546
547 ret = __intel_wait_for_register(dev_priv, SOFT_SCRATCH(14),
548 INTEL_GUC_SLEEP_STATE_INVALID_MASK,
549 0, 0, 10, &status);
550 if (ret)
551 return ret;
552
553 if (status != INTEL_GUC_SLEEP_STATE_SUCCESS) {
554 DRM_ERROR("GuC failed to change sleep state. "
555 "action=0x%x, err=%u\n",
556 action[0], status);
557 return -EIO;
558 }
559
560 return 0;
561}
562
524/** 563/**
525 * intel_guc_suspend() - notify GuC entering suspend state 564 * intel_guc_suspend() - notify GuC entering suspend state
526 * @guc: the guc 565 * @guc: the guc
@@ -533,7 +572,7 @@ int intel_guc_suspend(struct intel_guc *guc)
533 intel_guc_ggtt_offset(guc, guc->shared_data) 572 intel_guc_ggtt_offset(guc, guc->shared_data)
534 }; 573 };
535 574
536 return intel_guc_send(guc, data, ARRAY_SIZE(data)); 575 return guc_sleep_state_action(guc, data, ARRAY_SIZE(data));
537} 576}
538 577
539/** 578/**
@@ -571,7 +610,7 @@ int intel_guc_resume(struct intel_guc *guc)
571 intel_guc_ggtt_offset(guc, guc->shared_data) 610 intel_guc_ggtt_offset(guc, guc->shared_data)
572 }; 611 };
573 612
574 return intel_guc_send(guc, data, ARRAY_SIZE(data)); 613 return guc_sleep_state_action(guc, data, ARRAY_SIZE(data));
575} 614}
576 615
577/** 616/**
diff --git a/drivers/gpu/drm/i915/intel_guc.h b/drivers/gpu/drm/i915/intel_guc.h
index ad42faf48c46..0f1c4f9ebfd8 100644
--- a/drivers/gpu/drm/i915/intel_guc.h
+++ b/drivers/gpu/drm/i915/intel_guc.h
@@ -95,6 +95,11 @@ struct intel_guc {
95 void (*notify)(struct intel_guc *guc); 95 void (*notify)(struct intel_guc *guc);
96}; 96};
97 97
98static inline bool intel_guc_is_alive(struct intel_guc *guc)
99{
100 return intel_uc_fw_is_loaded(&guc->fw);
101}
102
98static 103static
99inline int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len) 104inline int intel_guc_send(struct intel_guc *guc, const u32 *action, u32 len)
100{ 105{
diff --git a/drivers/gpu/drm/i915/intel_guc_fw.c b/drivers/gpu/drm/i915/intel_guc_fw.c
index a9e6fcce467c..a67144ee5ceb 100644
--- a/drivers/gpu/drm/i915/intel_guc_fw.c
+++ b/drivers/gpu/drm/i915/intel_guc_fw.c
@@ -78,7 +78,8 @@ static void guc_fw_select(struct intel_uc_fw *guc_fw)
78 guc_fw->major_ver_wanted = KBL_FW_MAJOR; 78 guc_fw->major_ver_wanted = KBL_FW_MAJOR;
79 guc_fw->minor_ver_wanted = KBL_FW_MINOR; 79 guc_fw->minor_ver_wanted = KBL_FW_MINOR;
80 } else { 80 } else {
81 DRM_WARN("%s: No firmware known for this platform!\n", 81 dev_info(dev_priv->drm.dev,
82 "%s: No firmware known for this platform!\n",
82 intel_uc_fw_type_repr(guc_fw->type)); 83 intel_uc_fw_type_repr(guc_fw->type));
83 } 84 }
84} 85}
@@ -125,66 +126,26 @@ static void guc_prepare_xfer(struct intel_guc *guc)
125} 126}
126 127
127/* Copy RSA signature from the fw image to HW for verification */ 128/* Copy RSA signature from the fw image to HW for verification */
128static int guc_xfer_rsa(struct intel_guc *guc, struct i915_vma *vma) 129static void guc_xfer_rsa(struct intel_guc *guc, struct i915_vma *vma)
129{ 130{
130 struct drm_i915_private *dev_priv = guc_to_i915(guc); 131 struct drm_i915_private *dev_priv = guc_to_i915(guc);
131 struct intel_uc_fw *guc_fw = &guc->fw;
132 struct sg_table *sg = vma->pages;
133 u32 rsa[UOS_RSA_SCRATCH_COUNT]; 132 u32 rsa[UOS_RSA_SCRATCH_COUNT];
134 int i; 133 int i;
135 134
136 if (sg_pcopy_to_buffer(sg->sgl, sg->nents, rsa, sizeof(rsa), 135 sg_pcopy_to_buffer(vma->pages->sgl, vma->pages->nents,
137 guc_fw->rsa_offset) != sizeof(rsa)) 136 rsa, sizeof(rsa), guc->fw.rsa_offset);
138 return -EINVAL;
139 137
140 for (i = 0; i < UOS_RSA_SCRATCH_COUNT; i++) 138 for (i = 0; i < UOS_RSA_SCRATCH_COUNT; i++)
141 I915_WRITE(UOS_RSA_SCRATCH(i), rsa[i]); 139 I915_WRITE(UOS_RSA_SCRATCH(i), rsa[i]);
142
143 return 0;
144} 140}
145 141
146/* 142static bool guc_xfer_completed(struct intel_guc *guc, u32 *status)
147 * Transfer the firmware image to RAM for execution by the microcontroller.
148 *
149 * Architecturally, the DMA engine is bidirectional, and can potentially even
150 * transfer between GTT locations. This functionality is left out of the API
151 * for now as there is no need for it.
152 */
153static int guc_xfer_ucode(struct intel_guc *guc, struct i915_vma *vma)
154{ 143{
155 struct drm_i915_private *dev_priv = guc_to_i915(guc); 144 struct drm_i915_private *dev_priv = guc_to_i915(guc);
156 struct intel_uc_fw *guc_fw = &guc->fw;
157 unsigned long offset;
158 u32 status;
159 int ret;
160
161 /*
162 * The header plus uCode will be copied to WOPCM via DMA, excluding any
163 * other components
164 */
165 I915_WRITE(DMA_COPY_SIZE, guc_fw->header_size + guc_fw->ucode_size);
166
167 /* Set the source address for the new blob */
168 offset = intel_guc_ggtt_offset(guc, vma) + guc_fw->header_offset;
169 I915_WRITE(DMA_ADDR_0_LOW, lower_32_bits(offset));
170 I915_WRITE(DMA_ADDR_0_HIGH, upper_32_bits(offset) & 0xFFFF);
171 145
172 /* 146 /* Did we complete the xfer? */
173 * Set the DMA destination. Current uCode expects the code to be 147 *status = I915_READ(DMA_CTRL);
174 * loaded at 8k; locations below this are used for the stack. 148 return !(*status & START_DMA);
175 */
176 I915_WRITE(DMA_ADDR_1_LOW, 0x2000);
177 I915_WRITE(DMA_ADDR_1_HIGH, DMA_ADDRESS_SPACE_WOPCM);
178
179 /* Finally start the DMA */
180 I915_WRITE(DMA_CTRL, _MASKED_BIT_ENABLE(UOS_MOVE | START_DMA));
181
182 /* Wait for DMA to finish */
183 ret = __intel_wait_for_register_fw(dev_priv, DMA_CTRL, START_DMA, 0,
184 2, 100, &status);
185 DRM_DEBUG_DRIVER("GuC DMA status %#x\n", status);
186
187 return ret;
188} 149}
189 150
190/* 151/*
@@ -217,8 +178,8 @@ static int guc_wait_ucode(struct intel_guc *guc)
217 * NB: Docs recommend not using the interrupt for completion. 178 * NB: Docs recommend not using the interrupt for completion.
218 * Measurements indicate this should take no more than 20ms, so a 179 * Measurements indicate this should take no more than 20ms, so a
219 * timeout here indicates that the GuC has failed and is unusable. 180 * timeout here indicates that the GuC has failed and is unusable.
220 * (Higher levels of the driver will attempt to fall back to 181 * (Higher levels of the driver may decide to reset the GuC and
221 * execlist mode if this happens.) 182 * attempt the ucode load again if this happens.)
222 */ 183 */
223 ret = wait_for(guc_ready(guc, &status), 100); 184 ret = wait_for(guc_ready(guc, &status), 100);
224 DRM_DEBUG_DRIVER("GuC status %#x\n", status); 185 DRM_DEBUG_DRIVER("GuC status %#x\n", status);
@@ -228,10 +189,52 @@ static int guc_wait_ucode(struct intel_guc *guc)
228 ret = -ENOEXEC; 189 ret = -ENOEXEC;
229 } 190 }
230 191
192 if (ret == 0 && !guc_xfer_completed(guc, &status)) {
193 DRM_ERROR("GuC is ready, but the xfer %08x is incomplete\n",
194 status);
195 ret = -ENXIO;
196 }
197
231 return ret; 198 return ret;
232} 199}
233 200
234/* 201/*
202 * Transfer the firmware image to RAM for execution by the microcontroller.
203 *
204 * Architecturally, the DMA engine is bidirectional, and can potentially even
205 * transfer between GTT locations. This functionality is left out of the API
206 * for now as there is no need for it.
207 */
208static int guc_xfer_ucode(struct intel_guc *guc, struct i915_vma *vma)
209{
210 struct drm_i915_private *dev_priv = guc_to_i915(guc);
211 struct intel_uc_fw *guc_fw = &guc->fw;
212 unsigned long offset;
213
214 /*
215 * The header plus uCode will be copied to WOPCM via DMA, excluding any
216 * other components
217 */
218 I915_WRITE(DMA_COPY_SIZE, guc_fw->header_size + guc_fw->ucode_size);
219
220 /* Set the source address for the new blob */
221 offset = intel_guc_ggtt_offset(guc, vma) + guc_fw->header_offset;
222 I915_WRITE(DMA_ADDR_0_LOW, lower_32_bits(offset));
223 I915_WRITE(DMA_ADDR_0_HIGH, upper_32_bits(offset) & 0xFFFF);
224
225 /*
226 * Set the DMA destination. Current uCode expects the code to be
227 * loaded at 8k; locations below this are used for the stack.
228 */
229 I915_WRITE(DMA_ADDR_1_LOW, 0x2000);
230 I915_WRITE(DMA_ADDR_1_HIGH, DMA_ADDRESS_SPACE_WOPCM);
231
232 /* Finally start the DMA */
233 I915_WRITE(DMA_CTRL, _MASKED_BIT_ENABLE(UOS_MOVE | START_DMA));
234
235 return guc_wait_ucode(guc);
236}
237/*
235 * Load the GuC firmware blob into the MinuteIA. 238 * Load the GuC firmware blob into the MinuteIA.
236 */ 239 */
237static int guc_fw_xfer(struct intel_uc_fw *guc_fw, struct i915_vma *vma) 240static int guc_fw_xfer(struct intel_uc_fw *guc_fw, struct i915_vma *vma)
@@ -251,17 +254,9 @@ static int guc_fw_xfer(struct intel_uc_fw *guc_fw, struct i915_vma *vma)
251 * by the DMA engine in one operation, whereas the RSA signature is 254 * by the DMA engine in one operation, whereas the RSA signature is
252 * loaded via MMIO. 255 * loaded via MMIO.
253 */ 256 */
254 ret = guc_xfer_rsa(guc, vma); 257 guc_xfer_rsa(guc, vma);
255 if (ret)
256 DRM_WARN("GuC firmware signature xfer error %d\n", ret);
257 258
258 ret = guc_xfer_ucode(guc, vma); 259 ret = guc_xfer_ucode(guc, vma);
259 if (ret)
260 DRM_WARN("GuC firmware code xfer error %d\n", ret);
261
262 ret = guc_wait_ucode(guc);
263 if (ret)
264 DRM_ERROR("GuC firmware xfer error %d\n", ret);
265 260
266 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); 261 intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
267 262
diff --git a/drivers/gpu/drm/i915/intel_guc_fwif.h b/drivers/gpu/drm/i915/intel_guc_fwif.h
index 8382d591c784..b2f5148f4f17 100644
--- a/drivers/gpu/drm/i915/intel_guc_fwif.h
+++ b/drivers/gpu/drm/i915/intel_guc_fwif.h
@@ -39,6 +39,11 @@
39#define GUC_VIDEO_ENGINE2 4 39#define GUC_VIDEO_ENGINE2 4
40#define GUC_MAX_ENGINES_NUM (GUC_VIDEO_ENGINE2 + 1) 40#define GUC_MAX_ENGINES_NUM (GUC_VIDEO_ENGINE2 + 1)
41 41
42#define GUC_DOORBELL_INVALID 256
43
44#define GUC_DB_SIZE (PAGE_SIZE)
45#define GUC_WQ_SIZE (PAGE_SIZE * 2)
46
42/* Work queue item header definitions */ 47/* Work queue item header definitions */
43#define WQ_STATUS_ACTIVE 1 48#define WQ_STATUS_ACTIVE 1
44#define WQ_STATUS_SUSPENDED 2 49#define WQ_STATUS_SUSPENDED 2
@@ -59,9 +64,6 @@
59#define WQ_RING_TAIL_MAX 0x7FF /* 2^11 QWords */ 64#define WQ_RING_TAIL_MAX 0x7FF /* 2^11 QWords */
60#define WQ_RING_TAIL_MASK (WQ_RING_TAIL_MAX << WQ_RING_TAIL_SHIFT) 65#define WQ_RING_TAIL_MASK (WQ_RING_TAIL_MAX << WQ_RING_TAIL_SHIFT)
61 66
62#define GUC_DOORBELL_ENABLED 1
63#define GUC_DOORBELL_DISABLED 0
64
65#define GUC_STAGE_DESC_ATTR_ACTIVE BIT(0) 67#define GUC_STAGE_DESC_ATTR_ACTIVE BIT(0)
66#define GUC_STAGE_DESC_ATTR_PENDING_DB BIT(1) 68#define GUC_STAGE_DESC_ATTR_PENDING_DB BIT(1)
67#define GUC_STAGE_DESC_ATTR_KERNEL BIT(2) 69#define GUC_STAGE_DESC_ATTR_KERNEL BIT(2)
@@ -219,26 +221,6 @@ struct uc_css_header {
219 u32 header_info; 221 u32 header_info;
220} __packed; 222} __packed;
221 223
222struct guc_doorbell_info {
223 u32 db_status;
224 u32 cookie;
225 u32 reserved[14];
226} __packed;
227
228union guc_doorbell_qw {
229 struct {
230 u32 db_status;
231 u32 cookie;
232 };
233 u64 value_qw;
234} __packed;
235
236#define GUC_NUM_DOORBELLS 256
237#define GUC_DOORBELL_INVALID (GUC_NUM_DOORBELLS)
238
239#define GUC_DB_SIZE (PAGE_SIZE)
240#define GUC_WQ_SIZE (PAGE_SIZE * 2)
241
242/* Work item for submitting workloads into work queue of GuC. */ 224/* Work item for submitting workloads into work queue of GuC. */
243struct guc_wq_item { 225struct guc_wq_item {
244 u32 header; 226 u32 header;
@@ -601,7 +583,9 @@ struct guc_shared_ctx_data {
601 * registers, where first register holds data treated as message header, 583 * registers, where first register holds data treated as message header,
602 * and other registers are used to hold message payload. 584 * and other registers are used to hold message payload.
603 * 585 *
604 * For Gen9+, GuC uses software scratch registers 0xC180-0xC1B8 586 * For Gen9+, GuC uses software scratch registers 0xC180-0xC1B8,
587 * but no H2G command takes more than 8 parameters and the GuC FW
588 * itself uses an 8-element array to store the H2G message.
605 * 589 *
606 * +-----------+---------+---------+---------+ 590 * +-----------+---------+---------+---------+
607 * | MMIO[0] | MMIO[1] | ... | MMIO[n] | 591 * | MMIO[0] | MMIO[1] | ... | MMIO[n] |
@@ -633,6 +617,8 @@ struct guc_shared_ctx_data {
633 * field. 617 * field.
634 */ 618 */
635 619
620#define GUC_MAX_MMIO_MSG_LEN 8
621
636#define INTEL_GUC_MSG_TYPE_SHIFT 28 622#define INTEL_GUC_MSG_TYPE_SHIFT 28
637#define INTEL_GUC_MSG_TYPE_MASK (0xF << INTEL_GUC_MSG_TYPE_SHIFT) 623#define INTEL_GUC_MSG_TYPE_MASK (0xF << INTEL_GUC_MSG_TYPE_SHIFT)
638#define INTEL_GUC_MSG_DATA_SHIFT 16 624#define INTEL_GUC_MSG_DATA_SHIFT 16
@@ -687,6 +673,13 @@ enum intel_guc_report_status {
687 INTEL_GUC_REPORT_STATUS_COMPLETE = 0x4, 673 INTEL_GUC_REPORT_STATUS_COMPLETE = 0x4,
688}; 674};
689 675
676enum intel_guc_sleep_state_status {
677 INTEL_GUC_SLEEP_STATE_SUCCESS = 0x0,
678 INTEL_GUC_SLEEP_STATE_PREEMPT_TO_IDLE_FAILED = 0x1,
679 INTEL_GUC_SLEEP_STATE_ENGINE_RESET_FAILED = 0x2
680#define INTEL_GUC_SLEEP_STATE_INVALID_MASK 0x80000000
681};
682
690#define GUC_LOG_CONTROL_LOGGING_ENABLED (1 << 0) 683#define GUC_LOG_CONTROL_LOGGING_ENABLED (1 << 0)
691#define GUC_LOG_CONTROL_VERBOSITY_SHIFT 4 684#define GUC_LOG_CONTROL_VERBOSITY_SHIFT 4
692#define GUC_LOG_CONTROL_VERBOSITY_MASK (0xF << GUC_LOG_CONTROL_VERBOSITY_SHIFT) 685#define GUC_LOG_CONTROL_VERBOSITY_MASK (0xF << GUC_LOG_CONTROL_VERBOSITY_SHIFT)
diff --git a/drivers/gpu/drm/i915/intel_guc_reg.h b/drivers/gpu/drm/i915/intel_guc_reg.h
index d86084742a4a..57e7ad522c2f 100644
--- a/drivers/gpu/drm/i915/intel_guc_reg.h
+++ b/drivers/gpu/drm/i915/intel_guc_reg.h
@@ -104,6 +104,18 @@
104#define GUC_SEND_INTERRUPT _MMIO(0xc4c8) 104#define GUC_SEND_INTERRUPT _MMIO(0xc4c8)
105#define GUC_SEND_TRIGGER (1<<0) 105#define GUC_SEND_TRIGGER (1<<0)
106 106
107#define GUC_NUM_DOORBELLS 256
108
109/* format of the HW-monitored doorbell cacheline */
110struct guc_doorbell_info {
111 u32 db_status;
112#define GUC_DOORBELL_DISABLED 0
113#define GUC_DOORBELL_ENABLED 1
114
115 u32 cookie;
116 u32 reserved[14];
117} __packed;
118
107#define GEN8_DRBREGL(x) _MMIO(0x1000 + (x) * 8) 119#define GEN8_DRBREGL(x) _MMIO(0x1000 + (x) * 8)
108#define GEN8_DRB_VALID (1<<0) 120#define GEN8_DRB_VALID (1<<0)
109#define GEN8_DRBREGU(x) _MMIO(0x1000 + (x) * 8 + 4) 121#define GEN8_DRBREGU(x) _MMIO(0x1000 + (x) * 8 + 4)
diff --git a/drivers/gpu/drm/i915/intel_guc_submission.c b/drivers/gpu/drm/i915/intel_guc_submission.c
index a81f04d46e87..1570dcbe249c 100644
--- a/drivers/gpu/drm/i915/intel_guc_submission.c
+++ b/drivers/gpu/drm/i915/intel_guc_submission.c
@@ -192,7 +192,15 @@ static struct guc_doorbell_info *__get_doorbell(struct intel_guc_client *client)
192 return client->vaddr + client->doorbell_offset; 192 return client->vaddr + client->doorbell_offset;
193} 193}
194 194
195static void __create_doorbell(struct intel_guc_client *client) 195static bool __doorbell_valid(struct intel_guc *guc, u16 db_id)
196{
197 struct drm_i915_private *dev_priv = guc_to_i915(guc);
198
199 GEM_BUG_ON(db_id >= GUC_NUM_DOORBELLS);
200 return I915_READ(GEN8_DRBREGL(db_id)) & GEN8_DRB_VALID;
201}
202
203static void __init_doorbell(struct intel_guc_client *client)
196{ 204{
197 struct guc_doorbell_info *doorbell; 205 struct guc_doorbell_info *doorbell;
198 206
@@ -201,21 +209,19 @@ static void __create_doorbell(struct intel_guc_client *client)
201 doorbell->cookie = 0; 209 doorbell->cookie = 0;
202} 210}
203 211
204static void __destroy_doorbell(struct intel_guc_client *client) 212static void __fini_doorbell(struct intel_guc_client *client)
205{ 213{
206 struct drm_i915_private *dev_priv = guc_to_i915(client->guc);
207 struct guc_doorbell_info *doorbell; 214 struct guc_doorbell_info *doorbell;
208 u16 db_id = client->doorbell_id; 215 u16 db_id = client->doorbell_id;
209 216
210 doorbell = __get_doorbell(client); 217 doorbell = __get_doorbell(client);
211 doorbell->db_status = GUC_DOORBELL_DISABLED; 218 doorbell->db_status = GUC_DOORBELL_DISABLED;
212 doorbell->cookie = 0;
213 219
214 /* Doorbell release flow requires that we wait for GEN8_DRB_VALID bit 220 /* Doorbell release flow requires that we wait for GEN8_DRB_VALID bit
215 * to go to zero after updating db_status before we call the GuC to 221 * to go to zero after updating db_status before we call the GuC to
216 * release the doorbell 222 * release the doorbell
217 */ 223 */
218 if (wait_for_us(!(I915_READ(GEN8_DRBREGL(db_id)) & GEN8_DRB_VALID), 10)) 224 if (wait_for_us(!__doorbell_valid(client->guc, db_id), 10))
219 WARN_ONCE(true, "Doorbell never became invalid after disable\n"); 225 WARN_ONCE(true, "Doorbell never became invalid after disable\n");
220} 226}
221 227
@@ -227,11 +233,11 @@ static int create_doorbell(struct intel_guc_client *client)
227 return -ENODEV; /* internal setup error, should never happen */ 233 return -ENODEV; /* internal setup error, should never happen */
228 234
229 __update_doorbell_desc(client, client->doorbell_id); 235 __update_doorbell_desc(client, client->doorbell_id);
230 __create_doorbell(client); 236 __init_doorbell(client);
231 237
232 ret = __guc_allocate_doorbell(client->guc, client->stage_id); 238 ret = __guc_allocate_doorbell(client->guc, client->stage_id);
233 if (ret) { 239 if (ret) {
234 __destroy_doorbell(client); 240 __fini_doorbell(client);
235 __update_doorbell_desc(client, GUC_DOORBELL_INVALID); 241 __update_doorbell_desc(client, GUC_DOORBELL_INVALID);
236 DRM_DEBUG_DRIVER("Couldn't create client %u doorbell: %d\n", 242 DRM_DEBUG_DRIVER("Couldn't create client %u doorbell: %d\n",
237 client->stage_id, ret); 243 client->stage_id, ret);
@@ -247,7 +253,7 @@ static int destroy_doorbell(struct intel_guc_client *client)
247 253
248 GEM_BUG_ON(!has_doorbell(client)); 254 GEM_BUG_ON(!has_doorbell(client));
249 255
250 __destroy_doorbell(client); 256 __fini_doorbell(client);
251 ret = __guc_deallocate_doorbell(client->guc, client->stage_id); 257 ret = __guc_deallocate_doorbell(client->guc, client->stage_id);
252 if (ret) 258 if (ret)
253 DRM_ERROR("Couldn't destroy client %u doorbell: %d\n", 259 DRM_ERROR("Couldn't destroy client %u doorbell: %d\n",
@@ -282,8 +288,7 @@ __get_process_desc(struct intel_guc_client *client)
282/* 288/*
283 * Initialise the process descriptor shared with the GuC firmware. 289 * Initialise the process descriptor shared with the GuC firmware.
284 */ 290 */
285static void guc_proc_desc_init(struct intel_guc *guc, 291static void guc_proc_desc_init(struct intel_guc_client *client)
286 struct intel_guc_client *client)
287{ 292{
288 struct guc_process_desc *desc; 293 struct guc_process_desc *desc;
289 294
@@ -304,6 +309,14 @@ static void guc_proc_desc_init(struct intel_guc *guc,
304 desc->priority = client->priority; 309 desc->priority = client->priority;
305} 310}
306 311
312static void guc_proc_desc_fini(struct intel_guc_client *client)
313{
314 struct guc_process_desc *desc;
315
316 desc = __get_process_desc(client);
317 memset(desc, 0, sizeof(*desc));
318}
319
307static int guc_stage_desc_pool_create(struct intel_guc *guc) 320static int guc_stage_desc_pool_create(struct intel_guc *guc)
308{ 321{
309 struct i915_vma *vma; 322 struct i915_vma *vma;
@@ -341,9 +354,9 @@ static void guc_stage_desc_pool_destroy(struct intel_guc *guc)
341 * data structures relating to this client (doorbell, process descriptor, 354 * data structures relating to this client (doorbell, process descriptor,
342 * write queue, etc). 355 * write queue, etc).
343 */ 356 */
344static void guc_stage_desc_init(struct intel_guc *guc, 357static void guc_stage_desc_init(struct intel_guc_client *client)
345 struct intel_guc_client *client)
346{ 358{
359 struct intel_guc *guc = client->guc;
347 struct drm_i915_private *dev_priv = guc_to_i915(guc); 360 struct drm_i915_private *dev_priv = guc_to_i915(guc);
348 struct intel_engine_cs *engine; 361 struct intel_engine_cs *engine;
349 struct i915_gem_context *ctx = client->owner; 362 struct i915_gem_context *ctx = client->owner;
@@ -424,8 +437,7 @@ static void guc_stage_desc_init(struct intel_guc *guc,
424 desc->desc_private = ptr_to_u64(client); 437 desc->desc_private = ptr_to_u64(client);
425} 438}
426 439
427static void guc_stage_desc_fini(struct intel_guc *guc, 440static void guc_stage_desc_fini(struct intel_guc_client *client)
428 struct intel_guc_client *client)
429{ 441{
430 struct guc_stage_desc *desc; 442 struct guc_stage_desc *desc;
431 443
@@ -486,14 +498,6 @@ static void guc_wq_item_append(struct intel_guc_client *client,
486 WRITE_ONCE(desc->tail, (wq_off + wqi_size) & (GUC_WQ_SIZE - 1)); 498 WRITE_ONCE(desc->tail, (wq_off + wqi_size) & (GUC_WQ_SIZE - 1));
487} 499}
488 500
489static void guc_reset_wq(struct intel_guc_client *client)
490{
491 struct guc_process_desc *desc = __get_process_desc(client);
492
493 desc->head = 0;
494 desc->tail = 0;
495}
496
497static void guc_ring_doorbell(struct intel_guc_client *client) 501static void guc_ring_doorbell(struct intel_guc_client *client)
498{ 502{
499 struct guc_doorbell_info *db; 503 struct guc_doorbell_info *db;
@@ -746,30 +750,28 @@ static bool __guc_dequeue(struct intel_engine_cs *engine)
746 while ((rb = rb_first_cached(&execlists->queue))) { 750 while ((rb = rb_first_cached(&execlists->queue))) {
747 struct i915_priolist *p = to_priolist(rb); 751 struct i915_priolist *p = to_priolist(rb);
748 struct i915_request *rq, *rn; 752 struct i915_request *rq, *rn;
753 int i;
749 754
750 list_for_each_entry_safe(rq, rn, &p->requests, sched.link) { 755 priolist_for_each_request_consume(rq, rn, p, i) {
751 if (last && rq->hw_context != last->hw_context) { 756 if (last && rq->hw_context != last->hw_context) {
752 if (port == last_port) { 757 if (port == last_port)
753 __list_del_many(&p->requests,
754 &rq->sched.link);
755 goto done; 758 goto done;
756 }
757 759
758 if (submit) 760 if (submit)
759 port_assign(port, last); 761 port_assign(port, last);
760 port++; 762 port++;
761 } 763 }
762 764
763 INIT_LIST_HEAD(&rq->sched.link); 765 list_del_init(&rq->sched.link);
764 766
765 __i915_request_submit(rq); 767 __i915_request_submit(rq);
766 trace_i915_request_in(rq, port_index(port, execlists)); 768 trace_i915_request_in(rq, port_index(port, execlists));
769
767 last = rq; 770 last = rq;
768 submit = true; 771 submit = true;
769 } 772 }
770 773
771 rb_erase_cached(&p->node, &execlists->queue); 774 rb_erase_cached(&p->node, &execlists->queue);
772 INIT_LIST_HEAD(&p->requests);
773 if (p->priority != I915_PRIORITY_NORMAL) 775 if (p->priority != I915_PRIORITY_NORMAL)
774 kmem_cache_free(engine->i915->priorities, p); 776 kmem_cache_free(engine->i915->priorities, p);
775 } 777 }
@@ -791,19 +793,8 @@ done:
791 793
792static void guc_dequeue(struct intel_engine_cs *engine) 794static void guc_dequeue(struct intel_engine_cs *engine)
793{ 795{
794 unsigned long flags; 796 if (__guc_dequeue(engine))
795 bool submit;
796
797 local_irq_save(flags);
798
799 spin_lock(&engine->timeline.lock);
800 submit = __guc_dequeue(engine);
801 spin_unlock(&engine->timeline.lock);
802
803 if (submit)
804 guc_submit(engine); 797 guc_submit(engine);
805
806 local_irq_restore(flags);
807} 798}
808 799
809static void guc_submission_tasklet(unsigned long data) 800static void guc_submission_tasklet(unsigned long data)
@@ -812,6 +803,9 @@ static void guc_submission_tasklet(unsigned long data)
812 struct intel_engine_execlists * const execlists = &engine->execlists; 803 struct intel_engine_execlists * const execlists = &engine->execlists;
813 struct execlist_port *port = execlists->port; 804 struct execlist_port *port = execlists->port;
814 struct i915_request *rq; 805 struct i915_request *rq;
806 unsigned long flags;
807
808 spin_lock_irqsave(&engine->timeline.lock, flags);
815 809
816 rq = port_request(port); 810 rq = port_request(port);
817 while (rq && i915_request_completed(rq)) { 811 while (rq && i915_request_completed(rq)) {
@@ -835,6 +829,8 @@ static void guc_submission_tasklet(unsigned long data)
835 829
836 if (!execlists_is_active(execlists, EXECLISTS_ACTIVE_PREEMPT)) 830 if (!execlists_is_active(execlists, EXECLISTS_ACTIVE_PREEMPT))
837 guc_dequeue(engine); 831 guc_dequeue(engine);
832
833 spin_unlock_irqrestore(&engine->timeline.lock, flags);
838} 834}
839 835
840static struct i915_request * 836static struct i915_request *
@@ -877,72 +873,31 @@ guc_reset_prepare(struct intel_engine_cs *engine)
877/* Check that a doorbell register is in the expected state */ 873/* Check that a doorbell register is in the expected state */
878static bool doorbell_ok(struct intel_guc *guc, u16 db_id) 874static bool doorbell_ok(struct intel_guc *guc, u16 db_id)
879{ 875{
880 struct drm_i915_private *dev_priv = guc_to_i915(guc);
881 u32 drbregl;
882 bool valid; 876 bool valid;
883 877
884 GEM_BUG_ON(db_id >= GUC_DOORBELL_INVALID); 878 GEM_BUG_ON(db_id >= GUC_NUM_DOORBELLS);
885 879
886 drbregl = I915_READ(GEN8_DRBREGL(db_id)); 880 valid = __doorbell_valid(guc, db_id);
887 valid = drbregl & GEN8_DRB_VALID;
888 881
889 if (test_bit(db_id, guc->doorbell_bitmap) == valid) 882 if (test_bit(db_id, guc->doorbell_bitmap) == valid)
890 return true; 883 return true;
891 884
892 DRM_DEBUG_DRIVER("Doorbell %d has unexpected state (0x%x): valid=%s\n", 885 DRM_DEBUG_DRIVER("Doorbell %u has unexpected state: valid=%s\n",
893 db_id, drbregl, yesno(valid)); 886 db_id, yesno(valid));
894 887
895 return false; 888 return false;
896} 889}
897 890
898static bool guc_verify_doorbells(struct intel_guc *guc) 891static bool guc_verify_doorbells(struct intel_guc *guc)
899{ 892{
893 bool doorbells_ok = true;
900 u16 db_id; 894 u16 db_id;
901 895
902 for (db_id = 0; db_id < GUC_NUM_DOORBELLS; ++db_id) 896 for (db_id = 0; db_id < GUC_NUM_DOORBELLS; ++db_id)
903 if (!doorbell_ok(guc, db_id)) 897 if (!doorbell_ok(guc, db_id))
904 return false; 898 doorbells_ok = false;
905
906 return true;
907}
908
909static int guc_clients_doorbell_init(struct intel_guc *guc)
910{
911 int ret;
912
913 ret = create_doorbell(guc->execbuf_client);
914 if (ret)
915 return ret;
916
917 if (guc->preempt_client) {
918 ret = create_doorbell(guc->preempt_client);
919 if (ret) {
920 destroy_doorbell(guc->execbuf_client);
921 return ret;
922 }
923 }
924
925 return 0;
926}
927
928static void guc_clients_doorbell_fini(struct intel_guc *guc)
929{
930 /*
931 * By the time we're here, GuC has already been reset.
932 * Instead of trying (in vain) to communicate with it, let's just
933 * cleanup the doorbell HW and our internal state.
934 */
935 if (guc->preempt_client) {
936 __destroy_doorbell(guc->preempt_client);
937 __update_doorbell_desc(guc->preempt_client,
938 GUC_DOORBELL_INVALID);
939 }
940 899
941 if (guc->execbuf_client) { 900 return doorbells_ok;
942 __destroy_doorbell(guc->execbuf_client);
943 __update_doorbell_desc(guc->execbuf_client,
944 GUC_DOORBELL_INVALID);
945 }
946} 901}
947 902
948/** 903/**
@@ -1005,6 +960,10 @@ guc_client_alloc(struct drm_i915_private *dev_priv,
1005 } 960 }
1006 client->vaddr = vaddr; 961 client->vaddr = vaddr;
1007 962
963 ret = reserve_doorbell(client);
964 if (ret)
965 goto err_vaddr;
966
1008 client->doorbell_offset = __select_cacheline(guc); 967 client->doorbell_offset = __select_cacheline(guc);
1009 968
1010 /* 969 /*
@@ -1017,13 +976,6 @@ guc_client_alloc(struct drm_i915_private *dev_priv,
1017 else 976 else
1018 client->proc_desc_offset = (GUC_DB_SIZE / 2); 977 client->proc_desc_offset = (GUC_DB_SIZE / 2);
1019 978
1020 guc_proc_desc_init(guc, client);
1021 guc_stage_desc_init(guc, client);
1022
1023 ret = reserve_doorbell(client);
1024 if (ret)
1025 goto err_vaddr;
1026
1027 DRM_DEBUG_DRIVER("new priority %u client %p for engine(s) 0x%x: stage_id %u\n", 979 DRM_DEBUG_DRIVER("new priority %u client %p for engine(s) 0x%x: stage_id %u\n",
1028 priority, client, client->engines, client->stage_id); 980 priority, client, client->engines, client->stage_id);
1029 DRM_DEBUG_DRIVER("doorbell id %u, cacheline offset 0x%lx\n", 981 DRM_DEBUG_DRIVER("doorbell id %u, cacheline offset 0x%lx\n",
@@ -1045,7 +997,6 @@ err_client:
1045static void guc_client_free(struct intel_guc_client *client) 997static void guc_client_free(struct intel_guc_client *client)
1046{ 998{
1047 unreserve_doorbell(client); 999 unreserve_doorbell(client);
1048 guc_stage_desc_fini(client->guc, client);
1049 i915_vma_unpin_and_release(&client->vma, I915_VMA_RELEASE_MAP); 1000 i915_vma_unpin_and_release(&client->vma, I915_VMA_RELEASE_MAP);
1050 ida_simple_remove(&client->guc->stage_ids, client->stage_id); 1001 ida_simple_remove(&client->guc->stage_ids, client->stage_id);
1051 kfree(client); 1002 kfree(client);
@@ -1112,6 +1063,69 @@ static void guc_clients_destroy(struct intel_guc *guc)
1112 guc_client_free(client); 1063 guc_client_free(client);
1113} 1064}
1114 1065
1066static int __guc_client_enable(struct intel_guc_client *client)
1067{
1068 int ret;
1069
1070 guc_proc_desc_init(client);
1071 guc_stage_desc_init(client);
1072
1073 ret = create_doorbell(client);
1074 if (ret)
1075 goto fail;
1076
1077 return 0;
1078
1079fail:
1080 guc_stage_desc_fini(client);
1081 guc_proc_desc_fini(client);
1082 return ret;
1083}
1084
1085static void __guc_client_disable(struct intel_guc_client *client)
1086{
1087 /*
1088 * By the time we're here, GuC may have already been reset. if that is
1089 * the case, instead of trying (in vain) to communicate with it, let's
1090 * just cleanup the doorbell HW and our internal state.
1091 */
1092 if (intel_guc_is_alive(client->guc))
1093 destroy_doorbell(client);
1094 else
1095 __fini_doorbell(client);
1096
1097 guc_stage_desc_fini(client);
1098 guc_proc_desc_fini(client);
1099}
1100
1101static int guc_clients_enable(struct intel_guc *guc)
1102{
1103 int ret;
1104
1105 ret = __guc_client_enable(guc->execbuf_client);
1106 if (ret)
1107 return ret;
1108
1109 if (guc->preempt_client) {
1110 ret = __guc_client_enable(guc->preempt_client);
1111 if (ret) {
1112 __guc_client_disable(guc->execbuf_client);
1113 return ret;
1114 }
1115 }
1116
1117 return 0;
1118}
1119
1120static void guc_clients_disable(struct intel_guc *guc)
1121{
1122 if (guc->preempt_client)
1123 __guc_client_disable(guc->preempt_client);
1124
1125 if (guc->execbuf_client)
1126 __guc_client_disable(guc->execbuf_client);
1127}
1128
1115/* 1129/*
1116 * Set up the memory resources to be shared with the GuC (via the GGTT) 1130 * Set up the memory resources to be shared with the GuC (via the GGTT)
1117 * at firmware loading time. 1131 * at firmware loading time.
@@ -1295,15 +1309,11 @@ int intel_guc_submission_enable(struct intel_guc *guc)
1295 1309
1296 GEM_BUG_ON(!guc->execbuf_client); 1310 GEM_BUG_ON(!guc->execbuf_client);
1297 1311
1298 guc_reset_wq(guc->execbuf_client);
1299 if (guc->preempt_client)
1300 guc_reset_wq(guc->preempt_client);
1301
1302 err = intel_guc_sample_forcewake(guc); 1312 err = intel_guc_sample_forcewake(guc);
1303 if (err) 1313 if (err)
1304 return err; 1314 return err;
1305 1315
1306 err = guc_clients_doorbell_init(guc); 1316 err = guc_clients_enable(guc);
1307 if (err) 1317 if (err)
1308 return err; 1318 return err;
1309 1319
@@ -1325,7 +1335,7 @@ void intel_guc_submission_disable(struct intel_guc *guc)
1325 GEM_BUG_ON(dev_priv->gt.awake); /* GT should be parked first */ 1335 GEM_BUG_ON(dev_priv->gt.awake); /* GT should be parked first */
1326 1336
1327 guc_interrupts_release(dev_priv); 1337 guc_interrupts_release(dev_priv);
1328 guc_clients_doorbell_fini(guc); 1338 guc_clients_disable(guc);
1329} 1339}
1330 1340
1331#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) 1341#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c
index 26e48fc95543..1bf487f94254 100644
--- a/drivers/gpu/drm/i915/intel_hdcp.c
+++ b/drivers/gpu/drm/i915/intel_hdcp.c
@@ -16,6 +16,62 @@
16 16
17#define KEY_LOAD_TRIES 5 17#define KEY_LOAD_TRIES 5
18 18
19static
20bool intel_hdcp_is_ksv_valid(u8 *ksv)
21{
22 int i, ones = 0;
23 /* KSV has 20 1's and 20 0's */
24 for (i = 0; i < DRM_HDCP_KSV_LEN; i++)
25 ones += hweight8(ksv[i]);
26 if (ones != 20)
27 return false;
28
29 return true;
30}
31
32static
33int intel_hdcp_read_valid_bksv(struct intel_digital_port *intel_dig_port,
34 const struct intel_hdcp_shim *shim, u8 *bksv)
35{
36 int ret, i, tries = 2;
37
38 /* HDCP spec states that we must retry the bksv if it is invalid */
39 for (i = 0; i < tries; i++) {
40 ret = shim->read_bksv(intel_dig_port, bksv);
41 if (ret)
42 return ret;
43 if (intel_hdcp_is_ksv_valid(bksv))
44 break;
45 }
46 if (i == tries) {
47 DRM_DEBUG_KMS("Bksv is invalid\n");
48 return -ENODEV;
49 }
50
51 return 0;
52}
53
54/* Is HDCP1.4 capable on Platform and Sink */
55bool intel_hdcp_capable(struct intel_connector *connector)
56{
57 struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
58 const struct intel_hdcp_shim *shim = connector->hdcp.shim;
59 bool capable = false;
60 u8 bksv[5];
61
62 if (!shim)
63 return capable;
64
65 if (shim->hdcp_capable) {
66 shim->hdcp_capable(intel_dig_port, &capable);
67 } else {
68 if (!intel_hdcp_read_valid_bksv(intel_dig_port, shim, bksv))
69 capable = true;
70 }
71
72 return capable;
73}
74
19static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port, 75static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *intel_dig_port,
20 const struct intel_hdcp_shim *shim) 76 const struct intel_hdcp_shim *shim)
21{ 77{
@@ -168,18 +224,6 @@ u32 intel_hdcp_get_repeater_ctl(struct intel_digital_port *intel_dig_port)
168} 224}
169 225
170static 226static
171bool intel_hdcp_is_ksv_valid(u8 *ksv)
172{
173 int i, ones = 0;
174 /* KSV has 20 1's and 20 0's */
175 for (i = 0; i < DRM_HDCP_KSV_LEN; i++)
176 ones += hweight8(ksv[i]);
177 if (ones != 20)
178 return false;
179 return true;
180}
181
182static
183int intel_hdcp_validate_v_prime(struct intel_digital_port *intel_dig_port, 227int intel_hdcp_validate_v_prime(struct intel_digital_port *intel_dig_port,
184 const struct intel_hdcp_shim *shim, 228 const struct intel_hdcp_shim *shim,
185 u8 *ksv_fifo, u8 num_downstream, u8 *bstatus) 229 u8 *ksv_fifo, u8 num_downstream, u8 *bstatus)
@@ -383,7 +427,7 @@ int intel_hdcp_validate_v_prime(struct intel_digital_port *intel_dig_port,
383 if (intel_wait_for_register(dev_priv, HDCP_REP_CTL, 427 if (intel_wait_for_register(dev_priv, HDCP_REP_CTL,
384 HDCP_SHA1_COMPLETE, 428 HDCP_SHA1_COMPLETE,
385 HDCP_SHA1_COMPLETE, 1)) { 429 HDCP_SHA1_COMPLETE, 1)) {
386 DRM_DEBUG_KMS("Timed out waiting for SHA1 complete\n"); 430 DRM_ERROR("Timed out waiting for SHA1 complete\n");
387 return -ETIMEDOUT; 431 return -ETIMEDOUT;
388 } 432 }
389 if (!(I915_READ(HDCP_REP_CTL) & HDCP_SHA1_V_MATCH)) { 433 if (!(I915_READ(HDCP_REP_CTL) & HDCP_SHA1_V_MATCH)) {
@@ -404,7 +448,7 @@ int intel_hdcp_auth_downstream(struct intel_digital_port *intel_dig_port,
404 448
405 ret = intel_hdcp_poll_ksv_fifo(intel_dig_port, shim); 449 ret = intel_hdcp_poll_ksv_fifo(intel_dig_port, shim);
406 if (ret) { 450 if (ret) {
407 DRM_ERROR("KSV list failed to become ready (%d)\n", ret); 451 DRM_DEBUG_KMS("KSV list failed to become ready (%d)\n", ret);
408 return ret; 452 return ret;
409 } 453 }
410 454
@@ -414,7 +458,7 @@ int intel_hdcp_auth_downstream(struct intel_digital_port *intel_dig_port,
414 458
415 if (DRM_HDCP_MAX_DEVICE_EXCEEDED(bstatus[0]) || 459 if (DRM_HDCP_MAX_DEVICE_EXCEEDED(bstatus[0]) ||
416 DRM_HDCP_MAX_CASCADE_EXCEEDED(bstatus[1])) { 460 DRM_HDCP_MAX_CASCADE_EXCEEDED(bstatus[1])) {
417 DRM_ERROR("Max Topology Limit Exceeded\n"); 461 DRM_DEBUG_KMS("Max Topology Limit Exceeded\n");
418 return -EPERM; 462 return -EPERM;
419 } 463 }
420 464
@@ -450,7 +494,7 @@ int intel_hdcp_auth_downstream(struct intel_digital_port *intel_dig_port,
450 } 494 }
451 495
452 if (i == tries) { 496 if (i == tries) {
453 DRM_ERROR("V Prime validation failed.(%d)\n", ret); 497 DRM_DEBUG_KMS("V Prime validation failed.(%d)\n", ret);
454 goto err; 498 goto err;
455 } 499 }
456 500
@@ -499,7 +543,7 @@ static int intel_hdcp_auth(struct intel_digital_port *intel_dig_port,
499 if (ret) 543 if (ret)
500 return ret; 544 return ret;
501 if (!hdcp_capable) { 545 if (!hdcp_capable) {
502 DRM_ERROR("Panel is not HDCP capable\n"); 546 DRM_DEBUG_KMS("Panel is not HDCP capable\n");
503 return -EINVAL; 547 return -EINVAL;
504 } 548 }
505 } 549 }
@@ -527,18 +571,9 @@ static int intel_hdcp_auth(struct intel_digital_port *intel_dig_port,
527 571
528 memset(&bksv, 0, sizeof(bksv)); 572 memset(&bksv, 0, sizeof(bksv));
529 573
530 /* HDCP spec states that we must retry the bksv if it is invalid */ 574 ret = intel_hdcp_read_valid_bksv(intel_dig_port, shim, bksv.shim);
531 for (i = 0; i < tries; i++) { 575 if (ret < 0)
532 ret = shim->read_bksv(intel_dig_port, bksv.shim); 576 return ret;
533 if (ret)
534 return ret;
535 if (intel_hdcp_is_ksv_valid(bksv.shim))
536 break;
537 }
538 if (i == tries) {
539 DRM_ERROR("HDCP failed, Bksv is invalid\n");
540 return -ENODEV;
541 }
542 577
543 I915_WRITE(PORT_HDCP_BKSVLO(port), bksv.reg[0]); 578 I915_WRITE(PORT_HDCP_BKSVLO(port), bksv.reg[0]);
544 I915_WRITE(PORT_HDCP_BKSVHI(port), bksv.reg[1]); 579 I915_WRITE(PORT_HDCP_BKSVHI(port), bksv.reg[1]);
@@ -594,8 +629,8 @@ static int intel_hdcp_auth(struct intel_digital_port *intel_dig_port,
594 } 629 }
595 630
596 if (i == tries) { 631 if (i == tries) {
597 DRM_ERROR("Timed out waiting for Ri prime match (%x)\n", 632 DRM_DEBUG_KMS("Timed out waiting for Ri prime match (%x)\n",
598 I915_READ(PORT_HDCP_STATUS(port))); 633 I915_READ(PORT_HDCP_STATUS(port)));
599 return -ETIMEDOUT; 634 return -ETIMEDOUT;
600 } 635 }
601 636
@@ -618,14 +653,9 @@ static int intel_hdcp_auth(struct intel_digital_port *intel_dig_port,
618 return 0; 653 return 0;
619} 654}
620 655
621static
622struct intel_digital_port *conn_to_dig_port(struct intel_connector *connector)
623{
624 return enc_to_dig_port(&intel_attached_encoder(&connector->base)->base);
625}
626
627static int _intel_hdcp_disable(struct intel_connector *connector) 656static int _intel_hdcp_disable(struct intel_connector *connector)
628{ 657{
658 struct intel_hdcp *hdcp = &connector->hdcp;
629 struct drm_i915_private *dev_priv = connector->base.dev->dev_private; 659 struct drm_i915_private *dev_priv = connector->base.dev->dev_private;
630 struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); 660 struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
631 enum port port = intel_dig_port->base.port; 661 enum port port = intel_dig_port->base.port;
@@ -641,7 +671,7 @@ static int _intel_hdcp_disable(struct intel_connector *connector)
641 return -ETIMEDOUT; 671 return -ETIMEDOUT;
642 } 672 }
643 673
644 ret = connector->hdcp_shim->toggle_signalling(intel_dig_port, false); 674 ret = hdcp->shim->toggle_signalling(intel_dig_port, false);
645 if (ret) { 675 if (ret) {
646 DRM_ERROR("Failed to disable HDCP signalling\n"); 676 DRM_ERROR("Failed to disable HDCP signalling\n");
647 return ret; 677 return ret;
@@ -653,6 +683,7 @@ static int _intel_hdcp_disable(struct intel_connector *connector)
653 683
654static int _intel_hdcp_enable(struct intel_connector *connector) 684static int _intel_hdcp_enable(struct intel_connector *connector)
655{ 685{
686 struct intel_hdcp *hdcp = &connector->hdcp;
656 struct drm_i915_private *dev_priv = connector->base.dev->dev_private; 687 struct drm_i915_private *dev_priv = connector->base.dev->dev_private;
657 int i, ret, tries = 3; 688 int i, ret, tries = 3;
658 689
@@ -677,8 +708,7 @@ static int _intel_hdcp_enable(struct intel_connector *connector)
677 708
678 /* Incase of authentication failures, HDCP spec expects reauth. */ 709 /* Incase of authentication failures, HDCP spec expects reauth. */
679 for (i = 0; i < tries; i++) { 710 for (i = 0; i < tries; i++) {
680 ret = intel_hdcp_auth(conn_to_dig_port(connector), 711 ret = intel_hdcp_auth(conn_to_dig_port(connector), hdcp->shim);
681 connector->hdcp_shim);
682 if (!ret) 712 if (!ret)
683 return 0; 713 return 0;
684 714
@@ -688,42 +718,50 @@ static int _intel_hdcp_enable(struct intel_connector *connector)
688 _intel_hdcp_disable(connector); 718 _intel_hdcp_disable(connector);
689 } 719 }
690 720
691 DRM_ERROR("HDCP authentication failed (%d tries/%d)\n", tries, ret); 721 DRM_DEBUG_KMS("HDCP authentication failed (%d tries/%d)\n", tries, ret);
692 return ret; 722 return ret;
693} 723}
694 724
725static inline
726struct intel_connector *intel_hdcp_to_connector(struct intel_hdcp *hdcp)
727{
728 return container_of(hdcp, struct intel_connector, hdcp);
729}
730
695static void intel_hdcp_check_work(struct work_struct *work) 731static void intel_hdcp_check_work(struct work_struct *work)
696{ 732{
697 struct intel_connector *connector = container_of(to_delayed_work(work), 733 struct intel_hdcp *hdcp = container_of(to_delayed_work(work),
698 struct intel_connector, 734 struct intel_hdcp,
699 hdcp_check_work); 735 check_work);
736 struct intel_connector *connector = intel_hdcp_to_connector(hdcp);
737
700 if (!intel_hdcp_check_link(connector)) 738 if (!intel_hdcp_check_link(connector))
701 schedule_delayed_work(&connector->hdcp_check_work, 739 schedule_delayed_work(&hdcp->check_work,
702 DRM_HDCP_CHECK_PERIOD_MS); 740 DRM_HDCP_CHECK_PERIOD_MS);
703} 741}
704 742
705static void intel_hdcp_prop_work(struct work_struct *work) 743static void intel_hdcp_prop_work(struct work_struct *work)
706{ 744{
707 struct intel_connector *connector = container_of(work, 745 struct intel_hdcp *hdcp = container_of(work, struct intel_hdcp,
708 struct intel_connector, 746 prop_work);
709 hdcp_prop_work); 747 struct intel_connector *connector = intel_hdcp_to_connector(hdcp);
710 struct drm_device *dev = connector->base.dev; 748 struct drm_device *dev = connector->base.dev;
711 struct drm_connector_state *state; 749 struct drm_connector_state *state;
712 750
713 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); 751 drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
714 mutex_lock(&connector->hdcp_mutex); 752 mutex_lock(&hdcp->mutex);
715 753
716 /* 754 /*
717 * This worker is only used to flip between ENABLED/DESIRED. Either of 755 * This worker is only used to flip between ENABLED/DESIRED. Either of
718 * those to UNDESIRED is handled by core. If hdcp_value == UNDESIRED, 756 * those to UNDESIRED is handled by core. If value == UNDESIRED,
719 * we're running just after hdcp has been disabled, so just exit 757 * we're running just after hdcp has been disabled, so just exit
720 */ 758 */
721 if (connector->hdcp_value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { 759 if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
722 state = connector->base.state; 760 state = connector->base.state;
723 state->content_protection = connector->hdcp_value; 761 state->content_protection = hdcp->value;
724 } 762 }
725 763
726 mutex_unlock(&connector->hdcp_mutex); 764 mutex_unlock(&hdcp->mutex);
727 drm_modeset_unlock(&dev->mode_config.connection_mutex); 765 drm_modeset_unlock(&dev->mode_config.connection_mutex);
728} 766}
729 767
@@ -735,8 +773,9 @@ bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port)
735} 773}
736 774
737int intel_hdcp_init(struct intel_connector *connector, 775int intel_hdcp_init(struct intel_connector *connector,
738 const struct intel_hdcp_shim *hdcp_shim) 776 const struct intel_hdcp_shim *shim)
739{ 777{
778 struct intel_hdcp *hdcp = &connector->hdcp;
740 int ret; 779 int ret;
741 780
742 ret = drm_connector_attach_content_protection_property( 781 ret = drm_connector_attach_content_protection_property(
@@ -744,51 +783,53 @@ int intel_hdcp_init(struct intel_connector *connector,
744 if (ret) 783 if (ret)
745 return ret; 784 return ret;
746 785
747 connector->hdcp_shim = hdcp_shim; 786 hdcp->shim = shim;
748 mutex_init(&connector->hdcp_mutex); 787 mutex_init(&hdcp->mutex);
749 INIT_DELAYED_WORK(&connector->hdcp_check_work, intel_hdcp_check_work); 788 INIT_DELAYED_WORK(&hdcp->check_work, intel_hdcp_check_work);
750 INIT_WORK(&connector->hdcp_prop_work, intel_hdcp_prop_work); 789 INIT_WORK(&hdcp->prop_work, intel_hdcp_prop_work);
751 return 0; 790 return 0;
752} 791}
753 792
754int intel_hdcp_enable(struct intel_connector *connector) 793int intel_hdcp_enable(struct intel_connector *connector)
755{ 794{
795 struct intel_hdcp *hdcp = &connector->hdcp;
756 int ret; 796 int ret;
757 797
758 if (!connector->hdcp_shim) 798 if (!hdcp->shim)
759 return -ENOENT; 799 return -ENOENT;
760 800
761 mutex_lock(&connector->hdcp_mutex); 801 mutex_lock(&hdcp->mutex);
762 802
763 ret = _intel_hdcp_enable(connector); 803 ret = _intel_hdcp_enable(connector);
764 if (ret) 804 if (ret)
765 goto out; 805 goto out;
766 806
767 connector->hdcp_value = DRM_MODE_CONTENT_PROTECTION_ENABLED; 807 hdcp->value = DRM_MODE_CONTENT_PROTECTION_ENABLED;
768 schedule_work(&connector->hdcp_prop_work); 808 schedule_work(&hdcp->prop_work);
769 schedule_delayed_work(&connector->hdcp_check_work, 809 schedule_delayed_work(&hdcp->check_work,
770 DRM_HDCP_CHECK_PERIOD_MS); 810 DRM_HDCP_CHECK_PERIOD_MS);
771out: 811out:
772 mutex_unlock(&connector->hdcp_mutex); 812 mutex_unlock(&hdcp->mutex);
773 return ret; 813 return ret;
774} 814}
775 815
776int intel_hdcp_disable(struct intel_connector *connector) 816int intel_hdcp_disable(struct intel_connector *connector)
777{ 817{
818 struct intel_hdcp *hdcp = &connector->hdcp;
778 int ret = 0; 819 int ret = 0;
779 820
780 if (!connector->hdcp_shim) 821 if (!hdcp->shim)
781 return -ENOENT; 822 return -ENOENT;
782 823
783 mutex_lock(&connector->hdcp_mutex); 824 mutex_lock(&hdcp->mutex);
784 825
785 if (connector->hdcp_value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { 826 if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
786 connector->hdcp_value = DRM_MODE_CONTENT_PROTECTION_UNDESIRED; 827 hdcp->value = DRM_MODE_CONTENT_PROTECTION_UNDESIRED;
787 ret = _intel_hdcp_disable(connector); 828 ret = _intel_hdcp_disable(connector);
788 } 829 }
789 830
790 mutex_unlock(&connector->hdcp_mutex); 831 mutex_unlock(&hdcp->mutex);
791 cancel_delayed_work_sync(&connector->hdcp_check_work); 832 cancel_delayed_work_sync(&hdcp->check_work);
792 return ret; 833 return ret;
793} 834}
794 835
@@ -828,17 +869,18 @@ void intel_hdcp_atomic_check(struct drm_connector *connector,
828/* Implements Part 3 of the HDCP authorization procedure */ 869/* Implements Part 3 of the HDCP authorization procedure */
829int intel_hdcp_check_link(struct intel_connector *connector) 870int intel_hdcp_check_link(struct intel_connector *connector)
830{ 871{
872 struct intel_hdcp *hdcp = &connector->hdcp;
831 struct drm_i915_private *dev_priv = connector->base.dev->dev_private; 873 struct drm_i915_private *dev_priv = connector->base.dev->dev_private;
832 struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); 874 struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
833 enum port port = intel_dig_port->base.port; 875 enum port port = intel_dig_port->base.port;
834 int ret = 0; 876 int ret = 0;
835 877
836 if (!connector->hdcp_shim) 878 if (!hdcp->shim)
837 return -ENOENT; 879 return -ENOENT;
838 880
839 mutex_lock(&connector->hdcp_mutex); 881 mutex_lock(&hdcp->mutex);
840 882
841 if (connector->hdcp_value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED) 883 if (hdcp->value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
842 goto out; 884 goto out;
843 885
844 if (!(I915_READ(PORT_HDCP_STATUS(port)) & HDCP_STATUS_ENC)) { 886 if (!(I915_READ(PORT_HDCP_STATUS(port)) & HDCP_STATUS_ENC)) {
@@ -846,17 +888,15 @@ int intel_hdcp_check_link(struct intel_connector *connector)
846 connector->base.name, connector->base.base.id, 888 connector->base.name, connector->base.base.id,
847 I915_READ(PORT_HDCP_STATUS(port))); 889 I915_READ(PORT_HDCP_STATUS(port)));
848 ret = -ENXIO; 890 ret = -ENXIO;
849 connector->hdcp_value = DRM_MODE_CONTENT_PROTECTION_DESIRED; 891 hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
850 schedule_work(&connector->hdcp_prop_work); 892 schedule_work(&hdcp->prop_work);
851 goto out; 893 goto out;
852 } 894 }
853 895
854 if (connector->hdcp_shim->check_link(intel_dig_port)) { 896 if (hdcp->shim->check_link(intel_dig_port)) {
855 if (connector->hdcp_value != 897 if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
856 DRM_MODE_CONTENT_PROTECTION_UNDESIRED) { 898 hdcp->value = DRM_MODE_CONTENT_PROTECTION_ENABLED;
857 connector->hdcp_value = 899 schedule_work(&hdcp->prop_work);
858 DRM_MODE_CONTENT_PROTECTION_ENABLED;
859 schedule_work(&connector->hdcp_prop_work);
860 } 900 }
861 goto out; 901 goto out;
862 } 902 }
@@ -867,20 +907,20 @@ int intel_hdcp_check_link(struct intel_connector *connector)
867 ret = _intel_hdcp_disable(connector); 907 ret = _intel_hdcp_disable(connector);
868 if (ret) { 908 if (ret) {
869 DRM_ERROR("Failed to disable hdcp (%d)\n", ret); 909 DRM_ERROR("Failed to disable hdcp (%d)\n", ret);
870 connector->hdcp_value = DRM_MODE_CONTENT_PROTECTION_DESIRED; 910 hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
871 schedule_work(&connector->hdcp_prop_work); 911 schedule_work(&hdcp->prop_work);
872 goto out; 912 goto out;
873 } 913 }
874 914
875 ret = _intel_hdcp_enable(connector); 915 ret = _intel_hdcp_enable(connector);
876 if (ret) { 916 if (ret) {
877 DRM_ERROR("Failed to enable hdcp (%d)\n", ret); 917 DRM_DEBUG_KMS("Failed to enable hdcp (%d)\n", ret);
878 connector->hdcp_value = DRM_MODE_CONTENT_PROTECTION_DESIRED; 918 hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
879 schedule_work(&connector->hdcp_prop_work); 919 schedule_work(&hdcp->prop_work);
880 goto out; 920 goto out;
881 } 921 }
882 922
883out: 923out:
884 mutex_unlock(&connector->hdcp_mutex); 924 mutex_unlock(&hdcp->mutex);
885 return ret; 925 return ret;
886} 926}
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index d7234e03fdb0..e2c6a2b3e8f2 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -148,14 +148,13 @@ hsw_dip_data_reg(struct drm_i915_private *dev_priv,
148 } 148 }
149} 149}
150 150
151static void g4x_write_infoframe(struct drm_encoder *encoder, 151static void g4x_write_infoframe(struct intel_encoder *encoder,
152 const struct intel_crtc_state *crtc_state, 152 const struct intel_crtc_state *crtc_state,
153 unsigned int type, 153 unsigned int type,
154 const void *frame, ssize_t len) 154 const void *frame, ssize_t len)
155{ 155{
156 const u32 *data = frame; 156 const u32 *data = frame;
157 struct drm_device *dev = encoder->dev; 157 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
158 struct drm_i915_private *dev_priv = to_i915(dev);
159 u32 val = I915_READ(VIDEO_DIP_CTL); 158 u32 val = I915_READ(VIDEO_DIP_CTL);
160 int i; 159 int i;
161 160
@@ -186,31 +185,29 @@ static void g4x_write_infoframe(struct drm_encoder *encoder,
186 POSTING_READ(VIDEO_DIP_CTL); 185 POSTING_READ(VIDEO_DIP_CTL);
187} 186}
188 187
189static bool g4x_infoframe_enabled(struct drm_encoder *encoder, 188static bool g4x_infoframe_enabled(struct intel_encoder *encoder,
190 const struct intel_crtc_state *pipe_config) 189 const struct intel_crtc_state *pipe_config)
191{ 190{
192 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 191 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
193 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
194 u32 val = I915_READ(VIDEO_DIP_CTL); 192 u32 val = I915_READ(VIDEO_DIP_CTL);
195 193
196 if ((val & VIDEO_DIP_ENABLE) == 0) 194 if ((val & VIDEO_DIP_ENABLE) == 0)
197 return false; 195 return false;
198 196
199 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->base.port)) 197 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
200 return false; 198 return false;
201 199
202 return val & (VIDEO_DIP_ENABLE_AVI | 200 return val & (VIDEO_DIP_ENABLE_AVI |
203 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD); 201 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
204} 202}
205 203
206static void ibx_write_infoframe(struct drm_encoder *encoder, 204static void ibx_write_infoframe(struct intel_encoder *encoder,
207 const struct intel_crtc_state *crtc_state, 205 const struct intel_crtc_state *crtc_state,
208 unsigned int type, 206 unsigned int type,
209 const void *frame, ssize_t len) 207 const void *frame, ssize_t len)
210{ 208{
211 const u32 *data = frame; 209 const u32 *data = frame;
212 struct drm_device *dev = encoder->dev; 210 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
213 struct drm_i915_private *dev_priv = to_i915(dev);
214 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc); 211 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
215 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 212 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
216 u32 val = I915_READ(reg); 213 u32 val = I915_READ(reg);
@@ -243,11 +240,10 @@ static void ibx_write_infoframe(struct drm_encoder *encoder,
243 POSTING_READ(reg); 240 POSTING_READ(reg);
244} 241}
245 242
246static bool ibx_infoframe_enabled(struct drm_encoder *encoder, 243static bool ibx_infoframe_enabled(struct intel_encoder *encoder,
247 const struct intel_crtc_state *pipe_config) 244 const struct intel_crtc_state *pipe_config)
248{ 245{
249 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 246 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
250 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
251 enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe; 247 enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe;
252 i915_reg_t reg = TVIDEO_DIP_CTL(pipe); 248 i915_reg_t reg = TVIDEO_DIP_CTL(pipe);
253 u32 val = I915_READ(reg); 249 u32 val = I915_READ(reg);
@@ -255,7 +251,7 @@ static bool ibx_infoframe_enabled(struct drm_encoder *encoder,
255 if ((val & VIDEO_DIP_ENABLE) == 0) 251 if ((val & VIDEO_DIP_ENABLE) == 0)
256 return false; 252 return false;
257 253
258 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->base.port)) 254 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
259 return false; 255 return false;
260 256
261 return val & (VIDEO_DIP_ENABLE_AVI | 257 return val & (VIDEO_DIP_ENABLE_AVI |
@@ -263,14 +259,13 @@ static bool ibx_infoframe_enabled(struct drm_encoder *encoder,
263 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP); 259 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
264} 260}
265 261
266static void cpt_write_infoframe(struct drm_encoder *encoder, 262static void cpt_write_infoframe(struct intel_encoder *encoder,
267 const struct intel_crtc_state *crtc_state, 263 const struct intel_crtc_state *crtc_state,
268 unsigned int type, 264 unsigned int type,
269 const void *frame, ssize_t len) 265 const void *frame, ssize_t len)
270{ 266{
271 const u32 *data = frame; 267 const u32 *data = frame;
272 struct drm_device *dev = encoder->dev; 268 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
273 struct drm_i915_private *dev_priv = to_i915(dev);
274 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc); 269 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
275 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 270 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
276 u32 val = I915_READ(reg); 271 u32 val = I915_READ(reg);
@@ -306,10 +301,10 @@ static void cpt_write_infoframe(struct drm_encoder *encoder,
306 POSTING_READ(reg); 301 POSTING_READ(reg);
307} 302}
308 303
309static bool cpt_infoframe_enabled(struct drm_encoder *encoder, 304static bool cpt_infoframe_enabled(struct intel_encoder *encoder,
310 const struct intel_crtc_state *pipe_config) 305 const struct intel_crtc_state *pipe_config)
311{ 306{
312 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 307 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
313 enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe; 308 enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe;
314 u32 val = I915_READ(TVIDEO_DIP_CTL(pipe)); 309 u32 val = I915_READ(TVIDEO_DIP_CTL(pipe));
315 310
@@ -321,14 +316,13 @@ static bool cpt_infoframe_enabled(struct drm_encoder *encoder,
321 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP); 316 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
322} 317}
323 318
324static void vlv_write_infoframe(struct drm_encoder *encoder, 319static void vlv_write_infoframe(struct intel_encoder *encoder,
325 const struct intel_crtc_state *crtc_state, 320 const struct intel_crtc_state *crtc_state,
326 unsigned int type, 321 unsigned int type,
327 const void *frame, ssize_t len) 322 const void *frame, ssize_t len)
328{ 323{
329 const u32 *data = frame; 324 const u32 *data = frame;
330 struct drm_device *dev = encoder->dev; 325 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
331 struct drm_i915_private *dev_priv = to_i915(dev);
332 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc); 326 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
333 i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe); 327 i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
334 u32 val = I915_READ(reg); 328 u32 val = I915_READ(reg);
@@ -361,18 +355,17 @@ static void vlv_write_infoframe(struct drm_encoder *encoder,
361 POSTING_READ(reg); 355 POSTING_READ(reg);
362} 356}
363 357
364static bool vlv_infoframe_enabled(struct drm_encoder *encoder, 358static bool vlv_infoframe_enabled(struct intel_encoder *encoder,
365 const struct intel_crtc_state *pipe_config) 359 const struct intel_crtc_state *pipe_config)
366{ 360{
367 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 361 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
368 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
369 enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe; 362 enum pipe pipe = to_intel_crtc(pipe_config->base.crtc)->pipe;
370 u32 val = I915_READ(VLV_TVIDEO_DIP_CTL(pipe)); 363 u32 val = I915_READ(VLV_TVIDEO_DIP_CTL(pipe));
371 364
372 if ((val & VIDEO_DIP_ENABLE) == 0) 365 if ((val & VIDEO_DIP_ENABLE) == 0)
373 return false; 366 return false;
374 367
375 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(intel_dig_port->base.port)) 368 if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
376 return false; 369 return false;
377 370
378 return val & (VIDEO_DIP_ENABLE_AVI | 371 return val & (VIDEO_DIP_ENABLE_AVI |
@@ -380,14 +373,13 @@ static bool vlv_infoframe_enabled(struct drm_encoder *encoder,
380 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP); 373 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
381} 374}
382 375
383static void hsw_write_infoframe(struct drm_encoder *encoder, 376static void hsw_write_infoframe(struct intel_encoder *encoder,
384 const struct intel_crtc_state *crtc_state, 377 const struct intel_crtc_state *crtc_state,
385 unsigned int type, 378 unsigned int type,
386 const void *frame, ssize_t len) 379 const void *frame, ssize_t len)
387{ 380{
388 const u32 *data = frame; 381 const u32 *data = frame;
389 struct drm_device *dev = encoder->dev; 382 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
390 struct drm_i915_private *dev_priv = to_i915(dev);
391 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 383 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
392 i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder); 384 i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder);
393 int data_size = type == DP_SDP_VSC ? 385 int data_size = type == DP_SDP_VSC ?
@@ -415,10 +407,10 @@ static void hsw_write_infoframe(struct drm_encoder *encoder,
415 POSTING_READ(ctl_reg); 407 POSTING_READ(ctl_reg);
416} 408}
417 409
418static bool hsw_infoframe_enabled(struct drm_encoder *encoder, 410static bool hsw_infoframe_enabled(struct intel_encoder *encoder,
419 const struct intel_crtc_state *pipe_config) 411 const struct intel_crtc_state *pipe_config)
420{ 412{
421 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 413 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
422 u32 val = I915_READ(HSW_TVIDEO_DIP_CTL(pipe_config->cpu_transcoder)); 414 u32 val = I915_READ(HSW_TVIDEO_DIP_CTL(pipe_config->cpu_transcoder));
423 415
424 return val & (VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW | 416 return val & (VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
@@ -443,11 +435,11 @@ static bool hsw_infoframe_enabled(struct drm_encoder *encoder,
443 * trick them by giving an offset into the buffer and moving back the header 435 * trick them by giving an offset into the buffer and moving back the header
444 * bytes by one. 436 * bytes by one.
445 */ 437 */
446static void intel_write_infoframe(struct drm_encoder *encoder, 438static void intel_write_infoframe(struct intel_encoder *encoder,
447 const struct intel_crtc_state *crtc_state, 439 const struct intel_crtc_state *crtc_state,
448 union hdmi_infoframe *frame) 440 union hdmi_infoframe *frame)
449{ 441{
450 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); 442 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
451 u8 buffer[VIDEO_DIP_DATA_SIZE]; 443 u8 buffer[VIDEO_DIP_DATA_SIZE];
452 ssize_t len; 444 ssize_t len;
453 445
@@ -457,20 +449,20 @@ static void intel_write_infoframe(struct drm_encoder *encoder,
457 return; 449 return;
458 450
459 /* Insert the 'hole' (see big comment above) at position 3 */ 451 /* Insert the 'hole' (see big comment above) at position 3 */
460 buffer[0] = buffer[1]; 452 memmove(&buffer[0], &buffer[1], 3);
461 buffer[1] = buffer[2];
462 buffer[2] = buffer[3];
463 buffer[3] = 0; 453 buffer[3] = 0;
464 len++; 454 len++;
465 455
466 intel_dig_port->write_infoframe(encoder, crtc_state, frame->any.type, buffer, len); 456 intel_dig_port->write_infoframe(encoder,
457 crtc_state,
458 frame->any.type, buffer, len);
467} 459}
468 460
469static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder, 461static void intel_hdmi_set_avi_infoframe(struct intel_encoder *encoder,
470 const struct intel_crtc_state *crtc_state, 462 const struct intel_crtc_state *crtc_state,
471 const struct drm_connector_state *conn_state) 463 const struct drm_connector_state *conn_state)
472{ 464{
473 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); 465 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
474 const struct drm_display_mode *adjusted_mode = 466 const struct drm_display_mode *adjusted_mode =
475 &crtc_state->base.adjusted_mode; 467 &crtc_state->base.adjusted_mode;
476 struct drm_connector *connector = &intel_hdmi->attached_connector->base; 468 struct drm_connector *connector = &intel_hdmi->attached_connector->base;
@@ -487,8 +479,10 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
487 return; 479 return;
488 } 480 }
489 481
490 if (crtc_state->ycbcr420) 482 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
491 frame.avi.colorspace = HDMI_COLORSPACE_YUV420; 483 frame.avi.colorspace = HDMI_COLORSPACE_YUV420;
484 else if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444)
485 frame.avi.colorspace = HDMI_COLORSPACE_YUV444;
492 else 486 else
493 frame.avi.colorspace = HDMI_COLORSPACE_RGB; 487 frame.avi.colorspace = HDMI_COLORSPACE_RGB;
494 488
@@ -503,10 +497,11 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
503 conn_state); 497 conn_state);
504 498
505 /* TODO: handle pixel repetition for YCBCR420 outputs */ 499 /* TODO: handle pixel repetition for YCBCR420 outputs */
506 intel_write_infoframe(encoder, crtc_state, &frame); 500 intel_write_infoframe(encoder, crtc_state,
501 &frame);
507} 502}
508 503
509static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder, 504static void intel_hdmi_set_spd_infoframe(struct intel_encoder *encoder,
510 const struct intel_crtc_state *crtc_state) 505 const struct intel_crtc_state *crtc_state)
511{ 506{
512 union hdmi_infoframe frame; 507 union hdmi_infoframe frame;
@@ -520,11 +515,12 @@ static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder,
520 515
521 frame.spd.sdi = HDMI_SPD_SDI_PC; 516 frame.spd.sdi = HDMI_SPD_SDI_PC;
522 517
523 intel_write_infoframe(encoder, crtc_state, &frame); 518 intel_write_infoframe(encoder, crtc_state,
519 &frame);
524} 520}
525 521
526static void 522static void
527intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder, 523intel_hdmi_set_hdmi_infoframe(struct intel_encoder *encoder,
528 const struct intel_crtc_state *crtc_state, 524 const struct intel_crtc_state *crtc_state,
529 const struct drm_connector_state *conn_state) 525 const struct drm_connector_state *conn_state)
530{ 526{
@@ -537,20 +533,21 @@ intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder,
537 if (ret < 0) 533 if (ret < 0)
538 return; 534 return;
539 535
540 intel_write_infoframe(encoder, crtc_state, &frame); 536 intel_write_infoframe(encoder, crtc_state,
537 &frame);
541} 538}
542 539
543static void g4x_set_infoframes(struct drm_encoder *encoder, 540static void g4x_set_infoframes(struct intel_encoder *encoder,
544 bool enable, 541 bool enable,
545 const struct intel_crtc_state *crtc_state, 542 const struct intel_crtc_state *crtc_state,
546 const struct drm_connector_state *conn_state) 543 const struct drm_connector_state *conn_state)
547{ 544{
548 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 545 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
549 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); 546 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
550 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi; 547 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
551 i915_reg_t reg = VIDEO_DIP_CTL; 548 i915_reg_t reg = VIDEO_DIP_CTL;
552 u32 val = I915_READ(reg); 549 u32 val = I915_READ(reg);
553 u32 port = VIDEO_DIP_PORT(intel_dig_port->base.port); 550 u32 port = VIDEO_DIP_PORT(encoder->port);
554 551
555 assert_hdmi_port_disabled(intel_hdmi); 552 assert_hdmi_port_disabled(intel_hdmi);
556 553
@@ -658,11 +655,11 @@ static bool gcp_default_phase_possible(int pipe_bpp,
658 mode->crtc_htotal/2 % pixels_per_group == 0); 655 mode->crtc_htotal/2 % pixels_per_group == 0);
659} 656}
660 657
661static bool intel_hdmi_set_gcp_infoframe(struct drm_encoder *encoder, 658static bool intel_hdmi_set_gcp_infoframe(struct intel_encoder *encoder,
662 const struct intel_crtc_state *crtc_state, 659 const struct intel_crtc_state *crtc_state,
663 const struct drm_connector_state *conn_state) 660 const struct drm_connector_state *conn_state)
664{ 661{
665 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 662 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
666 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc); 663 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
667 i915_reg_t reg; 664 i915_reg_t reg;
668 u32 val = 0; 665 u32 val = 0;
@@ -690,18 +687,18 @@ static bool intel_hdmi_set_gcp_infoframe(struct drm_encoder *encoder,
690 return val != 0; 687 return val != 0;
691} 688}
692 689
693static void ibx_set_infoframes(struct drm_encoder *encoder, 690static void ibx_set_infoframes(struct intel_encoder *encoder,
694 bool enable, 691 bool enable,
695 const struct intel_crtc_state *crtc_state, 692 const struct intel_crtc_state *crtc_state,
696 const struct drm_connector_state *conn_state) 693 const struct drm_connector_state *conn_state)
697{ 694{
698 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 695 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
699 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc); 696 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
700 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder); 697 struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
701 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi; 698 struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
702 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 699 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
703 u32 val = I915_READ(reg); 700 u32 val = I915_READ(reg);
704 u32 port = VIDEO_DIP_PORT(intel_dig_port->base.port); 701 u32 port = VIDEO_DIP_PORT(encoder->port);
705 702
706 assert_hdmi_port_disabled(intel_hdmi); 703 assert_hdmi_port_disabled(intel_hdmi);
707 704
@@ -743,14 +740,14 @@ static void ibx_set_infoframes(struct drm_encoder *encoder,
743 intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state); 740 intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
744} 741}
745 742
746static void cpt_set_infoframes(struct drm_encoder *encoder, 743static void cpt_set_infoframes(struct intel_encoder *encoder,
747 bool enable, 744 bool enable,
748 const struct intel_crtc_state *crtc_state, 745 const struct intel_crtc_state *crtc_state,
749 const struct drm_connector_state *conn_state) 746 const struct drm_connector_state *conn_state)
750{ 747{
751 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 748 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
752 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc); 749 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
753 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); 750 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
754 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 751 i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
755 u32 val = I915_READ(reg); 752 u32 val = I915_READ(reg);
756 753
@@ -786,18 +783,17 @@ static void cpt_set_infoframes(struct drm_encoder *encoder,
786 intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state); 783 intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
787} 784}
788 785
789static void vlv_set_infoframes(struct drm_encoder *encoder, 786static void vlv_set_infoframes(struct intel_encoder *encoder,
790 bool enable, 787 bool enable,
791 const struct intel_crtc_state *crtc_state, 788 const struct intel_crtc_state *crtc_state,
792 const struct drm_connector_state *conn_state) 789 const struct drm_connector_state *conn_state)
793{ 790{
794 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 791 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
795 struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
796 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc); 792 struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->base.crtc);
797 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); 793 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
798 i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe); 794 i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
799 u32 val = I915_READ(reg); 795 u32 val = I915_READ(reg);
800 u32 port = VIDEO_DIP_PORT(intel_dig_port->base.port); 796 u32 port = VIDEO_DIP_PORT(encoder->port);
801 797
802 assert_hdmi_port_disabled(intel_hdmi); 798 assert_hdmi_port_disabled(intel_hdmi);
803 799
@@ -839,12 +835,12 @@ static void vlv_set_infoframes(struct drm_encoder *encoder,
839 intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state); 835 intel_hdmi_set_hdmi_infoframe(encoder, crtc_state, conn_state);
840} 836}
841 837
842static void hsw_set_infoframes(struct drm_encoder *encoder, 838static void hsw_set_infoframes(struct intel_encoder *encoder,
843 bool enable, 839 bool enable,
844 const struct intel_crtc_state *crtc_state, 840 const struct intel_crtc_state *crtc_state,
845 const struct drm_connector_state *conn_state) 841 const struct drm_connector_state *conn_state)
846{ 842{
847 struct drm_i915_private *dev_priv = to_i915(encoder->dev); 843 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
848 i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder); 844 i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder);
849 u32 val = I915_READ(reg); 845 u32 val = I915_READ(reg);
850 846
@@ -966,13 +962,13 @@ int intel_hdmi_hdcp_write_an_aksv(struct intel_digital_port *intel_dig_port,
966 ret = intel_hdmi_hdcp_write(intel_dig_port, DRM_HDCP_DDC_AN, an, 962 ret = intel_hdmi_hdcp_write(intel_dig_port, DRM_HDCP_DDC_AN, an,
967 DRM_HDCP_AN_LEN); 963 DRM_HDCP_AN_LEN);
968 if (ret) { 964 if (ret) {
969 DRM_ERROR("Write An over DDC failed (%d)\n", ret); 965 DRM_DEBUG_KMS("Write An over DDC failed (%d)\n", ret);
970 return ret; 966 return ret;
971 } 967 }
972 968
973 ret = intel_gmbus_output_aksv(adapter); 969 ret = intel_gmbus_output_aksv(adapter);
974 if (ret < 0) { 970 if (ret < 0) {
975 DRM_ERROR("Failed to output aksv (%d)\n", ret); 971 DRM_DEBUG_KMS("Failed to output aksv (%d)\n", ret);
976 return ret; 972 return ret;
977 } 973 }
978 return 0; 974 return 0;
@@ -985,7 +981,7 @@ static int intel_hdmi_hdcp_read_bksv(struct intel_digital_port *intel_dig_port,
985 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BKSV, bksv, 981 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BKSV, bksv,
986 DRM_HDCP_KSV_LEN); 982 DRM_HDCP_KSV_LEN);
987 if (ret) 983 if (ret)
988 DRM_ERROR("Read Bksv over DDC failed (%d)\n", ret); 984 DRM_DEBUG_KMS("Read Bksv over DDC failed (%d)\n", ret);
989 return ret; 985 return ret;
990} 986}
991 987
@@ -997,7 +993,7 @@ int intel_hdmi_hdcp_read_bstatus(struct intel_digital_port *intel_dig_port,
997 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BSTATUS, 993 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BSTATUS,
998 bstatus, DRM_HDCP_BSTATUS_LEN); 994 bstatus, DRM_HDCP_BSTATUS_LEN);
999 if (ret) 995 if (ret)
1000 DRM_ERROR("Read bstatus over DDC failed (%d)\n", ret); 996 DRM_DEBUG_KMS("Read bstatus over DDC failed (%d)\n", ret);
1001 return ret; 997 return ret;
1002} 998}
1003 999
@@ -1010,7 +1006,7 @@ int intel_hdmi_hdcp_repeater_present(struct intel_digital_port *intel_dig_port,
1010 1006
1011 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BCAPS, &val, 1); 1007 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BCAPS, &val, 1);
1012 if (ret) { 1008 if (ret) {
1013 DRM_ERROR("Read bcaps over DDC failed (%d)\n", ret); 1009 DRM_DEBUG_KMS("Read bcaps over DDC failed (%d)\n", ret);
1014 return ret; 1010 return ret;
1015 } 1011 }
1016 *repeater_present = val & DRM_HDCP_DDC_BCAPS_REPEATER_PRESENT; 1012 *repeater_present = val & DRM_HDCP_DDC_BCAPS_REPEATER_PRESENT;
@@ -1025,7 +1021,7 @@ int intel_hdmi_hdcp_read_ri_prime(struct intel_digital_port *intel_dig_port,
1025 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_RI_PRIME, 1021 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_RI_PRIME,
1026 ri_prime, DRM_HDCP_RI_LEN); 1022 ri_prime, DRM_HDCP_RI_LEN);
1027 if (ret) 1023 if (ret)
1028 DRM_ERROR("Read Ri' over DDC failed (%d)\n", ret); 1024 DRM_DEBUG_KMS("Read Ri' over DDC failed (%d)\n", ret);
1029 return ret; 1025 return ret;
1030} 1026}
1031 1027
@@ -1038,7 +1034,7 @@ int intel_hdmi_hdcp_read_ksv_ready(struct intel_digital_port *intel_dig_port,
1038 1034
1039 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BCAPS, &val, 1); 1035 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BCAPS, &val, 1);
1040 if (ret) { 1036 if (ret) {
1041 DRM_ERROR("Read bcaps over DDC failed (%d)\n", ret); 1037 DRM_DEBUG_KMS("Read bcaps over DDC failed (%d)\n", ret);
1042 return ret; 1038 return ret;
1043 } 1039 }
1044 *ksv_ready = val & DRM_HDCP_DDC_BCAPS_KSV_FIFO_READY; 1040 *ksv_ready = val & DRM_HDCP_DDC_BCAPS_KSV_FIFO_READY;
@@ -1053,7 +1049,7 @@ int intel_hdmi_hdcp_read_ksv_fifo(struct intel_digital_port *intel_dig_port,
1053 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_KSV_FIFO, 1049 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_KSV_FIFO,
1054 ksv_fifo, num_downstream * DRM_HDCP_KSV_LEN); 1050 ksv_fifo, num_downstream * DRM_HDCP_KSV_LEN);
1055 if (ret) { 1051 if (ret) {
1056 DRM_ERROR("Read ksv fifo over DDC failed (%d)\n", ret); 1052 DRM_DEBUG_KMS("Read ksv fifo over DDC failed (%d)\n", ret);
1057 return ret; 1053 return ret;
1058 } 1054 }
1059 return 0; 1055 return 0;
@@ -1071,7 +1067,7 @@ int intel_hdmi_hdcp_read_v_prime_part(struct intel_digital_port *intel_dig_port,
1071 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_V_PRIME(i), 1067 ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_V_PRIME(i),
1072 part, DRM_HDCP_V_PRIME_PART_LEN); 1068 part, DRM_HDCP_V_PRIME_PART_LEN);
1073 if (ret) 1069 if (ret)
1074 DRM_ERROR("Read V'[%d] over DDC failed (%d)\n", i, ret); 1070 DRM_DEBUG_KMS("Read V'[%d] over DDC failed (%d)\n", i, ret);
1075 return ret; 1071 return ret;
1076} 1072}
1077 1073
@@ -1218,7 +1214,7 @@ static void intel_hdmi_get_config(struct intel_encoder *encoder,
1218 if (tmp & HDMI_MODE_SELECT_HDMI) 1214 if (tmp & HDMI_MODE_SELECT_HDMI)
1219 pipe_config->has_hdmi_sink = true; 1215 pipe_config->has_hdmi_sink = true;
1220 1216
1221 if (intel_dig_port->infoframe_enabled(&encoder->base, pipe_config)) 1217 if (intel_dig_port->infoframe_enabled(encoder, pipe_config))
1222 pipe_config->has_infoframe = true; 1218 pipe_config->has_infoframe = true;
1223 1219
1224 if (tmp & SDVO_AUDIO_ENABLE) 1220 if (tmp & SDVO_AUDIO_ENABLE)
@@ -1439,7 +1435,8 @@ static void intel_disable_hdmi(struct intel_encoder *encoder,
1439 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true); 1435 intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true);
1440 } 1436 }
1441 1437
1442 intel_dig_port->set_infoframes(&encoder->base, false, 1438 intel_dig_port->set_infoframes(encoder,
1439 false,
1443 old_crtc_state, old_conn_state); 1440 old_crtc_state, old_conn_state);
1444 1441
1445 intel_dp_dual_mode_set_tmds_output(intel_hdmi, false); 1442 intel_dp_dual_mode_set_tmds_output(intel_hdmi, false);
@@ -1598,6 +1595,8 @@ static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state,
1598 struct drm_atomic_state *state = crtc_state->base.state; 1595 struct drm_atomic_state *state = crtc_state->base.state;
1599 struct drm_connector_state *connector_state; 1596 struct drm_connector_state *connector_state;
1600 struct drm_connector *connector; 1597 struct drm_connector *connector;
1598 const struct drm_display_mode *adjusted_mode =
1599 &crtc_state->base.adjusted_mode;
1601 int i; 1600 int i;
1602 1601
1603 if (HAS_GMCH_DISPLAY(dev_priv)) 1602 if (HAS_GMCH_DISPLAY(dev_priv))
@@ -1625,7 +1624,7 @@ static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state,
1625 if (connector_state->crtc != crtc_state->base.crtc) 1624 if (connector_state->crtc != crtc_state->base.crtc)
1626 continue; 1625 continue;
1627 1626
1628 if (crtc_state->ycbcr420) { 1627 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) {
1629 const struct drm_hdmi_info *hdmi = &info->hdmi; 1628 const struct drm_hdmi_info *hdmi = &info->hdmi;
1630 1629
1631 if (bpc == 12 && !(hdmi->y420_dc_modes & 1630 if (bpc == 12 && !(hdmi->y420_dc_modes &
@@ -1646,7 +1645,14 @@ static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state,
1646 1645
1647 /* Display WA #1139: glk */ 1646 /* Display WA #1139: glk */
1648 if (bpc == 12 && IS_GLK_REVID(dev_priv, 0, GLK_REVID_A1) && 1647 if (bpc == 12 && IS_GLK_REVID(dev_priv, 0, GLK_REVID_A1) &&
1649 crtc_state->base.adjusted_mode.htotal > 5460) 1648 adjusted_mode->htotal > 5460)
1649 return false;
1650
1651 /* Display Wa_1405510057:icl */
1652 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 &&
1653 bpc == 10 && IS_ICELAKE(dev_priv) &&
1654 (adjusted_mode->crtc_hblank_end -
1655 adjusted_mode->crtc_hblank_start) % 8 == 2)
1650 return false; 1656 return false;
1651 1657
1652 return true; 1658 return true;
@@ -1670,7 +1676,7 @@ intel_hdmi_ycbcr420_config(struct drm_connector *connector,
1670 *clock_12bpc /= 2; 1676 *clock_12bpc /= 2;
1671 *clock_10bpc /= 2; 1677 *clock_10bpc /= 2;
1672 *clock_8bpc /= 2; 1678 *clock_8bpc /= 2;
1673 config->ycbcr420 = true; 1679 config->output_format = INTEL_OUTPUT_FORMAT_YCBCR420;
1674 1680
1675 /* YCBCR 420 output conversion needs a scaler */ 1681 /* YCBCR 420 output conversion needs a scaler */
1676 if (skl_update_scaler_crtc(config)) { 1682 if (skl_update_scaler_crtc(config)) {
@@ -1704,6 +1710,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,
1704 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) 1710 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
1705 return false; 1711 return false;
1706 1712
1713 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
1707 pipe_config->has_hdmi_sink = !force_dvi && intel_hdmi->has_hdmi_sink; 1714 pipe_config->has_hdmi_sink = !force_dvi && intel_hdmi->has_hdmi_sink;
1708 1715
1709 if (pipe_config->has_hdmi_sink) 1716 if (pipe_config->has_hdmi_sink)
@@ -1974,7 +1981,7 @@ static void intel_hdmi_pre_enable(struct intel_encoder *encoder,
1974 1981
1975 intel_hdmi_prepare(encoder, pipe_config); 1982 intel_hdmi_prepare(encoder, pipe_config);
1976 1983
1977 intel_dig_port->set_infoframes(&encoder->base, 1984 intel_dig_port->set_infoframes(encoder,
1978 pipe_config->has_infoframe, 1985 pipe_config->has_infoframe,
1979 pipe_config, conn_state); 1986 pipe_config, conn_state);
1980} 1987}
@@ -1992,7 +1999,7 @@ static void vlv_hdmi_pre_enable(struct intel_encoder *encoder,
1992 vlv_set_phy_signal_level(encoder, 0x2b245f5f, 0x00002000, 0x5578b83a, 1999 vlv_set_phy_signal_level(encoder, 0x2b245f5f, 0x00002000, 0x5578b83a,
1993 0x2b247878); 2000 0x2b247878);
1994 2001
1995 dport->set_infoframes(&encoder->base, 2002 dport->set_infoframes(encoder,
1996 pipe_config->has_infoframe, 2003 pipe_config->has_infoframe,
1997 pipe_config, conn_state); 2004 pipe_config, conn_state);
1998 2005
@@ -2063,7 +2070,7 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder,
2063 /* Use 800mV-0dB */ 2070 /* Use 800mV-0dB */
2064 chv_set_phy_signal_level(encoder, 128, 102, false); 2071 chv_set_phy_signal_level(encoder, 128, 102, false);
2065 2072
2066 dport->set_infoframes(&encoder->base, 2073 dport->set_infoframes(encoder,
2067 pipe_config->has_infoframe, 2074 pipe_config->has_infoframe,
2068 pipe_config, conn_state); 2075 pipe_config, conn_state);
2069 2076
@@ -2075,13 +2082,26 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder,
2075 chv_phy_release_cl2_override(encoder); 2082 chv_phy_release_cl2_override(encoder);
2076} 2083}
2077 2084
2085static int
2086intel_hdmi_connector_register(struct drm_connector *connector)
2087{
2088 int ret;
2089
2090 ret = intel_connector_register(connector);
2091 if (ret)
2092 return ret;
2093
2094 i915_debugfs_connector_add(connector);
2095
2096 return ret;
2097}
2098
2078static void intel_hdmi_destroy(struct drm_connector *connector) 2099static void intel_hdmi_destroy(struct drm_connector *connector)
2079{ 2100{
2080 if (intel_attached_hdmi(connector)->cec_notifier) 2101 if (intel_attached_hdmi(connector)->cec_notifier)
2081 cec_notifier_put(intel_attached_hdmi(connector)->cec_notifier); 2102 cec_notifier_put(intel_attached_hdmi(connector)->cec_notifier);
2082 kfree(to_intel_connector(connector)->detect_edid); 2103
2083 drm_connector_cleanup(connector); 2104 intel_connector_destroy(connector);
2084 kfree(connector);
2085} 2105}
2086 2106
2087static const struct drm_connector_funcs intel_hdmi_connector_funcs = { 2107static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
@@ -2090,7 +2110,7 @@ static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
2090 .fill_modes = drm_helper_probe_single_connector_modes, 2110 .fill_modes = drm_helper_probe_single_connector_modes,
2091 .atomic_get_property = intel_digital_connector_atomic_get_property, 2111 .atomic_get_property = intel_digital_connector_atomic_get_property,
2092 .atomic_set_property = intel_digital_connector_atomic_set_property, 2112 .atomic_set_property = intel_digital_connector_atomic_set_property,
2093 .late_register = intel_connector_register, 2113 .late_register = intel_hdmi_connector_register,
2094 .early_unregister = intel_connector_unregister, 2114 .early_unregister = intel_connector_unregister,
2095 .destroy = intel_hdmi_destroy, 2115 .destroy = intel_hdmi_destroy,
2096 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 2116 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
@@ -2110,11 +2130,16 @@ static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
2110static void 2130static void
2111intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector) 2131intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
2112{ 2132{
2133 struct drm_i915_private *dev_priv = to_i915(connector->dev);
2134
2113 intel_attach_force_audio_property(connector); 2135 intel_attach_force_audio_property(connector);
2114 intel_attach_broadcast_rgb_property(connector); 2136 intel_attach_broadcast_rgb_property(connector);
2115 intel_attach_aspect_ratio_property(connector); 2137 intel_attach_aspect_ratio_property(connector);
2116 drm_connector_attach_content_type_property(connector); 2138 drm_connector_attach_content_type_property(connector);
2117 connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE; 2139 connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
2140
2141 if (!HAS_GMCH_DISPLAY(dev_priv))
2142 drm_connector_attach_max_bpc_property(connector, 8, 12);
2118} 2143}
2119 2144
2120/* 2145/*
@@ -2325,9 +2350,18 @@ void intel_infoframe_init(struct intel_digital_port *intel_dig_port)
2325 intel_dig_port->set_infoframes = g4x_set_infoframes; 2350 intel_dig_port->set_infoframes = g4x_set_infoframes;
2326 intel_dig_port->infoframe_enabled = g4x_infoframe_enabled; 2351 intel_dig_port->infoframe_enabled = g4x_infoframe_enabled;
2327 } else if (HAS_DDI(dev_priv)) { 2352 } else if (HAS_DDI(dev_priv)) {
2328 intel_dig_port->write_infoframe = hsw_write_infoframe; 2353 if (intel_dig_port->lspcon.active) {
2329 intel_dig_port->set_infoframes = hsw_set_infoframes; 2354 intel_dig_port->write_infoframe =
2330 intel_dig_port->infoframe_enabled = hsw_infoframe_enabled; 2355 lspcon_write_infoframe;
2356 intel_dig_port->set_infoframes = lspcon_set_infoframes;
2357 intel_dig_port->infoframe_enabled =
2358 lspcon_infoframe_enabled;
2359 } else {
2360 intel_dig_port->set_infoframes = hsw_set_infoframes;
2361 intel_dig_port->infoframe_enabled =
2362 hsw_infoframe_enabled;
2363 intel_dig_port->write_infoframe = hsw_write_infoframe;
2364 }
2331 } else if (HAS_PCH_IBX(dev_priv)) { 2365 } else if (HAS_PCH_IBX(dev_priv)) {
2332 intel_dig_port->write_infoframe = ibx_write_infoframe; 2366 intel_dig_port->write_infoframe = ibx_write_infoframe;
2333 intel_dig_port->set_infoframes = ibx_set_infoframes; 2367 intel_dig_port->set_infoframes = ibx_set_infoframes;
@@ -2486,5 +2520,6 @@ void intel_hdmi_init(struct drm_i915_private *dev_priv,
2486 2520
2487 intel_infoframe_init(intel_dig_port); 2521 intel_infoframe_init(intel_dig_port);
2488 2522
2523 intel_dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port);
2489 intel_hdmi_init_connector(intel_dig_port, intel_connector); 2524 intel_hdmi_init_connector(intel_dig_port, intel_connector);
2490} 2525}
diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c
index 648a13c6043c..e24174d08fed 100644
--- a/drivers/gpu/drm/i915/intel_hotplug.c
+++ b/drivers/gpu/drm/i915/intel_hotplug.c
@@ -114,51 +114,68 @@ enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv,
114#define HPD_STORM_REENABLE_DELAY (2 * 60 * 1000) 114#define HPD_STORM_REENABLE_DELAY (2 * 60 * 1000)
115 115
116/** 116/**
117 * intel_hpd_irq_storm_detect - gather stats and detect HPD irq storm on a pin 117 * intel_hpd_irq_storm_detect - gather stats and detect HPD IRQ storm on a pin
118 * @dev_priv: private driver data pointer 118 * @dev_priv: private driver data pointer
119 * @pin: the pin to gather stats on 119 * @pin: the pin to gather stats on
120 * @long_hpd: whether the HPD IRQ was long or short
120 * 121 *
121 * Gather stats about HPD irqs from the specified @pin, and detect irq 122 * Gather stats about HPD IRQs from the specified @pin, and detect IRQ
122 * storms. Only the pin specific stats and state are changed, the caller is 123 * storms. Only the pin specific stats and state are changed, the caller is
123 * responsible for further action. 124 * responsible for further action.
124 * 125 *
125 * The number of irqs that are allowed within @HPD_STORM_DETECT_PERIOD is 126 * The number of IRQs that are allowed within @HPD_STORM_DETECT_PERIOD is
126 * stored in @dev_priv->hotplug.hpd_storm_threshold which defaults to 127 * stored in @dev_priv->hotplug.hpd_storm_threshold which defaults to
127 * @HPD_STORM_DEFAULT_THRESHOLD. If this threshold is exceeded, it's 128 * @HPD_STORM_DEFAULT_THRESHOLD. Long IRQs count as +10 to this threshold, and
128 * considered an irq storm and the irq state is set to @HPD_MARK_DISABLED. 129 * short IRQs count as +1. If this threshold is exceeded, it's considered an
130 * IRQ storm and the IRQ state is set to @HPD_MARK_DISABLED.
131 *
132 * By default, most systems will only count long IRQs towards
133 * &dev_priv->hotplug.hpd_storm_threshold. However, some older systems also
134 * suffer from short IRQ storms and must also track these. Because short IRQ
135 * storms are naturally caused by sideband interactions with DP MST devices,
136 * short IRQ detection is only enabled for systems without DP MST support.
137 * Systems which are new enough to support DP MST are far less likely to
138 * suffer from IRQ storms at all, so this is fine.
129 * 139 *
130 * The HPD threshold can be controlled through i915_hpd_storm_ctl in debugfs, 140 * The HPD threshold can be controlled through i915_hpd_storm_ctl in debugfs,
131 * and should only be adjusted for automated hotplug testing. 141 * and should only be adjusted for automated hotplug testing.
132 * 142 *
133 * Return true if an irq storm was detected on @pin. 143 * Return true if an IRQ storm was detected on @pin.
134 */ 144 */
135static bool intel_hpd_irq_storm_detect(struct drm_i915_private *dev_priv, 145static bool intel_hpd_irq_storm_detect(struct drm_i915_private *dev_priv,
136 enum hpd_pin pin) 146 enum hpd_pin pin, bool long_hpd)
137{ 147{
138 unsigned long start = dev_priv->hotplug.stats[pin].last_jiffies; 148 struct i915_hotplug *hpd = &dev_priv->hotplug;
149 unsigned long start = hpd->stats[pin].last_jiffies;
139 unsigned long end = start + msecs_to_jiffies(HPD_STORM_DETECT_PERIOD); 150 unsigned long end = start + msecs_to_jiffies(HPD_STORM_DETECT_PERIOD);
140 const int threshold = dev_priv->hotplug.hpd_storm_threshold; 151 const int increment = long_hpd ? 10 : 1;
152 const int threshold = hpd->hpd_storm_threshold;
141 bool storm = false; 153 bool storm = false;
142 154
155 if (!threshold ||
156 (!long_hpd && !dev_priv->hotplug.hpd_short_storm_enabled))
157 return false;
158
143 if (!time_in_range(jiffies, start, end)) { 159 if (!time_in_range(jiffies, start, end)) {
144 dev_priv->hotplug.stats[pin].last_jiffies = jiffies; 160 hpd->stats[pin].last_jiffies = jiffies;
145 dev_priv->hotplug.stats[pin].count = 0; 161 hpd->stats[pin].count = 0;
146 DRM_DEBUG_KMS("Received HPD interrupt on PIN %d - cnt: 0\n", pin); 162 }
147 } else if (dev_priv->hotplug.stats[pin].count > threshold && 163
148 threshold) { 164 hpd->stats[pin].count += increment;
149 dev_priv->hotplug.stats[pin].state = HPD_MARK_DISABLED; 165 if (hpd->stats[pin].count > threshold) {
166 hpd->stats[pin].state = HPD_MARK_DISABLED;
150 DRM_DEBUG_KMS("HPD interrupt storm detected on PIN %d\n", pin); 167 DRM_DEBUG_KMS("HPD interrupt storm detected on PIN %d\n", pin);
151 storm = true; 168 storm = true;
152 } else { 169 } else {
153 dev_priv->hotplug.stats[pin].count++;
154 DRM_DEBUG_KMS("Received HPD interrupt on PIN %d - cnt: %d\n", pin, 170 DRM_DEBUG_KMS("Received HPD interrupt on PIN %d - cnt: %d\n", pin,
155 dev_priv->hotplug.stats[pin].count); 171 hpd->stats[pin].count);
156 } 172 }
157 173
158 return storm; 174 return storm;
159} 175}
160 176
161static void intel_hpd_irq_storm_disable(struct drm_i915_private *dev_priv) 177static void
178intel_hpd_irq_storm_switch_to_polling(struct drm_i915_private *dev_priv)
162{ 179{
163 struct drm_device *dev = &dev_priv->drm; 180 struct drm_device *dev = &dev_priv->drm;
164 struct intel_connector *intel_connector; 181 struct intel_connector *intel_connector;
@@ -228,7 +245,9 @@ static void intel_hpd_irq_storm_reenable_work(struct work_struct *work)
228 drm_for_each_connector_iter(connector, &conn_iter) { 245 drm_for_each_connector_iter(connector, &conn_iter) {
229 struct intel_connector *intel_connector = to_intel_connector(connector); 246 struct intel_connector *intel_connector = to_intel_connector(connector);
230 247
231 if (intel_connector->encoder->hpd_pin == pin) { 248 /* Don't check MST ports, they don't have pins */
249 if (!intel_connector->mst_port &&
250 intel_connector->encoder->hpd_pin == pin) {
232 if (connector->polled != intel_connector->polled) 251 if (connector->polled != intel_connector->polled)
233 DRM_DEBUG_DRIVER("Reenabling HPD on connector %s\n", 252 DRM_DEBUG_DRIVER("Reenabling HPD on connector %s\n",
234 connector->name); 253 connector->name);
@@ -346,8 +365,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
346 hpd_event_bits = dev_priv->hotplug.event_bits; 365 hpd_event_bits = dev_priv->hotplug.event_bits;
347 dev_priv->hotplug.event_bits = 0; 366 dev_priv->hotplug.event_bits = 0;
348 367
349 /* Disable hotplug on connectors that hit an irq storm. */ 368 /* Enable polling for connectors which had HPD IRQ storms */
350 intel_hpd_irq_storm_disable(dev_priv); 369 intel_hpd_irq_storm_switch_to_polling(dev_priv);
351 370
352 spin_unlock_irq(&dev_priv->irq_lock); 371 spin_unlock_irq(&dev_priv->irq_lock);
353 372
@@ -395,37 +414,54 @@ void intel_hpd_irq_handler(struct drm_i915_private *dev_priv,
395 struct intel_encoder *encoder; 414 struct intel_encoder *encoder;
396 bool storm_detected = false; 415 bool storm_detected = false;
397 bool queue_dig = false, queue_hp = false; 416 bool queue_dig = false, queue_hp = false;
417 u32 long_hpd_pulse_mask = 0;
418 u32 short_hpd_pulse_mask = 0;
419 enum hpd_pin pin;
398 420
399 if (!pin_mask) 421 if (!pin_mask)
400 return; 422 return;
401 423
402 spin_lock(&dev_priv->irq_lock); 424 spin_lock(&dev_priv->irq_lock);
425
426 /*
427 * Determine whether ->hpd_pulse() exists for each pin, and
428 * whether we have a short or a long pulse. This is needed
429 * as each pin may have up to two encoders (HDMI and DP) and
430 * only the one of them (DP) will have ->hpd_pulse().
431 */
403 for_each_intel_encoder(&dev_priv->drm, encoder) { 432 for_each_intel_encoder(&dev_priv->drm, encoder) {
404 enum hpd_pin pin = encoder->hpd_pin;
405 bool has_hpd_pulse = intel_encoder_has_hpd_pulse(encoder); 433 bool has_hpd_pulse = intel_encoder_has_hpd_pulse(encoder);
434 enum port port = encoder->port;
435 bool long_hpd;
406 436
437 pin = encoder->hpd_pin;
407 if (!(BIT(pin) & pin_mask)) 438 if (!(BIT(pin) & pin_mask))
408 continue; 439 continue;
409 440
410 if (has_hpd_pulse) { 441 if (!has_hpd_pulse)
411 bool long_hpd = long_mask & BIT(pin); 442 continue;
412 enum port port = encoder->port;
413 443
414 DRM_DEBUG_DRIVER("digital hpd port %c - %s\n", port_name(port), 444 long_hpd = long_mask & BIT(pin);
415 long_hpd ? "long" : "short"); 445
416 /* 446 DRM_DEBUG_DRIVER("digital hpd port %c - %s\n", port_name(port),
417 * For long HPD pulses we want to have the digital queue happen, 447 long_hpd ? "long" : "short");
418 * but we still want HPD storm detection to function. 448 queue_dig = true;
419 */ 449
420 queue_dig = true; 450 if (long_hpd) {
421 if (long_hpd) { 451 long_hpd_pulse_mask |= BIT(pin);
422 dev_priv->hotplug.long_port_mask |= (1 << port); 452 dev_priv->hotplug.long_port_mask |= BIT(port);
423 } else { 453 } else {
424 /* for short HPD just trigger the digital queue */ 454 short_hpd_pulse_mask |= BIT(pin);
425 dev_priv->hotplug.short_port_mask |= (1 << port); 455 dev_priv->hotplug.short_port_mask |= BIT(port);
426 continue;
427 }
428 } 456 }
457 }
458
459 /* Now process each pin just once */
460 for_each_hpd_pin(pin) {
461 bool long_hpd;
462
463 if (!(BIT(pin) & pin_mask))
464 continue;
429 465
430 if (dev_priv->hotplug.stats[pin].state == HPD_DISABLED) { 466 if (dev_priv->hotplug.stats[pin].state == HPD_DISABLED) {
431 /* 467 /*
@@ -442,17 +478,30 @@ void intel_hpd_irq_handler(struct drm_i915_private *dev_priv,
442 if (dev_priv->hotplug.stats[pin].state != HPD_ENABLED) 478 if (dev_priv->hotplug.stats[pin].state != HPD_ENABLED)
443 continue; 479 continue;
444 480
445 if (!has_hpd_pulse) { 481 /*
482 * Delegate to ->hpd_pulse() if one of the encoders for this
483 * pin has it, otherwise let the hotplug_work deal with this
484 * pin directly.
485 */
486 if (((short_hpd_pulse_mask | long_hpd_pulse_mask) & BIT(pin))) {
487 long_hpd = long_hpd_pulse_mask & BIT(pin);
488 } else {
446 dev_priv->hotplug.event_bits |= BIT(pin); 489 dev_priv->hotplug.event_bits |= BIT(pin);
490 long_hpd = true;
447 queue_hp = true; 491 queue_hp = true;
448 } 492 }
449 493
450 if (intel_hpd_irq_storm_detect(dev_priv, pin)) { 494 if (intel_hpd_irq_storm_detect(dev_priv, pin, long_hpd)) {
451 dev_priv->hotplug.event_bits &= ~BIT(pin); 495 dev_priv->hotplug.event_bits &= ~BIT(pin);
452 storm_detected = true; 496 storm_detected = true;
497 queue_hp = true;
453 } 498 }
454 } 499 }
455 500
501 /*
502 * Disable any IRQs that storms were detected on. Polling enablement
503 * happens later in our hotplug work.
504 */
456 if (storm_detected && dev_priv->display_irqs_enabled) 505 if (storm_detected && dev_priv->display_irqs_enabled)
457 dev_priv->display.hpd_irq_setup(dev_priv); 506 dev_priv->display.hpd_irq_setup(dev_priv);
458 spin_unlock(&dev_priv->irq_lock); 507 spin_unlock(&dev_priv->irq_lock);
diff --git a/drivers/gpu/drm/i915/intel_huc.c b/drivers/gpu/drm/i915/intel_huc.c
index 37ef540dd280..bc27b691d824 100644
--- a/drivers/gpu/drm/i915/intel_huc.c
+++ b/drivers/gpu/drm/i915/intel_huc.c
@@ -108,13 +108,14 @@ fail:
108 * This function reads status register to verify if HuC 108 * This function reads status register to verify if HuC
109 * firmware was successfully loaded. 109 * firmware was successfully loaded.
110 * 110 *
111 * Returns positive value if HuC firmware is loaded and verified 111 * Returns: 1 if HuC firmware is loaded and verified,
112 * and -ENODEV if HuC is not present. 112 * 0 if HuC firmware is not loaded and -ENODEV if HuC
113 * is not present on this platform.
113 */ 114 */
114int intel_huc_check_status(struct intel_huc *huc) 115int intel_huc_check_status(struct intel_huc *huc)
115{ 116{
116 struct drm_i915_private *dev_priv = huc_to_i915(huc); 117 struct drm_i915_private *dev_priv = huc_to_i915(huc);
117 u32 status; 118 bool status;
118 119
119 if (!HAS_HUC(dev_priv)) 120 if (!HAS_HUC(dev_priv))
120 return -ENODEV; 121 return -ENODEV;
diff --git a/drivers/gpu/drm/i915/intel_lpe_audio.c b/drivers/gpu/drm/i915/intel_lpe_audio.c
index cdf19553ffac..5d5336fbe7b0 100644
--- a/drivers/gpu/drm/i915/intel_lpe_audio.c
+++ b/drivers/gpu/drm/i915/intel_lpe_audio.c
@@ -297,8 +297,10 @@ void intel_lpe_audio_teardown(struct drm_i915_private *dev_priv)
297 lpe_audio_platdev_destroy(dev_priv); 297 lpe_audio_platdev_destroy(dev_priv);
298 298
299 irq_free_desc(dev_priv->lpe_audio.irq); 299 irq_free_desc(dev_priv->lpe_audio.irq);
300}
301 300
301 dev_priv->lpe_audio.irq = -1;
302 dev_priv->lpe_audio.platdev = NULL;
303}
302 304
303/** 305/**
304 * intel_lpe_audio_notify() - notify lpe audio event 306 * intel_lpe_audio_notify() - notify lpe audio event
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 43957bb37a42..08fd9b12e4d7 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -259,63 +259,6 @@ intel_lr_context_descriptor_update(struct i915_gem_context *ctx,
259 ce->lrc_desc = desc; 259 ce->lrc_desc = desc;
260} 260}
261 261
262static struct i915_priolist *
263lookup_priolist(struct intel_engine_cs *engine, int prio)
264{
265 struct intel_engine_execlists * const execlists = &engine->execlists;
266 struct i915_priolist *p;
267 struct rb_node **parent, *rb;
268 bool first = true;
269
270 if (unlikely(execlists->no_priolist))
271 prio = I915_PRIORITY_NORMAL;
272
273find_priolist:
274 /* most positive priority is scheduled first, equal priorities fifo */
275 rb = NULL;
276 parent = &execlists->queue.rb_root.rb_node;
277 while (*parent) {
278 rb = *parent;
279 p = to_priolist(rb);
280 if (prio > p->priority) {
281 parent = &rb->rb_left;
282 } else if (prio < p->priority) {
283 parent = &rb->rb_right;
284 first = false;
285 } else {
286 return p;
287 }
288 }
289
290 if (prio == I915_PRIORITY_NORMAL) {
291 p = &execlists->default_priolist;
292 } else {
293 p = kmem_cache_alloc(engine->i915->priorities, GFP_ATOMIC);
294 /* Convert an allocation failure to a priority bump */
295 if (unlikely(!p)) {
296 prio = I915_PRIORITY_NORMAL; /* recurses just once */
297
298 /* To maintain ordering with all rendering, after an
299 * allocation failure we have to disable all scheduling.
300 * Requests will then be executed in fifo, and schedule
301 * will ensure that dependencies are emitted in fifo.
302 * There will be still some reordering with existing
303 * requests, so if userspace lied about their
304 * dependencies that reordering may be visible.
305 */
306 execlists->no_priolist = true;
307 goto find_priolist;
308 }
309 }
310
311 p->priority = prio;
312 INIT_LIST_HEAD(&p->requests);
313 rb_link_node(&p->node, rb, parent);
314 rb_insert_color_cached(&p->node, &execlists->queue, first);
315
316 return p;
317}
318
319static void unwind_wa_tail(struct i915_request *rq) 262static void unwind_wa_tail(struct i915_request *rq)
320{ 263{
321 rq->tail = intel_ring_wrap(rq->ring, rq->wa_tail - WA_TAIL_BYTES); 264 rq->tail = intel_ring_wrap(rq->ring, rq->wa_tail - WA_TAIL_BYTES);
@@ -324,9 +267,9 @@ static void unwind_wa_tail(struct i915_request *rq)
324 267
325static void __unwind_incomplete_requests(struct intel_engine_cs *engine) 268static void __unwind_incomplete_requests(struct intel_engine_cs *engine)
326{ 269{
327 struct i915_request *rq, *rn; 270 struct i915_request *rq, *rn, *active = NULL;
328 struct i915_priolist *uninitialized_var(p); 271 struct list_head *uninitialized_var(pl);
329 int last_prio = I915_PRIORITY_INVALID; 272 int prio = I915_PRIORITY_INVALID | I915_PRIORITY_NEWCLIENT;
330 273
331 lockdep_assert_held(&engine->timeline.lock); 274 lockdep_assert_held(&engine->timeline.lock);
332 275
@@ -334,19 +277,34 @@ static void __unwind_incomplete_requests(struct intel_engine_cs *engine)
334 &engine->timeline.requests, 277 &engine->timeline.requests,
335 link) { 278 link) {
336 if (i915_request_completed(rq)) 279 if (i915_request_completed(rq))
337 return; 280 break;
338 281
339 __i915_request_unsubmit(rq); 282 __i915_request_unsubmit(rq);
340 unwind_wa_tail(rq); 283 unwind_wa_tail(rq);
341 284
285 GEM_BUG_ON(rq->hw_context->active);
286
342 GEM_BUG_ON(rq_prio(rq) == I915_PRIORITY_INVALID); 287 GEM_BUG_ON(rq_prio(rq) == I915_PRIORITY_INVALID);
343 if (rq_prio(rq) != last_prio) { 288 if (rq_prio(rq) != prio) {
344 last_prio = rq_prio(rq); 289 prio = rq_prio(rq);
345 p = lookup_priolist(engine, last_prio); 290 pl = i915_sched_lookup_priolist(engine, prio);
346 } 291 }
292 GEM_BUG_ON(RB_EMPTY_ROOT(&engine->execlists.queue.rb_root));
293
294 list_add(&rq->sched.link, pl);
347 295
348 GEM_BUG_ON(p->priority != rq_prio(rq)); 296 active = rq;
349 list_add(&rq->sched.link, &p->requests); 297 }
298
299 /*
300 * The active request is now effectively the start of a new client
301 * stream, so give it the equivalent small priority bump to prevent
302 * it being gazumped a second time by another peer.
303 */
304 if (!(prio & I915_PRIORITY_NEWCLIENT)) {
305 prio |= I915_PRIORITY_NEWCLIENT;
306 list_move_tail(&active->sched.link,
307 i915_sched_lookup_priolist(engine, prio));
350 } 308 }
351} 309}
352 310
@@ -355,13 +313,8 @@ execlists_unwind_incomplete_requests(struct intel_engine_execlists *execlists)
355{ 313{
356 struct intel_engine_cs *engine = 314 struct intel_engine_cs *engine =
357 container_of(execlists, typeof(*engine), execlists); 315 container_of(execlists, typeof(*engine), execlists);
358 unsigned long flags;
359
360 spin_lock_irqsave(&engine->timeline.lock, flags);
361 316
362 __unwind_incomplete_requests(engine); 317 __unwind_incomplete_requests(engine);
363
364 spin_unlock_irqrestore(&engine->timeline.lock, flags);
365} 318}
366 319
367static inline void 320static inline void
@@ -394,13 +347,17 @@ execlists_user_end(struct intel_engine_execlists *execlists)
394static inline void 347static inline void
395execlists_context_schedule_in(struct i915_request *rq) 348execlists_context_schedule_in(struct i915_request *rq)
396{ 349{
350 GEM_BUG_ON(rq->hw_context->active);
351
397 execlists_context_status_change(rq, INTEL_CONTEXT_SCHEDULE_IN); 352 execlists_context_status_change(rq, INTEL_CONTEXT_SCHEDULE_IN);
398 intel_engine_context_in(rq->engine); 353 intel_engine_context_in(rq->engine);
354 rq->hw_context->active = rq->engine;
399} 355}
400 356
401static inline void 357static inline void
402execlists_context_schedule_out(struct i915_request *rq, unsigned long status) 358execlists_context_schedule_out(struct i915_request *rq, unsigned long status)
403{ 359{
360 rq->hw_context->active = NULL;
404 intel_engine_context_out(rq->engine); 361 intel_engine_context_out(rq->engine);
405 execlists_context_status_change(rq, status); 362 execlists_context_status_change(rq, status);
406 trace_i915_request_out(rq); 363 trace_i915_request_out(rq);
@@ -417,21 +374,32 @@ execlists_update_context_pdps(struct i915_hw_ppgtt *ppgtt, u32 *reg_state)
417 374
418static u64 execlists_update_context(struct i915_request *rq) 375static u64 execlists_update_context(struct i915_request *rq)
419{ 376{
377 struct i915_hw_ppgtt *ppgtt = rq->gem_context->ppgtt;
420 struct intel_context *ce = rq->hw_context; 378 struct intel_context *ce = rq->hw_context;
421 struct i915_hw_ppgtt *ppgtt =
422 rq->gem_context->ppgtt ?: rq->i915->mm.aliasing_ppgtt;
423 u32 *reg_state = ce->lrc_reg_state; 379 u32 *reg_state = ce->lrc_reg_state;
424 380
425 reg_state[CTX_RING_TAIL+1] = intel_ring_set_tail(rq->ring, rq->tail); 381 reg_state[CTX_RING_TAIL+1] = intel_ring_set_tail(rq->ring, rq->tail);
426 382
427 /* True 32b PPGTT with dynamic page allocation: update PDP 383 /*
384 * True 32b PPGTT with dynamic page allocation: update PDP
428 * registers and point the unallocated PDPs to scratch page. 385 * registers and point the unallocated PDPs to scratch page.
429 * PML4 is allocated during ppgtt init, so this is not needed 386 * PML4 is allocated during ppgtt init, so this is not needed
430 * in 48-bit mode. 387 * in 48-bit mode.
431 */ 388 */
432 if (ppgtt && !i915_vm_is_48bit(&ppgtt->vm)) 389 if (!i915_vm_is_48bit(&ppgtt->vm))
433 execlists_update_context_pdps(ppgtt, reg_state); 390 execlists_update_context_pdps(ppgtt, reg_state);
434 391
392 /*
393 * Make sure the context image is complete before we submit it to HW.
394 *
395 * Ostensibly, writes (including the WCB) should be flushed prior to
396 * an uncached write such as our mmio register access, the empirical
397 * evidence (esp. on Braswell) suggests that the WC write into memory
398 * may not be visible to the HW prior to the completion of the UC
399 * register write and that we may begin execution from the context
400 * before its image is complete leading to invalid PD chasing.
401 */
402 wmb();
435 return ce->lrc_desc; 403 return ce->lrc_desc;
436} 404}
437 405
@@ -669,8 +637,9 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
669 while ((rb = rb_first_cached(&execlists->queue))) { 637 while ((rb = rb_first_cached(&execlists->queue))) {
670 struct i915_priolist *p = to_priolist(rb); 638 struct i915_priolist *p = to_priolist(rb);
671 struct i915_request *rq, *rn; 639 struct i915_request *rq, *rn;
640 int i;
672 641
673 list_for_each_entry_safe(rq, rn, &p->requests, sched.link) { 642 priolist_for_each_request_consume(rq, rn, p, i) {
674 /* 643 /*
675 * Can we combine this request with the current port? 644 * Can we combine this request with the current port?
676 * It has to be the same context/ringbuffer and not 645 * It has to be the same context/ringbuffer and not
@@ -689,11 +658,8 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
689 * combine this request with the last, then we 658 * combine this request with the last, then we
690 * are done. 659 * are done.
691 */ 660 */
692 if (port == last_port) { 661 if (port == last_port)
693 __list_del_many(&p->requests,
694 &rq->sched.link);
695 goto done; 662 goto done;
696 }
697 663
698 /* 664 /*
699 * If GVT overrides us we only ever submit 665 * If GVT overrides us we only ever submit
@@ -703,11 +669,8 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
703 * request) to the second port. 669 * request) to the second port.
704 */ 670 */
705 if (ctx_single_port_submission(last->hw_context) || 671 if (ctx_single_port_submission(last->hw_context) ||
706 ctx_single_port_submission(rq->hw_context)) { 672 ctx_single_port_submission(rq->hw_context))
707 __list_del_many(&p->requests,
708 &rq->sched.link);
709 goto done; 673 goto done;
710 }
711 674
712 GEM_BUG_ON(last->hw_context == rq->hw_context); 675 GEM_BUG_ON(last->hw_context == rq->hw_context);
713 676
@@ -718,15 +681,16 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
718 GEM_BUG_ON(port_isset(port)); 681 GEM_BUG_ON(port_isset(port));
719 } 682 }
720 683
721 INIT_LIST_HEAD(&rq->sched.link); 684 list_del_init(&rq->sched.link);
685
722 __i915_request_submit(rq); 686 __i915_request_submit(rq);
723 trace_i915_request_in(rq, port_index(port, execlists)); 687 trace_i915_request_in(rq, port_index(port, execlists));
688
724 last = rq; 689 last = rq;
725 submit = true; 690 submit = true;
726 } 691 }
727 692
728 rb_erase_cached(&p->node, &execlists->queue); 693 rb_erase_cached(&p->node, &execlists->queue);
729 INIT_LIST_HEAD(&p->requests);
730 if (p->priority != I915_PRIORITY_NORMAL) 694 if (p->priority != I915_PRIORITY_NORMAL)
731 kmem_cache_free(engine->i915->priorities, p); 695 kmem_cache_free(engine->i915->priorities, p);
732 } 696 }
@@ -861,16 +825,16 @@ static void execlists_cancel_requests(struct intel_engine_cs *engine)
861 /* Flush the queued requests to the timeline list (for retiring). */ 825 /* Flush the queued requests to the timeline list (for retiring). */
862 while ((rb = rb_first_cached(&execlists->queue))) { 826 while ((rb = rb_first_cached(&execlists->queue))) {
863 struct i915_priolist *p = to_priolist(rb); 827 struct i915_priolist *p = to_priolist(rb);
828 int i;
864 829
865 list_for_each_entry_safe(rq, rn, &p->requests, sched.link) { 830 priolist_for_each_request_consume(rq, rn, p, i) {
866 INIT_LIST_HEAD(&rq->sched.link); 831 list_del_init(&rq->sched.link);
867 832
868 dma_fence_set_error(&rq->fence, -EIO); 833 dma_fence_set_error(&rq->fence, -EIO);
869 __i915_request_submit(rq); 834 __i915_request_submit(rq);
870 } 835 }
871 836
872 rb_erase_cached(&p->node, &execlists->queue); 837 rb_erase_cached(&p->node, &execlists->queue);
873 INIT_LIST_HEAD(&p->requests);
874 if (p->priority != I915_PRIORITY_NORMAL) 838 if (p->priority != I915_PRIORITY_NORMAL)
875 kmem_cache_free(engine->i915->priorities, p); 839 kmem_cache_free(engine->i915->priorities, p);
876 } 840 }
@@ -1076,13 +1040,7 @@ static void queue_request(struct intel_engine_cs *engine,
1076 struct i915_sched_node *node, 1040 struct i915_sched_node *node,
1077 int prio) 1041 int prio)
1078{ 1042{
1079 list_add_tail(&node->link, 1043 list_add_tail(&node->link, i915_sched_lookup_priolist(engine, prio));
1080 &lookup_priolist(engine, prio)->requests);
1081}
1082
1083static void __update_queue(struct intel_engine_cs *engine, int prio)
1084{
1085 engine->execlists.queue_priority = prio;
1086} 1044}
1087 1045
1088static void __submit_queue_imm(struct intel_engine_cs *engine) 1046static void __submit_queue_imm(struct intel_engine_cs *engine)
@@ -1101,7 +1059,7 @@ static void __submit_queue_imm(struct intel_engine_cs *engine)
1101static void submit_queue(struct intel_engine_cs *engine, int prio) 1059static void submit_queue(struct intel_engine_cs *engine, int prio)
1102{ 1060{
1103 if (prio > engine->execlists.queue_priority) { 1061 if (prio > engine->execlists.queue_priority) {
1104 __update_queue(engine, prio); 1062 engine->execlists.queue_priority = prio;
1105 __submit_queue_imm(engine); 1063 __submit_queue_imm(engine);
1106 } 1064 }
1107} 1065}
@@ -1124,139 +1082,6 @@ static void execlists_submit_request(struct i915_request *request)
1124 spin_unlock_irqrestore(&engine->timeline.lock, flags); 1082 spin_unlock_irqrestore(&engine->timeline.lock, flags);
1125} 1083}
1126 1084
1127static struct i915_request *sched_to_request(struct i915_sched_node *node)
1128{
1129 return container_of(node, struct i915_request, sched);
1130}
1131
1132static struct intel_engine_cs *
1133sched_lock_engine(struct i915_sched_node *node, struct intel_engine_cs *locked)
1134{
1135 struct intel_engine_cs *engine = sched_to_request(node)->engine;
1136
1137 GEM_BUG_ON(!locked);
1138
1139 if (engine != locked) {
1140 spin_unlock(&locked->timeline.lock);
1141 spin_lock(&engine->timeline.lock);
1142 }
1143
1144 return engine;
1145}
1146
1147static void execlists_schedule(struct i915_request *request,
1148 const struct i915_sched_attr *attr)
1149{
1150 struct i915_priolist *uninitialized_var(pl);
1151 struct intel_engine_cs *engine, *last;
1152 struct i915_dependency *dep, *p;
1153 struct i915_dependency stack;
1154 const int prio = attr->priority;
1155 LIST_HEAD(dfs);
1156
1157 GEM_BUG_ON(prio == I915_PRIORITY_INVALID);
1158
1159 if (i915_request_completed(request))
1160 return;
1161
1162 if (prio <= READ_ONCE(request->sched.attr.priority))
1163 return;
1164
1165 /* Need BKL in order to use the temporary link inside i915_dependency */
1166 lockdep_assert_held(&request->i915->drm.struct_mutex);
1167
1168 stack.signaler = &request->sched;
1169 list_add(&stack.dfs_link, &dfs);
1170
1171 /*
1172 * Recursively bump all dependent priorities to match the new request.
1173 *
1174 * A naive approach would be to use recursion:
1175 * static void update_priorities(struct i915_sched_node *node, prio) {
1176 * list_for_each_entry(dep, &node->signalers_list, signal_link)
1177 * update_priorities(dep->signal, prio)
1178 * queue_request(node);
1179 * }
1180 * but that may have unlimited recursion depth and so runs a very
1181 * real risk of overunning the kernel stack. Instead, we build
1182 * a flat list of all dependencies starting with the current request.
1183 * As we walk the list of dependencies, we add all of its dependencies
1184 * to the end of the list (this may include an already visited
1185 * request) and continue to walk onwards onto the new dependencies. The
1186 * end result is a topological list of requests in reverse order, the
1187 * last element in the list is the request we must execute first.
1188 */
1189 list_for_each_entry(dep, &dfs, dfs_link) {
1190 struct i915_sched_node *node = dep->signaler;
1191
1192 /*
1193 * Within an engine, there can be no cycle, but we may
1194 * refer to the same dependency chain multiple times
1195 * (redundant dependencies are not eliminated) and across
1196 * engines.
1197 */
1198 list_for_each_entry(p, &node->signalers_list, signal_link) {
1199 GEM_BUG_ON(p == dep); /* no cycles! */
1200
1201 if (i915_sched_node_signaled(p->signaler))
1202 continue;
1203
1204 GEM_BUG_ON(p->signaler->attr.priority < node->attr.priority);
1205 if (prio > READ_ONCE(p->signaler->attr.priority))
1206 list_move_tail(&p->dfs_link, &dfs);
1207 }
1208 }
1209
1210 /*
1211 * If we didn't need to bump any existing priorities, and we haven't
1212 * yet submitted this request (i.e. there is no potential race with
1213 * execlists_submit_request()), we can set our own priority and skip
1214 * acquiring the engine locks.
1215 */
1216 if (request->sched.attr.priority == I915_PRIORITY_INVALID) {
1217 GEM_BUG_ON(!list_empty(&request->sched.link));
1218 request->sched.attr = *attr;
1219 if (stack.dfs_link.next == stack.dfs_link.prev)
1220 return;
1221 __list_del_entry(&stack.dfs_link);
1222 }
1223
1224 last = NULL;
1225 engine = request->engine;
1226 spin_lock_irq(&engine->timeline.lock);
1227
1228 /* Fifo and depth-first replacement ensure our deps execute before us */
1229 list_for_each_entry_safe_reverse(dep, p, &dfs, dfs_link) {
1230 struct i915_sched_node *node = dep->signaler;
1231
1232 INIT_LIST_HEAD(&dep->dfs_link);
1233
1234 engine = sched_lock_engine(node, engine);
1235
1236 if (prio <= node->attr.priority)
1237 continue;
1238
1239 node->attr.priority = prio;
1240 if (!list_empty(&node->link)) {
1241 if (last != engine) {
1242 pl = lookup_priolist(engine, prio);
1243 last = engine;
1244 }
1245 GEM_BUG_ON(pl->priority != prio);
1246 list_move_tail(&node->link, &pl->requests);
1247 }
1248
1249 if (prio > engine->execlists.queue_priority &&
1250 i915_sw_fence_done(&sched_to_request(node)->submit)) {
1251 /* defer submission until after all of our updates */
1252 __update_queue(engine, prio);
1253 tasklet_hi_schedule(&engine->execlists.tasklet);
1254 }
1255 }
1256
1257 spin_unlock_irq(&engine->timeline.lock);
1258}
1259
1260static void execlists_context_destroy(struct intel_context *ce) 1085static void execlists_context_destroy(struct intel_context *ce)
1261{ 1086{
1262 GEM_BUG_ON(ce->pin_count); 1087 GEM_BUG_ON(ce->pin_count);
@@ -1272,6 +1097,28 @@ static void execlists_context_destroy(struct intel_context *ce)
1272 1097
1273static void execlists_context_unpin(struct intel_context *ce) 1098static void execlists_context_unpin(struct intel_context *ce)
1274{ 1099{
1100 struct intel_engine_cs *engine;
1101
1102 /*
1103 * The tasklet may still be using a pointer to our state, via an
1104 * old request. However, since we know we only unpin the context
1105 * on retirement of the following request, we know that the last
1106 * request referencing us will have had a completion CS interrupt.
1107 * If we see that it is still active, it means that the tasklet hasn't
1108 * had the chance to run yet; let it run before we teardown the
1109 * reference it may use.
1110 */
1111 engine = READ_ONCE(ce->active);
1112 if (unlikely(engine)) {
1113 unsigned long flags;
1114
1115 spin_lock_irqsave(&engine->timeline.lock, flags);
1116 process_csb(engine);
1117 spin_unlock_irqrestore(&engine->timeline.lock, flags);
1118
1119 GEM_BUG_ON(READ_ONCE(ce->active));
1120 }
1121
1275 i915_gem_context_unpin_hw_id(ce->gem_context); 1122 i915_gem_context_unpin_hw_id(ce->gem_context);
1276 1123
1277 intel_ring_unpin(ce->ring); 1124 intel_ring_unpin(ce->ring);
@@ -1375,6 +1222,7 @@ execlists_context_pin(struct intel_engine_cs *engine,
1375 struct intel_context *ce = to_intel_context(ctx, engine); 1222 struct intel_context *ce = to_intel_context(ctx, engine);
1376 1223
1377 lockdep_assert_held(&ctx->i915->drm.struct_mutex); 1224 lockdep_assert_held(&ctx->i915->drm.struct_mutex);
1225 GEM_BUG_ON(!ctx->ppgtt);
1378 1226
1379 if (likely(ce->pin_count++)) 1227 if (likely(ce->pin_count++))
1380 return ce; 1228 return ce;
@@ -1679,7 +1527,7 @@ static int intel_init_workaround_bb(struct intel_engine_cs *engine)
1679 unsigned int i; 1527 unsigned int i;
1680 int ret; 1528 int ret;
1681 1529
1682 if (GEM_WARN_ON(engine->id != RCS)) 1530 if (GEM_DEBUG_WARN_ON(engine->id != RCS))
1683 return -EINVAL; 1531 return -EINVAL;
1684 1532
1685 switch (INTEL_GEN(engine->i915)) { 1533 switch (INTEL_GEN(engine->i915)) {
@@ -1718,8 +1566,8 @@ static int intel_init_workaround_bb(struct intel_engine_cs *engine)
1718 */ 1566 */
1719 for (i = 0; i < ARRAY_SIZE(wa_bb_fn); i++) { 1567 for (i = 0; i < ARRAY_SIZE(wa_bb_fn); i++) {
1720 wa_bb[i]->offset = batch_ptr - batch; 1568 wa_bb[i]->offset = batch_ptr - batch;
1721 if (GEM_WARN_ON(!IS_ALIGNED(wa_bb[i]->offset, 1569 if (GEM_DEBUG_WARN_ON(!IS_ALIGNED(wa_bb[i]->offset,
1722 CACHELINE_BYTES))) { 1570 CACHELINE_BYTES))) {
1723 ret = -EINVAL; 1571 ret = -EINVAL;
1724 break; 1572 break;
1725 } 1573 }
@@ -1902,7 +1750,7 @@ static void execlists_reset(struct intel_engine_cs *engine,
1902 unsigned long flags; 1750 unsigned long flags;
1903 u32 *regs; 1751 u32 *regs;
1904 1752
1905 GEM_TRACE("%s request global=%x, current=%d\n", 1753 GEM_TRACE("%s request global=%d, current=%d\n",
1906 engine->name, request ? request->global_seqno : 0, 1754 engine->name, request ? request->global_seqno : 0,
1907 intel_engine_get_seqno(engine)); 1755 intel_engine_get_seqno(engine));
1908 1756
@@ -2029,8 +1877,7 @@ static int gen8_emit_bb_start(struct i915_request *rq,
2029 * it is unsafe in case of lite-restore (because the ctx is 1877 * it is unsafe in case of lite-restore (because the ctx is
2030 * not idle). PML4 is allocated during ppgtt init so this is 1878 * not idle). PML4 is allocated during ppgtt init so this is
2031 * not needed in 48-bit.*/ 1879 * not needed in 48-bit.*/
2032 if (rq->gem_context->ppgtt && 1880 if ((intel_engine_flag(rq->engine) & rq->gem_context->ppgtt->pd_dirty_rings) &&
2033 (intel_engine_flag(rq->engine) & rq->gem_context->ppgtt->pd_dirty_rings) &&
2034 !i915_vm_is_48bit(&rq->gem_context->ppgtt->vm) && 1881 !i915_vm_is_48bit(&rq->gem_context->ppgtt->vm) &&
2035 !intel_vgpu_active(rq->i915)) { 1882 !intel_vgpu_active(rq->i915)) {
2036 ret = intel_logical_ring_emit_pdps(rq); 1883 ret = intel_logical_ring_emit_pdps(rq);
@@ -2109,7 +1956,7 @@ static int gen8_emit_flush(struct i915_request *request, u32 mode)
2109 1956
2110 if (mode & EMIT_INVALIDATE) { 1957 if (mode & EMIT_INVALIDATE) {
2111 cmd |= MI_INVALIDATE_TLB; 1958 cmd |= MI_INVALIDATE_TLB;
2112 if (request->engine->id == VCS) 1959 if (request->engine->class == VIDEO_DECODE_CLASS)
2113 cmd |= MI_INVALIDATE_BSD; 1960 cmd |= MI_INVALIDATE_BSD;
2114 } 1961 }
2115 1962
@@ -2294,7 +2141,7 @@ void intel_execlists_set_default_submission(struct intel_engine_cs *engine)
2294{ 2141{
2295 engine->submit_request = execlists_submit_request; 2142 engine->submit_request = execlists_submit_request;
2296 engine->cancel_requests = execlists_cancel_requests; 2143 engine->cancel_requests = execlists_cancel_requests;
2297 engine->schedule = execlists_schedule; 2144 engine->schedule = i915_schedule;
2298 engine->execlists.tasklet.func = execlists_submission_tasklet; 2145 engine->execlists.tasklet.func = execlists_submission_tasklet;
2299 2146
2300 engine->reset.prepare = execlists_reset_prepare; 2147 engine->reset.prepare = execlists_reset_prepare;
@@ -2632,7 +2479,6 @@ static void execlists_init_reg_state(u32 *regs,
2632 struct intel_ring *ring) 2479 struct intel_ring *ring)
2633{ 2480{
2634 struct drm_i915_private *dev_priv = engine->i915; 2481 struct drm_i915_private *dev_priv = engine->i915;
2635 struct i915_hw_ppgtt *ppgtt = ctx->ppgtt ?: dev_priv->mm.aliasing_ppgtt;
2636 u32 base = engine->mmio_base; 2482 u32 base = engine->mmio_base;
2637 bool rcs = engine->class == RENDER_CLASS; 2483 bool rcs = engine->class == RENDER_CLASS;
2638 2484
@@ -2704,12 +2550,12 @@ static void execlists_init_reg_state(u32 *regs,
2704 CTX_REG(regs, CTX_PDP0_UDW, GEN8_RING_PDP_UDW(engine, 0), 0); 2550 CTX_REG(regs, CTX_PDP0_UDW, GEN8_RING_PDP_UDW(engine, 0), 0);
2705 CTX_REG(regs, CTX_PDP0_LDW, GEN8_RING_PDP_LDW(engine, 0), 0); 2551 CTX_REG(regs, CTX_PDP0_LDW, GEN8_RING_PDP_LDW(engine, 0), 0);
2706 2552
2707 if (ppgtt && i915_vm_is_48bit(&ppgtt->vm)) { 2553 if (i915_vm_is_48bit(&ctx->ppgtt->vm)) {
2708 /* 64b PPGTT (48bit canonical) 2554 /* 64b PPGTT (48bit canonical)
2709 * PDP0_DESCRIPTOR contains the base address to PML4 and 2555 * PDP0_DESCRIPTOR contains the base address to PML4 and
2710 * other PDP Descriptors are ignored. 2556 * other PDP Descriptors are ignored.
2711 */ 2557 */
2712 ASSIGN_CTX_PML4(ppgtt, regs); 2558 ASSIGN_CTX_PML4(ctx->ppgtt, regs);
2713 } 2559 }
2714 2560
2715 if (rcs) { 2561 if (rcs) {
diff --git a/drivers/gpu/drm/i915/intel_lspcon.c b/drivers/gpu/drm/i915/intel_lspcon.c
index 3e085c5f2b81..96a8d9524b0c 100644
--- a/drivers/gpu/drm/i915/intel_lspcon.c
+++ b/drivers/gpu/drm/i915/intel_lspcon.c
@@ -27,6 +27,22 @@
27#include <drm/drm_dp_dual_mode_helper.h> 27#include <drm/drm_dp_dual_mode_helper.h>
28#include "intel_drv.h" 28#include "intel_drv.h"
29 29
30/* LSPCON OUI Vendor ID(signatures) */
31#define LSPCON_VENDOR_PARADE_OUI 0x001CF8
32#define LSPCON_VENDOR_MCA_OUI 0x0060AD
33
34/* AUX addresses to write MCA AVI IF */
35#define LSPCON_MCA_AVI_IF_WRITE_OFFSET 0x5C0
36#define LSPCON_MCA_AVI_IF_CTRL 0x5DF
37#define LSPCON_MCA_AVI_IF_KICKOFF (1 << 0)
38#define LSPCON_MCA_AVI_IF_HANDLED (1 << 1)
39
40/* AUX addresses to write Parade AVI IF */
41#define LSPCON_PARADE_AVI_IF_WRITE_OFFSET 0x516
42#define LSPCON_PARADE_AVI_IF_CTRL 0x51E
43#define LSPCON_PARADE_AVI_IF_KICKOFF (1 << 7)
44#define LSPCON_PARADE_AVI_IF_DATA_SIZE 32
45
30static struct intel_dp *lspcon_to_intel_dp(struct intel_lspcon *lspcon) 46static struct intel_dp *lspcon_to_intel_dp(struct intel_lspcon *lspcon)
31{ 47{
32 struct intel_digital_port *dig_port = 48 struct intel_digital_port *dig_port =
@@ -50,6 +66,40 @@ static const char *lspcon_mode_name(enum drm_lspcon_mode mode)
50 } 66 }
51} 67}
52 68
69static bool lspcon_detect_vendor(struct intel_lspcon *lspcon)
70{
71 struct intel_dp *dp = lspcon_to_intel_dp(lspcon);
72 struct drm_dp_dpcd_ident *ident;
73 u32 vendor_oui;
74
75 if (drm_dp_read_desc(&dp->aux, &dp->desc, drm_dp_is_branch(dp->dpcd))) {
76 DRM_ERROR("Can't read description\n");
77 return false;
78 }
79
80 ident = &dp->desc.ident;
81 vendor_oui = (ident->oui[0] << 16) | (ident->oui[1] << 8) |
82 ident->oui[2];
83
84 switch (vendor_oui) {
85 case LSPCON_VENDOR_MCA_OUI:
86 lspcon->vendor = LSPCON_VENDOR_MCA;
87 DRM_DEBUG_KMS("Vendor: Mega Chips\n");
88 break;
89
90 case LSPCON_VENDOR_PARADE_OUI:
91 lspcon->vendor = LSPCON_VENDOR_PARADE;
92 DRM_DEBUG_KMS("Vendor: Parade Tech\n");
93 break;
94
95 default:
96 DRM_ERROR("Invalid/Unknown vendor OUI\n");
97 return false;
98 }
99
100 return true;
101}
102
53static enum drm_lspcon_mode lspcon_get_current_mode(struct intel_lspcon *lspcon) 103static enum drm_lspcon_mode lspcon_get_current_mode(struct intel_lspcon *lspcon)
54{ 104{
55 enum drm_lspcon_mode current_mode; 105 enum drm_lspcon_mode current_mode;
@@ -130,6 +180,21 @@ static bool lspcon_wake_native_aux_ch(struct intel_lspcon *lspcon)
130 return true; 180 return true;
131} 181}
132 182
183void lspcon_ycbcr420_config(struct drm_connector *connector,
184 struct intel_crtc_state *crtc_state)
185{
186 const struct drm_display_info *info = &connector->display_info;
187 const struct drm_display_mode *adjusted_mode =
188 &crtc_state->base.adjusted_mode;
189
190 if (drm_mode_is_420_only(info, adjusted_mode) &&
191 connector->ycbcr_420_allowed) {
192 crtc_state->port_clock /= 2;
193 crtc_state->output_format = INTEL_OUTPUT_FORMAT_YCBCR444;
194 crtc_state->lspcon_downsampling = true;
195 }
196}
197
133static bool lspcon_probe(struct intel_lspcon *lspcon) 198static bool lspcon_probe(struct intel_lspcon *lspcon)
134{ 199{
135 int retry; 200 int retry;
@@ -159,7 +224,18 @@ static bool lspcon_probe(struct intel_lspcon *lspcon)
159 /* Yay ... got a LSPCON device */ 224 /* Yay ... got a LSPCON device */
160 DRM_DEBUG_KMS("LSPCON detected\n"); 225 DRM_DEBUG_KMS("LSPCON detected\n");
161 lspcon->mode = lspcon_wait_mode(lspcon, expected_mode); 226 lspcon->mode = lspcon_wait_mode(lspcon, expected_mode);
162 lspcon->active = true; 227
228 /*
229 * In the SW state machine, lets Put LSPCON in PCON mode only.
230 * In this way, it will work with both HDMI 1.4 sinks as well as HDMI
231 * 2.0 sinks.
232 */
233 if (lspcon->mode != DRM_LSPCON_MODE_PCON) {
234 if (lspcon_change_mode(lspcon, DRM_LSPCON_MODE_PCON) < 0) {
235 DRM_ERROR("LSPCON mode change to PCON failed\n");
236 return false;
237 }
238 }
163 return true; 239 return true;
164} 240}
165 241
@@ -185,6 +261,255 @@ static void lspcon_resume_in_pcon_wa(struct intel_lspcon *lspcon)
185 DRM_DEBUG_KMS("LSPCON DP descriptor mismatch after resume\n"); 261 DRM_DEBUG_KMS("LSPCON DP descriptor mismatch after resume\n");
186} 262}
187 263
264static bool lspcon_parade_fw_ready(struct drm_dp_aux *aux)
265{
266 u8 avi_if_ctrl;
267 u8 retry;
268 ssize_t ret;
269
270 /* Check if LSPCON FW is ready for data */
271 for (retry = 0; retry < 5; retry++) {
272 if (retry)
273 usleep_range(200, 300);
274
275 ret = drm_dp_dpcd_read(aux, LSPCON_PARADE_AVI_IF_CTRL,
276 &avi_if_ctrl, 1);
277 if (ret < 0) {
278 DRM_ERROR("Failed to read AVI IF control\n");
279 return false;
280 }
281
282 if ((avi_if_ctrl & LSPCON_PARADE_AVI_IF_KICKOFF) == 0)
283 return true;
284 }
285
286 DRM_ERROR("Parade FW not ready to accept AVI IF\n");
287 return false;
288}
289
290static bool _lspcon_parade_write_infoframe_blocks(struct drm_dp_aux *aux,
291 uint8_t *avi_buf)
292{
293 u8 avi_if_ctrl;
294 u8 block_count = 0;
295 u8 *data;
296 uint16_t reg;
297 ssize_t ret;
298
299 while (block_count < 4) {
300 if (!lspcon_parade_fw_ready(aux)) {
301 DRM_DEBUG_KMS("LSPCON FW not ready, block %d\n",
302 block_count);
303 return false;
304 }
305
306 reg = LSPCON_PARADE_AVI_IF_WRITE_OFFSET;
307 data = avi_buf + block_count * 8;
308 ret = drm_dp_dpcd_write(aux, reg, data, 8);
309 if (ret < 0) {
310 DRM_ERROR("Failed to write AVI IF block %d\n",
311 block_count);
312 return false;
313 }
314
315 /*
316 * Once a block of data is written, we have to inform the FW
317 * about this by writing into avi infoframe control register:
318 * - set the kickoff bit[7] to 1
319 * - write the block no. to bits[1:0]
320 */
321 reg = LSPCON_PARADE_AVI_IF_CTRL;
322 avi_if_ctrl = LSPCON_PARADE_AVI_IF_KICKOFF | block_count;
323 ret = drm_dp_dpcd_write(aux, reg, &avi_if_ctrl, 1);
324 if (ret < 0) {
325 DRM_ERROR("Failed to update (0x%x), block %d\n",
326 reg, block_count);
327 return false;
328 }
329
330 block_count++;
331 }
332
333 DRM_DEBUG_KMS("Wrote AVI IF blocks successfully\n");
334 return true;
335}
336
337static bool _lspcon_write_avi_infoframe_parade(struct drm_dp_aux *aux,
338 const uint8_t *frame,
339 ssize_t len)
340{
341 uint8_t avi_if[LSPCON_PARADE_AVI_IF_DATA_SIZE] = {1, };
342
343 /*
344 * Parade's frames contains 32 bytes of data, divided
345 * into 4 frames:
346 * Token byte (first byte of first frame, must be non-zero)
347 * HB0 to HB2 from AVI IF (3 bytes header)
348 * PB0 to PB27 from AVI IF (28 bytes data)
349 * So it should look like this
350 * first block: | <token> <HB0-HB2> <DB0-DB3> |
351 * next 3 blocks: |<DB4-DB11>|<DB12-DB19>|<DB20-DB28>|
352 */
353
354 if (len > LSPCON_PARADE_AVI_IF_DATA_SIZE - 1) {
355 DRM_ERROR("Invalid length of infoframes\n");
356 return false;
357 }
358
359 memcpy(&avi_if[1], frame, len);
360
361 if (!_lspcon_parade_write_infoframe_blocks(aux, avi_if)) {
362 DRM_DEBUG_KMS("Failed to write infoframe blocks\n");
363 return false;
364 }
365
366 return true;
367}
368
369static bool _lspcon_write_avi_infoframe_mca(struct drm_dp_aux *aux,
370 const uint8_t *buffer, ssize_t len)
371{
372 int ret;
373 uint32_t val = 0;
374 uint32_t retry;
375 uint16_t reg;
376 const uint8_t *data = buffer;
377
378 reg = LSPCON_MCA_AVI_IF_WRITE_OFFSET;
379 while (val < len) {
380 /* DPCD write for AVI IF can fail on a slow FW day, so retry */
381 for (retry = 0; retry < 5; retry++) {
382 ret = drm_dp_dpcd_write(aux, reg, (void *)data, 1);
383 if (ret == 1) {
384 break;
385 } else if (retry < 4) {
386 mdelay(50);
387 continue;
388 } else {
389 DRM_ERROR("DPCD write failed at:0x%x\n", reg);
390 return false;
391 }
392 }
393 val++; reg++; data++;
394 }
395
396 val = 0;
397 reg = LSPCON_MCA_AVI_IF_CTRL;
398 ret = drm_dp_dpcd_read(aux, reg, &val, 1);
399 if (ret < 0) {
400 DRM_ERROR("DPCD read failed, address 0x%x\n", reg);
401 return false;
402 }
403
404 /* Indicate LSPCON chip about infoframe, clear bit 1 and set bit 0 */
405 val &= ~LSPCON_MCA_AVI_IF_HANDLED;
406 val |= LSPCON_MCA_AVI_IF_KICKOFF;
407
408 ret = drm_dp_dpcd_write(aux, reg, &val, 1);
409 if (ret < 0) {
410 DRM_ERROR("DPCD read failed, address 0x%x\n", reg);
411 return false;
412 }
413
414 val = 0;
415 ret = drm_dp_dpcd_read(aux, reg, &val, 1);
416 if (ret < 0) {
417 DRM_ERROR("DPCD read failed, address 0x%x\n", reg);
418 return false;
419 }
420
421 if (val == LSPCON_MCA_AVI_IF_HANDLED)
422 DRM_DEBUG_KMS("AVI IF handled by FW\n");
423
424 return true;
425}
426
427void lspcon_write_infoframe(struct intel_encoder *encoder,
428 const struct intel_crtc_state *crtc_state,
429 unsigned int type,
430 const void *frame, ssize_t len)
431{
432 bool ret;
433 struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
434 struct intel_lspcon *lspcon = enc_to_intel_lspcon(&encoder->base);
435
436 /* LSPCON only needs AVI IF */
437 if (type != HDMI_INFOFRAME_TYPE_AVI)
438 return;
439
440 if (lspcon->vendor == LSPCON_VENDOR_MCA)
441 ret = _lspcon_write_avi_infoframe_mca(&intel_dp->aux,
442 frame, len);
443 else
444 ret = _lspcon_write_avi_infoframe_parade(&intel_dp->aux,
445 frame, len);
446
447 if (!ret) {
448 DRM_ERROR("Failed to write AVI infoframes\n");
449 return;
450 }
451
452 DRM_DEBUG_DRIVER("AVI infoframes updated successfully\n");
453}
454
455void lspcon_set_infoframes(struct intel_encoder *encoder,
456 bool enable,
457 const struct intel_crtc_state *crtc_state,
458 const struct drm_connector_state *conn_state)
459{
460 ssize_t ret;
461 union hdmi_infoframe frame;
462 uint8_t buf[VIDEO_DIP_DATA_SIZE];
463 struct intel_digital_port *dig_port = enc_to_dig_port(&encoder->base);
464 struct intel_lspcon *lspcon = &dig_port->lspcon;
465 struct intel_dp *intel_dp = &dig_port->dp;
466 struct drm_connector *connector = &intel_dp->attached_connector->base;
467 const struct drm_display_mode *mode = &crtc_state->base.adjusted_mode;
468 bool is_hdmi2_sink = connector->display_info.hdmi.scdc.supported;
469
470 if (!lspcon->active) {
471 DRM_ERROR("Writing infoframes while LSPCON disabled ?\n");
472 return;
473 }
474
475 ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
476 mode, is_hdmi2_sink);
477 if (ret < 0) {
478 DRM_ERROR("couldn't fill AVI infoframe\n");
479 return;
480 }
481
482 if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444) {
483 if (crtc_state->lspcon_downsampling)
484 frame.avi.colorspace = HDMI_COLORSPACE_YUV420;
485 else
486 frame.avi.colorspace = HDMI_COLORSPACE_YUV444;
487 } else {
488 frame.avi.colorspace = HDMI_COLORSPACE_RGB;
489 }
490
491 drm_hdmi_avi_infoframe_quant_range(&frame.avi, mode,
492 crtc_state->limited_color_range ?
493 HDMI_QUANTIZATION_RANGE_LIMITED :
494 HDMI_QUANTIZATION_RANGE_FULL,
495 false, is_hdmi2_sink);
496
497 ret = hdmi_infoframe_pack(&frame, buf, sizeof(buf));
498 if (ret < 0) {
499 DRM_ERROR("Failed to pack AVI IF\n");
500 return;
501 }
502
503 dig_port->write_infoframe(encoder, crtc_state, HDMI_INFOFRAME_TYPE_AVI,
504 buf, ret);
505}
506
507bool lspcon_infoframe_enabled(struct intel_encoder *encoder,
508 const struct intel_crtc_state *pipe_config)
509{
510 return enc_to_intel_lspcon(&encoder->base)->active;
511}
512
188void lspcon_resume(struct intel_lspcon *lspcon) 513void lspcon_resume(struct intel_lspcon *lspcon)
189{ 514{
190 enum drm_lspcon_mode expected_mode; 515 enum drm_lspcon_mode expected_mode;
@@ -216,6 +541,7 @@ bool lspcon_init(struct intel_digital_port *intel_dig_port)
216 struct intel_lspcon *lspcon = &intel_dig_port->lspcon; 541 struct intel_lspcon *lspcon = &intel_dig_port->lspcon;
217 struct drm_device *dev = intel_dig_port->base.base.dev; 542 struct drm_device *dev = intel_dig_port->base.base.dev;
218 struct drm_i915_private *dev_priv = to_i915(dev); 543 struct drm_i915_private *dev_priv = to_i915(dev);
544 struct drm_connector *connector = &dp->attached_connector->base;
219 545
220 if (!HAS_LSPCON(dev_priv)) { 546 if (!HAS_LSPCON(dev_priv)) {
221 DRM_ERROR("LSPCON is not supported on this platform\n"); 547 DRM_ERROR("LSPCON is not supported on this platform\n");
@@ -230,25 +556,18 @@ bool lspcon_init(struct intel_digital_port *intel_dig_port)
230 return false; 556 return false;
231 } 557 }
232 558
233 /*
234 * In the SW state machine, lets Put LSPCON in PCON mode only.
235 * In this way, it will work with both HDMI 1.4 sinks as well as HDMI
236 * 2.0 sinks.
237 */
238 if (lspcon->active && lspcon->mode != DRM_LSPCON_MODE_PCON) {
239 if (lspcon_change_mode(lspcon, DRM_LSPCON_MODE_PCON) < 0) {
240 DRM_ERROR("LSPCON mode change to PCON failed\n");
241 return false;
242 }
243 }
244
245 if (!intel_dp_read_dpcd(dp)) { 559 if (!intel_dp_read_dpcd(dp)) {
246 DRM_ERROR("LSPCON DPCD read failed\n"); 560 DRM_ERROR("LSPCON DPCD read failed\n");
247 return false; 561 return false;
248 } 562 }
249 563
250 drm_dp_read_desc(&dp->aux, &dp->desc, drm_dp_is_branch(dp->dpcd)); 564 if (!lspcon_detect_vendor(lspcon)) {
565 DRM_ERROR("LSPCON vendor detection failed\n");
566 return false;
567 }
251 568
569 connector->ycbcr_420_allowed = true;
570 lspcon->active = true;
252 DRM_DEBUG_KMS("Success: LSPCON init\n"); 571 DRM_DEBUG_KMS("Success: LSPCON init\n");
253 return true; 572 return true;
254} 573}
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index f9f3b0885ba5..e6c5d985ea0a 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -42,10 +42,6 @@
42#include <linux/acpi.h> 42#include <linux/acpi.h>
43 43
44/* Private structure for the integrated LVDS support */ 44/* Private structure for the integrated LVDS support */
45struct intel_lvds_connector {
46 struct intel_connector base;
47};
48
49struct intel_lvds_pps { 45struct intel_lvds_pps {
50 /* 100us units */ 46 /* 100us units */
51 int t1_t2; 47 int t1_t2;
@@ -70,7 +66,7 @@ struct intel_lvds_encoder {
70 struct intel_lvds_pps init_pps; 66 struct intel_lvds_pps init_pps;
71 u32 init_lvds_val; 67 u32 init_lvds_val;
72 68
73 struct intel_lvds_connector *attached_connector; 69 struct intel_connector *attached_connector;
74}; 70};
75 71
76static struct intel_lvds_encoder *to_lvds_encoder(struct drm_encoder *encoder) 72static struct intel_lvds_encoder *to_lvds_encoder(struct drm_encoder *encoder)
@@ -78,11 +74,6 @@ static struct intel_lvds_encoder *to_lvds_encoder(struct drm_encoder *encoder)
78 return container_of(encoder, struct intel_lvds_encoder, base.base); 74 return container_of(encoder, struct intel_lvds_encoder, base.base);
79} 75}
80 76
81static struct intel_lvds_connector *to_lvds_connector(struct drm_connector *connector)
82{
83 return container_of(connector, struct intel_lvds_connector, base.base);
84}
85
86bool intel_lvds_port_enabled(struct drm_i915_private *dev_priv, 77bool intel_lvds_port_enabled(struct drm_i915_private *dev_priv,
87 i915_reg_t lvds_reg, enum pipe *pipe) 78 i915_reg_t lvds_reg, enum pipe *pipe)
88{ 79{
@@ -396,7 +387,7 @@ static bool intel_lvds_compute_config(struct intel_encoder *intel_encoder,
396 struct intel_lvds_encoder *lvds_encoder = 387 struct intel_lvds_encoder *lvds_encoder =
397 to_lvds_encoder(&intel_encoder->base); 388 to_lvds_encoder(&intel_encoder->base);
398 struct intel_connector *intel_connector = 389 struct intel_connector *intel_connector =
399 &lvds_encoder->attached_connector->base; 390 lvds_encoder->attached_connector;
400 struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode; 391 struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
401 struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc); 392 struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
402 unsigned int lvds_bpp; 393 unsigned int lvds_bpp;
@@ -418,6 +409,8 @@ static bool intel_lvds_compute_config(struct intel_encoder *intel_encoder,
418 pipe_config->pipe_bpp = lvds_bpp; 409 pipe_config->pipe_bpp = lvds_bpp;
419 } 410 }
420 411
412 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
413
421 /* 414 /*
422 * We have timings from the BIOS for the panel, put them in 415 * We have timings from the BIOS for the panel, put them in
423 * to the adjusted mode. The CRTC will be set up for this mode, 416 * to the adjusted mode. The CRTC will be set up for this mode,
@@ -461,15 +454,15 @@ intel_lvds_detect(struct drm_connector *connector, bool force)
461 */ 454 */
462static int intel_lvds_get_modes(struct drm_connector *connector) 455static int intel_lvds_get_modes(struct drm_connector *connector)
463{ 456{
464 struct intel_lvds_connector *lvds_connector = to_lvds_connector(connector); 457 struct intel_connector *intel_connector = to_intel_connector(connector);
465 struct drm_device *dev = connector->dev; 458 struct drm_device *dev = connector->dev;
466 struct drm_display_mode *mode; 459 struct drm_display_mode *mode;
467 460
468 /* use cached edid if we have one */ 461 /* use cached edid if we have one */
469 if (!IS_ERR_OR_NULL(lvds_connector->base.edid)) 462 if (!IS_ERR_OR_NULL(intel_connector->edid))
470 return drm_add_edid_modes(connector, lvds_connector->base.edid); 463 return drm_add_edid_modes(connector, intel_connector->edid);
471 464
472 mode = drm_mode_duplicate(dev, lvds_connector->base.panel.fixed_mode); 465 mode = drm_mode_duplicate(dev, intel_connector->panel.fixed_mode);
473 if (mode == NULL) 466 if (mode == NULL)
474 return 0; 467 return 0;
475 468
@@ -477,27 +470,6 @@ static int intel_lvds_get_modes(struct drm_connector *connector)
477 return 1; 470 return 1;
478} 471}
479 472
480/**
481 * intel_lvds_destroy - unregister and free LVDS structures
482 * @connector: connector to free
483 *
484 * Unregister the DDC bus for this connector then free the driver private
485 * structure.
486 */
487static void intel_lvds_destroy(struct drm_connector *connector)
488{
489 struct intel_lvds_connector *lvds_connector =
490 to_lvds_connector(connector);
491
492 if (!IS_ERR_OR_NULL(lvds_connector->base.edid))
493 kfree(lvds_connector->base.edid);
494
495 intel_panel_fini(&lvds_connector->base.panel);
496
497 drm_connector_cleanup(connector);
498 kfree(connector);
499}
500
501static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs = { 473static const struct drm_connector_helper_funcs intel_lvds_connector_helper_funcs = {
502 .get_modes = intel_lvds_get_modes, 474 .get_modes = intel_lvds_get_modes,
503 .mode_valid = intel_lvds_mode_valid, 475 .mode_valid = intel_lvds_mode_valid,
@@ -511,7 +483,7 @@ static const struct drm_connector_funcs intel_lvds_connector_funcs = {
511 .atomic_set_property = intel_digital_connector_atomic_set_property, 483 .atomic_set_property = intel_digital_connector_atomic_set_property,
512 .late_register = intel_connector_register, 484 .late_register = intel_connector_register,
513 .early_unregister = intel_connector_unregister, 485 .early_unregister = intel_connector_unregister,
514 .destroy = intel_lvds_destroy, 486 .destroy = intel_connector_destroy,
515 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 487 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
516 .atomic_duplicate_state = intel_digital_connector_duplicate_state, 488 .atomic_duplicate_state = intel_digital_connector_duplicate_state,
517}; 489};
@@ -802,8 +774,7 @@ static bool compute_is_dual_link_lvds(struct intel_lvds_encoder *lvds_encoder)
802 return i915_modparams.lvds_channel_mode == 2; 774 return i915_modparams.lvds_channel_mode == 2;
803 775
804 /* single channel LVDS is limited to 112 MHz */ 776 /* single channel LVDS is limited to 112 MHz */
805 if (lvds_encoder->attached_connector->base.panel.fixed_mode->clock 777 if (lvds_encoder->attached_connector->panel.fixed_mode->clock > 112999)
806 > 112999)
807 return true; 778 return true;
808 779
809 if (dmi_check_system(intel_dual_link_lvds)) 780 if (dmi_check_system(intel_dual_link_lvds))
@@ -858,7 +829,6 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
858 struct drm_device *dev = &dev_priv->drm; 829 struct drm_device *dev = &dev_priv->drm;
859 struct intel_lvds_encoder *lvds_encoder; 830 struct intel_lvds_encoder *lvds_encoder;
860 struct intel_encoder *intel_encoder; 831 struct intel_encoder *intel_encoder;
861 struct intel_lvds_connector *lvds_connector;
862 struct intel_connector *intel_connector; 832 struct intel_connector *intel_connector;
863 struct drm_connector *connector; 833 struct drm_connector *connector;
864 struct drm_encoder *encoder; 834 struct drm_encoder *encoder;
@@ -911,23 +881,16 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
911 if (!lvds_encoder) 881 if (!lvds_encoder)
912 return; 882 return;
913 883
914 lvds_connector = kzalloc(sizeof(*lvds_connector), GFP_KERNEL); 884 intel_connector = intel_connector_alloc();
915 if (!lvds_connector) { 885 if (!intel_connector) {
916 kfree(lvds_encoder);
917 return;
918 }
919
920 if (intel_connector_init(&lvds_connector->base) < 0) {
921 kfree(lvds_connector);
922 kfree(lvds_encoder); 886 kfree(lvds_encoder);
923 return; 887 return;
924 } 888 }
925 889
926 lvds_encoder->attached_connector = lvds_connector; 890 lvds_encoder->attached_connector = intel_connector;
927 891
928 intel_encoder = &lvds_encoder->base; 892 intel_encoder = &lvds_encoder->base;
929 encoder = &intel_encoder->base; 893 encoder = &intel_encoder->base;
930 intel_connector = &lvds_connector->base;
931 connector = &intel_connector->base; 894 connector = &intel_connector->base;
932 drm_connector_init(dev, &intel_connector->base, &intel_lvds_connector_funcs, 895 drm_connector_init(dev, &intel_connector->base, &intel_lvds_connector_funcs,
933 DRM_MODE_CONNECTOR_LVDS); 896 DRM_MODE_CONNECTOR_LVDS);
@@ -1008,7 +971,7 @@ void intel_lvds_init(struct drm_i915_private *dev_priv)
1008 } else { 971 } else {
1009 edid = ERR_PTR(-ENOENT); 972 edid = ERR_PTR(-ENOENT);
1010 } 973 }
1011 lvds_connector->base.edid = edid; 974 intel_connector->edid = edid;
1012 975
1013 list_for_each_entry(scan, &connector->probed_modes, head) { 976 list_for_each_entry(scan, &connector->probed_modes, head) {
1014 if (scan->type & DRM_MODE_TYPE_PREFERRED) { 977 if (scan->type & DRM_MODE_TYPE_PREFERRED) {
@@ -1072,6 +1035,6 @@ failed:
1072 drm_connector_cleanup(connector); 1035 drm_connector_cleanup(connector);
1073 drm_encoder_cleanup(encoder); 1036 drm_encoder_cleanup(encoder);
1074 kfree(lvds_encoder); 1037 kfree(lvds_encoder);
1075 kfree(lvds_connector); 1038 intel_connector_free(intel_connector);
1076 return; 1039 return;
1077} 1040}
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index e034b4166d32..b8f106d9ecf8 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -773,70 +773,6 @@ static void intel_setup_cadls(struct drm_i915_private *dev_priv)
773 opregion->acpi->cadl[i] = 0; 773 opregion->acpi->cadl[i] = 0;
774} 774}
775 775
776void intel_opregion_register(struct drm_i915_private *dev_priv)
777{
778 struct intel_opregion *opregion = &dev_priv->opregion;
779
780 if (!opregion->header)
781 return;
782
783 if (opregion->acpi) {
784 intel_didl_outputs(dev_priv);
785 intel_setup_cadls(dev_priv);
786
787 /* Notify BIOS we are ready to handle ACPI video ext notifs.
788 * Right now, all the events are handled by the ACPI video module.
789 * We don't actually need to do anything with them. */
790 opregion->acpi->csts = 0;
791 opregion->acpi->drdy = 1;
792
793 opregion->acpi_notifier.notifier_call = intel_opregion_video_event;
794 register_acpi_notifier(&opregion->acpi_notifier);
795 }
796
797 if (opregion->asle) {
798 opregion->asle->tche = ASLE_TCHE_BLC_EN;
799 opregion->asle->ardy = ASLE_ARDY_READY;
800 }
801}
802
803void intel_opregion_unregister(struct drm_i915_private *dev_priv)
804{
805 struct intel_opregion *opregion = &dev_priv->opregion;
806
807 if (!opregion->header)
808 return;
809
810 if (opregion->asle)
811 opregion->asle->ardy = ASLE_ARDY_NOT_READY;
812
813 cancel_work_sync(&dev_priv->opregion.asle_work);
814
815 if (opregion->acpi) {
816 opregion->acpi->drdy = 0;
817
818 unregister_acpi_notifier(&opregion->acpi_notifier);
819 opregion->acpi_notifier.notifier_call = NULL;
820 }
821
822 /* just clear all opregion memory pointers now */
823 memunmap(opregion->header);
824 if (opregion->rvda) {
825 memunmap(opregion->rvda);
826 opregion->rvda = NULL;
827 }
828 if (opregion->vbt_firmware) {
829 kfree(opregion->vbt_firmware);
830 opregion->vbt_firmware = NULL;
831 }
832 opregion->header = NULL;
833 opregion->acpi = NULL;
834 opregion->swsci = NULL;
835 opregion->asle = NULL;
836 opregion->vbt = NULL;
837 opregion->lid_state = NULL;
838}
839
840static void swsci_setup(struct drm_i915_private *dev_priv) 776static void swsci_setup(struct drm_i915_private *dev_priv)
841{ 777{
842 struct intel_opregion *opregion = &dev_priv->opregion; 778 struct intel_opregion *opregion = &dev_priv->opregion;
@@ -1115,3 +1051,97 @@ intel_opregion_get_panel_type(struct drm_i915_private *dev_priv)
1115 1051
1116 return ret - 1; 1052 return ret - 1;
1117} 1053}
1054
1055void intel_opregion_register(struct drm_i915_private *i915)
1056{
1057 struct intel_opregion *opregion = &i915->opregion;
1058
1059 if (!opregion->header)
1060 return;
1061
1062 if (opregion->acpi) {
1063 opregion->acpi_notifier.notifier_call =
1064 intel_opregion_video_event;
1065 register_acpi_notifier(&opregion->acpi_notifier);
1066 }
1067
1068 intel_opregion_resume(i915);
1069}
1070
1071void intel_opregion_resume(struct drm_i915_private *i915)
1072{
1073 struct intel_opregion *opregion = &i915->opregion;
1074
1075 if (!opregion->header)
1076 return;
1077
1078 if (opregion->acpi) {
1079 intel_didl_outputs(i915);
1080 intel_setup_cadls(i915);
1081
1082 /*
1083 * Notify BIOS we are ready to handle ACPI video ext notifs.
1084 * Right now, all the events are handled by the ACPI video
1085 * module. We don't actually need to do anything with them.
1086 */
1087 opregion->acpi->csts = 0;
1088 opregion->acpi->drdy = 1;
1089 }
1090
1091 if (opregion->asle) {
1092 opregion->asle->tche = ASLE_TCHE_BLC_EN;
1093 opregion->asle->ardy = ASLE_ARDY_READY;
1094 }
1095
1096 intel_opregion_notify_adapter(i915, PCI_D0);
1097}
1098
1099void intel_opregion_suspend(struct drm_i915_private *i915, pci_power_t state)
1100{
1101 struct intel_opregion *opregion = &i915->opregion;
1102
1103 if (!opregion->header)
1104 return;
1105
1106 intel_opregion_notify_adapter(i915, state);
1107
1108 if (opregion->asle)
1109 opregion->asle->ardy = ASLE_ARDY_NOT_READY;
1110
1111 cancel_work_sync(&i915->opregion.asle_work);
1112
1113 if (opregion->acpi)
1114 opregion->acpi->drdy = 0;
1115}
1116
1117void intel_opregion_unregister(struct drm_i915_private *i915)
1118{
1119 struct intel_opregion *opregion = &i915->opregion;
1120
1121 intel_opregion_suspend(i915, PCI_D1);
1122
1123 if (!opregion->header)
1124 return;
1125
1126 if (opregion->acpi_notifier.notifier_call) {
1127 unregister_acpi_notifier(&opregion->acpi_notifier);
1128 opregion->acpi_notifier.notifier_call = NULL;
1129 }
1130
1131 /* just clear all opregion memory pointers now */
1132 memunmap(opregion->header);
1133 if (opregion->rvda) {
1134 memunmap(opregion->rvda);
1135 opregion->rvda = NULL;
1136 }
1137 if (opregion->vbt_firmware) {
1138 kfree(opregion->vbt_firmware);
1139 opregion->vbt_firmware = NULL;
1140 }
1141 opregion->header = NULL;
1142 opregion->acpi = NULL;
1143 opregion->swsci = NULL;
1144 opregion->asle = NULL;
1145 opregion->vbt = NULL;
1146 opregion->lid_state = NULL;
1147}
diff --git a/drivers/gpu/drm/i915/intel_opregion.h b/drivers/gpu/drm/i915/intel_opregion.h
index e8498a8cda3d..d84b6d2d2fae 100644
--- a/drivers/gpu/drm/i915/intel_opregion.h
+++ b/drivers/gpu/drm/i915/intel_opregion.h
@@ -57,8 +57,14 @@ struct intel_opregion {
57#ifdef CONFIG_ACPI 57#ifdef CONFIG_ACPI
58 58
59int intel_opregion_setup(struct drm_i915_private *dev_priv); 59int intel_opregion_setup(struct drm_i915_private *dev_priv);
60
60void intel_opregion_register(struct drm_i915_private *dev_priv); 61void intel_opregion_register(struct drm_i915_private *dev_priv);
61void intel_opregion_unregister(struct drm_i915_private *dev_priv); 62void intel_opregion_unregister(struct drm_i915_private *dev_priv);
63
64void intel_opregion_resume(struct drm_i915_private *dev_priv);
65void intel_opregion_suspend(struct drm_i915_private *dev_priv,
66 pci_power_t state);
67
62void intel_opregion_asle_intr(struct drm_i915_private *dev_priv); 68void intel_opregion_asle_intr(struct drm_i915_private *dev_priv);
63int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder, 69int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
64 bool enable); 70 bool enable);
@@ -81,6 +87,15 @@ static inline void intel_opregion_unregister(struct drm_i915_private *dev_priv)
81{ 87{
82} 88}
83 89
90void intel_opregion_resume(struct drm_i915_private *dev_priv)
91{
92}
93
94void intel_opregion_suspend(struct drm_i915_private *dev_priv,
95 pci_power_t state)
96{
97}
98
84static inline void intel_opregion_asle_intr(struct drm_i915_private *dev_priv) 99static inline void intel_opregion_asle_intr(struct drm_i915_private *dev_priv)
85{ 100{
86} 101}
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index 72eb7e48e8bc..20ea7c99d13a 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -1338,7 +1338,7 @@ err_put_bo:
1338 return err; 1338 return err;
1339} 1339}
1340 1340
1341void intel_setup_overlay(struct drm_i915_private *dev_priv) 1341void intel_overlay_setup(struct drm_i915_private *dev_priv)
1342{ 1342{
1343 struct intel_overlay *overlay; 1343 struct intel_overlay *overlay;
1344 int ret; 1344 int ret;
@@ -1387,7 +1387,7 @@ out_free:
1387 kfree(overlay); 1387 kfree(overlay);
1388} 1388}
1389 1389
1390void intel_cleanup_overlay(struct drm_i915_private *dev_priv) 1390void intel_overlay_cleanup(struct drm_i915_private *dev_priv)
1391{ 1391{
1392 struct intel_overlay *overlay; 1392 struct intel_overlay *overlay;
1393 1393
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 4a9f139e7b73..e6cd7b55c018 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -111,7 +111,7 @@ intel_pch_panel_fitting(struct intel_crtc *intel_crtc,
111 /* Native modes don't need fitting */ 111 /* Native modes don't need fitting */
112 if (adjusted_mode->crtc_hdisplay == pipe_config->pipe_src_w && 112 if (adjusted_mode->crtc_hdisplay == pipe_config->pipe_src_w &&
113 adjusted_mode->crtc_vdisplay == pipe_config->pipe_src_h && 113 adjusted_mode->crtc_vdisplay == pipe_config->pipe_src_h &&
114 !pipe_config->ycbcr420) 114 pipe_config->output_format != INTEL_OUTPUT_FORMAT_YCBCR420)
115 goto done; 115 goto done;
116 116
117 switch (fitting_mode) { 117 switch (fitting_mode) {
@@ -505,7 +505,7 @@ static u32 _vlv_get_backlight(struct drm_i915_private *dev_priv, enum pipe pipe)
505static u32 vlv_get_backlight(struct intel_connector *connector) 505static u32 vlv_get_backlight(struct intel_connector *connector)
506{ 506{
507 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); 507 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
508 enum pipe pipe = intel_get_pipe_from_connector(connector); 508 enum pipe pipe = intel_connector_get_pipe(connector);
509 509
510 return _vlv_get_backlight(dev_priv, pipe); 510 return _vlv_get_backlight(dev_priv, pipe);
511} 511}
@@ -763,7 +763,7 @@ static void pwm_disable_backlight(const struct drm_connector_state *old_conn_sta
763 struct intel_panel *panel = &connector->panel; 763 struct intel_panel *panel = &connector->panel;
764 764
765 /* Disable the backlight */ 765 /* Disable the backlight */
766 pwm_config(panel->backlight.pwm, 0, CRC_PMIC_PWM_PERIOD_NS); 766 intel_panel_actually_set_backlight(old_conn_state, 0);
767 usleep_range(2000, 3000); 767 usleep_range(2000, 3000);
768 pwm_disable(panel->backlight.pwm); 768 pwm_disable(panel->backlight.pwm);
769} 769}
@@ -1814,11 +1814,8 @@ int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe)
1814 return 0; 1814 return 0;
1815} 1815}
1816 1816
1817void intel_panel_destroy_backlight(struct drm_connector *connector) 1817static void intel_panel_destroy_backlight(struct intel_panel *panel)
1818{ 1818{
1819 struct intel_connector *intel_connector = to_intel_connector(connector);
1820 struct intel_panel *panel = &intel_connector->panel;
1821
1822 /* dispose of the pwm */ 1819 /* dispose of the pwm */
1823 if (panel->backlight.pwm) 1820 if (panel->backlight.pwm)
1824 pwm_put(panel->backlight.pwm); 1821 pwm_put(panel->backlight.pwm);
@@ -1923,6 +1920,8 @@ void intel_panel_fini(struct intel_panel *panel)
1923 struct intel_connector *intel_connector = 1920 struct intel_connector *intel_connector =
1924 container_of(panel, struct intel_connector, panel); 1921 container_of(panel, struct intel_connector, panel);
1925 1922
1923 intel_panel_destroy_backlight(panel);
1924
1926 if (panel->fixed_mode) 1925 if (panel->fixed_mode)
1927 drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode); 1926 drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode);
1928 1927
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 1db9b8328275..897a791662c5 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2493,6 +2493,9 @@ static uint32_t ilk_compute_pri_wm(const struct intel_crtc_state *cstate,
2493 uint32_t method1, method2; 2493 uint32_t method1, method2;
2494 int cpp; 2494 int cpp;
2495 2495
2496 if (mem_value == 0)
2497 return U32_MAX;
2498
2496 if (!intel_wm_plane_visible(cstate, pstate)) 2499 if (!intel_wm_plane_visible(cstate, pstate))
2497 return 0; 2500 return 0;
2498 2501
@@ -2522,6 +2525,9 @@ static uint32_t ilk_compute_spr_wm(const struct intel_crtc_state *cstate,
2522 uint32_t method1, method2; 2525 uint32_t method1, method2;
2523 int cpp; 2526 int cpp;
2524 2527
2528 if (mem_value == 0)
2529 return U32_MAX;
2530
2525 if (!intel_wm_plane_visible(cstate, pstate)) 2531 if (!intel_wm_plane_visible(cstate, pstate))
2526 return 0; 2532 return 0;
2527 2533
@@ -2545,6 +2551,9 @@ static uint32_t ilk_compute_cur_wm(const struct intel_crtc_state *cstate,
2545{ 2551{
2546 int cpp; 2552 int cpp;
2547 2553
2554 if (mem_value == 0)
2555 return U32_MAX;
2556
2548 if (!intel_wm_plane_visible(cstate, pstate)) 2557 if (!intel_wm_plane_visible(cstate, pstate))
2549 return 0; 2558 return 0;
2550 2559
@@ -2881,8 +2890,7 @@ static void intel_read_wm_latency(struct drm_i915_private *dev_priv,
2881 * any underrun. If not able to get Dimm info assume 16GB dimm 2890 * any underrun. If not able to get Dimm info assume 16GB dimm
2882 * to avoid any underrun. 2891 * to avoid any underrun.
2883 */ 2892 */
2884 if (!dev_priv->dram_info.valid_dimm || 2893 if (dev_priv->dram_info.is_16gb_dimm)
2885 dev_priv->dram_info.is_16gb_dimm)
2886 wm[0] += 1; 2894 wm[0] += 1;
2887 2895
2888 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { 2896 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
@@ -3009,6 +3017,34 @@ static void snb_wm_latency_quirk(struct drm_i915_private *dev_priv)
3009 intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency); 3017 intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
3010} 3018}
3011 3019
3020static void snb_wm_lp3_irq_quirk(struct drm_i915_private *dev_priv)
3021{
3022 /*
3023 * On some SNB machines (Thinkpad X220 Tablet at least)
3024 * LP3 usage can cause vblank interrupts to be lost.
3025 * The DEIIR bit will go high but it looks like the CPU
3026 * never gets interrupted.
3027 *
3028 * It's not clear whether other interrupt source could
3029 * be affected or if this is somehow limited to vblank
3030 * interrupts only. To play it safe we disable LP3
3031 * watermarks entirely.
3032 */
3033 if (dev_priv->wm.pri_latency[3] == 0 &&
3034 dev_priv->wm.spr_latency[3] == 0 &&
3035 dev_priv->wm.cur_latency[3] == 0)
3036 return;
3037
3038 dev_priv->wm.pri_latency[3] = 0;
3039 dev_priv->wm.spr_latency[3] = 0;
3040 dev_priv->wm.cur_latency[3] = 0;
3041
3042 DRM_DEBUG_KMS("LP3 watermarks disabled due to potential for lost interrupts\n");
3043 intel_print_wm_latency(dev_priv, "Primary", dev_priv->wm.pri_latency);
3044 intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency);
3045 intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
3046}
3047
3012static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv) 3048static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv)
3013{ 3049{
3014 intel_read_wm_latency(dev_priv, dev_priv->wm.pri_latency); 3050 intel_read_wm_latency(dev_priv, dev_priv->wm.pri_latency);
@@ -3025,8 +3061,10 @@ static void ilk_setup_wm_latency(struct drm_i915_private *dev_priv)
3025 intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency); 3061 intel_print_wm_latency(dev_priv, "Sprite", dev_priv->wm.spr_latency);
3026 intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency); 3062 intel_print_wm_latency(dev_priv, "Cursor", dev_priv->wm.cur_latency);
3027 3063
3028 if (IS_GEN6(dev_priv)) 3064 if (IS_GEN6(dev_priv)) {
3029 snb_wm_latency_quirk(dev_priv); 3065 snb_wm_latency_quirk(dev_priv);
3066 snb_wm_lp3_irq_quirk(dev_priv);
3067 }
3030} 3068}
3031 3069
3032static void skl_setup_wm_latency(struct drm_i915_private *dev_priv) 3070static void skl_setup_wm_latency(struct drm_i915_private *dev_priv)
@@ -3160,7 +3198,8 @@ static int ilk_compute_intermediate_wm(struct drm_device *dev,
3160 * and after the vblank. 3198 * and after the vblank.
3161 */ 3199 */
3162 *a = newstate->wm.ilk.optimal; 3200 *a = newstate->wm.ilk.optimal;
3163 if (!newstate->base.active || drm_atomic_crtc_needs_modeset(&newstate->base)) 3201 if (!newstate->base.active || drm_atomic_crtc_needs_modeset(&newstate->base) ||
3202 intel_state->skip_intermediate_wm)
3164 return 0; 3203 return 0;
3165 3204
3166 a->pipe_enabled |= b->pipe_enabled; 3205 a->pipe_enabled |= b->pipe_enabled;
@@ -3612,15 +3651,8 @@ static bool skl_needs_memory_bw_wa(struct intel_atomic_state *state)
3612static bool 3651static bool
3613intel_has_sagv(struct drm_i915_private *dev_priv) 3652intel_has_sagv(struct drm_i915_private *dev_priv)
3614{ 3653{
3615 if (IS_KABYLAKE(dev_priv) || IS_COFFEELAKE(dev_priv) || 3654 return (IS_GEN9_BC(dev_priv) || INTEL_GEN(dev_priv) >= 10) &&
3616 IS_CANNONLAKE(dev_priv)) 3655 dev_priv->sagv_status != I915_SAGV_NOT_CONTROLLED;
3617 return true;
3618
3619 if (IS_SKYLAKE(dev_priv) &&
3620 dev_priv->sagv_status != I915_SAGV_NOT_CONTROLLED)
3621 return true;
3622
3623 return false;
3624} 3656}
3625 3657
3626/* 3658/*
@@ -3784,7 +3816,7 @@ bool intel_can_enable_sagv(struct drm_atomic_state *state)
3784 3816
3785static u16 intel_get_ddb_size(struct drm_i915_private *dev_priv, 3817static u16 intel_get_ddb_size(struct drm_i915_private *dev_priv,
3786 const struct intel_crtc_state *cstate, 3818 const struct intel_crtc_state *cstate,
3787 const unsigned int total_data_rate, 3819 const u64 total_data_rate,
3788 const int num_active, 3820 const int num_active,
3789 struct skl_ddb_allocation *ddb) 3821 struct skl_ddb_allocation *ddb)
3790{ 3822{
@@ -3798,12 +3830,12 @@ static u16 intel_get_ddb_size(struct drm_i915_private *dev_priv,
3798 return ddb_size - 4; /* 4 blocks for bypass path allocation */ 3830 return ddb_size - 4; /* 4 blocks for bypass path allocation */
3799 3831
3800 adjusted_mode = &cstate->base.adjusted_mode; 3832 adjusted_mode = &cstate->base.adjusted_mode;
3801 total_data_bw = (u64)total_data_rate * drm_mode_vrefresh(adjusted_mode); 3833 total_data_bw = total_data_rate * drm_mode_vrefresh(adjusted_mode);
3802 3834
3803 /* 3835 /*
3804 * 12GB/s is maximum BW supported by single DBuf slice. 3836 * 12GB/s is maximum BW supported by single DBuf slice.
3805 */ 3837 */
3806 if (total_data_bw >= GBps(12) || num_active > 1) { 3838 if (num_active > 1 || total_data_bw >= GBps(12)) {
3807 ddb->enabled_slices = 2; 3839 ddb->enabled_slices = 2;
3808 } else { 3840 } else {
3809 ddb->enabled_slices = 1; 3841 ddb->enabled_slices = 1;
@@ -3814,16 +3846,15 @@ static u16 intel_get_ddb_size(struct drm_i915_private *dev_priv,
3814} 3846}
3815 3847
3816static void 3848static void
3817skl_ddb_get_pipe_allocation_limits(struct drm_device *dev, 3849skl_ddb_get_pipe_allocation_limits(struct drm_i915_private *dev_priv,
3818 const struct intel_crtc_state *cstate, 3850 const struct intel_crtc_state *cstate,
3819 const unsigned int total_data_rate, 3851 const u64 total_data_rate,
3820 struct skl_ddb_allocation *ddb, 3852 struct skl_ddb_allocation *ddb,
3821 struct skl_ddb_entry *alloc, /* out */ 3853 struct skl_ddb_entry *alloc, /* out */
3822 int *num_active /* out */) 3854 int *num_active /* out */)
3823{ 3855{
3824 struct drm_atomic_state *state = cstate->base.state; 3856 struct drm_atomic_state *state = cstate->base.state;
3825 struct intel_atomic_state *intel_state = to_intel_atomic_state(state); 3857 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
3826 struct drm_i915_private *dev_priv = to_i915(dev);
3827 struct drm_crtc *for_crtc = cstate->base.crtc; 3858 struct drm_crtc *for_crtc = cstate->base.crtc;
3828 const struct drm_crtc_state *crtc_state; 3859 const struct drm_crtc_state *crtc_state;
3829 const struct drm_crtc *crtc; 3860 const struct drm_crtc *crtc;
@@ -3945,14 +3976,9 @@ skl_ddb_get_hw_plane_state(struct drm_i915_private *dev_priv,
3945 val & PLANE_CTL_ALPHA_MASK); 3976 val & PLANE_CTL_ALPHA_MASK);
3946 3977
3947 val = I915_READ(PLANE_BUF_CFG(pipe, plane_id)); 3978 val = I915_READ(PLANE_BUF_CFG(pipe, plane_id));
3948 /* 3979 if (fourcc == DRM_FORMAT_NV12 && INTEL_GEN(dev_priv) < 11) {
3949 * FIXME: add proper NV12 support for ICL. Avoid reading unclaimed
3950 * registers for now.
3951 */
3952 if (INTEL_GEN(dev_priv) < 11)
3953 val2 = I915_READ(PLANE_NV12_BUF_CFG(pipe, plane_id)); 3980 val2 = I915_READ(PLANE_NV12_BUF_CFG(pipe, plane_id));
3954 3981
3955 if (fourcc == DRM_FORMAT_NV12) {
3956 skl_ddb_entry_init_from_hw(dev_priv, 3982 skl_ddb_entry_init_from_hw(dev_priv,
3957 &ddb->plane[pipe][plane_id], val2); 3983 &ddb->plane[pipe][plane_id], val2);
3958 skl_ddb_entry_init_from_hw(dev_priv, 3984 skl_ddb_entry_init_from_hw(dev_priv,
@@ -4139,23 +4165,24 @@ int skl_check_pipe_max_pixel_rate(struct intel_crtc *intel_crtc,
4139 return 0; 4165 return 0;
4140} 4166}
4141 4167
4142static unsigned int 4168static u64
4143skl_plane_relative_data_rate(const struct intel_crtc_state *cstate, 4169skl_plane_relative_data_rate(const struct intel_crtc_state *cstate,
4144 const struct drm_plane_state *pstate, 4170 const struct intel_plane_state *intel_pstate,
4145 const int plane) 4171 const int plane)
4146{ 4172{
4147 struct intel_plane *intel_plane = to_intel_plane(pstate->plane); 4173 struct intel_plane *intel_plane =
4148 struct intel_plane_state *intel_pstate = to_intel_plane_state(pstate); 4174 to_intel_plane(intel_pstate->base.plane);
4149 uint32_t data_rate; 4175 uint32_t data_rate;
4150 uint32_t width = 0, height = 0; 4176 uint32_t width = 0, height = 0;
4151 struct drm_framebuffer *fb; 4177 struct drm_framebuffer *fb;
4152 u32 format; 4178 u32 format;
4153 uint_fixed_16_16_t down_scale_amount; 4179 uint_fixed_16_16_t down_scale_amount;
4180 u64 rate;
4154 4181
4155 if (!intel_pstate->base.visible) 4182 if (!intel_pstate->base.visible)
4156 return 0; 4183 return 0;
4157 4184
4158 fb = pstate->fb; 4185 fb = intel_pstate->base.fb;
4159 format = fb->format->format; 4186 format = fb->format->format;
4160 4187
4161 if (intel_plane->id == PLANE_CURSOR) 4188 if (intel_plane->id == PLANE_CURSOR)
@@ -4177,28 +4204,26 @@ skl_plane_relative_data_rate(const struct intel_crtc_state *cstate,
4177 height /= 2; 4204 height /= 2;
4178 } 4205 }
4179 4206
4180 data_rate = width * height * fb->format->cpp[plane]; 4207 data_rate = width * height;
4181 4208
4182 down_scale_amount = skl_plane_downscale_amount(cstate, intel_pstate); 4209 down_scale_amount = skl_plane_downscale_amount(cstate, intel_pstate);
4183 4210
4184 return mul_round_up_u32_fixed16(data_rate, down_scale_amount); 4211 rate = mul_round_up_u32_fixed16(data_rate, down_scale_amount);
4212
4213 rate *= fb->format->cpp[plane];
4214 return rate;
4185} 4215}
4186 4216
4187/* 4217static u64
4188 * We don't overflow 32 bits. Worst case is 3 planes enabled, each fetching
4189 * a 8192x4096@32bpp framebuffer:
4190 * 3 * 4096 * 8192 * 4 < 2^32
4191 */
4192static unsigned int
4193skl_get_total_relative_data_rate(struct intel_crtc_state *intel_cstate, 4218skl_get_total_relative_data_rate(struct intel_crtc_state *intel_cstate,
4194 unsigned int *plane_data_rate, 4219 u64 *plane_data_rate,
4195 unsigned int *uv_plane_data_rate) 4220 u64 *uv_plane_data_rate)
4196{ 4221{
4197 struct drm_crtc_state *cstate = &intel_cstate->base; 4222 struct drm_crtc_state *cstate = &intel_cstate->base;
4198 struct drm_atomic_state *state = cstate->state; 4223 struct drm_atomic_state *state = cstate->state;
4199 struct drm_plane *plane; 4224 struct drm_plane *plane;
4200 const struct drm_plane_state *pstate; 4225 const struct drm_plane_state *pstate;
4201 unsigned int total_data_rate = 0; 4226 u64 total_data_rate = 0;
4202 4227
4203 if (WARN_ON(!state)) 4228 if (WARN_ON(!state))
4204 return 0; 4229 return 0;
@@ -4206,26 +4231,81 @@ skl_get_total_relative_data_rate(struct intel_crtc_state *intel_cstate,
4206 /* Calculate and cache data rate for each plane */ 4231 /* Calculate and cache data rate for each plane */
4207 drm_atomic_crtc_state_for_each_plane_state(plane, pstate, cstate) { 4232 drm_atomic_crtc_state_for_each_plane_state(plane, pstate, cstate) {
4208 enum plane_id plane_id = to_intel_plane(plane)->id; 4233 enum plane_id plane_id = to_intel_plane(plane)->id;
4209 unsigned int rate; 4234 u64 rate;
4235 const struct intel_plane_state *intel_pstate =
4236 to_intel_plane_state(pstate);
4210 4237
4211 /* packed/y */ 4238 /* packed/y */
4212 rate = skl_plane_relative_data_rate(intel_cstate, 4239 rate = skl_plane_relative_data_rate(intel_cstate,
4213 pstate, 0); 4240 intel_pstate, 0);
4214 plane_data_rate[plane_id] = rate; 4241 plane_data_rate[plane_id] = rate;
4215
4216 total_data_rate += rate; 4242 total_data_rate += rate;
4217 4243
4218 /* uv-plane */ 4244 /* uv-plane */
4219 rate = skl_plane_relative_data_rate(intel_cstate, 4245 rate = skl_plane_relative_data_rate(intel_cstate,
4220 pstate, 1); 4246 intel_pstate, 1);
4221 uv_plane_data_rate[plane_id] = rate; 4247 uv_plane_data_rate[plane_id] = rate;
4222
4223 total_data_rate += rate; 4248 total_data_rate += rate;
4224 } 4249 }
4225 4250
4226 return total_data_rate; 4251 return total_data_rate;
4227} 4252}
4228 4253
4254static u64
4255icl_get_total_relative_data_rate(struct intel_crtc_state *intel_cstate,
4256 u64 *plane_data_rate)
4257{
4258 struct drm_crtc_state *cstate = &intel_cstate->base;
4259 struct drm_atomic_state *state = cstate->state;
4260 struct drm_plane *plane;
4261 const struct drm_plane_state *pstate;
4262 u64 total_data_rate = 0;
4263
4264 if (WARN_ON(!state))
4265 return 0;
4266
4267 /* Calculate and cache data rate for each plane */
4268 drm_atomic_crtc_state_for_each_plane_state(plane, pstate, cstate) {
4269 const struct intel_plane_state *intel_pstate =
4270 to_intel_plane_state(pstate);
4271 enum plane_id plane_id = to_intel_plane(plane)->id;
4272 u64 rate;
4273
4274 if (!intel_pstate->linked_plane) {
4275 rate = skl_plane_relative_data_rate(intel_cstate,
4276 intel_pstate, 0);
4277 plane_data_rate[plane_id] = rate;
4278 total_data_rate += rate;
4279 } else {
4280 enum plane_id y_plane_id;
4281
4282 /*
4283 * The slave plane might not iterate in
4284 * drm_atomic_crtc_state_for_each_plane_state(),
4285 * and needs the master plane state which may be
4286 * NULL if we try get_new_plane_state(), so we
4287 * always calculate from the master.
4288 */
4289 if (intel_pstate->slave)
4290 continue;
4291
4292 /* Y plane rate is calculated on the slave */
4293 rate = skl_plane_relative_data_rate(intel_cstate,
4294 intel_pstate, 0);
4295 y_plane_id = intel_pstate->linked_plane->id;
4296 plane_data_rate[y_plane_id] = rate;
4297 total_data_rate += rate;
4298
4299 rate = skl_plane_relative_data_rate(intel_cstate,
4300 intel_pstate, 1);
4301 plane_data_rate[plane_id] = rate;
4302 total_data_rate += rate;
4303 }
4304 }
4305
4306 return total_data_rate;
4307}
4308
4229static uint16_t 4309static uint16_t
4230skl_ddb_min_alloc(const struct drm_plane_state *pstate, const int plane) 4310skl_ddb_min_alloc(const struct drm_plane_state *pstate, const int plane)
4231{ 4311{
@@ -4298,15 +4378,25 @@ skl_ddb_calc_min(const struct intel_crtc_state *cstate, int num_active,
4298 4378
4299 drm_atomic_crtc_state_for_each_plane_state(plane, pstate, &cstate->base) { 4379 drm_atomic_crtc_state_for_each_plane_state(plane, pstate, &cstate->base) {
4300 enum plane_id plane_id = to_intel_plane(plane)->id; 4380 enum plane_id plane_id = to_intel_plane(plane)->id;
4381 struct intel_plane_state *plane_state = to_intel_plane_state(pstate);
4301 4382
4302 if (plane_id == PLANE_CURSOR) 4383 if (plane_id == PLANE_CURSOR)
4303 continue; 4384 continue;
4304 4385
4305 if (!pstate->visible) 4386 /* slave plane must be invisible and calculated from master */
4387 if (!pstate->visible || WARN_ON(plane_state->slave))
4306 continue; 4388 continue;
4307 4389
4308 minimum[plane_id] = skl_ddb_min_alloc(pstate, 0); 4390 if (!plane_state->linked_plane) {
4309 uv_minimum[plane_id] = skl_ddb_min_alloc(pstate, 1); 4391 minimum[plane_id] = skl_ddb_min_alloc(pstate, 0);
4392 uv_minimum[plane_id] = skl_ddb_min_alloc(pstate, 1);
4393 } else {
4394 enum plane_id y_plane_id =
4395 plane_state->linked_plane->id;
4396
4397 minimum[y_plane_id] = skl_ddb_min_alloc(pstate, 0);
4398 minimum[plane_id] = skl_ddb_min_alloc(pstate, 1);
4399 }
4310 } 4400 }
4311 4401
4312 minimum[PLANE_CURSOR] = skl_cursor_allocation(num_active); 4402 minimum[PLANE_CURSOR] = skl_cursor_allocation(num_active);
@@ -4318,18 +4408,18 @@ skl_allocate_pipe_ddb(struct intel_crtc_state *cstate,
4318{ 4408{
4319 struct drm_atomic_state *state = cstate->base.state; 4409 struct drm_atomic_state *state = cstate->base.state;
4320 struct drm_crtc *crtc = cstate->base.crtc; 4410 struct drm_crtc *crtc = cstate->base.crtc;
4321 struct drm_device *dev = crtc->dev; 4411 struct drm_i915_private *dev_priv = to_i915(crtc->dev);
4322 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 4412 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
4323 enum pipe pipe = intel_crtc->pipe; 4413 enum pipe pipe = intel_crtc->pipe;
4324 struct skl_ddb_entry *alloc = &cstate->wm.skl.ddb; 4414 struct skl_ddb_entry *alloc = &cstate->wm.skl.ddb;
4325 uint16_t alloc_size, start; 4415 uint16_t alloc_size, start;
4326 uint16_t minimum[I915_MAX_PLANES] = {}; 4416 uint16_t minimum[I915_MAX_PLANES] = {};
4327 uint16_t uv_minimum[I915_MAX_PLANES] = {}; 4417 uint16_t uv_minimum[I915_MAX_PLANES] = {};
4328 unsigned int total_data_rate; 4418 u64 total_data_rate;
4329 enum plane_id plane_id; 4419 enum plane_id plane_id;
4330 int num_active; 4420 int num_active;
4331 unsigned int plane_data_rate[I915_MAX_PLANES] = {}; 4421 u64 plane_data_rate[I915_MAX_PLANES] = {};
4332 unsigned int uv_plane_data_rate[I915_MAX_PLANES] = {}; 4422 u64 uv_plane_data_rate[I915_MAX_PLANES] = {};
4333 uint16_t total_min_blocks = 0; 4423 uint16_t total_min_blocks = 0;
4334 4424
4335 /* Clear the partitioning for disabled planes. */ 4425 /* Clear the partitioning for disabled planes. */
@@ -4344,11 +4434,18 @@ skl_allocate_pipe_ddb(struct intel_crtc_state *cstate,
4344 return 0; 4434 return 0;
4345 } 4435 }
4346 4436
4347 total_data_rate = skl_get_total_relative_data_rate(cstate, 4437 if (INTEL_GEN(dev_priv) < 11)
4348 plane_data_rate, 4438 total_data_rate =
4349 uv_plane_data_rate); 4439 skl_get_total_relative_data_rate(cstate,
4350 skl_ddb_get_pipe_allocation_limits(dev, cstate, total_data_rate, ddb, 4440 plane_data_rate,
4351 alloc, &num_active); 4441 uv_plane_data_rate);
4442 else
4443 total_data_rate =
4444 icl_get_total_relative_data_rate(cstate,
4445 plane_data_rate);
4446
4447 skl_ddb_get_pipe_allocation_limits(dev_priv, cstate, total_data_rate,
4448 ddb, alloc, &num_active);
4352 alloc_size = skl_ddb_entry_size(alloc); 4449 alloc_size = skl_ddb_entry_size(alloc);
4353 if (alloc_size == 0) 4450 if (alloc_size == 0)
4354 return 0; 4451 return 0;
@@ -4388,7 +4485,7 @@ skl_allocate_pipe_ddb(struct intel_crtc_state *cstate,
4388 4485
4389 start = alloc->start; 4486 start = alloc->start;
4390 for_each_plane_id_on_crtc(intel_crtc, plane_id) { 4487 for_each_plane_id_on_crtc(intel_crtc, plane_id) {
4391 unsigned int data_rate, uv_data_rate; 4488 u64 data_rate, uv_data_rate;
4392 uint16_t plane_blocks, uv_plane_blocks; 4489 uint16_t plane_blocks, uv_plane_blocks;
4393 4490
4394 if (plane_id == PLANE_CURSOR) 4491 if (plane_id == PLANE_CURSOR)
@@ -4402,8 +4499,7 @@ skl_allocate_pipe_ddb(struct intel_crtc_state *cstate,
4402 * result is < available as data_rate / total_data_rate < 1 4499 * result is < available as data_rate / total_data_rate < 1
4403 */ 4500 */
4404 plane_blocks = minimum[plane_id]; 4501 plane_blocks = minimum[plane_id];
4405 plane_blocks += div_u64((uint64_t)alloc_size * data_rate, 4502 plane_blocks += div64_u64(alloc_size * data_rate, total_data_rate);
4406 total_data_rate);
4407 4503
4408 /* Leave disabled planes at (0,0) */ 4504 /* Leave disabled planes at (0,0) */
4409 if (data_rate) { 4505 if (data_rate) {
@@ -4417,8 +4513,10 @@ skl_allocate_pipe_ddb(struct intel_crtc_state *cstate,
4417 uv_data_rate = uv_plane_data_rate[plane_id]; 4513 uv_data_rate = uv_plane_data_rate[plane_id];
4418 4514
4419 uv_plane_blocks = uv_minimum[plane_id]; 4515 uv_plane_blocks = uv_minimum[plane_id];
4420 uv_plane_blocks += div_u64((uint64_t)alloc_size * uv_data_rate, 4516 uv_plane_blocks += div64_u64(alloc_size * uv_data_rate, total_data_rate);
4421 total_data_rate); 4517
4518 /* Gen11+ uses a separate plane for UV watermarks */
4519 WARN_ON(INTEL_GEN(dev_priv) >= 11 && uv_plane_blocks);
4422 4520
4423 if (uv_data_rate) { 4521 if (uv_data_rate) {
4424 ddb->uv_plane[pipe][plane_id].start = start; 4522 ddb->uv_plane[pipe][plane_id].start = start;
@@ -4476,7 +4574,7 @@ static uint_fixed_16_16_t skl_wm_method2(uint32_t pixel_rate,
4476} 4574}
4477 4575
4478static uint_fixed_16_16_t 4576static uint_fixed_16_16_t
4479intel_get_linetime_us(struct intel_crtc_state *cstate) 4577intel_get_linetime_us(const struct intel_crtc_state *cstate)
4480{ 4578{
4481 uint32_t pixel_rate; 4579 uint32_t pixel_rate;
4482 uint32_t crtc_htotal; 4580 uint32_t crtc_htotal;
@@ -4520,7 +4618,7 @@ skl_adjusted_plane_pixel_rate(const struct intel_crtc_state *cstate,
4520 4618
4521static int 4619static int
4522skl_compute_plane_wm_params(const struct drm_i915_private *dev_priv, 4620skl_compute_plane_wm_params(const struct drm_i915_private *dev_priv,
4523 struct intel_crtc_state *cstate, 4621 const struct intel_crtc_state *cstate,
4524 const struct intel_plane_state *intel_pstate, 4622 const struct intel_plane_state *intel_pstate,
4525 struct skl_wm_params *wp, int plane_id) 4623 struct skl_wm_params *wp, int plane_id)
4526{ 4624{
@@ -4627,7 +4725,7 @@ skl_compute_plane_wm_params(const struct drm_i915_private *dev_priv,
4627} 4725}
4628 4726
4629static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv, 4727static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
4630 struct intel_crtc_state *cstate, 4728 const struct intel_crtc_state *cstate,
4631 const struct intel_plane_state *intel_pstate, 4729 const struct intel_plane_state *intel_pstate,
4632 uint16_t ddb_allocation, 4730 uint16_t ddb_allocation,
4633 int level, 4731 int level,
@@ -4672,15 +4770,24 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
4672 } else { 4770 } else {
4673 if ((wp->cpp * cstate->base.adjusted_mode.crtc_htotal / 4771 if ((wp->cpp * cstate->base.adjusted_mode.crtc_htotal /
4674 wp->dbuf_block_size < 1) && 4772 wp->dbuf_block_size < 1) &&
4675 (wp->plane_bytes_per_line / wp->dbuf_block_size < 1)) 4773 (wp->plane_bytes_per_line / wp->dbuf_block_size < 1)) {
4676 selected_result = method2; 4774 selected_result = method2;
4677 else if (ddb_allocation >= 4775 } else if (ddb_allocation >=
4678 fixed16_to_u32_round_up(wp->plane_blocks_per_line)) 4776 fixed16_to_u32_round_up(wp->plane_blocks_per_line)) {
4679 selected_result = min_fixed16(method1, method2); 4777 if (IS_GEN9(dev_priv) &&
4680 else if (latency >= wp->linetime_us) 4778 !IS_GEMINILAKE(dev_priv))
4681 selected_result = min_fixed16(method1, method2); 4779 selected_result = min_fixed16(method1, method2);
4682 else 4780 else
4781 selected_result = method2;
4782 } else if (latency >= wp->linetime_us) {
4783 if (IS_GEN9(dev_priv) &&
4784 !IS_GEMINILAKE(dev_priv))
4785 selected_result = min_fixed16(method1, method2);
4786 else
4787 selected_result = method2;
4788 } else {
4683 selected_result = method1; 4789 selected_result = method1;
4790 }
4684 } 4791 }
4685 4792
4686 res_blocks = fixed16_to_u32_round_up(selected_result) + 1; 4793 res_blocks = fixed16_to_u32_round_up(selected_result) + 1;
@@ -4756,17 +4863,6 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
4756 } 4863 }
4757 } 4864 }
4758 4865
4759 /*
4760 * Display WA #826 (SKL:ALL, BXT:ALL) & #1059 (CNL:A)
4761 * disable wm level 1-7 on NV12 planes
4762 */
4763 if (wp->is_planar && level >= 1 &&
4764 (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv) ||
4765 IS_CNL_REVID(dev_priv, CNL_REVID_A0, CNL_REVID_A0))) {
4766 result->plane_en = false;
4767 return 0;
4768 }
4769
4770 /* The number of lines are ignored for the level 0 watermark. */ 4866 /* The number of lines are ignored for the level 0 watermark. */
4771 result->plane_res_b = res_blocks; 4867 result->plane_res_b = res_blocks;
4772 result->plane_res_l = res_lines; 4868 result->plane_res_l = res_lines;
@@ -4778,38 +4874,22 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
4778static int 4874static int
4779skl_compute_wm_levels(const struct drm_i915_private *dev_priv, 4875skl_compute_wm_levels(const struct drm_i915_private *dev_priv,
4780 struct skl_ddb_allocation *ddb, 4876 struct skl_ddb_allocation *ddb,
4781 struct intel_crtc_state *cstate, 4877 const struct intel_crtc_state *cstate,
4782 const struct intel_plane_state *intel_pstate, 4878 const struct intel_plane_state *intel_pstate,
4879 uint16_t ddb_blocks,
4783 const struct skl_wm_params *wm_params, 4880 const struct skl_wm_params *wm_params,
4784 struct skl_plane_wm *wm, 4881 struct skl_plane_wm *wm,
4785 int plane_id) 4882 struct skl_wm_level *levels)
4786{ 4883{
4787 struct intel_crtc *intel_crtc = to_intel_crtc(cstate->base.crtc);
4788 struct drm_plane *plane = intel_pstate->base.plane;
4789 struct intel_plane *intel_plane = to_intel_plane(plane);
4790 uint16_t ddb_blocks;
4791 enum pipe pipe = intel_crtc->pipe;
4792 int level, max_level = ilk_wm_max_level(dev_priv); 4884 int level, max_level = ilk_wm_max_level(dev_priv);
4793 enum plane_id intel_plane_id = intel_plane->id; 4885 struct skl_wm_level *result_prev = &levels[0];
4794 int ret; 4886 int ret;
4795 4887
4796 if (WARN_ON(!intel_pstate->base.fb)) 4888 if (WARN_ON(!intel_pstate->base.fb))
4797 return -EINVAL; 4889 return -EINVAL;
4798 4890
4799 ddb_blocks = plane_id ?
4800 skl_ddb_entry_size(&ddb->uv_plane[pipe][intel_plane_id]) :
4801 skl_ddb_entry_size(&ddb->plane[pipe][intel_plane_id]);
4802
4803 for (level = 0; level <= max_level; level++) { 4891 for (level = 0; level <= max_level; level++) {
4804 struct skl_wm_level *result = plane_id ? &wm->uv_wm[level] : 4892 struct skl_wm_level *result = &levels[level];
4805 &wm->wm[level];
4806 struct skl_wm_level *result_prev;
4807
4808 if (level)
4809 result_prev = plane_id ? &wm->uv_wm[level - 1] :
4810 &wm->wm[level - 1];
4811 else
4812 result_prev = plane_id ? &wm->uv_wm[0] : &wm->wm[0];
4813 4893
4814 ret = skl_compute_plane_wm(dev_priv, 4894 ret = skl_compute_plane_wm(dev_priv,
4815 cstate, 4895 cstate,
@@ -4821,6 +4901,8 @@ skl_compute_wm_levels(const struct drm_i915_private *dev_priv,
4821 result); 4901 result);
4822 if (ret) 4902 if (ret)
4823 return ret; 4903 return ret;
4904
4905 result_prev = result;
4824 } 4906 }
4825 4907
4826 if (intel_pstate->base.fb->format->format == DRM_FORMAT_NV12) 4908 if (intel_pstate->base.fb->format->format == DRM_FORMAT_NV12)
@@ -4830,7 +4912,7 @@ skl_compute_wm_levels(const struct drm_i915_private *dev_priv,
4830} 4912}
4831 4913
4832static uint32_t 4914static uint32_t
4833skl_compute_linetime_wm(struct intel_crtc_state *cstate) 4915skl_compute_linetime_wm(const struct intel_crtc_state *cstate)
4834{ 4916{
4835 struct drm_atomic_state *state = cstate->base.state; 4917 struct drm_atomic_state *state = cstate->base.state;
4836 struct drm_i915_private *dev_priv = to_i915(state->dev); 4918 struct drm_i915_private *dev_priv = to_i915(state->dev);
@@ -4852,7 +4934,7 @@ skl_compute_linetime_wm(struct intel_crtc_state *cstate)
4852 return linetime_wm; 4934 return linetime_wm;
4853} 4935}
4854 4936
4855static void skl_compute_transition_wm(struct intel_crtc_state *cstate, 4937static void skl_compute_transition_wm(const struct intel_crtc_state *cstate,
4856 struct skl_wm_params *wp, 4938 struct skl_wm_params *wp,
4857 struct skl_wm_level *wm_l0, 4939 struct skl_wm_level *wm_l0,
4858 uint16_t ddb_allocation, 4940 uint16_t ddb_allocation,
@@ -4862,7 +4944,7 @@ static void skl_compute_transition_wm(struct intel_crtc_state *cstate,
4862 const struct drm_i915_private *dev_priv = to_i915(dev); 4944 const struct drm_i915_private *dev_priv = to_i915(dev);
4863 uint16_t trans_min, trans_y_tile_min; 4945 uint16_t trans_min, trans_y_tile_min;
4864 const uint16_t trans_amount = 10; /* This is configurable amount */ 4946 const uint16_t trans_amount = 10; /* This is configurable amount */
4865 uint16_t trans_offset_b, res_blocks; 4947 uint16_t wm0_sel_res_b, trans_offset_b, res_blocks;
4866 4948
4867 if (!cstate->base.active) 4949 if (!cstate->base.active)
4868 goto exit; 4950 goto exit;
@@ -4875,19 +4957,31 @@ static void skl_compute_transition_wm(struct intel_crtc_state *cstate,
4875 if (!dev_priv->ipc_enabled) 4957 if (!dev_priv->ipc_enabled)
4876 goto exit; 4958 goto exit;
4877 4959
4878 trans_min = 0; 4960 trans_min = 14;
4879 if (INTEL_GEN(dev_priv) >= 10) 4961 if (INTEL_GEN(dev_priv) >= 11)
4880 trans_min = 4; 4962 trans_min = 4;
4881 4963
4882 trans_offset_b = trans_min + trans_amount; 4964 trans_offset_b = trans_min + trans_amount;
4883 4965
4966 /*
4967 * The spec asks for Selected Result Blocks for wm0 (the real value),
4968 * not Result Blocks (the integer value). Pay attention to the capital
4969 * letters. The value wm_l0->plane_res_b is actually Result Blocks, but
4970 * since Result Blocks is the ceiling of Selected Result Blocks plus 1,
4971 * and since we later will have to get the ceiling of the sum in the
4972 * transition watermarks calculation, we can just pretend Selected
4973 * Result Blocks is Result Blocks minus 1 and it should work for the
4974 * current platforms.
4975 */
4976 wm0_sel_res_b = wm_l0->plane_res_b - 1;
4977
4884 if (wp->y_tiled) { 4978 if (wp->y_tiled) {
4885 trans_y_tile_min = (uint16_t) mul_round_up_u32_fixed16(2, 4979 trans_y_tile_min = (uint16_t) mul_round_up_u32_fixed16(2,
4886 wp->y_tile_minimum); 4980 wp->y_tile_minimum);
4887 res_blocks = max(wm_l0->plane_res_b, trans_y_tile_min) + 4981 res_blocks = max(wm0_sel_res_b, trans_y_tile_min) +
4888 trans_offset_b; 4982 trans_offset_b;
4889 } else { 4983 } else {
4890 res_blocks = wm_l0->plane_res_b + trans_offset_b; 4984 res_blocks = wm0_sel_res_b + trans_offset_b;
4891 4985
4892 /* WA BUG:1938466 add one block for non y-tile planes */ 4986 /* WA BUG:1938466 add one block for non y-tile planes */
4893 if (IS_CNL_REVID(dev_priv, CNL_REVID_A0, CNL_REVID_A0)) 4987 if (IS_CNL_REVID(dev_priv, CNL_REVID_A0, CNL_REVID_A0))
@@ -4907,16 +5001,101 @@ exit:
4907 trans_wm->plane_en = false; 5001 trans_wm->plane_en = false;
4908} 5002}
4909 5003
5004static int __skl_build_plane_wm_single(struct skl_ddb_allocation *ddb,
5005 struct skl_pipe_wm *pipe_wm,
5006 enum plane_id plane_id,
5007 const struct intel_crtc_state *cstate,
5008 const struct intel_plane_state *pstate,
5009 int color_plane)
5010{
5011 struct drm_i915_private *dev_priv = to_i915(pstate->base.plane->dev);
5012 struct skl_plane_wm *wm = &pipe_wm->planes[plane_id];
5013 enum pipe pipe = to_intel_plane(pstate->base.plane)->pipe;
5014 struct skl_wm_params wm_params;
5015 uint16_t ddb_blocks = skl_ddb_entry_size(&ddb->plane[pipe][plane_id]);
5016 int ret;
5017
5018 ret = skl_compute_plane_wm_params(dev_priv, cstate, pstate,
5019 &wm_params, color_plane);
5020 if (ret)
5021 return ret;
5022
5023 ret = skl_compute_wm_levels(dev_priv, ddb, cstate, pstate,
5024 ddb_blocks, &wm_params, wm, wm->wm);
5025
5026 if (ret)
5027 return ret;
5028
5029 skl_compute_transition_wm(cstate, &wm_params, &wm->wm[0],
5030 ddb_blocks, &wm->trans_wm);
5031
5032 return 0;
5033}
5034
5035static int skl_build_plane_wm_single(struct skl_ddb_allocation *ddb,
5036 struct skl_pipe_wm *pipe_wm,
5037 const struct intel_crtc_state *cstate,
5038 const struct intel_plane_state *pstate)
5039{
5040 enum plane_id plane_id = to_intel_plane(pstate->base.plane)->id;
5041
5042 return __skl_build_plane_wm_single(ddb, pipe_wm, plane_id, cstate, pstate, 0);
5043}
5044
5045static int skl_build_plane_wm_planar(struct skl_ddb_allocation *ddb,
5046 struct skl_pipe_wm *pipe_wm,
5047 const struct intel_crtc_state *cstate,
5048 const struct intel_plane_state *pstate)
5049{
5050 struct intel_plane *plane = to_intel_plane(pstate->base.plane);
5051 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
5052 enum plane_id plane_id = plane->id;
5053 struct skl_plane_wm *wm = &pipe_wm->planes[plane_id];
5054 struct skl_wm_params wm_params;
5055 enum pipe pipe = plane->pipe;
5056 uint16_t ddb_blocks = skl_ddb_entry_size(&ddb->plane[pipe][plane_id]);
5057 int ret;
5058
5059 ret = __skl_build_plane_wm_single(ddb, pipe_wm, plane_id, cstate, pstate, 0);
5060 if (ret)
5061 return ret;
5062
5063 /* uv plane watermarks must also be validated for NV12/Planar */
5064 ddb_blocks = skl_ddb_entry_size(&ddb->uv_plane[pipe][plane_id]);
5065
5066 ret = skl_compute_plane_wm_params(dev_priv, cstate, pstate, &wm_params, 1);
5067 if (ret)
5068 return ret;
5069
5070 return skl_compute_wm_levels(dev_priv, ddb, cstate, pstate,
5071 ddb_blocks, &wm_params, wm, wm->uv_wm);
5072}
5073
5074static int icl_build_plane_wm_planar(struct skl_ddb_allocation *ddb,
5075 struct skl_pipe_wm *pipe_wm,
5076 const struct intel_crtc_state *cstate,
5077 const struct intel_plane_state *pstate)
5078{
5079 int ret;
5080 enum plane_id y_plane_id = pstate->linked_plane->id;
5081 enum plane_id uv_plane_id = to_intel_plane(pstate->base.plane)->id;
5082
5083 ret = __skl_build_plane_wm_single(ddb, pipe_wm, y_plane_id,
5084 cstate, pstate, 0);
5085 if (ret)
5086 return ret;
5087
5088 return __skl_build_plane_wm_single(ddb, pipe_wm, uv_plane_id,
5089 cstate, pstate, 1);
5090}
5091
4910static int skl_build_pipe_wm(struct intel_crtc_state *cstate, 5092static int skl_build_pipe_wm(struct intel_crtc_state *cstate,
4911 struct skl_ddb_allocation *ddb, 5093 struct skl_ddb_allocation *ddb,
4912 struct skl_pipe_wm *pipe_wm) 5094 struct skl_pipe_wm *pipe_wm)
4913{ 5095{
4914 struct drm_device *dev = cstate->base.crtc->dev;
4915 struct drm_crtc_state *crtc_state = &cstate->base; 5096 struct drm_crtc_state *crtc_state = &cstate->base;
4916 const struct drm_i915_private *dev_priv = to_i915(dev);
4917 struct drm_plane *plane; 5097 struct drm_plane *plane;
4918 const struct drm_plane_state *pstate; 5098 const struct drm_plane_state *pstate;
4919 struct skl_plane_wm *wm;
4920 int ret; 5099 int ret;
4921 5100
4922 /* 5101 /*
@@ -4928,44 +5107,21 @@ static int skl_build_pipe_wm(struct intel_crtc_state *cstate,
4928 drm_atomic_crtc_state_for_each_plane_state(plane, pstate, crtc_state) { 5107 drm_atomic_crtc_state_for_each_plane_state(plane, pstate, crtc_state) {
4929 const struct intel_plane_state *intel_pstate = 5108 const struct intel_plane_state *intel_pstate =
4930 to_intel_plane_state(pstate); 5109 to_intel_plane_state(pstate);
4931 enum plane_id plane_id = to_intel_plane(plane)->id;
4932 struct skl_wm_params wm_params;
4933 enum pipe pipe = to_intel_crtc(cstate->base.crtc)->pipe;
4934 uint16_t ddb_blocks;
4935 5110
4936 wm = &pipe_wm->planes[plane_id]; 5111 /* Watermarks calculated in master */
4937 ddb_blocks = skl_ddb_entry_size(&ddb->plane[pipe][plane_id]); 5112 if (intel_pstate->slave)
5113 continue;
4938 5114
4939 ret = skl_compute_plane_wm_params(dev_priv, cstate, 5115 if (intel_pstate->linked_plane)
4940 intel_pstate, &wm_params, 0); 5116 ret = icl_build_plane_wm_planar(ddb, pipe_wm, cstate, intel_pstate);
4941 if (ret) 5117 else if (intel_pstate->base.fb &&
4942 return ret; 5118 intel_pstate->base.fb->format->format == DRM_FORMAT_NV12)
5119 ret = skl_build_plane_wm_planar(ddb, pipe_wm, cstate, intel_pstate);
5120 else
5121 ret = skl_build_plane_wm_single(ddb, pipe_wm, cstate, intel_pstate);
4943 5122
4944 ret = skl_compute_wm_levels(dev_priv, ddb, cstate,
4945 intel_pstate, &wm_params, wm, 0);
4946 if (ret) 5123 if (ret)
4947 return ret; 5124 return ret;
4948
4949 skl_compute_transition_wm(cstate, &wm_params, &wm->wm[0],
4950 ddb_blocks, &wm->trans_wm);
4951
4952 /* uv plane watermarks must also be validated for NV12/Planar */
4953 if (wm_params.is_planar) {
4954 memset(&wm_params, 0, sizeof(struct skl_wm_params));
4955 wm->is_planar = true;
4956
4957 ret = skl_compute_plane_wm_params(dev_priv, cstate,
4958 intel_pstate,
4959 &wm_params, 1);
4960 if (ret)
4961 return ret;
4962
4963 ret = skl_compute_wm_levels(dev_priv, ddb, cstate,
4964 intel_pstate, &wm_params,
4965 wm, 1);
4966 if (ret)
4967 return ret;
4968 }
4969 } 5125 }
4970 5126
4971 pipe_wm->linetime = skl_compute_linetime_wm(cstate); 5127 pipe_wm->linetime = skl_compute_linetime_wm(cstate);
@@ -5016,14 +5172,7 @@ static void skl_write_plane_wm(struct intel_crtc *intel_crtc,
5016 skl_write_wm_level(dev_priv, PLANE_WM_TRANS(pipe, plane_id), 5172 skl_write_wm_level(dev_priv, PLANE_WM_TRANS(pipe, plane_id),
5017 &wm->trans_wm); 5173 &wm->trans_wm);
5018 5174
5019 skl_ddb_entry_write(dev_priv, PLANE_BUF_CFG(pipe, plane_id), 5175 if (wm->is_planar && INTEL_GEN(dev_priv) < 11) {
5020 &ddb->plane[pipe][plane_id]);
5021 /* FIXME: add proper NV12 support for ICL. */
5022 if (INTEL_GEN(dev_priv) >= 11)
5023 return skl_ddb_entry_write(dev_priv,
5024 PLANE_BUF_CFG(pipe, plane_id),
5025 &ddb->plane[pipe][plane_id]);
5026 if (wm->is_planar) {
5027 skl_ddb_entry_write(dev_priv, PLANE_BUF_CFG(pipe, plane_id), 5176 skl_ddb_entry_write(dev_priv, PLANE_BUF_CFG(pipe, plane_id),
5028 &ddb->uv_plane[pipe][plane_id]); 5177 &ddb->uv_plane[pipe][plane_id]);
5029 skl_ddb_entry_write(dev_priv, 5178 skl_ddb_entry_write(dev_priv,
@@ -5032,7 +5181,8 @@ static void skl_write_plane_wm(struct intel_crtc *intel_crtc,
5032 } else { 5181 } else {
5033 skl_ddb_entry_write(dev_priv, PLANE_BUF_CFG(pipe, plane_id), 5182 skl_ddb_entry_write(dev_priv, PLANE_BUF_CFG(pipe, plane_id),
5034 &ddb->plane[pipe][plane_id]); 5183 &ddb->plane[pipe][plane_id]);
5035 I915_WRITE(PLANE_NV12_BUF_CFG(pipe, plane_id), 0x0); 5184 if (INTEL_GEN(dev_priv) < 11)
5185 I915_WRITE(PLANE_NV12_BUF_CFG(pipe, plane_id), 0x0);
5036 } 5186 }
5037} 5187}
5038 5188
@@ -5076,16 +5226,15 @@ static inline bool skl_ddb_entries_overlap(const struct skl_ddb_entry *a,
5076 return a->start < b->end && b->start < a->end; 5226 return a->start < b->end && b->start < a->end;
5077} 5227}
5078 5228
5079bool skl_ddb_allocation_overlaps(struct drm_i915_private *dev_priv, 5229bool skl_ddb_allocation_overlaps(const struct skl_ddb_entry *ddb,
5080 const struct skl_ddb_entry **entries, 5230 const struct skl_ddb_entry entries[],
5081 const struct skl_ddb_entry *ddb, 5231 int num_entries, int ignore_idx)
5082 int ignore)
5083{ 5232{
5084 enum pipe pipe; 5233 int i;
5085 5234
5086 for_each_pipe(dev_priv, pipe) { 5235 for (i = 0; i < num_entries; i++) {
5087 if (pipe != ignore && entries[pipe] && 5236 if (i != ignore_idx &&
5088 skl_ddb_entries_overlap(ddb, entries[pipe])) 5237 skl_ddb_entries_overlap(ddb, &entries[i]))
5089 return true; 5238 return true;
5090 } 5239 }
5091 5240
@@ -5137,11 +5286,12 @@ skl_ddb_add_affected_planes(struct intel_crtc_state *cstate)
5137 struct intel_atomic_state *intel_state = to_intel_atomic_state(state); 5286 struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
5138 struct skl_ddb_allocation *new_ddb = &intel_state->wm_results.ddb; 5287 struct skl_ddb_allocation *new_ddb = &intel_state->wm_results.ddb;
5139 struct skl_ddb_allocation *cur_ddb = &dev_priv->wm.skl_hw.ddb; 5288 struct skl_ddb_allocation *cur_ddb = &dev_priv->wm.skl_hw.ddb;
5140 struct drm_plane_state *plane_state;
5141 struct drm_plane *plane; 5289 struct drm_plane *plane;
5142 enum pipe pipe = intel_crtc->pipe; 5290 enum pipe pipe = intel_crtc->pipe;
5143 5291
5144 drm_for_each_plane_mask(plane, dev, cstate->base.plane_mask) { 5292 drm_for_each_plane_mask(plane, dev, cstate->base.plane_mask) {
5293 struct drm_plane_state *plane_state;
5294 struct intel_plane *linked;
5145 enum plane_id plane_id = to_intel_plane(plane)->id; 5295 enum plane_id plane_id = to_intel_plane(plane)->id;
5146 5296
5147 if (skl_ddb_entry_equal(&cur_ddb->plane[pipe][plane_id], 5297 if (skl_ddb_entry_equal(&cur_ddb->plane[pipe][plane_id],
@@ -5153,6 +5303,15 @@ skl_ddb_add_affected_planes(struct intel_crtc_state *cstate)
5153 plane_state = drm_atomic_get_plane_state(state, plane); 5303 plane_state = drm_atomic_get_plane_state(state, plane);
5154 if (IS_ERR(plane_state)) 5304 if (IS_ERR(plane_state))
5155 return PTR_ERR(plane_state); 5305 return PTR_ERR(plane_state);
5306
5307 /* Make sure linked plane is updated too */
5308 linked = to_intel_plane_state(plane_state)->linked_plane;
5309 if (!linked)
5310 continue;
5311
5312 plane_state = drm_atomic_get_plane_state(state, &linked->base);
5313 if (IS_ERR(plane_state))
5314 return PTR_ERR(plane_state);
5156 } 5315 }
5157 5316
5158 return 0; 5317 return 0;
@@ -5211,11 +5370,11 @@ skl_print_wm_changes(const struct drm_atomic_state *state)
5211 if (skl_ddb_entry_equal(old, new)) 5370 if (skl_ddb_entry_equal(old, new))
5212 continue; 5371 continue;
5213 5372
5214 DRM_DEBUG_ATOMIC("[PLANE:%d:%s] ddb (%d - %d) -> (%d - %d)\n", 5373 DRM_DEBUG_KMS("[PLANE:%d:%s] ddb (%d - %d) -> (%d - %d)\n",
5215 intel_plane->base.base.id, 5374 intel_plane->base.base.id,
5216 intel_plane->base.name, 5375 intel_plane->base.name,
5217 old->start, old->end, 5376 old->start, old->end,
5218 new->start, new->end); 5377 new->start, new->end);
5219 } 5378 }
5220 } 5379 }
5221} 5380}
@@ -6117,14 +6276,8 @@ void intel_enable_ipc(struct drm_i915_private *dev_priv)
6117{ 6276{
6118 u32 val; 6277 u32 val;
6119 6278
6120 /* Display WA #0477 WaDisableIPC: skl */ 6279 if (!HAS_IPC(dev_priv))
6121 if (IS_SKYLAKE(dev_priv)) 6280 return;
6122 dev_priv->ipc_enabled = false;
6123
6124 /* Display WA #1141: SKL:all KBL:all CFL */
6125 if ((IS_KABYLAKE(dev_priv) || IS_COFFEELAKE(dev_priv)) &&
6126 !dev_priv->dram_info.symmetric_memory)
6127 dev_priv->ipc_enabled = false;
6128 6281
6129 val = I915_READ(DISP_ARB_CTL2); 6282 val = I915_READ(DISP_ARB_CTL2);
6130 6283
@@ -6138,11 +6291,15 @@ void intel_enable_ipc(struct drm_i915_private *dev_priv)
6138 6291
6139void intel_init_ipc(struct drm_i915_private *dev_priv) 6292void intel_init_ipc(struct drm_i915_private *dev_priv)
6140{ 6293{
6141 dev_priv->ipc_enabled = false;
6142 if (!HAS_IPC(dev_priv)) 6294 if (!HAS_IPC(dev_priv))
6143 return; 6295 return;
6144 6296
6145 dev_priv->ipc_enabled = true; 6297 /* Display WA #1141: SKL:all KBL:all CFL */
6298 if (IS_KABYLAKE(dev_priv) || IS_COFFEELAKE(dev_priv))
6299 dev_priv->ipc_enabled = dev_priv->dram_info.symmetric_memory;
6300 else
6301 dev_priv->ipc_enabled = true;
6302
6146 intel_enable_ipc(dev_priv); 6303 intel_enable_ipc(dev_priv);
6147} 6304}
6148 6305
@@ -8736,6 +8893,10 @@ static void icl_init_clock_gating(struct drm_i915_private *dev_priv)
8736 /* This is not an Wa. Enable to reduce Sampler power */ 8893 /* This is not an Wa. Enable to reduce Sampler power */
8737 I915_WRITE(GEN10_DFR_RATIO_EN_AND_CHICKEN, 8894 I915_WRITE(GEN10_DFR_RATIO_EN_AND_CHICKEN,
8738 I915_READ(GEN10_DFR_RATIO_EN_AND_CHICKEN) & ~DFR_DISABLE); 8895 I915_READ(GEN10_DFR_RATIO_EN_AND_CHICKEN) & ~DFR_DISABLE);
8896
8897 /* WaEnable32PlaneMode:icl */
8898 I915_WRITE(GEN9_CSFE_CHICKEN1_RCS,
8899 _MASKED_BIT_ENABLE(GEN11_ENABLE_32_PLANE_MODE));
8739} 8900}
8740 8901
8741static void cnp_init_clock_gating(struct drm_i915_private *dev_priv) 8902static void cnp_init_clock_gating(struct drm_i915_private *dev_priv)
@@ -9313,8 +9474,6 @@ void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv)
9313/* Set up chip specific power management-related functions */ 9474/* Set up chip specific power management-related functions */
9314void intel_init_pm(struct drm_i915_private *dev_priv) 9475void intel_init_pm(struct drm_i915_private *dev_priv)
9315{ 9476{
9316 intel_fbc_init(dev_priv);
9317
9318 /* For cxsr */ 9477 /* For cxsr */
9319 if (IS_PINEVIEW(dev_priv)) 9478 if (IS_PINEVIEW(dev_priv))
9320 i915_pineview_get_mem_freq(dev_priv); 9479 i915_pineview_get_mem_freq(dev_priv);
diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c
index b6838b525502..54fa17a5596a 100644
--- a/drivers/gpu/drm/i915/intel_psr.c
+++ b/drivers/gpu/drm/i915/intel_psr.c
@@ -71,6 +71,10 @@ static bool psr_global_enabled(u32 debug)
71static bool intel_psr2_enabled(struct drm_i915_private *dev_priv, 71static bool intel_psr2_enabled(struct drm_i915_private *dev_priv,
72 const struct intel_crtc_state *crtc_state) 72 const struct intel_crtc_state *crtc_state)
73{ 73{
74 /* Disable PSR2 by default for all platforms */
75 if (i915_modparams.enable_psr == -1)
76 return false;
77
74 switch (dev_priv->psr.debug & I915_PSR_DEBUG_MODE_MASK) { 78 switch (dev_priv->psr.debug & I915_PSR_DEBUG_MODE_MASK) {
75 case I915_PSR_DEBUG_FORCE_PSR1: 79 case I915_PSR_DEBUG_FORCE_PSR1:
76 return false; 80 return false;
@@ -79,25 +83,42 @@ static bool intel_psr2_enabled(struct drm_i915_private *dev_priv,
79 } 83 }
80} 84}
81 85
86static int edp_psr_shift(enum transcoder cpu_transcoder)
87{
88 switch (cpu_transcoder) {
89 case TRANSCODER_A:
90 return EDP_PSR_TRANSCODER_A_SHIFT;
91 case TRANSCODER_B:
92 return EDP_PSR_TRANSCODER_B_SHIFT;
93 case TRANSCODER_C:
94 return EDP_PSR_TRANSCODER_C_SHIFT;
95 default:
96 MISSING_CASE(cpu_transcoder);
97 /* fallthrough */
98 case TRANSCODER_EDP:
99 return EDP_PSR_TRANSCODER_EDP_SHIFT;
100 }
101}
102
82void intel_psr_irq_control(struct drm_i915_private *dev_priv, u32 debug) 103void intel_psr_irq_control(struct drm_i915_private *dev_priv, u32 debug)
83{ 104{
84 u32 debug_mask, mask; 105 u32 debug_mask, mask;
106 enum transcoder cpu_transcoder;
107 u32 transcoders = BIT(TRANSCODER_EDP);
108
109 if (INTEL_GEN(dev_priv) >= 8)
110 transcoders |= BIT(TRANSCODER_A) |
111 BIT(TRANSCODER_B) |
112 BIT(TRANSCODER_C);
85 113
86 mask = EDP_PSR_ERROR(TRANSCODER_EDP); 114 debug_mask = 0;
87 debug_mask = EDP_PSR_POST_EXIT(TRANSCODER_EDP) | 115 mask = 0;
88 EDP_PSR_PRE_ENTRY(TRANSCODER_EDP); 116 for_each_cpu_transcoder_masked(dev_priv, cpu_transcoder, transcoders) {
89 117 int shift = edp_psr_shift(cpu_transcoder);
90 if (INTEL_GEN(dev_priv) >= 8) { 118
91 mask |= EDP_PSR_ERROR(TRANSCODER_A) | 119 mask |= EDP_PSR_ERROR(shift);
92 EDP_PSR_ERROR(TRANSCODER_B) | 120 debug_mask |= EDP_PSR_POST_EXIT(shift) |
93 EDP_PSR_ERROR(TRANSCODER_C); 121 EDP_PSR_PRE_ENTRY(shift);
94
95 debug_mask |= EDP_PSR_POST_EXIT(TRANSCODER_A) |
96 EDP_PSR_PRE_ENTRY(TRANSCODER_A) |
97 EDP_PSR_POST_EXIT(TRANSCODER_B) |
98 EDP_PSR_PRE_ENTRY(TRANSCODER_B) |
99 EDP_PSR_POST_EXIT(TRANSCODER_C) |
100 EDP_PSR_PRE_ENTRY(TRANSCODER_C);
101 } 122 }
102 123
103 if (debug & I915_PSR_DEBUG_IRQ) 124 if (debug & I915_PSR_DEBUG_IRQ)
@@ -155,18 +176,20 @@ void intel_psr_irq_handler(struct drm_i915_private *dev_priv, u32 psr_iir)
155 BIT(TRANSCODER_C); 176 BIT(TRANSCODER_C);
156 177
157 for_each_cpu_transcoder_masked(dev_priv, cpu_transcoder, transcoders) { 178 for_each_cpu_transcoder_masked(dev_priv, cpu_transcoder, transcoders) {
179 int shift = edp_psr_shift(cpu_transcoder);
180
158 /* FIXME: Exit PSR and link train manually when this happens. */ 181 /* FIXME: Exit PSR and link train manually when this happens. */
159 if (psr_iir & EDP_PSR_ERROR(cpu_transcoder)) 182 if (psr_iir & EDP_PSR_ERROR(shift))
160 DRM_DEBUG_KMS("[transcoder %s] PSR aux error\n", 183 DRM_DEBUG_KMS("[transcoder %s] PSR aux error\n",
161 transcoder_name(cpu_transcoder)); 184 transcoder_name(cpu_transcoder));
162 185
163 if (psr_iir & EDP_PSR_PRE_ENTRY(cpu_transcoder)) { 186 if (psr_iir & EDP_PSR_PRE_ENTRY(shift)) {
164 dev_priv->psr.last_entry_attempt = time_ns; 187 dev_priv->psr.last_entry_attempt = time_ns;
165 DRM_DEBUG_KMS("[transcoder %s] PSR entry attempt in 2 vblanks\n", 188 DRM_DEBUG_KMS("[transcoder %s] PSR entry attempt in 2 vblanks\n",
166 transcoder_name(cpu_transcoder)); 189 transcoder_name(cpu_transcoder));
167 } 190 }
168 191
169 if (psr_iir & EDP_PSR_POST_EXIT(cpu_transcoder)) { 192 if (psr_iir & EDP_PSR_POST_EXIT(shift)) {
170 dev_priv->psr.last_exit = time_ns; 193 dev_priv->psr.last_exit = time_ns;
171 DRM_DEBUG_KMS("[transcoder %s] PSR exit completed\n", 194 DRM_DEBUG_KMS("[transcoder %s] PSR exit completed\n",
172 transcoder_name(cpu_transcoder)); 195 transcoder_name(cpu_transcoder));
@@ -294,7 +317,8 @@ static void intel_psr_setup_vsc(struct intel_dp *intel_dp,
294 psr_vsc.sdp_header.HB3 = 0x8; 317 psr_vsc.sdp_header.HB3 = 0x8;
295 } 318 }
296 319
297 intel_dig_port->write_infoframe(&intel_dig_port->base.base, crtc_state, 320 intel_dig_port->write_infoframe(&intel_dig_port->base,
321 crtc_state,
298 DP_SDP_VSC, &psr_vsc, sizeof(psr_vsc)); 322 DP_SDP_VSC, &psr_vsc, sizeof(psr_vsc));
299} 323}
300 324
@@ -553,11 +577,31 @@ static void intel_psr_activate(struct intel_dp *intel_dp)
553 dev_priv->psr.active = true; 577 dev_priv->psr.active = true;
554} 578}
555 579
580static i915_reg_t gen9_chicken_trans_reg(struct drm_i915_private *dev_priv,
581 enum transcoder cpu_transcoder)
582{
583 static const i915_reg_t regs[] = {
584 [TRANSCODER_A] = CHICKEN_TRANS_A,
585 [TRANSCODER_B] = CHICKEN_TRANS_B,
586 [TRANSCODER_C] = CHICKEN_TRANS_C,
587 [TRANSCODER_EDP] = CHICKEN_TRANS_EDP,
588 };
589
590 WARN_ON(INTEL_GEN(dev_priv) < 9);
591
592 if (WARN_ON(cpu_transcoder >= ARRAY_SIZE(regs) ||
593 !regs[cpu_transcoder].reg))
594 cpu_transcoder = TRANSCODER_A;
595
596 return regs[cpu_transcoder];
597}
598
556static void intel_psr_enable_source(struct intel_dp *intel_dp, 599static void intel_psr_enable_source(struct intel_dp *intel_dp,
557 const struct intel_crtc_state *crtc_state) 600 const struct intel_crtc_state *crtc_state)
558{ 601{
559 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 602 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
560 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 603 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
604 u32 mask;
561 605
562 /* Only HSW and BDW have PSR AUX registers that need to be setup. SKL+ 606 /* Only HSW and BDW have PSR AUX registers that need to be setup. SKL+
563 * use hardcoded values PSR AUX transactions 607 * use hardcoded values PSR AUX transactions
@@ -566,37 +610,34 @@ static void intel_psr_enable_source(struct intel_dp *intel_dp,
566 hsw_psr_setup_aux(intel_dp); 610 hsw_psr_setup_aux(intel_dp);
567 611
568 if (dev_priv->psr.psr2_enabled) { 612 if (dev_priv->psr.psr2_enabled) {
569 u32 chicken = I915_READ(CHICKEN_TRANS(cpu_transcoder)); 613 i915_reg_t reg = gen9_chicken_trans_reg(dev_priv,
614 cpu_transcoder);
615 u32 chicken = I915_READ(reg);
570 616
571 if (INTEL_GEN(dev_priv) == 9 && !IS_GEMINILAKE(dev_priv)) 617 if (IS_GEN9(dev_priv) && !IS_GEMINILAKE(dev_priv))
572 chicken |= (PSR2_VSC_ENABLE_PROG_HEADER 618 chicken |= (PSR2_VSC_ENABLE_PROG_HEADER
573 | PSR2_ADD_VERTICAL_LINE_COUNT); 619 | PSR2_ADD_VERTICAL_LINE_COUNT);
574 620
575 else 621 else
576 chicken &= ~VSC_DATA_SEL_SOFTWARE_CONTROL; 622 chicken &= ~VSC_DATA_SEL_SOFTWARE_CONTROL;
577 I915_WRITE(CHICKEN_TRANS(cpu_transcoder), chicken); 623 I915_WRITE(reg, chicken);
578
579 I915_WRITE(EDP_PSR_DEBUG,
580 EDP_PSR_DEBUG_MASK_MEMUP |
581 EDP_PSR_DEBUG_MASK_HPD |
582 EDP_PSR_DEBUG_MASK_LPSP |
583 EDP_PSR_DEBUG_MASK_MAX_SLEEP |
584 EDP_PSR_DEBUG_MASK_DISP_REG_WRITE);
585 } else {
586 /*
587 * Per Spec: Avoid continuous PSR exit by masking MEMUP
588 * and HPD. also mask LPSP to avoid dependency on other
589 * drivers that might block runtime_pm besides
590 * preventing other hw tracking issues now we can rely
591 * on frontbuffer tracking.
592 */
593 I915_WRITE(EDP_PSR_DEBUG,
594 EDP_PSR_DEBUG_MASK_MEMUP |
595 EDP_PSR_DEBUG_MASK_HPD |
596 EDP_PSR_DEBUG_MASK_LPSP |
597 EDP_PSR_DEBUG_MASK_DISP_REG_WRITE |
598 EDP_PSR_DEBUG_MASK_MAX_SLEEP);
599 } 624 }
625
626 /*
627 * Per Spec: Avoid continuous PSR exit by masking MEMUP and HPD also
628 * mask LPSP to avoid dependency on other drivers that might block
629 * runtime_pm besides preventing other hw tracking issues now we
630 * can rely on frontbuffer tracking.
631 */
632 mask = EDP_PSR_DEBUG_MASK_MEMUP |
633 EDP_PSR_DEBUG_MASK_HPD |
634 EDP_PSR_DEBUG_MASK_LPSP |
635 EDP_PSR_DEBUG_MASK_MAX_SLEEP;
636
637 if (INTEL_GEN(dev_priv) < 11)
638 mask |= EDP_PSR_DEBUG_MASK_DISP_REG_WRITE;
639
640 I915_WRITE(EDP_PSR_DEBUG, mask);
600} 641}
601 642
602static void intel_psr_enable_locked(struct drm_i915_private *dev_priv, 643static void intel_psr_enable_locked(struct drm_i915_private *dev_priv,
@@ -656,49 +697,34 @@ unlock:
656 mutex_unlock(&dev_priv->psr.lock); 697 mutex_unlock(&dev_priv->psr.lock);
657} 698}
658 699
659static void 700static void intel_psr_exit(struct drm_i915_private *dev_priv)
660intel_psr_disable_source(struct intel_dp *intel_dp)
661{ 701{
662 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 702 u32 val;
663
664 if (dev_priv->psr.active) {
665 i915_reg_t psr_status;
666 u32 psr_status_mask;
667
668 if (dev_priv->psr.psr2_enabled) {
669 psr_status = EDP_PSR2_STATUS;
670 psr_status_mask = EDP_PSR2_STATUS_STATE_MASK;
671
672 I915_WRITE(EDP_PSR2_CTL,
673 I915_READ(EDP_PSR2_CTL) &
674 ~(EDP_PSR2_ENABLE | EDP_SU_TRACK_ENABLE));
675
676 } else {
677 psr_status = EDP_PSR_STATUS;
678 psr_status_mask = EDP_PSR_STATUS_STATE_MASK;
679
680 I915_WRITE(EDP_PSR_CTL,
681 I915_READ(EDP_PSR_CTL) & ~EDP_PSR_ENABLE);
682 }
683 703
684 /* Wait till PSR is idle */ 704 if (!dev_priv->psr.active) {
685 if (intel_wait_for_register(dev_priv, 705 if (INTEL_GEN(dev_priv) >= 9)
686 psr_status, psr_status_mask, 0, 706 WARN_ON(I915_READ(EDP_PSR2_CTL) & EDP_PSR2_ENABLE);
687 2000)) 707 WARN_ON(I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE);
688 DRM_ERROR("Timed out waiting for PSR Idle State\n"); 708 return;
709 }
689 710
690 dev_priv->psr.active = false; 711 if (dev_priv->psr.psr2_enabled) {
712 val = I915_READ(EDP_PSR2_CTL);
713 WARN_ON(!(val & EDP_PSR2_ENABLE));
714 I915_WRITE(EDP_PSR2_CTL, val & ~EDP_PSR2_ENABLE);
691 } else { 715 } else {
692 if (dev_priv->psr.psr2_enabled) 716 val = I915_READ(EDP_PSR_CTL);
693 WARN_ON(I915_READ(EDP_PSR2_CTL) & EDP_PSR2_ENABLE); 717 WARN_ON(!(val & EDP_PSR_ENABLE));
694 else 718 I915_WRITE(EDP_PSR_CTL, val & ~EDP_PSR_ENABLE);
695 WARN_ON(I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE);
696 } 719 }
720 dev_priv->psr.active = false;
697} 721}
698 722
699static void intel_psr_disable_locked(struct intel_dp *intel_dp) 723static void intel_psr_disable_locked(struct intel_dp *intel_dp)
700{ 724{
701 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 725 struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
726 i915_reg_t psr_status;
727 u32 psr_status_mask;
702 728
703 lockdep_assert_held(&dev_priv->psr.lock); 729 lockdep_assert_held(&dev_priv->psr.lock);
704 730
@@ -707,7 +733,21 @@ static void intel_psr_disable_locked(struct intel_dp *intel_dp)
707 733
708 DRM_DEBUG_KMS("Disabling PSR%s\n", 734 DRM_DEBUG_KMS("Disabling PSR%s\n",
709 dev_priv->psr.psr2_enabled ? "2" : "1"); 735 dev_priv->psr.psr2_enabled ? "2" : "1");
710 intel_psr_disable_source(intel_dp); 736
737 intel_psr_exit(dev_priv);
738
739 if (dev_priv->psr.psr2_enabled) {
740 psr_status = EDP_PSR2_STATUS;
741 psr_status_mask = EDP_PSR2_STATUS_STATE_MASK;
742 } else {
743 psr_status = EDP_PSR_STATUS;
744 psr_status_mask = EDP_PSR_STATUS_STATE_MASK;
745 }
746
747 /* Wait till PSR is idle */
748 if (intel_wait_for_register(dev_priv, psr_status, psr_status_mask, 0,
749 2000))
750 DRM_ERROR("Timed out waiting PSR idle state\n");
711 751
712 /* Disable PSR on Sink */ 752 /* Disable PSR on Sink */
713 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, 0); 753 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, 0);
@@ -925,25 +965,6 @@ unlock:
925 mutex_unlock(&dev_priv->psr.lock); 965 mutex_unlock(&dev_priv->psr.lock);
926} 966}
927 967
928static void intel_psr_exit(struct drm_i915_private *dev_priv)
929{
930 u32 val;
931
932 if (!dev_priv->psr.active)
933 return;
934
935 if (dev_priv->psr.psr2_enabled) {
936 val = I915_READ(EDP_PSR2_CTL);
937 WARN_ON(!(val & EDP_PSR2_ENABLE));
938 I915_WRITE(EDP_PSR2_CTL, val & ~EDP_PSR2_ENABLE);
939 } else {
940 val = I915_READ(EDP_PSR_CTL);
941 WARN_ON(!(val & EDP_PSR_ENABLE));
942 I915_WRITE(EDP_PSR_CTL, val & ~EDP_PSR_ENABLE);
943 }
944 dev_priv->psr.active = false;
945}
946
947/** 968/**
948 * intel_psr_invalidate - Invalidade PSR 969 * intel_psr_invalidate - Invalidade PSR
949 * @dev_priv: i915 device 970 * @dev_priv: i915 device
@@ -1026,20 +1047,16 @@ void intel_psr_flush(struct drm_i915_private *dev_priv,
1026 1047
1027 /* By definition flush = invalidate + flush */ 1048 /* By definition flush = invalidate + flush */
1028 if (frontbuffer_bits) { 1049 if (frontbuffer_bits) {
1029 if (dev_priv->psr.psr2_enabled) { 1050 /*
1030 intel_psr_exit(dev_priv); 1051 * Display WA #0884: all
1031 } else { 1052 * This documented WA for bxt can be safely applied
1032 /* 1053 * broadly so we can force HW tracking to exit PSR
1033 * Display WA #0884: all 1054 * instead of disabling and re-enabling.
1034 * This documented WA for bxt can be safely applied 1055 * Workaround tells us to write 0 to CUR_SURFLIVE_A,
1035 * broadly so we can force HW tracking to exit PSR 1056 * but it makes more sense write to the current active
1036 * instead of disabling and re-enabling. 1057 * pipe.
1037 * Workaround tells us to write 0 to CUR_SURFLIVE_A, 1058 */
1038 * but it makes more sense write to the current active 1059 I915_WRITE(CURSURFLIVE(pipe), 0);
1039 * pipe.
1040 */
1041 I915_WRITE(CURSURFLIVE(pipe), 0);
1042 }
1043 } 1060 }
1044 1061
1045 if (!dev_priv->psr.active && !dev_priv->psr.busy_frontbuffer_bits) 1062 if (!dev_priv->psr.active && !dev_priv->psr.busy_frontbuffer_bits)
@@ -1065,12 +1082,9 @@ void intel_psr_init(struct drm_i915_private *dev_priv)
1065 if (!dev_priv->psr.sink_support) 1082 if (!dev_priv->psr.sink_support)
1066 return; 1083 return;
1067 1084
1068 if (i915_modparams.enable_psr == -1) { 1085 if (i915_modparams.enable_psr == -1)
1069 i915_modparams.enable_psr = dev_priv->vbt.psr.enable; 1086 if (INTEL_GEN(dev_priv) < 9 || !dev_priv->vbt.psr.enable)
1070 1087 i915_modparams.enable_psr = 0;
1071 /* Per platform default: all disabled. */
1072 i915_modparams.enable_psr = 0;
1073 }
1074 1088
1075 /* Set link_standby x link_off defaults */ 1089 /* Set link_standby x link_off defaults */
1076 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 1090 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
@@ -1130,8 +1144,6 @@ void intel_psr_short_pulse(struct intel_dp *intel_dp)
1130 intel_psr_disable_locked(intel_dp); 1144 intel_psr_disable_locked(intel_dp);
1131 /* clear status register */ 1145 /* clear status register */
1132 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_ERROR_STATUS, val); 1146 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_ERROR_STATUS, val);
1133
1134 /* TODO: handle PSR2 errors */
1135exit: 1147exit:
1136 mutex_unlock(&psr->lock); 1148 mutex_unlock(&psr->lock);
1137} 1149}
diff --git a/drivers/gpu/drm/i915/intel_quirks.c b/drivers/gpu/drm/i915/intel_quirks.c
new file mode 100644
index 000000000000..ec2b0fc92b8b
--- /dev/null
+++ b/drivers/gpu/drm/i915/intel_quirks.c
@@ -0,0 +1,169 @@
1// SPDX-License-Identifier: MIT
2/*
3 * Copyright © 2018 Intel Corporation
4 */
5
6#include <linux/dmi.h>
7
8#include "intel_drv.h"
9
10/*
11 * Some machines (Lenovo U160) do not work with SSC on LVDS for some reason
12 */
13static void quirk_ssc_force_disable(struct drm_i915_private *i915)
14{
15 i915->quirks |= QUIRK_LVDS_SSC_DISABLE;
16 DRM_INFO("applying lvds SSC disable quirk\n");
17}
18
19/*
20 * A machine (e.g. Acer Aspire 5734Z) may need to invert the panel backlight
21 * brightness value
22 */
23static void quirk_invert_brightness(struct drm_i915_private *i915)
24{
25 i915->quirks |= QUIRK_INVERT_BRIGHTNESS;
26 DRM_INFO("applying inverted panel brightness quirk\n");
27}
28
29/* Some VBT's incorrectly indicate no backlight is present */
30static void quirk_backlight_present(struct drm_i915_private *i915)
31{
32 i915->quirks |= QUIRK_BACKLIGHT_PRESENT;
33 DRM_INFO("applying backlight present quirk\n");
34}
35
36/* Toshiba Satellite P50-C-18C requires T12 delay to be min 800ms
37 * which is 300 ms greater than eDP spec T12 min.
38 */
39static void quirk_increase_t12_delay(struct drm_i915_private *i915)
40{
41 i915->quirks |= QUIRK_INCREASE_T12_DELAY;
42 DRM_INFO("Applying T12 delay quirk\n");
43}
44
45/*
46 * GeminiLake NUC HDMI outputs require additional off time
47 * this allows the onboard retimer to correctly sync to signal
48 */
49static void quirk_increase_ddi_disabled_time(struct drm_i915_private *i915)
50{
51 i915->quirks |= QUIRK_INCREASE_DDI_DISABLED_TIME;
52 DRM_INFO("Applying Increase DDI Disabled quirk\n");
53}
54
55struct intel_quirk {
56 int device;
57 int subsystem_vendor;
58 int subsystem_device;
59 void (*hook)(struct drm_i915_private *i915);
60};
61
62/* For systems that don't have a meaningful PCI subdevice/subvendor ID */
63struct intel_dmi_quirk {
64 void (*hook)(struct drm_i915_private *i915);
65 const struct dmi_system_id (*dmi_id_list)[];
66};
67
68static int intel_dmi_reverse_brightness(const struct dmi_system_id *id)
69{
70 DRM_INFO("Backlight polarity reversed on %s\n", id->ident);
71 return 1;
72}
73
74static const struct intel_dmi_quirk intel_dmi_quirks[] = {
75 {
76 .dmi_id_list = &(const struct dmi_system_id[]) {
77 {
78 .callback = intel_dmi_reverse_brightness,
79 .ident = "NCR Corporation",
80 .matches = {DMI_MATCH(DMI_SYS_VENDOR, "NCR Corporation"),
81 DMI_MATCH(DMI_PRODUCT_NAME, ""),
82 },
83 },
84 { } /* terminating entry */
85 },
86 .hook = quirk_invert_brightness,
87 },
88};
89
90static struct intel_quirk intel_quirks[] = {
91 /* Lenovo U160 cannot use SSC on LVDS */
92 { 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable },
93
94 /* Sony Vaio Y cannot use SSC on LVDS */
95 { 0x0046, 0x104d, 0x9076, quirk_ssc_force_disable },
96
97 /* Acer Aspire 5734Z must invert backlight brightness */
98 { 0x2a42, 0x1025, 0x0459, quirk_invert_brightness },
99
100 /* Acer/eMachines G725 */
101 { 0x2a42, 0x1025, 0x0210, quirk_invert_brightness },
102
103 /* Acer/eMachines e725 */
104 { 0x2a42, 0x1025, 0x0212, quirk_invert_brightness },
105
106 /* Acer/Packard Bell NCL20 */
107 { 0x2a42, 0x1025, 0x034b, quirk_invert_brightness },
108
109 /* Acer Aspire 4736Z */
110 { 0x2a42, 0x1025, 0x0260, quirk_invert_brightness },
111
112 /* Acer Aspire 5336 */
113 { 0x2a42, 0x1025, 0x048a, quirk_invert_brightness },
114
115 /* Acer C720 and C720P Chromebooks (Celeron 2955U) have backlights */
116 { 0x0a06, 0x1025, 0x0a11, quirk_backlight_present },
117
118 /* Acer C720 Chromebook (Core i3 4005U) */
119 { 0x0a16, 0x1025, 0x0a11, quirk_backlight_present },
120
121 /* Apple Macbook 2,1 (Core 2 T7400) */
122 { 0x27a2, 0x8086, 0x7270, quirk_backlight_present },
123
124 /* Apple Macbook 4,1 */
125 { 0x2a02, 0x106b, 0x00a1, quirk_backlight_present },
126
127 /* Toshiba CB35 Chromebook (Celeron 2955U) */
128 { 0x0a06, 0x1179, 0x0a88, quirk_backlight_present },
129
130 /* HP Chromebook 14 (Celeron 2955U) */
131 { 0x0a06, 0x103c, 0x21ed, quirk_backlight_present },
132
133 /* Dell Chromebook 11 */
134 { 0x0a06, 0x1028, 0x0a35, quirk_backlight_present },
135
136 /* Dell Chromebook 11 (2015 version) */
137 { 0x0a16, 0x1028, 0x0a35, quirk_backlight_present },
138
139 /* Toshiba Satellite P50-C-18C */
140 { 0x191B, 0x1179, 0xF840, quirk_increase_t12_delay },
141
142 /* GeminiLake NUC */
143 { 0x3185, 0x8086, 0x2072, quirk_increase_ddi_disabled_time },
144 { 0x3184, 0x8086, 0x2072, quirk_increase_ddi_disabled_time },
145 /* ASRock ITX*/
146 { 0x3185, 0x1849, 0x2212, quirk_increase_ddi_disabled_time },
147 { 0x3184, 0x1849, 0x2212, quirk_increase_ddi_disabled_time },
148};
149
150void intel_init_quirks(struct drm_i915_private *i915)
151{
152 struct pci_dev *d = i915->drm.pdev;
153 int i;
154
155 for (i = 0; i < ARRAY_SIZE(intel_quirks); i++) {
156 struct intel_quirk *q = &intel_quirks[i];
157
158 if (d->device == q->device &&
159 (d->subsystem_vendor == q->subsystem_vendor ||
160 q->subsystem_vendor == PCI_ANY_ID) &&
161 (d->subsystem_device == q->subsystem_device ||
162 q->subsystem_device == PCI_ANY_ID))
163 q->hook(i915);
164 }
165 for (i = 0; i < ARRAY_SIZE(intel_dmi_quirks); i++) {
166 if (dmi_check_system(*intel_dmi_quirks[i].dmi_id_list) != 0)
167 intel_dmi_quirks[i].hook(i915);
168 }
169}
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index d0ef50bf930a..87eebc13c0d8 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -91,6 +91,7 @@ static int
91gen4_render_ring_flush(struct i915_request *rq, u32 mode) 91gen4_render_ring_flush(struct i915_request *rq, u32 mode)
92{ 92{
93 u32 cmd, *cs; 93 u32 cmd, *cs;
94 int i;
94 95
95 /* 96 /*
96 * read/write caches: 97 * read/write caches:
@@ -127,12 +128,45 @@ gen4_render_ring_flush(struct i915_request *rq, u32 mode)
127 cmd |= MI_INVALIDATE_ISP; 128 cmd |= MI_INVALIDATE_ISP;
128 } 129 }
129 130
130 cs = intel_ring_begin(rq, 2); 131 i = 2;
132 if (mode & EMIT_INVALIDATE)
133 i += 20;
134
135 cs = intel_ring_begin(rq, i);
131 if (IS_ERR(cs)) 136 if (IS_ERR(cs))
132 return PTR_ERR(cs); 137 return PTR_ERR(cs);
133 138
134 *cs++ = cmd; 139 *cs++ = cmd;
135 *cs++ = MI_NOOP; 140
141 /*
142 * A random delay to let the CS invalidate take effect? Without this
143 * delay, the GPU relocation path fails as the CS does not see
144 * the updated contents. Just as important, if we apply the flushes
145 * to the EMIT_FLUSH branch (i.e. immediately after the relocation
146 * write and before the invalidate on the next batch), the relocations
147 * still fail. This implies that is a delay following invalidation
148 * that is required to reset the caches as opposed to a delay to
149 * ensure the memory is written.
150 */
151 if (mode & EMIT_INVALIDATE) {
152 *cs++ = GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE;
153 *cs++ = i915_ggtt_offset(rq->engine->scratch) |
154 PIPE_CONTROL_GLOBAL_GTT;
155 *cs++ = 0;
156 *cs++ = 0;
157
158 for (i = 0; i < 12; i++)
159 *cs++ = MI_FLUSH;
160
161 *cs++ = GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE;
162 *cs++ = i915_ggtt_offset(rq->engine->scratch) |
163 PIPE_CONTROL_GLOBAL_GTT;
164 *cs++ = 0;
165 *cs++ = 0;
166 }
167
168 *cs++ = cmd;
169
136 intel_ring_advance(rq, cs); 170 intel_ring_advance(rq, cs);
137 171
138 return 0; 172 return 0;
@@ -574,7 +608,9 @@ static void skip_request(struct i915_request *rq)
574 608
575static void reset_ring(struct intel_engine_cs *engine, struct i915_request *rq) 609static void reset_ring(struct intel_engine_cs *engine, struct i915_request *rq)
576{ 610{
577 GEM_TRACE("%s seqno=%x\n", engine->name, rq ? rq->global_seqno : 0); 611 GEM_TRACE("%s request global=%d, current=%d\n",
612 engine->name, rq ? rq->global_seqno : 0,
613 intel_engine_get_seqno(engine));
578 614
579 /* 615 /*
580 * Try to restore the logical GPU state to match the continuation 616 * Try to restore the logical GPU state to match the continuation
@@ -1021,8 +1057,7 @@ i915_emit_bb_start(struct i915_request *rq,
1021int intel_ring_pin(struct intel_ring *ring) 1057int intel_ring_pin(struct intel_ring *ring)
1022{ 1058{
1023 struct i915_vma *vma = ring->vma; 1059 struct i915_vma *vma = ring->vma;
1024 enum i915_map_type map = 1060 enum i915_map_type map = i915_coherent_map_type(vma->vm->i915);
1025 HAS_LLC(vma->vm->i915) ? I915_MAP_WB : I915_MAP_WC;
1026 unsigned int flags; 1061 unsigned int flags;
1027 void *addr; 1062 void *addr;
1028 int ret; 1063 int ret;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 2dfa585712c2..8a2270b209b0 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -1,4 +1,4 @@
1/* SPDX-License-Identifier: GPL-2.0 */ 1/* SPDX-License-Identifier: MIT */
2#ifndef _INTEL_RINGBUFFER_H_ 2#ifndef _INTEL_RINGBUFFER_H_
3#define _INTEL_RINGBUFFER_H_ 3#define _INTEL_RINGBUFFER_H_
4 4
@@ -93,11 +93,11 @@ hangcheck_action_to_str(const enum intel_engine_hangcheck_action a)
93#define I915_MAX_SUBSLICES 8 93#define I915_MAX_SUBSLICES 8
94 94
95#define instdone_slice_mask(dev_priv__) \ 95#define instdone_slice_mask(dev_priv__) \
96 (INTEL_GEN(dev_priv__) == 7 ? \ 96 (IS_GEN7(dev_priv__) ? \
97 1 : INTEL_INFO(dev_priv__)->sseu.slice_mask) 97 1 : INTEL_INFO(dev_priv__)->sseu.slice_mask)
98 98
99#define instdone_subslice_mask(dev_priv__) \ 99#define instdone_subslice_mask(dev_priv__) \
100 (INTEL_GEN(dev_priv__) == 7 ? \ 100 (IS_GEN7(dev_priv__) ? \
101 1 : INTEL_INFO(dev_priv__)->sseu.subslice_mask[0]) 101 1 : INTEL_INFO(dev_priv__)->sseu.subslice_mask[0])
102 102
103#define for_each_instdone_slice_subslice(dev_priv__, slice__, subslice__) \ 103#define for_each_instdone_slice_subslice(dev_priv__, slice__, subslice__) \
@@ -190,11 +190,22 @@ enum intel_engine_id {
190}; 190};
191 191
192struct i915_priolist { 192struct i915_priolist {
193 struct list_head requests[I915_PRIORITY_COUNT];
193 struct rb_node node; 194 struct rb_node node;
194 struct list_head requests; 195 unsigned long used;
195 int priority; 196 int priority;
196}; 197};
197 198
199#define priolist_for_each_request(it, plist, idx) \
200 for (idx = 0; idx < ARRAY_SIZE((plist)->requests); idx++) \
201 list_for_each_entry(it, &(plist)->requests[idx], sched.link)
202
203#define priolist_for_each_request_consume(it, n, plist, idx) \
204 for (; (idx = ffs((plist)->used)); (plist)->used &= ~BIT(idx - 1)) \
205 list_for_each_entry_safe(it, n, \
206 &(plist)->requests[idx - 1], \
207 sched.link)
208
198struct st_preempt_hang { 209struct st_preempt_hang {
199 struct completion completion; 210 struct completion completion;
200 bool inject_hang; 211 bool inject_hang;
@@ -487,11 +498,10 @@ struct intel_engine_cs {
487 */ 498 */
488 void (*submit_request)(struct i915_request *rq); 499 void (*submit_request)(struct i915_request *rq);
489 500
490 /* Call when the priority on a request has changed and it and its 501 /*
502 * Call when the priority on a request has changed and it and its
491 * dependencies may need rescheduling. Note the request itself may 503 * dependencies may need rescheduling. Note the request itself may
492 * not be ready to run! 504 * not be ready to run!
493 *
494 * Called under the struct_mutex.
495 */ 505 */
496 void (*schedule)(struct i915_request *request, 506 void (*schedule)(struct i915_request *request,
497 const struct i915_sched_attr *attr); 507 const struct i915_sched_attr *attr);
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 0fdabce647ab..1c2de9b69a19 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -208,7 +208,7 @@ bool __intel_display_power_is_enabled(struct drm_i915_private *dev_priv,
208 208
209 is_enabled = true; 209 is_enabled = true;
210 210
211 for_each_power_domain_well_rev(dev_priv, power_well, BIT_ULL(domain)) { 211 for_each_power_domain_well_reverse(dev_priv, power_well, BIT_ULL(domain)) {
212 if (power_well->desc->always_on) 212 if (power_well->desc->always_on)
213 continue; 213 continue;
214 214
@@ -436,6 +436,15 @@ icl_combo_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
436 I915_WRITE(ICL_PORT_CL_DW12(port), val | ICL_LANE_ENABLE_AUX); 436 I915_WRITE(ICL_PORT_CL_DW12(port), val | ICL_LANE_ENABLE_AUX);
437 437
438 hsw_wait_for_power_well_enable(dev_priv, power_well); 438 hsw_wait_for_power_well_enable(dev_priv, power_well);
439
440 /* Display WA #1178: icl */
441 if (IS_ICELAKE(dev_priv) &&
442 pw_idx >= ICL_PW_CTL_IDX_AUX_A && pw_idx <= ICL_PW_CTL_IDX_AUX_B &&
443 !intel_bios_is_port_edp(dev_priv, port)) {
444 val = I915_READ(ICL_AUX_ANAOVRD1(pw_idx));
445 val |= ICL_AUX_ANAOVRD1_ENABLE | ICL_AUX_ANAOVRD1_LDO_BYPASS;
446 I915_WRITE(ICL_AUX_ANAOVRD1(pw_idx), val);
447 }
439} 448}
440 449
441static void 450static void
@@ -456,6 +465,25 @@ icl_combo_phy_aux_power_well_disable(struct drm_i915_private *dev_priv,
456 hsw_wait_for_power_well_disable(dev_priv, power_well); 465 hsw_wait_for_power_well_disable(dev_priv, power_well);
457} 466}
458 467
468#define ICL_AUX_PW_TO_CH(pw_idx) \
469 ((pw_idx) - ICL_PW_CTL_IDX_AUX_A + AUX_CH_A)
470
471static void
472icl_tc_phy_aux_power_well_enable(struct drm_i915_private *dev_priv,
473 struct i915_power_well *power_well)
474{
475 enum aux_ch aux_ch = ICL_AUX_PW_TO_CH(power_well->desc->hsw.idx);
476 u32 val;
477
478 val = I915_READ(DP_AUX_CH_CTL(aux_ch));
479 val &= ~DP_AUX_CH_CTL_TBT_IO;
480 if (power_well->desc->hsw.is_tc_tbt)
481 val |= DP_AUX_CH_CTL_TBT_IO;
482 I915_WRITE(DP_AUX_CH_CTL(aux_ch), val);
483
484 hsw_power_well_enable(dev_priv, power_well);
485}
486
459/* 487/*
460 * We should only use the power well if we explicitly asked the hardware to 488 * We should only use the power well if we explicitly asked the hardware to
461 * enable it, so check if it's enabled and also check if we've requested it to 489 * enable it, so check if it's enabled and also check if we've requested it to
@@ -465,11 +493,25 @@ static bool hsw_power_well_enabled(struct drm_i915_private *dev_priv,
465 struct i915_power_well *power_well) 493 struct i915_power_well *power_well)
466{ 494{
467 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs; 495 const struct i915_power_well_regs *regs = power_well->desc->hsw.regs;
496 enum i915_power_well_id id = power_well->desc->id;
468 int pw_idx = power_well->desc->hsw.idx; 497 int pw_idx = power_well->desc->hsw.idx;
469 u32 mask = HSW_PWR_WELL_CTL_REQ(pw_idx) | 498 u32 mask = HSW_PWR_WELL_CTL_REQ(pw_idx) |
470 HSW_PWR_WELL_CTL_STATE(pw_idx); 499 HSW_PWR_WELL_CTL_STATE(pw_idx);
500 u32 val;
471 501
472 return (I915_READ(regs->driver) & mask) == mask; 502 val = I915_READ(regs->driver);
503
504 /*
505 * On GEN9 big core due to a DMC bug the driver's request bits for PW1
506 * and the MISC_IO PW will be not restored, so check instead for the
507 * BIOS's own request bits, which are forced-on for these power wells
508 * when exiting DC5/6.
509 */
510 if (IS_GEN9(dev_priv) && !IS_GEN9_LP(dev_priv) &&
511 (id == SKL_DISP_PW_1 || id == SKL_DISP_PW_MISC_IO))
512 val |= I915_READ(regs->bios);
513
514 return (val & mask) == mask;
473} 515}
474 516
475static void assert_can_enable_dc9(struct drm_i915_private *dev_priv) 517static void assert_can_enable_dc9(struct drm_i915_private *dev_priv)
@@ -551,7 +593,9 @@ static u32 gen9_dc_mask(struct drm_i915_private *dev_priv)
551 u32 mask; 593 u32 mask;
552 594
553 mask = DC_STATE_EN_UPTO_DC5; 595 mask = DC_STATE_EN_UPTO_DC5;
554 if (IS_GEN9_LP(dev_priv)) 596 if (INTEL_GEN(dev_priv) >= 11)
597 mask |= DC_STATE_EN_UPTO_DC6 | DC_STATE_EN_DC9;
598 else if (IS_GEN9_LP(dev_priv))
555 mask |= DC_STATE_EN_DC9; 599 mask |= DC_STATE_EN_DC9;
556 else 600 else
557 mask |= DC_STATE_EN_UPTO_DC6; 601 mask |= DC_STATE_EN_UPTO_DC6;
@@ -624,8 +668,13 @@ void bxt_enable_dc9(struct drm_i915_private *dev_priv)
624 assert_can_enable_dc9(dev_priv); 668 assert_can_enable_dc9(dev_priv);
625 669
626 DRM_DEBUG_KMS("Enabling DC9\n"); 670 DRM_DEBUG_KMS("Enabling DC9\n");
627 671 /*
628 intel_power_sequencer_reset(dev_priv); 672 * Power sequencer reset is not needed on
673 * platforms with South Display Engine on PCH,
674 * because PPS registers are always on.
675 */
676 if (!HAS_PCH_SPLIT(dev_priv))
677 intel_power_sequencer_reset(dev_priv);
629 gen9_set_dc_state(dev_priv, DC_STATE_EN_DC9); 678 gen9_set_dc_state(dev_priv, DC_STATE_EN_DC9);
630} 679}
631 680
@@ -707,7 +756,7 @@ static void assert_can_enable_dc6(struct drm_i915_private *dev_priv)
707 assert_csr_loaded(dev_priv); 756 assert_csr_loaded(dev_priv);
708} 757}
709 758
710static void skl_enable_dc6(struct drm_i915_private *dev_priv) 759void skl_enable_dc6(struct drm_i915_private *dev_priv)
711{ 760{
712 assert_can_enable_dc6(dev_priv); 761 assert_can_enable_dc6(dev_priv);
713 762
@@ -808,6 +857,14 @@ static void gen9_dc_off_power_well_enable(struct drm_i915_private *dev_priv,
808 857
809 if (IS_GEN9_LP(dev_priv)) 858 if (IS_GEN9_LP(dev_priv))
810 bxt_verify_ddi_phy_power_wells(dev_priv); 859 bxt_verify_ddi_phy_power_wells(dev_priv);
860
861 if (INTEL_GEN(dev_priv) >= 11)
862 /*
863 * DMC retains HW context only for port A, the other combo
864 * PHY's HW context for port B is lost after DC transitions,
865 * so we need to restore it manually.
866 */
867 icl_combo_phys_init(dev_priv);
811} 868}
812 869
813static void gen9_dc_off_power_well_disable(struct drm_i915_private *dev_priv, 870static void gen9_dc_off_power_well_disable(struct drm_i915_private *dev_priv,
@@ -1608,7 +1665,7 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
1608 intel_display_power_domain_str(domain)); 1665 intel_display_power_domain_str(domain));
1609 power_domains->domain_use_count[domain]--; 1666 power_domains->domain_use_count[domain]--;
1610 1667
1611 for_each_power_domain_well_rev(dev_priv, power_well, BIT_ULL(domain)) 1668 for_each_power_domain_well_reverse(dev_priv, power_well, BIT_ULL(domain))
1612 intel_power_well_put(dev_priv, power_well); 1669 intel_power_well_put(dev_priv, power_well);
1613 1670
1614 mutex_unlock(&power_domains->lock); 1671 mutex_unlock(&power_domains->lock);
@@ -2041,7 +2098,7 @@ static const struct i915_power_well_ops chv_dpio_cmn_power_well_ops = {
2041static const struct i915_power_well_desc i9xx_always_on_power_well[] = { 2098static const struct i915_power_well_desc i9xx_always_on_power_well[] = {
2042 { 2099 {
2043 .name = "always-on", 2100 .name = "always-on",
2044 .always_on = 1, 2101 .always_on = true,
2045 .domains = POWER_DOMAIN_MASK, 2102 .domains = POWER_DOMAIN_MASK,
2046 .ops = &i9xx_always_on_power_well_ops, 2103 .ops = &i9xx_always_on_power_well_ops,
2047 .id = DISP_PW_ID_NONE, 2104 .id = DISP_PW_ID_NONE,
@@ -2058,7 +2115,7 @@ static const struct i915_power_well_ops i830_pipes_power_well_ops = {
2058static const struct i915_power_well_desc i830_power_wells[] = { 2115static const struct i915_power_well_desc i830_power_wells[] = {
2059 { 2116 {
2060 .name = "always-on", 2117 .name = "always-on",
2061 .always_on = 1, 2118 .always_on = true,
2062 .domains = POWER_DOMAIN_MASK, 2119 .domains = POWER_DOMAIN_MASK,
2063 .ops = &i9xx_always_on_power_well_ops, 2120 .ops = &i9xx_always_on_power_well_ops,
2064 .id = DISP_PW_ID_NONE, 2121 .id = DISP_PW_ID_NONE,
@@ -2102,7 +2159,7 @@ static const struct i915_power_well_regs hsw_power_well_regs = {
2102static const struct i915_power_well_desc hsw_power_wells[] = { 2159static const struct i915_power_well_desc hsw_power_wells[] = {
2103 { 2160 {
2104 .name = "always-on", 2161 .name = "always-on",
2105 .always_on = 1, 2162 .always_on = true,
2106 .domains = POWER_DOMAIN_MASK, 2163 .domains = POWER_DOMAIN_MASK,
2107 .ops = &i9xx_always_on_power_well_ops, 2164 .ops = &i9xx_always_on_power_well_ops,
2108 .id = DISP_PW_ID_NONE, 2165 .id = DISP_PW_ID_NONE,
@@ -2123,7 +2180,7 @@ static const struct i915_power_well_desc hsw_power_wells[] = {
2123static const struct i915_power_well_desc bdw_power_wells[] = { 2180static const struct i915_power_well_desc bdw_power_wells[] = {
2124 { 2181 {
2125 .name = "always-on", 2182 .name = "always-on",
2126 .always_on = 1, 2183 .always_on = true,
2127 .domains = POWER_DOMAIN_MASK, 2184 .domains = POWER_DOMAIN_MASK,
2128 .ops = &i9xx_always_on_power_well_ops, 2185 .ops = &i9xx_always_on_power_well_ops,
2129 .id = DISP_PW_ID_NONE, 2186 .id = DISP_PW_ID_NONE,
@@ -2166,7 +2223,7 @@ static const struct i915_power_well_ops vlv_dpio_power_well_ops = {
2166static const struct i915_power_well_desc vlv_power_wells[] = { 2223static const struct i915_power_well_desc vlv_power_wells[] = {
2167 { 2224 {
2168 .name = "always-on", 2225 .name = "always-on",
2169 .always_on = 1, 2226 .always_on = true,
2170 .domains = POWER_DOMAIN_MASK, 2227 .domains = POWER_DOMAIN_MASK,
2171 .ops = &i9xx_always_on_power_well_ops, 2228 .ops = &i9xx_always_on_power_well_ops,
2172 .id = DISP_PW_ID_NONE, 2229 .id = DISP_PW_ID_NONE,
@@ -2242,7 +2299,7 @@ static const struct i915_power_well_desc vlv_power_wells[] = {
2242static const struct i915_power_well_desc chv_power_wells[] = { 2299static const struct i915_power_well_desc chv_power_wells[] = {
2243 { 2300 {
2244 .name = "always-on", 2301 .name = "always-on",
2245 .always_on = 1, 2302 .always_on = true,
2246 .domains = POWER_DOMAIN_MASK, 2303 .domains = POWER_DOMAIN_MASK,
2247 .ops = &i9xx_always_on_power_well_ops, 2304 .ops = &i9xx_always_on_power_well_ops,
2248 .id = DISP_PW_ID_NONE, 2305 .id = DISP_PW_ID_NONE,
@@ -2293,7 +2350,7 @@ bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv,
2293static const struct i915_power_well_desc skl_power_wells[] = { 2350static const struct i915_power_well_desc skl_power_wells[] = {
2294 { 2351 {
2295 .name = "always-on", 2352 .name = "always-on",
2296 .always_on = 1, 2353 .always_on = true,
2297 .domains = POWER_DOMAIN_MASK, 2354 .domains = POWER_DOMAIN_MASK,
2298 .ops = &i9xx_always_on_power_well_ops, 2355 .ops = &i9xx_always_on_power_well_ops,
2299 .id = DISP_PW_ID_NONE, 2356 .id = DISP_PW_ID_NONE,
@@ -2301,6 +2358,7 @@ static const struct i915_power_well_desc skl_power_wells[] = {
2301 { 2358 {
2302 .name = "power well 1", 2359 .name = "power well 1",
2303 /* Handled by the DMC firmware */ 2360 /* Handled by the DMC firmware */
2361 .always_on = true,
2304 .domains = 0, 2362 .domains = 0,
2305 .ops = &hsw_power_well_ops, 2363 .ops = &hsw_power_well_ops,
2306 .id = SKL_DISP_PW_1, 2364 .id = SKL_DISP_PW_1,
@@ -2313,6 +2371,7 @@ static const struct i915_power_well_desc skl_power_wells[] = {
2313 { 2371 {
2314 .name = "MISC IO power well", 2372 .name = "MISC IO power well",
2315 /* Handled by the DMC firmware */ 2373 /* Handled by the DMC firmware */
2374 .always_on = true,
2316 .domains = 0, 2375 .domains = 0,
2317 .ops = &hsw_power_well_ops, 2376 .ops = &hsw_power_well_ops,
2318 .id = SKL_DISP_PW_MISC_IO, 2377 .id = SKL_DISP_PW_MISC_IO,
@@ -2385,13 +2444,15 @@ static const struct i915_power_well_desc skl_power_wells[] = {
2385static const struct i915_power_well_desc bxt_power_wells[] = { 2444static const struct i915_power_well_desc bxt_power_wells[] = {
2386 { 2445 {
2387 .name = "always-on", 2446 .name = "always-on",
2388 .always_on = 1, 2447 .always_on = true,
2389 .domains = POWER_DOMAIN_MASK, 2448 .domains = POWER_DOMAIN_MASK,
2390 .ops = &i9xx_always_on_power_well_ops, 2449 .ops = &i9xx_always_on_power_well_ops,
2391 .id = DISP_PW_ID_NONE, 2450 .id = DISP_PW_ID_NONE,
2392 }, 2451 },
2393 { 2452 {
2394 .name = "power well 1", 2453 .name = "power well 1",
2454 /* Handled by the DMC firmware */
2455 .always_on = true,
2395 .domains = 0, 2456 .domains = 0,
2396 .ops = &hsw_power_well_ops, 2457 .ops = &hsw_power_well_ops,
2397 .id = SKL_DISP_PW_1, 2458 .id = SKL_DISP_PW_1,
@@ -2443,7 +2504,7 @@ static const struct i915_power_well_desc bxt_power_wells[] = {
2443static const struct i915_power_well_desc glk_power_wells[] = { 2504static const struct i915_power_well_desc glk_power_wells[] = {
2444 { 2505 {
2445 .name = "always-on", 2506 .name = "always-on",
2446 .always_on = 1, 2507 .always_on = true,
2447 .domains = POWER_DOMAIN_MASK, 2508 .domains = POWER_DOMAIN_MASK,
2448 .ops = &i9xx_always_on_power_well_ops, 2509 .ops = &i9xx_always_on_power_well_ops,
2449 .id = DISP_PW_ID_NONE, 2510 .id = DISP_PW_ID_NONE,
@@ -2451,6 +2512,7 @@ static const struct i915_power_well_desc glk_power_wells[] = {
2451 { 2512 {
2452 .name = "power well 1", 2513 .name = "power well 1",
2453 /* Handled by the DMC firmware */ 2514 /* Handled by the DMC firmware */
2515 .always_on = true,
2454 .domains = 0, 2516 .domains = 0,
2455 .ops = &hsw_power_well_ops, 2517 .ops = &hsw_power_well_ops,
2456 .id = SKL_DISP_PW_1, 2518 .id = SKL_DISP_PW_1,
@@ -2571,7 +2633,7 @@ static const struct i915_power_well_desc glk_power_wells[] = {
2571static const struct i915_power_well_desc cnl_power_wells[] = { 2633static const struct i915_power_well_desc cnl_power_wells[] = {
2572 { 2634 {
2573 .name = "always-on", 2635 .name = "always-on",
2574 .always_on = 1, 2636 .always_on = true,
2575 .domains = POWER_DOMAIN_MASK, 2637 .domains = POWER_DOMAIN_MASK,
2576 .ops = &i9xx_always_on_power_well_ops, 2638 .ops = &i9xx_always_on_power_well_ops,
2577 .id = DISP_PW_ID_NONE, 2639 .id = DISP_PW_ID_NONE,
@@ -2579,6 +2641,7 @@ static const struct i915_power_well_desc cnl_power_wells[] = {
2579 { 2641 {
2580 .name = "power well 1", 2642 .name = "power well 1",
2581 /* Handled by the DMC firmware */ 2643 /* Handled by the DMC firmware */
2644 .always_on = true,
2582 .domains = 0, 2645 .domains = 0,
2583 .ops = &hsw_power_well_ops, 2646 .ops = &hsw_power_well_ops,
2584 .id = SKL_DISP_PW_1, 2647 .id = SKL_DISP_PW_1,
@@ -2716,6 +2779,13 @@ static const struct i915_power_well_ops icl_combo_phy_aux_power_well_ops = {
2716 .is_enabled = hsw_power_well_enabled, 2779 .is_enabled = hsw_power_well_enabled,
2717}; 2780};
2718 2781
2782static const struct i915_power_well_ops icl_tc_phy_aux_power_well_ops = {
2783 .sync_hw = hsw_power_well_sync_hw,
2784 .enable = icl_tc_phy_aux_power_well_enable,
2785 .disable = hsw_power_well_disable,
2786 .is_enabled = hsw_power_well_enabled,
2787};
2788
2719static const struct i915_power_well_regs icl_aux_power_well_regs = { 2789static const struct i915_power_well_regs icl_aux_power_well_regs = {
2720 .bios = ICL_PWR_WELL_CTL_AUX1, 2790 .bios = ICL_PWR_WELL_CTL_AUX1,
2721 .driver = ICL_PWR_WELL_CTL_AUX2, 2791 .driver = ICL_PWR_WELL_CTL_AUX2,
@@ -2731,7 +2801,7 @@ static const struct i915_power_well_regs icl_ddi_power_well_regs = {
2731static const struct i915_power_well_desc icl_power_wells[] = { 2801static const struct i915_power_well_desc icl_power_wells[] = {
2732 { 2802 {
2733 .name = "always-on", 2803 .name = "always-on",
2734 .always_on = 1, 2804 .always_on = true,
2735 .domains = POWER_DOMAIN_MASK, 2805 .domains = POWER_DOMAIN_MASK,
2736 .ops = &i9xx_always_on_power_well_ops, 2806 .ops = &i9xx_always_on_power_well_ops,
2737 .id = DISP_PW_ID_NONE, 2807 .id = DISP_PW_ID_NONE,
@@ -2739,6 +2809,7 @@ static const struct i915_power_well_desc icl_power_wells[] = {
2739 { 2809 {
2740 .name = "power well 1", 2810 .name = "power well 1",
2741 /* Handled by the DMC firmware */ 2811 /* Handled by the DMC firmware */
2812 .always_on = true,
2742 .domains = 0, 2813 .domains = 0,
2743 .ops = &hsw_power_well_ops, 2814 .ops = &hsw_power_well_ops,
2744 .id = SKL_DISP_PW_1, 2815 .id = SKL_DISP_PW_1,
@@ -2749,6 +2820,12 @@ static const struct i915_power_well_desc icl_power_wells[] = {
2749 }, 2820 },
2750 }, 2821 },
2751 { 2822 {
2823 .name = "DC off",
2824 .domains = ICL_DISPLAY_DC_OFF_POWER_DOMAINS,
2825 .ops = &gen9_dc_off_power_well_ops,
2826 .id = DISP_PW_ID_NONE,
2827 },
2828 {
2752 .name = "power well 2", 2829 .name = "power well 2",
2753 .domains = ICL_PW_2_POWER_DOMAINS, 2830 .domains = ICL_PW_2_POWER_DOMAINS,
2754 .ops = &hsw_power_well_ops, 2831 .ops = &hsw_power_well_ops,
@@ -2760,12 +2837,6 @@ static const struct i915_power_well_desc icl_power_wells[] = {
2760 }, 2837 },
2761 }, 2838 },
2762 { 2839 {
2763 .name = "DC off",
2764 .domains = ICL_DISPLAY_DC_OFF_POWER_DOMAINS,
2765 .ops = &gen9_dc_off_power_well_ops,
2766 .id = DISP_PW_ID_NONE,
2767 },
2768 {
2769 .name = "power well 3", 2840 .name = "power well 3",
2770 .domains = ICL_PW_3_POWER_DOMAINS, 2841 .domains = ICL_PW_3_POWER_DOMAINS,
2771 .ops = &hsw_power_well_ops, 2842 .ops = &hsw_power_well_ops,
@@ -2861,81 +2932,89 @@ static const struct i915_power_well_desc icl_power_wells[] = {
2861 { 2932 {
2862 .name = "AUX C", 2933 .name = "AUX C",
2863 .domains = ICL_AUX_C_IO_POWER_DOMAINS, 2934 .domains = ICL_AUX_C_IO_POWER_DOMAINS,
2864 .ops = &hsw_power_well_ops, 2935 .ops = &icl_tc_phy_aux_power_well_ops,
2865 .id = DISP_PW_ID_NONE, 2936 .id = DISP_PW_ID_NONE,
2866 { 2937 {
2867 .hsw.regs = &icl_aux_power_well_regs, 2938 .hsw.regs = &icl_aux_power_well_regs,
2868 .hsw.idx = ICL_PW_CTL_IDX_AUX_C, 2939 .hsw.idx = ICL_PW_CTL_IDX_AUX_C,
2940 .hsw.is_tc_tbt = false,
2869 }, 2941 },
2870 }, 2942 },
2871 { 2943 {
2872 .name = "AUX D", 2944 .name = "AUX D",
2873 .domains = ICL_AUX_D_IO_POWER_DOMAINS, 2945 .domains = ICL_AUX_D_IO_POWER_DOMAINS,
2874 .ops = &hsw_power_well_ops, 2946 .ops = &icl_tc_phy_aux_power_well_ops,
2875 .id = DISP_PW_ID_NONE, 2947 .id = DISP_PW_ID_NONE,
2876 { 2948 {
2877 .hsw.regs = &icl_aux_power_well_regs, 2949 .hsw.regs = &icl_aux_power_well_regs,
2878 .hsw.idx = ICL_PW_CTL_IDX_AUX_D, 2950 .hsw.idx = ICL_PW_CTL_IDX_AUX_D,
2951 .hsw.is_tc_tbt = false,
2879 }, 2952 },
2880 }, 2953 },
2881 { 2954 {
2882 .name = "AUX E", 2955 .name = "AUX E",
2883 .domains = ICL_AUX_E_IO_POWER_DOMAINS, 2956 .domains = ICL_AUX_E_IO_POWER_DOMAINS,
2884 .ops = &hsw_power_well_ops, 2957 .ops = &icl_tc_phy_aux_power_well_ops,
2885 .id = DISP_PW_ID_NONE, 2958 .id = DISP_PW_ID_NONE,
2886 { 2959 {
2887 .hsw.regs = &icl_aux_power_well_regs, 2960 .hsw.regs = &icl_aux_power_well_regs,
2888 .hsw.idx = ICL_PW_CTL_IDX_AUX_E, 2961 .hsw.idx = ICL_PW_CTL_IDX_AUX_E,
2962 .hsw.is_tc_tbt = false,
2889 }, 2963 },
2890 }, 2964 },
2891 { 2965 {
2892 .name = "AUX F", 2966 .name = "AUX F",
2893 .domains = ICL_AUX_F_IO_POWER_DOMAINS, 2967 .domains = ICL_AUX_F_IO_POWER_DOMAINS,
2894 .ops = &hsw_power_well_ops, 2968 .ops = &icl_tc_phy_aux_power_well_ops,
2895 .id = DISP_PW_ID_NONE, 2969 .id = DISP_PW_ID_NONE,
2896 { 2970 {
2897 .hsw.regs = &icl_aux_power_well_regs, 2971 .hsw.regs = &icl_aux_power_well_regs,
2898 .hsw.idx = ICL_PW_CTL_IDX_AUX_F, 2972 .hsw.idx = ICL_PW_CTL_IDX_AUX_F,
2973 .hsw.is_tc_tbt = false,
2899 }, 2974 },
2900 }, 2975 },
2901 { 2976 {
2902 .name = "AUX TBT1", 2977 .name = "AUX TBT1",
2903 .domains = ICL_AUX_TBT1_IO_POWER_DOMAINS, 2978 .domains = ICL_AUX_TBT1_IO_POWER_DOMAINS,
2904 .ops = &hsw_power_well_ops, 2979 .ops = &icl_tc_phy_aux_power_well_ops,
2905 .id = DISP_PW_ID_NONE, 2980 .id = DISP_PW_ID_NONE,
2906 { 2981 {
2907 .hsw.regs = &icl_aux_power_well_regs, 2982 .hsw.regs = &icl_aux_power_well_regs,
2908 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1, 2983 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT1,
2984 .hsw.is_tc_tbt = true,
2909 }, 2985 },
2910 }, 2986 },
2911 { 2987 {
2912 .name = "AUX TBT2", 2988 .name = "AUX TBT2",
2913 .domains = ICL_AUX_TBT2_IO_POWER_DOMAINS, 2989 .domains = ICL_AUX_TBT2_IO_POWER_DOMAINS,
2914 .ops = &hsw_power_well_ops, 2990 .ops = &icl_tc_phy_aux_power_well_ops,
2915 .id = DISP_PW_ID_NONE, 2991 .id = DISP_PW_ID_NONE,
2916 { 2992 {
2917 .hsw.regs = &icl_aux_power_well_regs, 2993 .hsw.regs = &icl_aux_power_well_regs,
2918 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2, 2994 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT2,
2995 .hsw.is_tc_tbt = true,
2919 }, 2996 },
2920 }, 2997 },
2921 { 2998 {
2922 .name = "AUX TBT3", 2999 .name = "AUX TBT3",
2923 .domains = ICL_AUX_TBT3_IO_POWER_DOMAINS, 3000 .domains = ICL_AUX_TBT3_IO_POWER_DOMAINS,
2924 .ops = &hsw_power_well_ops, 3001 .ops = &icl_tc_phy_aux_power_well_ops,
2925 .id = DISP_PW_ID_NONE, 3002 .id = DISP_PW_ID_NONE,
2926 { 3003 {
2927 .hsw.regs = &icl_aux_power_well_regs, 3004 .hsw.regs = &icl_aux_power_well_regs,
2928 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3, 3005 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT3,
3006 .hsw.is_tc_tbt = true,
2929 }, 3007 },
2930 }, 3008 },
2931 { 3009 {
2932 .name = "AUX TBT4", 3010 .name = "AUX TBT4",
2933 .domains = ICL_AUX_TBT4_IO_POWER_DOMAINS, 3011 .domains = ICL_AUX_TBT4_IO_POWER_DOMAINS,
2934 .ops = &hsw_power_well_ops, 3012 .ops = &icl_tc_phy_aux_power_well_ops,
2935 .id = DISP_PW_ID_NONE, 3013 .id = DISP_PW_ID_NONE,
2936 { 3014 {
2937 .hsw.regs = &icl_aux_power_well_regs, 3015 .hsw.regs = &icl_aux_power_well_regs,
2938 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4, 3016 .hsw.idx = ICL_PW_CTL_IDX_AUX_TBT4,
3017 .hsw.is_tc_tbt = true,
2939 }, 3018 },
2940 }, 3019 },
2941 { 3020 {
@@ -2969,17 +3048,20 @@ static uint32_t get_allowed_dc_mask(const struct drm_i915_private *dev_priv,
2969 int requested_dc; 3048 int requested_dc;
2970 int max_dc; 3049 int max_dc;
2971 3050
2972 if (IS_GEN9_BC(dev_priv) || INTEL_INFO(dev_priv)->gen >= 10) { 3051 if (INTEL_GEN(dev_priv) >= 11) {
2973 max_dc = 2; 3052 max_dc = 2;
2974 mask = 0;
2975 } else if (IS_GEN9_LP(dev_priv)) {
2976 max_dc = 1;
2977 /* 3053 /*
2978 * DC9 has a separate HW flow from the rest of the DC states, 3054 * DC9 has a separate HW flow from the rest of the DC states,
2979 * not depending on the DMC firmware. It's needed by system 3055 * not depending on the DMC firmware. It's needed by system
2980 * suspend/resume, so allow it unconditionally. 3056 * suspend/resume, so allow it unconditionally.
2981 */ 3057 */
2982 mask = DC_STATE_EN_DC9; 3058 mask = DC_STATE_EN_DC9;
3059 } else if (IS_GEN10(dev_priv) || IS_GEN9_BC(dev_priv)) {
3060 max_dc = 2;
3061 mask = 0;
3062 } else if (IS_GEN9_LP(dev_priv)) {
3063 max_dc = 1;
3064 mask = DC_STATE_EN_DC9;
2983 } else { 3065 } else {
2984 max_dc = 0; 3066 max_dc = 0;
2985 mask = 0; 3067 mask = 0;
@@ -3075,12 +3157,6 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)
3075 */ 3157 */
3076 if (IS_ICELAKE(dev_priv)) { 3158 if (IS_ICELAKE(dev_priv)) {
3077 err = set_power_wells(power_domains, icl_power_wells); 3159 err = set_power_wells(power_domains, icl_power_wells);
3078 } else if (IS_HASWELL(dev_priv)) {
3079 err = set_power_wells(power_domains, hsw_power_wells);
3080 } else if (IS_BROADWELL(dev_priv)) {
3081 err = set_power_wells(power_domains, bdw_power_wells);
3082 } else if (IS_GEN9_BC(dev_priv)) {
3083 err = set_power_wells(power_domains, skl_power_wells);
3084 } else if (IS_CANNONLAKE(dev_priv)) { 3160 } else if (IS_CANNONLAKE(dev_priv)) {
3085 err = set_power_wells(power_domains, cnl_power_wells); 3161 err = set_power_wells(power_domains, cnl_power_wells);
3086 3162
@@ -3092,13 +3168,18 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)
3092 */ 3168 */
3093 if (!IS_CNL_WITH_PORT_F(dev_priv)) 3169 if (!IS_CNL_WITH_PORT_F(dev_priv))
3094 power_domains->power_well_count -= 2; 3170 power_domains->power_well_count -= 2;
3095
3096 } else if (IS_BROXTON(dev_priv)) {
3097 err = set_power_wells(power_domains, bxt_power_wells);
3098 } else if (IS_GEMINILAKE(dev_priv)) { 3171 } else if (IS_GEMINILAKE(dev_priv)) {
3099 err = set_power_wells(power_domains, glk_power_wells); 3172 err = set_power_wells(power_domains, glk_power_wells);
3173 } else if (IS_BROXTON(dev_priv)) {
3174 err = set_power_wells(power_domains, bxt_power_wells);
3175 } else if (IS_GEN9_BC(dev_priv)) {
3176 err = set_power_wells(power_domains, skl_power_wells);
3100 } else if (IS_CHERRYVIEW(dev_priv)) { 3177 } else if (IS_CHERRYVIEW(dev_priv)) {
3101 err = set_power_wells(power_domains, chv_power_wells); 3178 err = set_power_wells(power_domains, chv_power_wells);
3179 } else if (IS_BROADWELL(dev_priv)) {
3180 err = set_power_wells(power_domains, bdw_power_wells);
3181 } else if (IS_HASWELL(dev_priv)) {
3182 err = set_power_wells(power_domains, hsw_power_wells);
3102 } else if (IS_VALLEYVIEW(dev_priv)) { 3183 } else if (IS_VALLEYVIEW(dev_priv)) {
3103 err = set_power_wells(power_domains, vlv_power_wells); 3184 err = set_power_wells(power_domains, vlv_power_wells);
3104 } else if (IS_I830(dev_priv)) { 3185 } else if (IS_I830(dev_priv)) {
@@ -3176,8 +3257,7 @@ static u8 intel_dbuf_max_slices(struct drm_i915_private *dev_priv)
3176void icl_dbuf_slices_update(struct drm_i915_private *dev_priv, 3257void icl_dbuf_slices_update(struct drm_i915_private *dev_priv,
3177 u8 req_slices) 3258 u8 req_slices)
3178{ 3259{
3179 u8 hw_enabled_slices = dev_priv->wm.skl_hw.ddb.enabled_slices; 3260 const u8 hw_enabled_slices = dev_priv->wm.skl_hw.ddb.enabled_slices;
3180 u32 val;
3181 bool ret; 3261 bool ret;
3182 3262
3183 if (req_slices > intel_dbuf_max_slices(dev_priv)) { 3263 if (req_slices > intel_dbuf_max_slices(dev_priv)) {
@@ -3188,7 +3268,6 @@ void icl_dbuf_slices_update(struct drm_i915_private *dev_priv,
3188 if (req_slices == hw_enabled_slices || req_slices == 0) 3268 if (req_slices == hw_enabled_slices || req_slices == 0)
3189 return; 3269 return;
3190 3270
3191 val = I915_READ(DBUF_CTL_S2);
3192 if (req_slices > hw_enabled_slices) 3271 if (req_slices > hw_enabled_slices)
3193 ret = intel_dbuf_slice_set(dev_priv, DBUF_CTL_S2, true); 3272 ret = intel_dbuf_slice_set(dev_priv, DBUF_CTL_S2, true);
3194 else 3273 else
@@ -3240,18 +3319,40 @@ static void icl_mbus_init(struct drm_i915_private *dev_priv)
3240 I915_WRITE(MBUS_ABOX_CTL, val); 3319 I915_WRITE(MBUS_ABOX_CTL, val);
3241} 3320}
3242 3321
3322static void intel_pch_reset_handshake(struct drm_i915_private *dev_priv,
3323 bool enable)
3324{
3325 i915_reg_t reg;
3326 u32 reset_bits, val;
3327
3328 if (IS_IVYBRIDGE(dev_priv)) {
3329 reg = GEN7_MSG_CTL;
3330 reset_bits = WAIT_FOR_PCH_FLR_ACK | WAIT_FOR_PCH_RESET_ACK;
3331 } else {
3332 reg = HSW_NDE_RSTWRN_OPT;
3333 reset_bits = RESET_PCH_HANDSHAKE_ENABLE;
3334 }
3335
3336 val = I915_READ(reg);
3337
3338 if (enable)
3339 val |= reset_bits;
3340 else
3341 val &= ~reset_bits;
3342
3343 I915_WRITE(reg, val);
3344}
3345
3243static void skl_display_core_init(struct drm_i915_private *dev_priv, 3346static void skl_display_core_init(struct drm_i915_private *dev_priv,
3244 bool resume) 3347 bool resume)
3245{ 3348{
3246 struct i915_power_domains *power_domains = &dev_priv->power_domains; 3349 struct i915_power_domains *power_domains = &dev_priv->power_domains;
3247 struct i915_power_well *well; 3350 struct i915_power_well *well;
3248 uint32_t val;
3249 3351
3250 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); 3352 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
3251 3353
3252 /* enable PCH reset handshake */ 3354 /* enable PCH reset handshake */
3253 val = I915_READ(HSW_NDE_RSTWRN_OPT); 3355 intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));
3254 I915_WRITE(HSW_NDE_RSTWRN_OPT, val | RESET_PCH_HANDSHAKE_ENABLE);
3255 3356
3256 /* enable PG1 and Misc I/O */ 3357 /* enable PG1 and Misc I/O */
3257 mutex_lock(&power_domains->lock); 3358 mutex_lock(&power_domains->lock);
@@ -3307,7 +3408,6 @@ void bxt_display_core_init(struct drm_i915_private *dev_priv,
3307{ 3408{
3308 struct i915_power_domains *power_domains = &dev_priv->power_domains; 3409 struct i915_power_domains *power_domains = &dev_priv->power_domains;
3309 struct i915_power_well *well; 3410 struct i915_power_well *well;
3310 uint32_t val;
3311 3411
3312 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); 3412 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
3313 3413
@@ -3317,9 +3417,7 @@ void bxt_display_core_init(struct drm_i915_private *dev_priv,
3317 * Move the handshake programming to initialization sequence. 3417 * Move the handshake programming to initialization sequence.
3318 * Previously was left up to BIOS. 3418 * Previously was left up to BIOS.
3319 */ 3419 */
3320 val = I915_READ(HSW_NDE_RSTWRN_OPT); 3420 intel_pch_reset_handshake(dev_priv, false);
3321 val &= ~RESET_PCH_HANDSHAKE_ENABLE;
3322 I915_WRITE(HSW_NDE_RSTWRN_OPT, val);
3323 3421
3324 /* Enable PG1 */ 3422 /* Enable PG1 */
3325 mutex_lock(&power_domains->lock); 3423 mutex_lock(&power_domains->lock);
@@ -3365,101 +3463,18 @@ void bxt_display_core_uninit(struct drm_i915_private *dev_priv)
3365 usleep_range(10, 30); /* 10 us delay per Bspec */ 3463 usleep_range(10, 30); /* 10 us delay per Bspec */
3366} 3464}
3367 3465
3368enum {
3369 PROCMON_0_85V_DOT_0,
3370 PROCMON_0_95V_DOT_0,
3371 PROCMON_0_95V_DOT_1,
3372 PROCMON_1_05V_DOT_0,
3373 PROCMON_1_05V_DOT_1,
3374};
3375
3376static const struct cnl_procmon {
3377 u32 dw1, dw9, dw10;
3378} cnl_procmon_values[] = {
3379 [PROCMON_0_85V_DOT_0] =
3380 { .dw1 = 0x00000000, .dw9 = 0x62AB67BB, .dw10 = 0x51914F96, },
3381 [PROCMON_0_95V_DOT_0] =
3382 { .dw1 = 0x00000000, .dw9 = 0x86E172C7, .dw10 = 0x77CA5EAB, },
3383 [PROCMON_0_95V_DOT_1] =
3384 { .dw1 = 0x00000000, .dw9 = 0x93F87FE1, .dw10 = 0x8AE871C5, },
3385 [PROCMON_1_05V_DOT_0] =
3386 { .dw1 = 0x00000000, .dw9 = 0x98FA82DD, .dw10 = 0x89E46DC1, },
3387 [PROCMON_1_05V_DOT_1] =
3388 { .dw1 = 0x00440000, .dw9 = 0x9A00AB25, .dw10 = 0x8AE38FF1, },
3389};
3390
3391/*
3392 * CNL has just one set of registers, while ICL has two sets: one for port A and
3393 * the other for port B. The CNL registers are equivalent to the ICL port A
3394 * registers, that's why we call the ICL macros even though the function has CNL
3395 * on its name.
3396 */
3397static void cnl_set_procmon_ref_values(struct drm_i915_private *dev_priv,
3398 enum port port)
3399{
3400 const struct cnl_procmon *procmon;
3401 u32 val;
3402
3403 val = I915_READ(ICL_PORT_COMP_DW3(port));
3404 switch (val & (PROCESS_INFO_MASK | VOLTAGE_INFO_MASK)) {
3405 default:
3406 MISSING_CASE(val);
3407 /* fall through */
3408 case VOLTAGE_INFO_0_85V | PROCESS_INFO_DOT_0:
3409 procmon = &cnl_procmon_values[PROCMON_0_85V_DOT_0];
3410 break;
3411 case VOLTAGE_INFO_0_95V | PROCESS_INFO_DOT_0:
3412 procmon = &cnl_procmon_values[PROCMON_0_95V_DOT_0];
3413 break;
3414 case VOLTAGE_INFO_0_95V | PROCESS_INFO_DOT_1:
3415 procmon = &cnl_procmon_values[PROCMON_0_95V_DOT_1];
3416 break;
3417 case VOLTAGE_INFO_1_05V | PROCESS_INFO_DOT_0:
3418 procmon = &cnl_procmon_values[PROCMON_1_05V_DOT_0];
3419 break;
3420 case VOLTAGE_INFO_1_05V | PROCESS_INFO_DOT_1:
3421 procmon = &cnl_procmon_values[PROCMON_1_05V_DOT_1];
3422 break;
3423 }
3424
3425 val = I915_READ(ICL_PORT_COMP_DW1(port));
3426 val &= ~((0xff << 16) | 0xff);
3427 val |= procmon->dw1;
3428 I915_WRITE(ICL_PORT_COMP_DW1(port), val);
3429
3430 I915_WRITE(ICL_PORT_COMP_DW9(port), procmon->dw9);
3431 I915_WRITE(ICL_PORT_COMP_DW10(port), procmon->dw10);
3432}
3433
3434static void cnl_display_core_init(struct drm_i915_private *dev_priv, bool resume) 3466static void cnl_display_core_init(struct drm_i915_private *dev_priv, bool resume)
3435{ 3467{
3436 struct i915_power_domains *power_domains = &dev_priv->power_domains; 3468 struct i915_power_domains *power_domains = &dev_priv->power_domains;
3437 struct i915_power_well *well; 3469 struct i915_power_well *well;
3438 u32 val;
3439 3470
3440 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); 3471 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
3441 3472
3442 /* 1. Enable PCH Reset Handshake */ 3473 /* 1. Enable PCH Reset Handshake */
3443 val = I915_READ(HSW_NDE_RSTWRN_OPT); 3474 intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));
3444 val |= RESET_PCH_HANDSHAKE_ENABLE;
3445 I915_WRITE(HSW_NDE_RSTWRN_OPT, val);
3446 3475
3447 /* 2. Enable Comp */ 3476 /* 2-3. */
3448 val = I915_READ(CHICKEN_MISC_2); 3477 cnl_combo_phys_init(dev_priv);
3449 val &= ~CNL_COMP_PWR_DOWN;
3450 I915_WRITE(CHICKEN_MISC_2, val);
3451
3452 /* Dummy PORT_A to get the correct CNL register from the ICL macro */
3453 cnl_set_procmon_ref_values(dev_priv, PORT_A);
3454
3455 val = I915_READ(CNL_PORT_COMP_DW0);
3456 val |= COMP_INIT;
3457 I915_WRITE(CNL_PORT_COMP_DW0, val);
3458
3459 /* 3. */
3460 val = I915_READ(CNL_PORT_CL1CM_DW5);
3461 val |= CL_POWER_DOWN_ENABLE;
3462 I915_WRITE(CNL_PORT_CL1CM_DW5, val);
3463 3478
3464 /* 3479 /*
3465 * 4. Enable Power Well 1 (PG1). 3480 * 4. Enable Power Well 1 (PG1).
@@ -3484,7 +3499,6 @@ static void cnl_display_core_uninit(struct drm_i915_private *dev_priv)
3484{ 3499{
3485 struct i915_power_domains *power_domains = &dev_priv->power_domains; 3500 struct i915_power_domains *power_domains = &dev_priv->power_domains;
3486 struct i915_power_well *well; 3501 struct i915_power_well *well;
3487 u32 val;
3488 3502
3489 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); 3503 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
3490 3504
@@ -3508,44 +3522,23 @@ static void cnl_display_core_uninit(struct drm_i915_private *dev_priv)
3508 3522
3509 usleep_range(10, 30); /* 10 us delay per Bspec */ 3523 usleep_range(10, 30); /* 10 us delay per Bspec */
3510 3524
3511 /* 5. Disable Comp */ 3525 /* 5. */
3512 val = I915_READ(CHICKEN_MISC_2); 3526 cnl_combo_phys_uninit(dev_priv);
3513 val |= CNL_COMP_PWR_DOWN;
3514 I915_WRITE(CHICKEN_MISC_2, val);
3515} 3527}
3516 3528
3517static void icl_display_core_init(struct drm_i915_private *dev_priv, 3529void icl_display_core_init(struct drm_i915_private *dev_priv,
3518 bool resume) 3530 bool resume)
3519{ 3531{
3520 struct i915_power_domains *power_domains = &dev_priv->power_domains; 3532 struct i915_power_domains *power_domains = &dev_priv->power_domains;
3521 struct i915_power_well *well; 3533 struct i915_power_well *well;
3522 enum port port;
3523 u32 val;
3524 3534
3525 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); 3535 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
3526 3536
3527 /* 1. Enable PCH reset handshake. */ 3537 /* 1. Enable PCH reset handshake. */
3528 val = I915_READ(HSW_NDE_RSTWRN_OPT); 3538 intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));
3529 val |= RESET_PCH_HANDSHAKE_ENABLE; 3539
3530 I915_WRITE(HSW_NDE_RSTWRN_OPT, val); 3540 /* 2-3. */
3531 3541 icl_combo_phys_init(dev_priv);
3532 for (port = PORT_A; port <= PORT_B; port++) {
3533 /* 2. Enable DDI combo PHY comp. */
3534 val = I915_READ(ICL_PHY_MISC(port));
3535 val &= ~ICL_PHY_MISC_DE_IO_COMP_PWR_DOWN;
3536 I915_WRITE(ICL_PHY_MISC(port), val);
3537
3538 cnl_set_procmon_ref_values(dev_priv, port);
3539
3540 val = I915_READ(ICL_PORT_COMP_DW0(port));
3541 val |= COMP_INIT;
3542 I915_WRITE(ICL_PORT_COMP_DW0(port), val);
3543
3544 /* 3. Set power down enable. */
3545 val = I915_READ(ICL_PORT_CL_DW5(port));
3546 val |= CL_POWER_DOWN_ENABLE;
3547 I915_WRITE(ICL_PORT_CL_DW5(port), val);
3548 }
3549 3542
3550 /* 3543 /*
3551 * 4. Enable Power Well 1 (PG1). 3544 * 4. Enable Power Well 1 (PG1).
@@ -3569,12 +3562,10 @@ static void icl_display_core_init(struct drm_i915_private *dev_priv,
3569 intel_csr_load_program(dev_priv); 3562 intel_csr_load_program(dev_priv);
3570} 3563}
3571 3564
3572static void icl_display_core_uninit(struct drm_i915_private *dev_priv) 3565void icl_display_core_uninit(struct drm_i915_private *dev_priv)
3573{ 3566{
3574 struct i915_power_domains *power_domains = &dev_priv->power_domains; 3567 struct i915_power_domains *power_domains = &dev_priv->power_domains;
3575 struct i915_power_well *well; 3568 struct i915_power_well *well;
3576 enum port port;
3577 u32 val;
3578 3569
3579 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE); 3570 gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
3580 3571
@@ -3596,12 +3587,8 @@ static void icl_display_core_uninit(struct drm_i915_private *dev_priv)
3596 intel_power_well_disable(dev_priv, well); 3587 intel_power_well_disable(dev_priv, well);
3597 mutex_unlock(&power_domains->lock); 3588 mutex_unlock(&power_domains->lock);
3598 3589
3599 /* 5. Disable Comp */ 3590 /* 5. */
3600 for (port = PORT_A; port <= PORT_B; port++) { 3591 icl_combo_phys_uninit(dev_priv);
3601 val = I915_READ(ICL_PHY_MISC(port));
3602 val |= ICL_PHY_MISC_DE_IO_COMP_PWR_DOWN;
3603 I915_WRITE(ICL_PHY_MISC(port), val);
3604 }
3605} 3592}
3606 3593
3607static void chv_phy_control_init(struct drm_i915_private *dev_priv) 3594static void chv_phy_control_init(struct drm_i915_private *dev_priv)
@@ -3759,7 +3746,8 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume)
3759 mutex_lock(&power_domains->lock); 3746 mutex_lock(&power_domains->lock);
3760 vlv_cmnlane_wa(dev_priv); 3747 vlv_cmnlane_wa(dev_priv);
3761 mutex_unlock(&power_domains->lock); 3748 mutex_unlock(&power_domains->lock);
3762 } 3749 } else if (IS_IVYBRIDGE(dev_priv) || INTEL_GEN(dev_priv) >= 7)
3750 intel_pch_reset_handshake(dev_priv, !HAS_PCH_NOP(dev_priv));
3763 3751
3764 /* 3752 /*
3765 * Keep all power wells enabled for any dependent HW access during 3753 * Keep all power wells enabled for any dependent HW access during
@@ -3953,14 +3941,6 @@ static void intel_power_domains_verify_state(struct drm_i915_private *dev_priv)
3953 int domains_count; 3941 int domains_count;
3954 bool enabled; 3942 bool enabled;
3955 3943
3956 /*
3957 * Power wells not belonging to any domain (like the MISC_IO
3958 * and PW1 power wells) are under FW control, so ignore them,
3959 * since their state can change asynchronously.
3960 */
3961 if (!power_well->desc->domains)
3962 continue;
3963
3964 enabled = power_well->desc->ops->is_enabled(dev_priv, 3944 enabled = power_well->desc->ops->is_enabled(dev_priv,
3965 power_well); 3945 power_well);
3966 if ((power_well->count || power_well->desc->always_on) != 3946 if ((power_well->count || power_well->desc->always_on) !=
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 701372e512a8..5805ec1aba12 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -105,11 +105,6 @@ struct intel_sdvo {
105 bool has_hdmi_audio; 105 bool has_hdmi_audio;
106 bool rgb_quant_range_selectable; 106 bool rgb_quant_range_selectable;
107 107
108 /**
109 * This is sdvo fixed pannel mode pointer
110 */
111 struct drm_display_mode *sdvo_lvds_fixed_mode;
112
113 /* DDC bus used by this SDVO encoder */ 108 /* DDC bus used by this SDVO encoder */
114 uint8_t ddc_bus; 109 uint8_t ddc_bus;
115 110
@@ -765,10 +760,14 @@ intel_sdvo_create_preferred_input_timing(struct intel_sdvo *intel_sdvo,
765 args.height = height; 760 args.height = height;
766 args.interlace = 0; 761 args.interlace = 0;
767 762
768 if (IS_LVDS(intel_sdvo_connector) && 763 if (IS_LVDS(intel_sdvo_connector)) {
769 (intel_sdvo->sdvo_lvds_fixed_mode->hdisplay != width || 764 const struct drm_display_mode *fixed_mode =
770 intel_sdvo->sdvo_lvds_fixed_mode->vdisplay != height)) 765 intel_sdvo_connector->base.panel.fixed_mode;
771 args.scaled = 1; 766
767 if (fixed_mode->hdisplay != width ||
768 fixed_mode->vdisplay != height)
769 args.scaled = 1;
770 }
772 771
773 return intel_sdvo_set_value(intel_sdvo, 772 return intel_sdvo_set_value(intel_sdvo,
774 SDVO_CMD_CREATE_PREFERRED_INPUT_TIMING, 773 SDVO_CMD_CREATE_PREFERRED_INPUT_TIMING,
@@ -1123,6 +1122,7 @@ static bool intel_sdvo_compute_config(struct intel_encoder *encoder,
1123 1122
1124 DRM_DEBUG_KMS("forcing bpc to 8 for SDVO\n"); 1123 DRM_DEBUG_KMS("forcing bpc to 8 for SDVO\n");
1125 pipe_config->pipe_bpp = 8*3; 1124 pipe_config->pipe_bpp = 8*3;
1125 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
1126 1126
1127 if (HAS_PCH_SPLIT(to_i915(encoder->base.dev))) 1127 if (HAS_PCH_SPLIT(to_i915(encoder->base.dev)))
1128 pipe_config->has_pch_encoder = true; 1128 pipe_config->has_pch_encoder = true;
@@ -1144,7 +1144,7 @@ static bool intel_sdvo_compute_config(struct intel_encoder *encoder,
1144 pipe_config->sdvo_tv_clock = true; 1144 pipe_config->sdvo_tv_clock = true;
1145 } else if (IS_LVDS(intel_sdvo_connector)) { 1145 } else if (IS_LVDS(intel_sdvo_connector)) {
1146 if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo, 1146 if (!intel_sdvo_set_output_timings_from_mode(intel_sdvo,
1147 intel_sdvo->sdvo_lvds_fixed_mode)) 1147 intel_sdvo_connector->base.panel.fixed_mode))
1148 return false; 1148 return false;
1149 1149
1150 (void) intel_sdvo_get_preferred_input_mode(intel_sdvo, 1150 (void) intel_sdvo_get_preferred_input_mode(intel_sdvo,
@@ -1301,7 +1301,7 @@ static void intel_sdvo_pre_enable(struct intel_encoder *intel_encoder,
1301 /* lvds has a special fixed output timing. */ 1301 /* lvds has a special fixed output timing. */
1302 if (IS_LVDS(intel_sdvo_connector)) 1302 if (IS_LVDS(intel_sdvo_connector))
1303 intel_sdvo_get_dtd_from_mode(&output_dtd, 1303 intel_sdvo_get_dtd_from_mode(&output_dtd,
1304 intel_sdvo->sdvo_lvds_fixed_mode); 1304 intel_sdvo_connector->base.panel.fixed_mode);
1305 else 1305 else
1306 intel_sdvo_get_dtd_from_mode(&output_dtd, mode); 1306 intel_sdvo_get_dtd_from_mode(&output_dtd, mode);
1307 if (!intel_sdvo_set_output_timing(intel_sdvo, &output_dtd)) 1307 if (!intel_sdvo_set_output_timing(intel_sdvo, &output_dtd))
@@ -1642,10 +1642,13 @@ intel_sdvo_mode_valid(struct drm_connector *connector,
1642 return MODE_CLOCK_HIGH; 1642 return MODE_CLOCK_HIGH;
1643 1643
1644 if (IS_LVDS(intel_sdvo_connector)) { 1644 if (IS_LVDS(intel_sdvo_connector)) {
1645 if (mode->hdisplay > intel_sdvo->sdvo_lvds_fixed_mode->hdisplay) 1645 const struct drm_display_mode *fixed_mode =
1646 intel_sdvo_connector->base.panel.fixed_mode;
1647
1648 if (mode->hdisplay > fixed_mode->hdisplay)
1646 return MODE_PANEL; 1649 return MODE_PANEL;
1647 1650
1648 if (mode->vdisplay > intel_sdvo->sdvo_lvds_fixed_mode->vdisplay) 1651 if (mode->vdisplay > fixed_mode->vdisplay)
1649 return MODE_PANEL; 1652 return MODE_PANEL;
1650 } 1653 }
1651 1654
@@ -2058,14 +2061,6 @@ static int intel_sdvo_get_modes(struct drm_connector *connector)
2058 return !list_empty(&connector->probed_modes); 2061 return !list_empty(&connector->probed_modes);
2059} 2062}
2060 2063
2061static void intel_sdvo_destroy(struct drm_connector *connector)
2062{
2063 struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
2064
2065 drm_connector_cleanup(connector);
2066 kfree(intel_sdvo_connector);
2067}
2068
2069static int 2064static int
2070intel_sdvo_connector_atomic_get_property(struct drm_connector *connector, 2065intel_sdvo_connector_atomic_get_property(struct drm_connector *connector,
2071 const struct drm_connector_state *state, 2066 const struct drm_connector_state *state,
@@ -2228,7 +2223,7 @@ static const struct drm_connector_funcs intel_sdvo_connector_funcs = {
2228 .atomic_set_property = intel_sdvo_connector_atomic_set_property, 2223 .atomic_set_property = intel_sdvo_connector_atomic_set_property,
2229 .late_register = intel_sdvo_connector_register, 2224 .late_register = intel_sdvo_connector_register,
2230 .early_unregister = intel_sdvo_connector_unregister, 2225 .early_unregister = intel_sdvo_connector_unregister,
2231 .destroy = intel_sdvo_destroy, 2226 .destroy = intel_connector_destroy,
2232 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 2227 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
2233 .atomic_duplicate_state = intel_sdvo_connector_duplicate_state, 2228 .atomic_duplicate_state = intel_sdvo_connector_duplicate_state,
2234}; 2229};
@@ -2267,10 +2262,6 @@ static void intel_sdvo_enc_destroy(struct drm_encoder *encoder)
2267{ 2262{
2268 struct intel_sdvo *intel_sdvo = to_sdvo(to_intel_encoder(encoder)); 2263 struct intel_sdvo *intel_sdvo = to_sdvo(to_intel_encoder(encoder));
2269 2264
2270 if (intel_sdvo->sdvo_lvds_fixed_mode != NULL)
2271 drm_mode_destroy(encoder->dev,
2272 intel_sdvo->sdvo_lvds_fixed_mode);
2273
2274 i2c_del_adapter(&intel_sdvo->ddc); 2265 i2c_del_adapter(&intel_sdvo->ddc);
2275 intel_encoder_destroy(encoder); 2266 intel_encoder_destroy(encoder);
2276} 2267}
@@ -2583,7 +2574,7 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type)
2583 return true; 2574 return true;
2584 2575
2585err: 2576err:
2586 intel_sdvo_destroy(connector); 2577 intel_connector_destroy(connector);
2587 return false; 2578 return false;
2588} 2579}
2589 2580
@@ -2663,19 +2654,22 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)
2663 2654
2664 list_for_each_entry(mode, &connector->probed_modes, head) { 2655 list_for_each_entry(mode, &connector->probed_modes, head) {
2665 if (mode->type & DRM_MODE_TYPE_PREFERRED) { 2656 if (mode->type & DRM_MODE_TYPE_PREFERRED) {
2666 intel_sdvo->sdvo_lvds_fixed_mode = 2657 struct drm_display_mode *fixed_mode =
2667 drm_mode_duplicate(connector->dev, mode); 2658 drm_mode_duplicate(connector->dev, mode);
2659
2660 intel_panel_init(&intel_connector->panel,
2661 fixed_mode, NULL);
2668 break; 2662 break;
2669 } 2663 }
2670 } 2664 }
2671 2665
2672 if (!intel_sdvo->sdvo_lvds_fixed_mode) 2666 if (!intel_connector->panel.fixed_mode)
2673 goto err; 2667 goto err;
2674 2668
2675 return true; 2669 return true;
2676 2670
2677err: 2671err:
2678 intel_sdvo_destroy(connector); 2672 intel_connector_destroy(connector);
2679 return false; 2673 return false;
2680} 2674}
2681 2675
@@ -2745,7 +2739,7 @@ static void intel_sdvo_output_cleanup(struct intel_sdvo *intel_sdvo)
2745 &dev->mode_config.connector_list, head) { 2739 &dev->mode_config.connector_list, head) {
2746 if (intel_attached_encoder(connector) == &intel_sdvo->base) { 2740 if (intel_attached_encoder(connector) == &intel_sdvo->base) {
2747 drm_connector_unregister(connector); 2741 drm_connector_unregister(connector);
2748 intel_sdvo_destroy(connector); 2742 intel_connector_destroy(connector);
2749 } 2743 }
2750 } 2744 }
2751} 2745}
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index 5fd2f7bf3927..abe193815ccc 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -40,6 +40,7 @@
40#include "intel_frontbuffer.h" 40#include "intel_frontbuffer.h"
41#include <drm/i915_drm.h> 41#include <drm/i915_drm.h>
42#include "i915_drv.h" 42#include "i915_drv.h"
43#include <drm/drm_color_mgmt.h>
43 44
44int intel_usecs_to_scanlines(const struct drm_display_mode *adjusted_mode, 45int intel_usecs_to_scanlines(const struct drm_display_mode *adjusted_mode,
45 int usecs) 46 int usecs)
@@ -275,17 +276,24 @@ int intel_plane_check_src_coordinates(struct intel_plane_state *plane_state)
275 src->y2 = (src_y + src_h) << 16; 276 src->y2 = (src_y + src_h) << 16;
276 277
277 if (fb->format->is_yuv && 278 if (fb->format->is_yuv &&
278 fb->format->format != DRM_FORMAT_NV12 &&
279 (src_x & 1 || src_w & 1)) { 279 (src_x & 1 || src_w & 1)) {
280 DRM_DEBUG_KMS("src x/w (%u, %u) must be a multiple of 2 for YUV planes\n", 280 DRM_DEBUG_KMS("src x/w (%u, %u) must be a multiple of 2 for YUV planes\n",
281 src_x, src_w); 281 src_x, src_w);
282 return -EINVAL; 282 return -EINVAL;
283 } 283 }
284 284
285 if (fb->format->is_yuv &&
286 fb->format->num_planes > 1 &&
287 (src_y & 1 || src_h & 1)) {
288 DRM_DEBUG_KMS("src y/h (%u, %u) must be a multiple of 2 for planar YUV planes\n",
289 src_y, src_h);
290 return -EINVAL;
291 }
292
285 return 0; 293 return 0;
286} 294}
287 295
288unsigned int 296static unsigned int
289skl_plane_max_stride(struct intel_plane *plane, 297skl_plane_max_stride(struct intel_plane *plane,
290 u32 pixel_format, u64 modifier, 298 u32 pixel_format, u64 modifier,
291 unsigned int rotation) 299 unsigned int rotation)
@@ -302,35 +310,201 @@ skl_plane_max_stride(struct intel_plane *plane,
302 return min(8192 * cpp, 32768); 310 return min(8192 * cpp, 32768);
303} 311}
304 312
305void 313static void
306skl_update_plane(struct intel_plane *plane, 314skl_program_scaler(struct intel_plane *plane,
307 const struct intel_crtc_state *crtc_state, 315 const struct intel_crtc_state *crtc_state,
308 const struct intel_plane_state *plane_state) 316 const struct intel_plane_state *plane_state)
317{
318 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
319 enum pipe pipe = plane->pipe;
320 int scaler_id = plane_state->scaler_id;
321 const struct intel_scaler *scaler =
322 &crtc_state->scaler_state.scalers[scaler_id];
323 int crtc_x = plane_state->base.dst.x1;
324 int crtc_y = plane_state->base.dst.y1;
325 uint32_t crtc_w = drm_rect_width(&plane_state->base.dst);
326 uint32_t crtc_h = drm_rect_height(&plane_state->base.dst);
327 u16 y_hphase, uv_rgb_hphase;
328 u16 y_vphase, uv_rgb_vphase;
329 int hscale, vscale;
330
331 hscale = drm_rect_calc_hscale(&plane_state->base.src,
332 &plane_state->base.dst,
333 0, INT_MAX);
334 vscale = drm_rect_calc_vscale(&plane_state->base.src,
335 &plane_state->base.dst,
336 0, INT_MAX);
337
338 /* TODO: handle sub-pixel coordinates */
339 if (plane_state->base.fb->format->format == DRM_FORMAT_NV12 &&
340 !icl_is_hdr_plane(plane)) {
341 y_hphase = skl_scaler_calc_phase(1, hscale, false);
342 y_vphase = skl_scaler_calc_phase(1, vscale, false);
343
344 /* MPEG2 chroma siting convention */
345 uv_rgb_hphase = skl_scaler_calc_phase(2, hscale, true);
346 uv_rgb_vphase = skl_scaler_calc_phase(2, vscale, false);
347 } else {
348 /* not used */
349 y_hphase = 0;
350 y_vphase = 0;
351
352 uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
353 uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
354 }
355
356 I915_WRITE_FW(SKL_PS_CTRL(pipe, scaler_id),
357 PS_SCALER_EN | PS_PLANE_SEL(plane->id) | scaler->mode);
358 I915_WRITE_FW(SKL_PS_VPHASE(pipe, scaler_id),
359 PS_Y_PHASE(y_vphase) | PS_UV_RGB_PHASE(uv_rgb_vphase));
360 I915_WRITE_FW(SKL_PS_HPHASE(pipe, scaler_id),
361 PS_Y_PHASE(y_hphase) | PS_UV_RGB_PHASE(uv_rgb_hphase));
362 I915_WRITE_FW(SKL_PS_WIN_POS(pipe, scaler_id), (crtc_x << 16) | crtc_y);
363 I915_WRITE_FW(SKL_PS_WIN_SZ(pipe, scaler_id), (crtc_w << 16) | crtc_h);
364}
365
366/* Preoffset values for YUV to RGB Conversion */
367#define PREOFF_YUV_TO_RGB_HI 0x1800
368#define PREOFF_YUV_TO_RGB_ME 0x1F00
369#define PREOFF_YUV_TO_RGB_LO 0x1800
370
371#define ROFF(x) (((x) & 0xffff) << 16)
372#define GOFF(x) (((x) & 0xffff) << 0)
373#define BOFF(x) (((x) & 0xffff) << 16)
374
375static void
376icl_program_input_csc_coeff(const struct intel_crtc_state *crtc_state,
377 const struct intel_plane_state *plane_state)
378{
379 struct drm_i915_private *dev_priv =
380 to_i915(plane_state->base.plane->dev);
381 struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
382 enum pipe pipe = crtc->pipe;
383 struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
384 enum plane_id plane_id = plane->id;
385
386 static const u16 input_csc_matrix[][9] = {
387 /*
388 * BT.601 full range YCbCr -> full range RGB
389 * The matrix required is :
390 * [1.000, 0.000, 1.371,
391 * 1.000, -0.336, -0.698,
392 * 1.000, 1.732, 0.0000]
393 */
394 [DRM_COLOR_YCBCR_BT601] = {
395 0x7AF8, 0x7800, 0x0,
396 0x8B28, 0x7800, 0x9AC0,
397 0x0, 0x7800, 0x7DD8,
398 },
399 /*
400 * BT.709 full range YCbCr -> full range RGB
401 * The matrix required is :
402 * [1.000, 0.000, 1.574,
403 * 1.000, -0.187, -0.468,
404 * 1.000, 1.855, 0.0000]
405 */
406 [DRM_COLOR_YCBCR_BT709] = {
407 0x7C98, 0x7800, 0x0,
408 0x9EF8, 0x7800, 0xABF8,
409 0x0, 0x7800, 0x7ED8,
410 },
411 };
412
413 /* Matrix for Limited Range to Full Range Conversion */
414 static const u16 input_csc_matrix_lr[][9] = {
415 /*
416 * BT.601 Limted range YCbCr -> full range RGB
417 * The matrix required is :
418 * [1.164384, 0.000, 1.596370,
419 * 1.138393, -0.382500, -0.794598,
420 * 1.138393, 1.971696, 0.0000]
421 */
422 [DRM_COLOR_YCBCR_BT601] = {
423 0x7CC8, 0x7950, 0x0,
424 0x8CB8, 0x7918, 0x9C40,
425 0x0, 0x7918, 0x7FC8,
426 },
427 /*
428 * BT.709 Limited range YCbCr -> full range RGB
429 * The matrix required is :
430 * [1.164, 0.000, 1.833671,
431 * 1.138393, -0.213249, -0.532909,
432 * 1.138393, 2.112402, 0.0000]
433 */
434 [DRM_COLOR_YCBCR_BT709] = {
435 0x7EA8, 0x7950, 0x0,
436 0x8888, 0x7918, 0xADA8,
437 0x0, 0x7918, 0x6870,
438 },
439 };
440 const u16 *csc;
441
442 if (plane_state->base.color_range == DRM_COLOR_YCBCR_FULL_RANGE)
443 csc = input_csc_matrix[plane_state->base.color_encoding];
444 else
445 csc = input_csc_matrix_lr[plane_state->base.color_encoding];
446
447 I915_WRITE_FW(PLANE_INPUT_CSC_COEFF(pipe, plane_id, 0), ROFF(csc[0]) |
448 GOFF(csc[1]));
449 I915_WRITE_FW(PLANE_INPUT_CSC_COEFF(pipe, plane_id, 1), BOFF(csc[2]));
450 I915_WRITE_FW(PLANE_INPUT_CSC_COEFF(pipe, plane_id, 2), ROFF(csc[3]) |
451 GOFF(csc[4]));
452 I915_WRITE_FW(PLANE_INPUT_CSC_COEFF(pipe, plane_id, 3), BOFF(csc[5]));
453 I915_WRITE_FW(PLANE_INPUT_CSC_COEFF(pipe, plane_id, 4), ROFF(csc[6]) |
454 GOFF(csc[7]));
455 I915_WRITE_FW(PLANE_INPUT_CSC_COEFF(pipe, plane_id, 5), BOFF(csc[8]));
456
457 I915_WRITE_FW(PLANE_INPUT_CSC_PREOFF(pipe, plane_id, 0),
458 PREOFF_YUV_TO_RGB_HI);
459 I915_WRITE_FW(PLANE_INPUT_CSC_PREOFF(pipe, plane_id, 1),
460 PREOFF_YUV_TO_RGB_ME);
461 I915_WRITE_FW(PLANE_INPUT_CSC_PREOFF(pipe, plane_id, 2),
462 PREOFF_YUV_TO_RGB_LO);
463 I915_WRITE_FW(PLANE_INPUT_CSC_POSTOFF(pipe, plane_id, 0), 0x0);
464 I915_WRITE_FW(PLANE_INPUT_CSC_POSTOFF(pipe, plane_id, 1), 0x0);
465 I915_WRITE_FW(PLANE_INPUT_CSC_POSTOFF(pipe, plane_id, 2), 0x0);
466}
467
468static void
469skl_program_plane(struct intel_plane *plane,
470 const struct intel_crtc_state *crtc_state,
471 const struct intel_plane_state *plane_state,
472 int color_plane, bool slave, u32 plane_ctl)
309{ 473{
310 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 474 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
311 const struct drm_framebuffer *fb = plane_state->base.fb;
312 enum plane_id plane_id = plane->id; 475 enum plane_id plane_id = plane->id;
313 enum pipe pipe = plane->pipe; 476 enum pipe pipe = plane->pipe;
314 u32 plane_ctl = plane_state->ctl;
315 const struct drm_intel_sprite_colorkey *key = &plane_state->ckey; 477 const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
316 u32 surf_addr = plane_state->color_plane[0].offset; 478 u32 surf_addr = plane_state->color_plane[color_plane].offset;
317 u32 stride = skl_plane_stride(plane_state, 0); 479 u32 stride = skl_plane_stride(plane_state, color_plane);
318 u32 aux_stride = skl_plane_stride(plane_state, 1); 480 u32 aux_stride = skl_plane_stride(plane_state, 1);
319 int crtc_x = plane_state->base.dst.x1; 481 int crtc_x = plane_state->base.dst.x1;
320 int crtc_y = plane_state->base.dst.y1; 482 int crtc_y = plane_state->base.dst.y1;
321 uint32_t crtc_w = drm_rect_width(&plane_state->base.dst); 483 uint32_t x = plane_state->color_plane[color_plane].x;
322 uint32_t crtc_h = drm_rect_height(&plane_state->base.dst); 484 uint32_t y = plane_state->color_plane[color_plane].y;
323 uint32_t x = plane_state->color_plane[0].x;
324 uint32_t y = plane_state->color_plane[0].y;
325 uint32_t src_w = drm_rect_width(&plane_state->base.src) >> 16; 485 uint32_t src_w = drm_rect_width(&plane_state->base.src) >> 16;
326 uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16; 486 uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16;
487 struct intel_plane *linked = plane_state->linked_plane;
488 const struct drm_framebuffer *fb = plane_state->base.fb;
489 u8 alpha = plane_state->base.alpha >> 8;
327 unsigned long irqflags; 490 unsigned long irqflags;
491 u32 keymsk, keymax;
328 492
329 /* Sizes are 0 based */ 493 /* Sizes are 0 based */
330 src_w--; 494 src_w--;
331 src_h--; 495 src_h--;
332 crtc_w--; 496
333 crtc_h--; 497 keymax = (key->max_value & 0xffffff) | PLANE_KEYMAX_ALPHA(alpha);
498
499 keymsk = key->channel_mask & 0x3ffffff;
500 if (alpha < 0xff)
501 keymsk |= PLANE_KEYMSK_ALPHA_ENABLE;
502
503 /* The scaler will handle the output position */
504 if (plane_state->scaler_id >= 0) {
505 crtc_x = 0;
506 crtc_y = 0;
507 }
334 508
335 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); 509 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
336 510
@@ -338,71 +512,83 @@ skl_update_plane(struct intel_plane *plane,
338 I915_WRITE_FW(PLANE_COLOR_CTL(pipe, plane_id), 512 I915_WRITE_FW(PLANE_COLOR_CTL(pipe, plane_id),
339 plane_state->color_ctl); 513 plane_state->color_ctl);
340 514
341 if (key->flags) { 515 if (fb->format->is_yuv && icl_is_hdr_plane(plane))
342 I915_WRITE_FW(PLANE_KEYVAL(pipe, plane_id), key->min_value); 516 icl_program_input_csc_coeff(crtc_state, plane_state);
343 I915_WRITE_FW(PLANE_KEYMAX(pipe, plane_id), key->max_value); 517
344 I915_WRITE_FW(PLANE_KEYMSK(pipe, plane_id), key->channel_mask); 518 I915_WRITE_FW(PLANE_KEYVAL(pipe, plane_id), key->min_value);
345 } 519 I915_WRITE_FW(PLANE_KEYMAX(pipe, plane_id), keymax);
520 I915_WRITE_FW(PLANE_KEYMSK(pipe, plane_id), keymsk);
346 521
347 I915_WRITE_FW(PLANE_OFFSET(pipe, plane_id), (y << 16) | x); 522 I915_WRITE_FW(PLANE_OFFSET(pipe, plane_id), (y << 16) | x);
348 I915_WRITE_FW(PLANE_STRIDE(pipe, plane_id), stride); 523 I915_WRITE_FW(PLANE_STRIDE(pipe, plane_id), stride);
349 I915_WRITE_FW(PLANE_SIZE(pipe, plane_id), (src_h << 16) | src_w); 524 I915_WRITE_FW(PLANE_SIZE(pipe, plane_id), (src_h << 16) | src_w);
350 I915_WRITE_FW(PLANE_AUX_DIST(pipe, plane_id), 525 I915_WRITE_FW(PLANE_AUX_DIST(pipe, plane_id),
351 (plane_state->color_plane[1].offset - surf_addr) | aux_stride); 526 (plane_state->color_plane[1].offset - surf_addr) | aux_stride);
352 I915_WRITE_FW(PLANE_AUX_OFFSET(pipe, plane_id),
353 (plane_state->color_plane[1].y << 16) |
354 plane_state->color_plane[1].x);
355 527
356 /* program plane scaler */ 528 if (INTEL_GEN(dev_priv) < 11)
357 if (plane_state->scaler_id >= 0) { 529 I915_WRITE_FW(PLANE_AUX_OFFSET(pipe, plane_id),
358 int scaler_id = plane_state->scaler_id; 530 (plane_state->color_plane[1].y << 16) |
359 const struct intel_scaler *scaler = 531 plane_state->color_plane[1].x);
360 &crtc_state->scaler_state.scalers[scaler_id]; 532
361 u16 y_hphase, uv_rgb_hphase; 533 if (icl_is_hdr_plane(plane)) {
362 u16 y_vphase, uv_rgb_vphase; 534 u32 cus_ctl = 0;
363 535
364 /* TODO: handle sub-pixel coordinates */ 536 if (linked) {
365 if (fb->format->format == DRM_FORMAT_NV12) { 537 /* Enable and use MPEG-2 chroma siting */
366 y_hphase = skl_scaler_calc_phase(1, false); 538 cus_ctl = PLANE_CUS_ENABLE |
367 y_vphase = skl_scaler_calc_phase(1, false); 539 PLANE_CUS_HPHASE_0 |
368 540 PLANE_CUS_VPHASE_SIGN_NEGATIVE |
369 /* MPEG2 chroma siting convention */ 541 PLANE_CUS_VPHASE_0_25;
370 uv_rgb_hphase = skl_scaler_calc_phase(2, true); 542
371 uv_rgb_vphase = skl_scaler_calc_phase(2, false); 543 if (linked->id == PLANE_SPRITE5)
372 } else { 544 cus_ctl |= PLANE_CUS_PLANE_7;
373 /* not used */ 545 else if (linked->id == PLANE_SPRITE4)
374 y_hphase = 0; 546 cus_ctl |= PLANE_CUS_PLANE_6;
375 y_vphase = 0; 547 else
376 548 MISSING_CASE(linked->id);
377 uv_rgb_hphase = skl_scaler_calc_phase(1, false);
378 uv_rgb_vphase = skl_scaler_calc_phase(1, false);
379 } 549 }
380 550
381 I915_WRITE_FW(SKL_PS_CTRL(pipe, scaler_id), 551 I915_WRITE_FW(PLANE_CUS_CTL(pipe, plane_id), cus_ctl);
382 PS_SCALER_EN | PS_PLANE_SEL(plane_id) | scaler->mode);
383 I915_WRITE_FW(SKL_PS_PWR_GATE(pipe, scaler_id), 0);
384 I915_WRITE_FW(SKL_PS_VPHASE(pipe, scaler_id),
385 PS_Y_PHASE(y_vphase) | PS_UV_RGB_PHASE(uv_rgb_vphase));
386 I915_WRITE_FW(SKL_PS_HPHASE(pipe, scaler_id),
387 PS_Y_PHASE(y_hphase) | PS_UV_RGB_PHASE(uv_rgb_hphase));
388 I915_WRITE_FW(SKL_PS_WIN_POS(pipe, scaler_id), (crtc_x << 16) | crtc_y);
389 I915_WRITE_FW(SKL_PS_WIN_SZ(pipe, scaler_id),
390 ((crtc_w + 1) << 16)|(crtc_h + 1));
391
392 I915_WRITE_FW(PLANE_POS(pipe, plane_id), 0);
393 } else {
394 I915_WRITE_FW(PLANE_POS(pipe, plane_id), (crtc_y << 16) | crtc_x);
395 } 552 }
396 553
554 if (!slave && plane_state->scaler_id >= 0)
555 skl_program_scaler(plane, crtc_state, plane_state);
556
557 I915_WRITE_FW(PLANE_POS(pipe, plane_id), (crtc_y << 16) | crtc_x);
558
397 I915_WRITE_FW(PLANE_CTL(pipe, plane_id), plane_ctl); 559 I915_WRITE_FW(PLANE_CTL(pipe, plane_id), plane_ctl);
398 I915_WRITE_FW(PLANE_SURF(pipe, plane_id), 560 I915_WRITE_FW(PLANE_SURF(pipe, plane_id),
399 intel_plane_ggtt_offset(plane_state) + surf_addr); 561 intel_plane_ggtt_offset(plane_state) + surf_addr);
400 POSTING_READ_FW(PLANE_SURF(pipe, plane_id));
401 562
402 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 563 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
403} 564}
404 565
405void 566static void
567skl_update_plane(struct intel_plane *plane,
568 const struct intel_crtc_state *crtc_state,
569 const struct intel_plane_state *plane_state)
570{
571 int color_plane = 0;
572
573 if (plane_state->linked_plane) {
574 /* Program the UV plane */
575 color_plane = 1;
576 }
577
578 skl_program_plane(plane, crtc_state, plane_state,
579 color_plane, false, plane_state->ctl);
580}
581
582static void
583icl_update_slave(struct intel_plane *plane,
584 const struct intel_crtc_state *crtc_state,
585 const struct intel_plane_state *plane_state)
586{
587 skl_program_plane(plane, crtc_state, plane_state, 0, true,
588 plane_state->ctl | PLANE_CTL_YUV420_Y_PLANE);
589}
590
591static void
406skl_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc) 592skl_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc)
407{ 593{
408 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 594 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
@@ -413,14 +599,12 @@ skl_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc)
413 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); 599 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
414 600
415 I915_WRITE_FW(PLANE_CTL(pipe, plane_id), 0); 601 I915_WRITE_FW(PLANE_CTL(pipe, plane_id), 0);
416
417 I915_WRITE_FW(PLANE_SURF(pipe, plane_id), 0); 602 I915_WRITE_FW(PLANE_SURF(pipe, plane_id), 0);
418 POSTING_READ_FW(PLANE_SURF(pipe, plane_id));
419 603
420 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 604 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
421} 605}
422 606
423bool 607static bool
424skl_plane_get_hw_state(struct intel_plane *plane, 608skl_plane_get_hw_state(struct intel_plane *plane,
425 enum pipe *pipe) 609 enum pipe *pipe)
426{ 610{
@@ -613,7 +797,6 @@ vlv_update_plane(struct intel_plane *plane,
613 const struct intel_plane_state *plane_state) 797 const struct intel_plane_state *plane_state)
614{ 798{
615 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 799 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
616 const struct drm_framebuffer *fb = plane_state->base.fb;
617 enum pipe pipe = plane->pipe; 800 enum pipe pipe = plane->pipe;
618 enum plane_id plane_id = plane->id; 801 enum plane_id plane_id = plane->id;
619 u32 sprctl = plane_state->ctl; 802 u32 sprctl = plane_state->ctl;
@@ -650,10 +833,8 @@ vlv_update_plane(struct intel_plane *plane,
650 plane_state->color_plane[0].stride); 833 plane_state->color_plane[0].stride);
651 I915_WRITE_FW(SPPOS(pipe, plane_id), (crtc_y << 16) | crtc_x); 834 I915_WRITE_FW(SPPOS(pipe, plane_id), (crtc_y << 16) | crtc_x);
652 835
653 if (fb->modifier == I915_FORMAT_MOD_X_TILED) 836 I915_WRITE_FW(SPTILEOFF(pipe, plane_id), (y << 16) | x);
654 I915_WRITE_FW(SPTILEOFF(pipe, plane_id), (y << 16) | x); 837 I915_WRITE_FW(SPLINOFF(pipe, plane_id), linear_offset);
655 else
656 I915_WRITE_FW(SPLINOFF(pipe, plane_id), linear_offset);
657 838
658 I915_WRITE_FW(SPCONSTALPHA(pipe, plane_id), 0); 839 I915_WRITE_FW(SPCONSTALPHA(pipe, plane_id), 0);
659 840
@@ -661,7 +842,6 @@ vlv_update_plane(struct intel_plane *plane,
661 I915_WRITE_FW(SPCNTR(pipe, plane_id), sprctl); 842 I915_WRITE_FW(SPCNTR(pipe, plane_id), sprctl);
662 I915_WRITE_FW(SPSURF(pipe, plane_id), 843 I915_WRITE_FW(SPSURF(pipe, plane_id),
663 intel_plane_ggtt_offset(plane_state) + sprsurf_offset); 844 intel_plane_ggtt_offset(plane_state) + sprsurf_offset);
664 POSTING_READ_FW(SPSURF(pipe, plane_id));
665 845
666 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 846 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
667} 847}
@@ -677,9 +857,7 @@ vlv_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc)
677 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); 857 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
678 858
679 I915_WRITE_FW(SPCNTR(pipe, plane_id), 0); 859 I915_WRITE_FW(SPCNTR(pipe, plane_id), 0);
680
681 I915_WRITE_FW(SPSURF(pipe, plane_id), 0); 860 I915_WRITE_FW(SPSURF(pipe, plane_id), 0);
682 POSTING_READ_FW(SPSURF(pipe, plane_id));
683 861
684 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 862 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
685} 863}
@@ -774,7 +952,6 @@ ivb_update_plane(struct intel_plane *plane,
774 const struct intel_plane_state *plane_state) 952 const struct intel_plane_state *plane_state)
775{ 953{
776 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 954 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
777 const struct drm_framebuffer *fb = plane_state->base.fb;
778 enum pipe pipe = plane->pipe; 955 enum pipe pipe = plane->pipe;
779 u32 sprctl = plane_state->ctl, sprscale = 0; 956 u32 sprctl = plane_state->ctl, sprscale = 0;
780 u32 sprsurf_offset = plane_state->color_plane[0].offset; 957 u32 sprsurf_offset = plane_state->color_plane[0].offset;
@@ -814,12 +991,12 @@ ivb_update_plane(struct intel_plane *plane,
814 991
815 /* HSW consolidates SPRTILEOFF and SPRLINOFF into a single SPROFFSET 992 /* HSW consolidates SPRTILEOFF and SPRLINOFF into a single SPROFFSET
816 * register */ 993 * register */
817 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 994 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
818 I915_WRITE_FW(SPROFFSET(pipe), (y << 16) | x); 995 I915_WRITE_FW(SPROFFSET(pipe), (y << 16) | x);
819 else if (fb->modifier == I915_FORMAT_MOD_X_TILED) 996 } else {
820 I915_WRITE_FW(SPRTILEOFF(pipe), (y << 16) | x); 997 I915_WRITE_FW(SPRTILEOFF(pipe), (y << 16) | x);
821 else
822 I915_WRITE_FW(SPRLINOFF(pipe), linear_offset); 998 I915_WRITE_FW(SPRLINOFF(pipe), linear_offset);
999 }
823 1000
824 I915_WRITE_FW(SPRSIZE(pipe), (crtc_h << 16) | crtc_w); 1001 I915_WRITE_FW(SPRSIZE(pipe), (crtc_h << 16) | crtc_w);
825 if (IS_IVYBRIDGE(dev_priv)) 1002 if (IS_IVYBRIDGE(dev_priv))
@@ -827,7 +1004,6 @@ ivb_update_plane(struct intel_plane *plane,
827 I915_WRITE_FW(SPRCTL(pipe), sprctl); 1004 I915_WRITE_FW(SPRCTL(pipe), sprctl);
828 I915_WRITE_FW(SPRSURF(pipe), 1005 I915_WRITE_FW(SPRSURF(pipe),
829 intel_plane_ggtt_offset(plane_state) + sprsurf_offset); 1006 intel_plane_ggtt_offset(plane_state) + sprsurf_offset);
830 POSTING_READ_FW(SPRSURF(pipe));
831 1007
832 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 1008 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
833} 1009}
@@ -845,9 +1021,7 @@ ivb_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc)
845 /* Can't leave the scaler enabled... */ 1021 /* Can't leave the scaler enabled... */
846 if (IS_IVYBRIDGE(dev_priv)) 1022 if (IS_IVYBRIDGE(dev_priv))
847 I915_WRITE_FW(SPRSCALE(pipe), 0); 1023 I915_WRITE_FW(SPRSCALE(pipe), 0);
848
849 I915_WRITE_FW(SPRSURF(pipe), 0); 1024 I915_WRITE_FW(SPRSURF(pipe), 0);
850 POSTING_READ_FW(SPRSURF(pipe));
851 1025
852 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 1026 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
853} 1027}
@@ -946,7 +1120,6 @@ g4x_update_plane(struct intel_plane *plane,
946 const struct intel_plane_state *plane_state) 1120 const struct intel_plane_state *plane_state)
947{ 1121{
948 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 1122 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
949 const struct drm_framebuffer *fb = plane_state->base.fb;
950 enum pipe pipe = plane->pipe; 1123 enum pipe pipe = plane->pipe;
951 u32 dvscntr = plane_state->ctl, dvsscale = 0; 1124 u32 dvscntr = plane_state->ctl, dvsscale = 0;
952 u32 dvssurf_offset = plane_state->color_plane[0].offset; 1125 u32 dvssurf_offset = plane_state->color_plane[0].offset;
@@ -984,17 +1157,14 @@ g4x_update_plane(struct intel_plane *plane,
984 I915_WRITE_FW(DVSSTRIDE(pipe), plane_state->color_plane[0].stride); 1157 I915_WRITE_FW(DVSSTRIDE(pipe), plane_state->color_plane[0].stride);
985 I915_WRITE_FW(DVSPOS(pipe), (crtc_y << 16) | crtc_x); 1158 I915_WRITE_FW(DVSPOS(pipe), (crtc_y << 16) | crtc_x);
986 1159
987 if (fb->modifier == I915_FORMAT_MOD_X_TILED) 1160 I915_WRITE_FW(DVSTILEOFF(pipe), (y << 16) | x);
988 I915_WRITE_FW(DVSTILEOFF(pipe), (y << 16) | x); 1161 I915_WRITE_FW(DVSLINOFF(pipe), linear_offset);
989 else
990 I915_WRITE_FW(DVSLINOFF(pipe), linear_offset);
991 1162
992 I915_WRITE_FW(DVSSIZE(pipe), (crtc_h << 16) | crtc_w); 1163 I915_WRITE_FW(DVSSIZE(pipe), (crtc_h << 16) | crtc_w);
993 I915_WRITE_FW(DVSSCALE(pipe), dvsscale); 1164 I915_WRITE_FW(DVSSCALE(pipe), dvsscale);
994 I915_WRITE_FW(DVSCNTR(pipe), dvscntr); 1165 I915_WRITE_FW(DVSCNTR(pipe), dvscntr);
995 I915_WRITE_FW(DVSSURF(pipe), 1166 I915_WRITE_FW(DVSSURF(pipe),
996 intel_plane_ggtt_offset(plane_state) + dvssurf_offset); 1167 intel_plane_ggtt_offset(plane_state) + dvssurf_offset);
997 POSTING_READ_FW(DVSSURF(pipe));
998 1168
999 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 1169 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
1000} 1170}
@@ -1011,9 +1181,7 @@ g4x_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc)
1011 I915_WRITE_FW(DVSCNTR(pipe), 0); 1181 I915_WRITE_FW(DVSCNTR(pipe), 0);
1012 /* Disable the scaler */ 1182 /* Disable the scaler */
1013 I915_WRITE_FW(DVSSCALE(pipe), 0); 1183 I915_WRITE_FW(DVSSCALE(pipe), 0);
1014
1015 I915_WRITE_FW(DVSSURF(pipe), 0); 1184 I915_WRITE_FW(DVSSURF(pipe), 0);
1016 POSTING_READ_FW(DVSSURF(pipe));
1017 1185
1018 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 1186 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
1019} 1187}
@@ -1039,6 +1207,19 @@ g4x_plane_get_hw_state(struct intel_plane *plane,
1039 return ret; 1207 return ret;
1040} 1208}
1041 1209
1210static bool intel_fb_scalable(const struct drm_framebuffer *fb)
1211{
1212 if (!fb)
1213 return false;
1214
1215 switch (fb->format->format) {
1216 case DRM_FORMAT_C8:
1217 return false;
1218 default:
1219 return true;
1220 }
1221}
1222
1042static int 1223static int
1043g4x_sprite_check_scaling(struct intel_crtc_state *crtc_state, 1224g4x_sprite_check_scaling(struct intel_crtc_state *crtc_state,
1044 struct intel_plane_state *plane_state) 1225 struct intel_plane_state *plane_state)
@@ -1106,18 +1287,18 @@ g4x_sprite_check(struct intel_crtc_state *crtc_state,
1106{ 1287{
1107 struct intel_plane *plane = to_intel_plane(plane_state->base.plane); 1288 struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
1108 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 1289 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
1109 int max_scale, min_scale; 1290 int min_scale = DRM_PLANE_HELPER_NO_SCALING;
1291 int max_scale = DRM_PLANE_HELPER_NO_SCALING;
1110 int ret; 1292 int ret;
1111 1293
1112 if (INTEL_GEN(dev_priv) < 7) { 1294 if (intel_fb_scalable(plane_state->base.fb)) {
1113 min_scale = 1; 1295 if (INTEL_GEN(dev_priv) < 7) {
1114 max_scale = 16 << 16; 1296 min_scale = 1;
1115 } else if (IS_IVYBRIDGE(dev_priv)) { 1297 max_scale = 16 << 16;
1116 min_scale = 1; 1298 } else if (IS_IVYBRIDGE(dev_priv)) {
1117 max_scale = 2 << 16; 1299 min_scale = 1;
1118 } else { 1300 max_scale = 2 << 16;
1119 min_scale = DRM_PLANE_HELPER_NO_SCALING; 1301 }
1120 max_scale = DRM_PLANE_HELPER_NO_SCALING;
1121 } 1302 }
1122 1303
1123 ret = drm_atomic_helper_check_plane_state(&plane_state->base, 1304 ret = drm_atomic_helper_check_plane_state(&plane_state->base,
@@ -1204,6 +1385,8 @@ vlv_sprite_check(struct intel_crtc_state *crtc_state,
1204static int skl_plane_check_fb(const struct intel_crtc_state *crtc_state, 1385static int skl_plane_check_fb(const struct intel_crtc_state *crtc_state,
1205 const struct intel_plane_state *plane_state) 1386 const struct intel_plane_state *plane_state)
1206{ 1387{
1388 struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
1389 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
1207 const struct drm_framebuffer *fb = plane_state->base.fb; 1390 const struct drm_framebuffer *fb = plane_state->base.fb;
1208 unsigned int rotation = plane_state->base.rotation; 1391 unsigned int rotation = plane_state->base.rotation;
1209 struct drm_format_name_buf format_name; 1392 struct drm_format_name_buf format_name;
@@ -1232,13 +1415,17 @@ static int skl_plane_check_fb(const struct intel_crtc_state *crtc_state,
1232 } 1415 }
1233 1416
1234 /* 1417 /*
1235 * 90/270 is not allowed with RGB64 16:16:16:16, 1418 * 90/270 is not allowed with RGB64 16:16:16:16 and
1236 * RGB 16-bit 5:6:5, and Indexed 8-bit. 1419 * Indexed 8-bit. RGB 16-bit 5:6:5 is allowed gen11 onwards.
1237 * TBD: Add RGB64 case once its added in supported format list. 1420 * TBD: Add RGB64 case once its added in supported format
1421 * list.
1238 */ 1422 */
1239 switch (fb->format->format) { 1423 switch (fb->format->format) {
1240 case DRM_FORMAT_C8:
1241 case DRM_FORMAT_RGB565: 1424 case DRM_FORMAT_RGB565:
1425 if (INTEL_GEN(dev_priv) >= 11)
1426 break;
1427 /* fall through */
1428 case DRM_FORMAT_C8:
1242 DRM_DEBUG_KMS("Unsupported pixel format %s for 90/270!\n", 1429 DRM_DEBUG_KMS("Unsupported pixel format %s for 90/270!\n",
1243 drm_get_format_name(fb->format->format, 1430 drm_get_format_name(fb->format->format,
1244 &format_name)); 1431 &format_name));
@@ -1292,12 +1479,31 @@ static int skl_plane_check_dst_coordinates(const struct intel_crtc_state *crtc_s
1292 return 0; 1479 return 0;
1293} 1480}
1294 1481
1295int skl_plane_check(struct intel_crtc_state *crtc_state, 1482static int skl_plane_check_nv12_rotation(const struct intel_plane_state *plane_state)
1296 struct intel_plane_state *plane_state) 1483{
1484 const struct drm_framebuffer *fb = plane_state->base.fb;
1485 unsigned int rotation = plane_state->base.rotation;
1486 int src_w = drm_rect_width(&plane_state->base.src) >> 16;
1487
1488 /* Display WA #1106 */
1489 if (fb->format->format == DRM_FORMAT_NV12 && src_w & 3 &&
1490 (rotation == DRM_MODE_ROTATE_270 ||
1491 rotation == (DRM_MODE_REFLECT_X | DRM_MODE_ROTATE_90))) {
1492 DRM_DEBUG_KMS("src width must be multiple of 4 for rotated NV12\n");
1493 return -EINVAL;
1494 }
1495
1496 return 0;
1497}
1498
1499static int skl_plane_check(struct intel_crtc_state *crtc_state,
1500 struct intel_plane_state *plane_state)
1297{ 1501{
1298 struct intel_plane *plane = to_intel_plane(plane_state->base.plane); 1502 struct intel_plane *plane = to_intel_plane(plane_state->base.plane);
1299 struct drm_i915_private *dev_priv = to_i915(plane->base.dev); 1503 struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
1300 int max_scale, min_scale; 1504 const struct drm_framebuffer *fb = plane_state->base.fb;
1505 int min_scale = DRM_PLANE_HELPER_NO_SCALING;
1506 int max_scale = DRM_PLANE_HELPER_NO_SCALING;
1301 int ret; 1507 int ret;
1302 1508
1303 ret = skl_plane_check_fb(crtc_state, plane_state); 1509 ret = skl_plane_check_fb(crtc_state, plane_state);
@@ -1305,15 +1511,9 @@ int skl_plane_check(struct intel_crtc_state *crtc_state,
1305 return ret; 1511 return ret;
1306 1512
1307 /* use scaler when colorkey is not required */ 1513 /* use scaler when colorkey is not required */
1308 if (!plane_state->ckey.flags) { 1514 if (!plane_state->ckey.flags && intel_fb_scalable(fb)) {
1309 const struct drm_framebuffer *fb = plane_state->base.fb;
1310
1311 min_scale = 1; 1515 min_scale = 1;
1312 max_scale = skl_max_scale(crtc_state, 1516 max_scale = skl_max_scale(crtc_state, fb->format->format);
1313 fb ? fb->format->format : 0);
1314 } else {
1315 min_scale = DRM_PLANE_HELPER_NO_SCALING;
1316 max_scale = DRM_PLANE_HELPER_NO_SCALING;
1317 } 1517 }
1318 1518
1319 ret = drm_atomic_helper_check_plane_state(&plane_state->base, 1519 ret = drm_atomic_helper_check_plane_state(&plane_state->base,
@@ -1334,10 +1534,18 @@ int skl_plane_check(struct intel_crtc_state *crtc_state,
1334 if (ret) 1534 if (ret)
1335 return ret; 1535 return ret;
1336 1536
1537 ret = skl_plane_check_nv12_rotation(plane_state);
1538 if (ret)
1539 return ret;
1540
1337 ret = skl_check_plane_surface(plane_state); 1541 ret = skl_check_plane_surface(plane_state);
1338 if (ret) 1542 if (ret)
1339 return ret; 1543 return ret;
1340 1544
1545 /* HW only has 8 bits pixel precision, disable plane if invisible */
1546 if (!(plane_state->base.alpha >> 8))
1547 plane_state->base.visible = false;
1548
1341 plane_state->ctl = skl_plane_ctl(crtc_state, plane_state); 1549 plane_state->ctl = skl_plane_ctl(crtc_state, plane_state);
1342 1550
1343 if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)) 1551 if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
@@ -1502,24 +1710,30 @@ static const uint32_t vlv_plane_formats[] = {
1502 DRM_FORMAT_VYUY, 1710 DRM_FORMAT_VYUY,
1503}; 1711};
1504 1712
1505static uint32_t skl_plane_formats[] = { 1713static const uint32_t skl_plane_formats[] = {
1714 DRM_FORMAT_C8,
1506 DRM_FORMAT_RGB565, 1715 DRM_FORMAT_RGB565,
1507 DRM_FORMAT_ABGR8888,
1508 DRM_FORMAT_ARGB8888,
1509 DRM_FORMAT_XBGR8888,
1510 DRM_FORMAT_XRGB8888, 1716 DRM_FORMAT_XRGB8888,
1717 DRM_FORMAT_XBGR8888,
1718 DRM_FORMAT_ARGB8888,
1719 DRM_FORMAT_ABGR8888,
1720 DRM_FORMAT_XRGB2101010,
1721 DRM_FORMAT_XBGR2101010,
1511 DRM_FORMAT_YUYV, 1722 DRM_FORMAT_YUYV,
1512 DRM_FORMAT_YVYU, 1723 DRM_FORMAT_YVYU,
1513 DRM_FORMAT_UYVY, 1724 DRM_FORMAT_UYVY,
1514 DRM_FORMAT_VYUY, 1725 DRM_FORMAT_VYUY,
1515}; 1726};
1516 1727
1517static uint32_t skl_planar_formats[] = { 1728static const uint32_t skl_planar_formats[] = {
1729 DRM_FORMAT_C8,
1518 DRM_FORMAT_RGB565, 1730 DRM_FORMAT_RGB565,
1519 DRM_FORMAT_ABGR8888,
1520 DRM_FORMAT_ARGB8888,
1521 DRM_FORMAT_XBGR8888,
1522 DRM_FORMAT_XRGB8888, 1731 DRM_FORMAT_XRGB8888,
1732 DRM_FORMAT_XBGR8888,
1733 DRM_FORMAT_ARGB8888,
1734 DRM_FORMAT_ABGR8888,
1735 DRM_FORMAT_XRGB2101010,
1736 DRM_FORMAT_XBGR2101010,
1523 DRM_FORMAT_YUYV, 1737 DRM_FORMAT_YUYV,
1524 DRM_FORMAT_YVYU, 1738 DRM_FORMAT_YVYU,
1525 DRM_FORMAT_UYVY, 1739 DRM_FORMAT_UYVY,
@@ -1724,8 +1938,36 @@ static const struct drm_plane_funcs skl_plane_funcs = {
1724 .format_mod_supported = skl_plane_format_mod_supported, 1938 .format_mod_supported = skl_plane_format_mod_supported,
1725}; 1939};
1726 1940
1727bool skl_plane_has_ccs(struct drm_i915_private *dev_priv, 1941static bool skl_plane_has_fbc(struct drm_i915_private *dev_priv,
1728 enum pipe pipe, enum plane_id plane_id) 1942 enum pipe pipe, enum plane_id plane_id)
1943{
1944 if (!HAS_FBC(dev_priv))
1945 return false;
1946
1947 return pipe == PIPE_A && plane_id == PLANE_PRIMARY;
1948}
1949
1950static bool skl_plane_has_planar(struct drm_i915_private *dev_priv,
1951 enum pipe pipe, enum plane_id plane_id)
1952{
1953 if (INTEL_GEN(dev_priv) >= 11)
1954 return plane_id <= PLANE_SPRITE3;
1955
1956 /* Display WA #0870: skl, bxt */
1957 if (IS_SKYLAKE(dev_priv) || IS_BROXTON(dev_priv))
1958 return false;
1959
1960 if (IS_GEN9(dev_priv) && !IS_GEMINILAKE(dev_priv) && pipe == PIPE_C)
1961 return false;
1962
1963 if (plane_id != PLANE_PRIMARY && plane_id != PLANE_SPRITE0)
1964 return false;
1965
1966 return true;
1967}
1968
1969static bool skl_plane_has_ccs(struct drm_i915_private *dev_priv,
1970 enum pipe pipe, enum plane_id plane_id)
1729{ 1971{
1730 if (plane_id == PLANE_CURSOR) 1972 if (plane_id == PLANE_CURSOR)
1731 return false; 1973 return false;
@@ -1742,109 +1984,173 @@ bool skl_plane_has_ccs(struct drm_i915_private *dev_priv,
1742} 1984}
1743 1985
1744struct intel_plane * 1986struct intel_plane *
1745intel_sprite_plane_create(struct drm_i915_private *dev_priv, 1987skl_universal_plane_create(struct drm_i915_private *dev_priv,
1746 enum pipe pipe, int plane) 1988 enum pipe pipe, enum plane_id plane_id)
1747{ 1989{
1748 struct intel_plane *intel_plane = NULL; 1990 struct intel_plane *plane;
1749 struct intel_plane_state *state = NULL; 1991 enum drm_plane_type plane_type;
1750 const struct drm_plane_funcs *plane_funcs;
1751 unsigned long possible_crtcs;
1752 const uint32_t *plane_formats;
1753 const uint64_t *modifiers;
1754 unsigned int supported_rotations; 1992 unsigned int supported_rotations;
1755 int num_plane_formats; 1993 unsigned int possible_crtcs;
1994 const u64 *modifiers;
1995 const u32 *formats;
1996 int num_formats;
1756 int ret; 1997 int ret;
1757 1998
1758 intel_plane = kzalloc(sizeof(*intel_plane), GFP_KERNEL); 1999 plane = intel_plane_alloc();
1759 if (!intel_plane) { 2000 if (IS_ERR(plane))
1760 ret = -ENOMEM; 2001 return plane;
1761 goto fail; 2002
2003 plane->pipe = pipe;
2004 plane->id = plane_id;
2005 plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane_id);
2006
2007 plane->has_fbc = skl_plane_has_fbc(dev_priv, pipe, plane_id);
2008 if (plane->has_fbc) {
2009 struct intel_fbc *fbc = &dev_priv->fbc;
2010
2011 fbc->possible_framebuffer_bits |= plane->frontbuffer_bit;
1762 } 2012 }
1763 2013
1764 state = intel_create_plane_state(&intel_plane->base); 2014 plane->max_stride = skl_plane_max_stride;
1765 if (!state) { 2015 plane->update_plane = skl_update_plane;
1766 ret = -ENOMEM; 2016 plane->disable_plane = skl_disable_plane;
1767 goto fail; 2017 plane->get_hw_state = skl_plane_get_hw_state;
2018 plane->check_plane = skl_plane_check;
2019 if (icl_is_nv12_y_plane(plane_id))
2020 plane->update_slave = icl_update_slave;
2021
2022 if (skl_plane_has_planar(dev_priv, pipe, plane_id)) {
2023 formats = skl_planar_formats;
2024 num_formats = ARRAY_SIZE(skl_planar_formats);
2025 } else {
2026 formats = skl_plane_formats;
2027 num_formats = ARRAY_SIZE(skl_plane_formats);
1768 } 2028 }
1769 intel_plane->base.state = &state->base;
1770 2029
1771 if (INTEL_GEN(dev_priv) >= 9) { 2030 plane->has_ccs = skl_plane_has_ccs(dev_priv, pipe, plane_id);
1772 state->scaler_id = -1; 2031 if (plane->has_ccs)
2032 modifiers = skl_plane_format_modifiers_ccs;
2033 else
2034 modifiers = skl_plane_format_modifiers_noccs;
1773 2035
1774 intel_plane->has_ccs = skl_plane_has_ccs(dev_priv, pipe, 2036 if (plane_id == PLANE_PRIMARY)
1775 PLANE_SPRITE0 + plane); 2037 plane_type = DRM_PLANE_TYPE_PRIMARY;
2038 else
2039 plane_type = DRM_PLANE_TYPE_OVERLAY;
1776 2040
1777 intel_plane->max_stride = skl_plane_max_stride; 2041 possible_crtcs = BIT(pipe);
1778 intel_plane->update_plane = skl_update_plane;
1779 intel_plane->disable_plane = skl_disable_plane;
1780 intel_plane->get_hw_state = skl_plane_get_hw_state;
1781 intel_plane->check_plane = skl_plane_check;
1782 2042
1783 if (skl_plane_has_planar(dev_priv, pipe, 2043 ret = drm_universal_plane_init(&dev_priv->drm, &plane->base,
1784 PLANE_SPRITE0 + plane)) { 2044 possible_crtcs, &skl_plane_funcs,
1785 plane_formats = skl_planar_formats; 2045 formats, num_formats, modifiers,
1786 num_plane_formats = ARRAY_SIZE(skl_planar_formats); 2046 plane_type,
1787 } else { 2047 "plane %d%c", plane_id + 1,
1788 plane_formats = skl_plane_formats; 2048 pipe_name(pipe));
1789 num_plane_formats = ARRAY_SIZE(skl_plane_formats); 2049 if (ret)
1790 } 2050 goto fail;
1791 2051
1792 if (intel_plane->has_ccs) 2052 supported_rotations =
1793 modifiers = skl_plane_format_modifiers_ccs; 2053 DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 |
1794 else 2054 DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270;
1795 modifiers = skl_plane_format_modifiers_noccs; 2055
1796 2056 if (INTEL_GEN(dev_priv) >= 10)
1797 plane_funcs = &skl_plane_funcs; 2057 supported_rotations |= DRM_MODE_REFLECT_X;
1798 } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) { 2058
1799 intel_plane->max_stride = i9xx_plane_max_stride; 2059 drm_plane_create_rotation_property(&plane->base,
1800 intel_plane->update_plane = vlv_update_plane; 2060 DRM_MODE_ROTATE_0,
1801 intel_plane->disable_plane = vlv_disable_plane; 2061 supported_rotations);
1802 intel_plane->get_hw_state = vlv_plane_get_hw_state; 2062
1803 intel_plane->check_plane = vlv_sprite_check; 2063 drm_plane_create_color_properties(&plane->base,
1804 2064 BIT(DRM_COLOR_YCBCR_BT601) |
1805 plane_formats = vlv_plane_formats; 2065 BIT(DRM_COLOR_YCBCR_BT709),
1806 num_plane_formats = ARRAY_SIZE(vlv_plane_formats); 2066 BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) |
2067 BIT(DRM_COLOR_YCBCR_FULL_RANGE),
2068 DRM_COLOR_YCBCR_BT709,
2069 DRM_COLOR_YCBCR_LIMITED_RANGE);
2070
2071 drm_plane_create_alpha_property(&plane->base);
2072 drm_plane_create_blend_mode_property(&plane->base,
2073 BIT(DRM_MODE_BLEND_PIXEL_NONE) |
2074 BIT(DRM_MODE_BLEND_PREMULTI) |
2075 BIT(DRM_MODE_BLEND_COVERAGE));
2076
2077 drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs);
2078
2079 return plane;
2080
2081fail:
2082 intel_plane_free(plane);
2083
2084 return ERR_PTR(ret);
2085}
2086
2087struct intel_plane *
2088intel_sprite_plane_create(struct drm_i915_private *dev_priv,
2089 enum pipe pipe, int sprite)
2090{
2091 struct intel_plane *plane;
2092 const struct drm_plane_funcs *plane_funcs;
2093 unsigned long possible_crtcs;
2094 unsigned int supported_rotations;
2095 const u64 *modifiers;
2096 const u32 *formats;
2097 int num_formats;
2098 int ret;
2099
2100 if (INTEL_GEN(dev_priv) >= 9)
2101 return skl_universal_plane_create(dev_priv, pipe,
2102 PLANE_SPRITE0 + sprite);
2103
2104 plane = intel_plane_alloc();
2105 if (IS_ERR(plane))
2106 return plane;
2107
2108 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
2109 plane->max_stride = i9xx_plane_max_stride;
2110 plane->update_plane = vlv_update_plane;
2111 plane->disable_plane = vlv_disable_plane;
2112 plane->get_hw_state = vlv_plane_get_hw_state;
2113 plane->check_plane = vlv_sprite_check;
2114
2115 formats = vlv_plane_formats;
2116 num_formats = ARRAY_SIZE(vlv_plane_formats);
1807 modifiers = i9xx_plane_format_modifiers; 2117 modifiers = i9xx_plane_format_modifiers;
1808 2118
1809 plane_funcs = &vlv_sprite_funcs; 2119 plane_funcs = &vlv_sprite_funcs;
1810 } else if (INTEL_GEN(dev_priv) >= 7) { 2120 } else if (INTEL_GEN(dev_priv) >= 7) {
1811 intel_plane->max_stride = g4x_sprite_max_stride; 2121 plane->max_stride = g4x_sprite_max_stride;
1812 intel_plane->update_plane = ivb_update_plane; 2122 plane->update_plane = ivb_update_plane;
1813 intel_plane->disable_plane = ivb_disable_plane; 2123 plane->disable_plane = ivb_disable_plane;
1814 intel_plane->get_hw_state = ivb_plane_get_hw_state; 2124 plane->get_hw_state = ivb_plane_get_hw_state;
1815 intel_plane->check_plane = g4x_sprite_check; 2125 plane->check_plane = g4x_sprite_check;
1816 2126
1817 plane_formats = snb_plane_formats; 2127 formats = snb_plane_formats;
1818 num_plane_formats = ARRAY_SIZE(snb_plane_formats); 2128 num_formats = ARRAY_SIZE(snb_plane_formats);
1819 modifiers = i9xx_plane_format_modifiers; 2129 modifiers = i9xx_plane_format_modifiers;
1820 2130
1821 plane_funcs = &snb_sprite_funcs; 2131 plane_funcs = &snb_sprite_funcs;
1822 } else { 2132 } else {
1823 intel_plane->max_stride = g4x_sprite_max_stride; 2133 plane->max_stride = g4x_sprite_max_stride;
1824 intel_plane->update_plane = g4x_update_plane; 2134 plane->update_plane = g4x_update_plane;
1825 intel_plane->disable_plane = g4x_disable_plane; 2135 plane->disable_plane = g4x_disable_plane;
1826 intel_plane->get_hw_state = g4x_plane_get_hw_state; 2136 plane->get_hw_state = g4x_plane_get_hw_state;
1827 intel_plane->check_plane = g4x_sprite_check; 2137 plane->check_plane = g4x_sprite_check;
1828 2138
1829 modifiers = i9xx_plane_format_modifiers; 2139 modifiers = i9xx_plane_format_modifiers;
1830 if (IS_GEN6(dev_priv)) { 2140 if (IS_GEN6(dev_priv)) {
1831 plane_formats = snb_plane_formats; 2141 formats = snb_plane_formats;
1832 num_plane_formats = ARRAY_SIZE(snb_plane_formats); 2142 num_formats = ARRAY_SIZE(snb_plane_formats);
1833 2143
1834 plane_funcs = &snb_sprite_funcs; 2144 plane_funcs = &snb_sprite_funcs;
1835 } else { 2145 } else {
1836 plane_formats = g4x_plane_formats; 2146 formats = g4x_plane_formats;
1837 num_plane_formats = ARRAY_SIZE(g4x_plane_formats); 2147 num_formats = ARRAY_SIZE(g4x_plane_formats);
1838 2148
1839 plane_funcs = &g4x_sprite_funcs; 2149 plane_funcs = &g4x_sprite_funcs;
1840 } 2150 }
1841 } 2151 }
1842 2152
1843 if (INTEL_GEN(dev_priv) >= 9) { 2153 if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {
1844 supported_rotations =
1845 DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_90 |
1846 DRM_MODE_ROTATE_180 | DRM_MODE_ROTATE_270;
1847 } else if (IS_CHERRYVIEW(dev_priv) && pipe == PIPE_B) {
1848 supported_rotations = 2154 supported_rotations =
1849 DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 | 2155 DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 |
1850 DRM_MODE_REFLECT_X; 2156 DRM_MODE_REFLECT_X;
@@ -1853,35 +2159,25 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,
1853 DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180; 2159 DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180;
1854 } 2160 }
1855 2161
1856 intel_plane->pipe = pipe; 2162 plane->pipe = pipe;
1857 intel_plane->i9xx_plane = plane; 2163 plane->id = PLANE_SPRITE0 + sprite;
1858 intel_plane->id = PLANE_SPRITE0 + plane; 2164 plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, plane->id);
1859 intel_plane->frontbuffer_bit = INTEL_FRONTBUFFER(pipe, intel_plane->id);
1860 2165
1861 possible_crtcs = (1 << pipe); 2166 possible_crtcs = BIT(pipe);
1862 2167
1863 if (INTEL_GEN(dev_priv) >= 9) 2168 ret = drm_universal_plane_init(&dev_priv->drm, &plane->base,
1864 ret = drm_universal_plane_init(&dev_priv->drm, &intel_plane->base, 2169 possible_crtcs, plane_funcs,
1865 possible_crtcs, plane_funcs, 2170 formats, num_formats, modifiers,
1866 plane_formats, num_plane_formats, 2171 DRM_PLANE_TYPE_OVERLAY,
1867 modifiers, 2172 "sprite %c", sprite_name(pipe, sprite));
1868 DRM_PLANE_TYPE_OVERLAY,
1869 "plane %d%c", plane + 2, pipe_name(pipe));
1870 else
1871 ret = drm_universal_plane_init(&dev_priv->drm, &intel_plane->base,
1872 possible_crtcs, plane_funcs,
1873 plane_formats, num_plane_formats,
1874 modifiers,
1875 DRM_PLANE_TYPE_OVERLAY,
1876 "sprite %c", sprite_name(pipe, plane));
1877 if (ret) 2173 if (ret)
1878 goto fail; 2174 goto fail;
1879 2175
1880 drm_plane_create_rotation_property(&intel_plane->base, 2176 drm_plane_create_rotation_property(&plane->base,
1881 DRM_MODE_ROTATE_0, 2177 DRM_MODE_ROTATE_0,
1882 supported_rotations); 2178 supported_rotations);
1883 2179
1884 drm_plane_create_color_properties(&intel_plane->base, 2180 drm_plane_create_color_properties(&plane->base,
1885 BIT(DRM_COLOR_YCBCR_BT601) | 2181 BIT(DRM_COLOR_YCBCR_BT601) |
1886 BIT(DRM_COLOR_YCBCR_BT709), 2182 BIT(DRM_COLOR_YCBCR_BT709),
1887 BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) | 2183 BIT(DRM_COLOR_YCBCR_LIMITED_RANGE) |
@@ -1889,13 +2185,12 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,
1889 DRM_COLOR_YCBCR_BT709, 2185 DRM_COLOR_YCBCR_BT709,
1890 DRM_COLOR_YCBCR_LIMITED_RANGE); 2186 DRM_COLOR_YCBCR_LIMITED_RANGE);
1891 2187
1892 drm_plane_helper_add(&intel_plane->base, &intel_plane_helper_funcs); 2188 drm_plane_helper_add(&plane->base, &intel_plane_helper_funcs);
1893 2189
1894 return intel_plane; 2190 return plane;
1895 2191
1896fail: 2192fail:
1897 kfree(state); 2193 intel_plane_free(plane);
1898 kfree(intel_plane);
1899 2194
1900 return ERR_PTR(ret); 2195 return ERR_PTR(ret);
1901} 2196}
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index b5b04cb892e9..860f306a23ba 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -885,6 +885,7 @@ intel_tv_compute_config(struct intel_encoder *encoder,
885 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) 885 if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
886 return false; 886 return false;
887 887
888 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
888 adjusted_mode->crtc_clock = tv_mode->clock; 889 adjusted_mode->crtc_clock = tv_mode->clock;
889 DRM_DEBUG_KMS("forcing bpc to 8 for TV\n"); 890 DRM_DEBUG_KMS("forcing bpc to 8 for TV\n");
890 pipe_config->pipe_bpp = 8*3; 891 pipe_config->pipe_bpp = 8*3;
@@ -1377,17 +1378,10 @@ intel_tv_get_modes(struct drm_connector *connector)
1377 return count; 1378 return count;
1378} 1379}
1379 1380
1380static void
1381intel_tv_destroy(struct drm_connector *connector)
1382{
1383 drm_connector_cleanup(connector);
1384 kfree(connector);
1385}
1386
1387static const struct drm_connector_funcs intel_tv_connector_funcs = { 1381static const struct drm_connector_funcs intel_tv_connector_funcs = {
1388 .late_register = intel_connector_register, 1382 .late_register = intel_connector_register,
1389 .early_unregister = intel_connector_unregister, 1383 .early_unregister = intel_connector_unregister,
1390 .destroy = intel_tv_destroy, 1384 .destroy = intel_connector_destroy,
1391 .fill_modes = drm_helper_probe_single_connector_modes, 1385 .fill_modes = drm_helper_probe_single_connector_modes,
1392 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 1386 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1393 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 1387 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
diff --git a/drivers/gpu/drm/i915/intel_uc.c b/drivers/gpu/drm/i915/intel_uc.c
index b1b3e81b6e24..b34c318b238d 100644
--- a/drivers/gpu/drm/i915/intel_uc.c
+++ b/drivers/gpu/drm/i915/intel_uc.c
@@ -376,7 +376,7 @@ int intel_uc_init_hw(struct drm_i915_private *i915)
376 376
377 intel_guc_init_params(guc); 377 intel_guc_init_params(guc);
378 ret = intel_guc_fw_upload(guc); 378 ret = intel_guc_fw_upload(guc);
379 if (ret == 0 || ret != -EAGAIN) 379 if (ret == 0 || ret != -ETIMEDOUT)
380 break; 380 break;
381 381
382 DRM_DEBUG_DRIVER("GuC fw load failed: %d; will reset and " 382 DRM_DEBUG_DRIVER("GuC fw load failed: %d; will reset and "
diff --git a/drivers/gpu/drm/i915/intel_uc_fw.h b/drivers/gpu/drm/i915/intel_uc_fw.h
index 87910aa83267..0e3bd580e267 100644
--- a/drivers/gpu/drm/i915/intel_uc_fw.h
+++ b/drivers/gpu/drm/i915/intel_uc_fw.h
@@ -115,9 +115,14 @@ static inline bool intel_uc_fw_is_selected(struct intel_uc_fw *uc_fw)
115 return uc_fw->path != NULL; 115 return uc_fw->path != NULL;
116} 116}
117 117
118static inline bool intel_uc_fw_is_loaded(struct intel_uc_fw *uc_fw)
119{
120 return uc_fw->load_status == INTEL_UC_FIRMWARE_SUCCESS;
121}
122
118static inline void intel_uc_fw_sanitize(struct intel_uc_fw *uc_fw) 123static inline void intel_uc_fw_sanitize(struct intel_uc_fw *uc_fw)
119{ 124{
120 if (uc_fw->load_status == INTEL_UC_FIRMWARE_SUCCESS) 125 if (intel_uc_fw_is_loaded(uc_fw))
121 uc_fw->load_status = INTEL_UC_FIRMWARE_PENDING; 126 uc_fw->load_status = INTEL_UC_FIRMWARE_PENDING;
122} 127}
123 128
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 3ad302c66254..9289515108c3 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -1437,7 +1437,7 @@ static void intel_uncore_fw_domains_init(struct drm_i915_private *dev_priv)
1437 FORCEWAKE_MEDIA_VEBOX_GEN11(i), 1437 FORCEWAKE_MEDIA_VEBOX_GEN11(i),
1438 FORCEWAKE_ACK_MEDIA_VEBOX_GEN11(i)); 1438 FORCEWAKE_ACK_MEDIA_VEBOX_GEN11(i));
1439 } 1439 }
1440 } else if (IS_GEN9(dev_priv) || IS_GEN10(dev_priv)) { 1440 } else if (IS_GEN10(dev_priv) || IS_GEN9(dev_priv)) {
1441 dev_priv->uncore.funcs.force_wake_get = 1441 dev_priv->uncore.funcs.force_wake_get =
1442 fw_domains_get_with_fallback; 1442 fw_domains_get_with_fallback;
1443 dev_priv->uncore.funcs.force_wake_put = fw_domains_put; 1443 dev_priv->uncore.funcs.force_wake_put = fw_domains_put;
diff --git a/drivers/gpu/drm/i915/intel_vbt_defs.h b/drivers/gpu/drm/i915/intel_vbt_defs.h
index bba98cf83cbd..bf3662ad5fed 100644
--- a/drivers/gpu/drm/i915/intel_vbt_defs.h
+++ b/drivers/gpu/drm/i915/intel_vbt_defs.h
@@ -326,6 +326,13 @@ enum vbt_gmbus_ddi {
326 ICL_DDC_BUS_PORT_4, 326 ICL_DDC_BUS_PORT_4,
327}; 327};
328 328
329#define DP_AUX_A 0x40
330#define DP_AUX_B 0x10
331#define DP_AUX_C 0x20
332#define DP_AUX_D 0x30
333#define DP_AUX_E 0x50
334#define DP_AUX_F 0x60
335
329#define VBT_DP_MAX_LINK_RATE_HBR3 0 336#define VBT_DP_MAX_LINK_RATE_HBR3 0
330#define VBT_DP_MAX_LINK_RATE_HBR2 1 337#define VBT_DP_MAX_LINK_RATE_HBR2 1
331#define VBT_DP_MAX_LINK_RATE_HBR 2 338#define VBT_DP_MAX_LINK_RATE_HBR 2
diff --git a/drivers/gpu/drm/i915/intel_workarounds.c b/drivers/gpu/drm/i915/intel_workarounds.c
index 4bcdeaf8d98f..ca1f78a42b17 100644
--- a/drivers/gpu/drm/i915/intel_workarounds.c
+++ b/drivers/gpu/drm/i915/intel_workarounds.c
@@ -823,18 +823,21 @@ static void icl_gt_workarounds_apply(struct drm_i915_private *dev_priv)
823 _MASKED_BIT_ENABLE(_3D_CHICKEN3_AA_LINE_QUALITY_FIX_ENABLE)); 823 _MASKED_BIT_ENABLE(_3D_CHICKEN3_AA_LINE_QUALITY_FIX_ENABLE));
824 824
825 /* WaInPlaceDecompressionHang:icl */ 825 /* WaInPlaceDecompressionHang:icl */
826 I915_WRITE(GEN9_GAMT_ECO_REG_RW_IA, I915_READ(GEN9_GAMT_ECO_REG_RW_IA) | 826 I915_WRITE(GEN9_GAMT_ECO_REG_RW_IA,
827 GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS); 827 I915_READ(GEN9_GAMT_ECO_REG_RW_IA) |
828 GAMT_ECO_ENABLE_IN_PLACE_DECOMPRESS);
828 829
829 /* WaPipelineFlushCoherentLines:icl */ 830 /* WaPipelineFlushCoherentLines:icl */
830 I915_WRITE(GEN8_L3SQCREG4, I915_READ(GEN8_L3SQCREG4) | 831 I915_WRITE(GEN8_L3SQCREG4,
831 GEN8_LQSC_FLUSH_COHERENT_LINES); 832 I915_READ(GEN8_L3SQCREG4) |
833 GEN8_LQSC_FLUSH_COHERENT_LINES);
832 834
833 /* Wa_1405543622:icl 835 /* Wa_1405543622:icl
834 * Formerly known as WaGAPZPriorityScheme 836 * Formerly known as WaGAPZPriorityScheme
835 */ 837 */
836 I915_WRITE(GEN8_GARBCNTL, I915_READ(GEN8_GARBCNTL) | 838 I915_WRITE(GEN8_GARBCNTL,
837 GEN11_ARBITRATION_PRIO_ORDER_MASK); 839 I915_READ(GEN8_GARBCNTL) |
840 GEN11_ARBITRATION_PRIO_ORDER_MASK);
838 841
839 /* Wa_1604223664:icl 842 /* Wa_1604223664:icl
840 * Formerly known as WaL3BankAddressHashing 843 * Formerly known as WaL3BankAddressHashing
@@ -854,21 +857,24 @@ static void icl_gt_workarounds_apply(struct drm_i915_private *dev_priv)
854 /* Wa_1405733216:icl 857 /* Wa_1405733216:icl
855 * Formerly known as WaDisableCleanEvicts 858 * Formerly known as WaDisableCleanEvicts
856 */ 859 */
857 I915_WRITE(GEN8_L3SQCREG4, I915_READ(GEN8_L3SQCREG4) | 860 I915_WRITE(GEN8_L3SQCREG4,
858 GEN11_LQSC_CLEAN_EVICT_DISABLE); 861 I915_READ(GEN8_L3SQCREG4) |
862 GEN11_LQSC_CLEAN_EVICT_DISABLE);
859 863
860 /* Wa_1405766107:icl 864 /* Wa_1405766107:icl
861 * Formerly known as WaCL2SFHalfMaxAlloc 865 * Formerly known as WaCL2SFHalfMaxAlloc
862 */ 866 */
863 I915_WRITE(GEN11_LSN_UNSLCVC, I915_READ(GEN11_LSN_UNSLCVC) | 867 I915_WRITE(GEN11_LSN_UNSLCVC,
864 GEN11_LSN_UNSLCVC_GAFS_HALF_SF_MAXALLOC | 868 I915_READ(GEN11_LSN_UNSLCVC) |
865 GEN11_LSN_UNSLCVC_GAFS_HALF_CL2_MAXALLOC); 869 GEN11_LSN_UNSLCVC_GAFS_HALF_SF_MAXALLOC |
870 GEN11_LSN_UNSLCVC_GAFS_HALF_CL2_MAXALLOC);
866 871
867 /* Wa_220166154:icl 872 /* Wa_220166154:icl
868 * Formerly known as WaDisCtxReload 873 * Formerly known as WaDisCtxReload
869 */ 874 */
870 I915_WRITE(GAMW_ECO_DEV_RW_IA_REG, I915_READ(GAMW_ECO_DEV_RW_IA_REG) | 875 I915_WRITE(GEN8_GAMW_ECO_DEV_RW_IA,
871 GAMW_ECO_DEV_CTX_RELOAD_DISABLE); 876 I915_READ(GEN8_GAMW_ECO_DEV_RW_IA) |
877 GAMW_ECO_DEV_CTX_RELOAD_DISABLE);
872 878
873 /* Wa_1405779004:icl (pre-prod) */ 879 /* Wa_1405779004:icl (pre-prod) */
874 if (IS_ICL_REVID(dev_priv, ICL_REVID_A0, ICL_REVID_A0)) 880 if (IS_ICL_REVID(dev_priv, ICL_REVID_A0, ICL_REVID_A0))
@@ -905,6 +911,13 @@ static void icl_gt_workarounds_apply(struct drm_i915_private *dev_priv)
905 I915_WRITE(GAMT_CHKN_BIT_REG, 911 I915_WRITE(GAMT_CHKN_BIT_REG,
906 I915_READ(GAMT_CHKN_BIT_REG) | 912 I915_READ(GAMT_CHKN_BIT_REG) |
907 GAMT_CHKN_DISABLE_L3_COH_PIPE); 913 GAMT_CHKN_DISABLE_L3_COH_PIPE);
914
915 /* Wa_1406609255:icl (pre-prod) */
916 if (IS_ICL_REVID(dev_priv, ICL_REVID_A0, ICL_REVID_B0))
917 I915_WRITE(GEN7_SARCHKMD,
918 I915_READ(GEN7_SARCHKMD) |
919 GEN7_DISABLE_DEMAND_PREFETCH |
920 GEN7_DISABLE_SAMPLER_PREFETCH);
908} 921}
909 922
910void intel_gt_workarounds_apply(struct drm_i915_private *dev_priv) 923void intel_gt_workarounds_apply(struct drm_i915_private *dev_priv)
@@ -941,7 +954,7 @@ struct whitelist {
941 954
942static void whitelist_reg(struct whitelist *w, i915_reg_t reg) 955static void whitelist_reg(struct whitelist *w, i915_reg_t reg)
943{ 956{
944 if (GEM_WARN_ON(w->count >= RING_MAX_NONPRIV_SLOTS)) 957 if (GEM_DEBUG_WARN_ON(w->count >= RING_MAX_NONPRIV_SLOTS))
945 return; 958 return;
946 959
947 w->reg[w->count++] = reg; 960 w->reg[w->count++] = reg;
@@ -1009,6 +1022,11 @@ static void cnl_whitelist_build(struct whitelist *w)
1009 1022
1010static void icl_whitelist_build(struct whitelist *w) 1023static void icl_whitelist_build(struct whitelist *w)
1011{ 1024{
1025 /* WaAllowUMDToModifyHalfSliceChicken7:icl */
1026 whitelist_reg(w, GEN9_HALF_SLICE_CHICKEN7);
1027
1028 /* WaAllowUMDToModifySamplerMode:icl */
1029 whitelist_reg(w, GEN10_SAMPLER_MODE);
1012} 1030}
1013 1031
1014static struct whitelist *whitelist_build(struct intel_engine_cs *engine, 1032static struct whitelist *whitelist_build(struct intel_engine_cs *engine,
diff --git a/drivers/gpu/drm/i915/selftests/huge_pages.c b/drivers/gpu/drm/i915/selftests/huge_pages.c
index 8d03f64eabd7..26c065c8d2c0 100644
--- a/drivers/gpu/drm/i915/selftests/huge_pages.c
+++ b/drivers/gpu/drm/i915/selftests/huge_pages.c
@@ -551,7 +551,7 @@ static int igt_mock_ppgtt_misaligned_dma(void *arg)
551 err = igt_check_page_sizes(vma); 551 err = igt_check_page_sizes(vma);
552 552
553 if (vma->page_sizes.gtt != I915_GTT_PAGE_SIZE_4K) { 553 if (vma->page_sizes.gtt != I915_GTT_PAGE_SIZE_4K) {
554 pr_err("page_sizes.gtt=%u, expected %lu\n", 554 pr_err("page_sizes.gtt=%u, expected %llu\n",
555 vma->page_sizes.gtt, I915_GTT_PAGE_SIZE_4K); 555 vma->page_sizes.gtt, I915_GTT_PAGE_SIZE_4K);
556 err = -EINVAL; 556 err = -EINVAL;
557 } 557 }
@@ -1135,7 +1135,8 @@ static int igt_write_huge(struct i915_gem_context *ctx,
1135 n = 0; 1135 n = 0;
1136 for_each_engine(engine, i915, id) { 1136 for_each_engine(engine, i915, id) {
1137 if (!intel_engine_can_store_dword(engine)) { 1137 if (!intel_engine_can_store_dword(engine)) {
1138 pr_info("store-dword-imm not supported on engine=%u\n", id); 1138 pr_info("store-dword-imm not supported on engine=%u\n",
1139 id);
1139 continue; 1140 continue;
1140 } 1141 }
1141 engines[n++] = engine; 1142 engines[n++] = engine;
@@ -1167,17 +1168,30 @@ static int igt_write_huge(struct i915_gem_context *ctx,
1167 engine = engines[order[i] % n]; 1168 engine = engines[order[i] % n];
1168 i = (i + 1) % (n * I915_NUM_ENGINES); 1169 i = (i + 1) % (n * I915_NUM_ENGINES);
1169 1170
1170 err = __igt_write_huge(ctx, engine, obj, size, offset_low, dword, num + 1); 1171 /*
1172 * In order to utilize 64K pages we need to both pad the vma
1173 * size and ensure the vma offset is at the start of the pt
1174 * boundary, however to improve coverage we opt for testing both
1175 * aligned and unaligned offsets.
1176 */
1177 if (obj->mm.page_sizes.sg & I915_GTT_PAGE_SIZE_64K)
1178 offset_low = round_down(offset_low,
1179 I915_GTT_PAGE_SIZE_2M);
1180
1181 err = __igt_write_huge(ctx, engine, obj, size, offset_low,
1182 dword, num + 1);
1171 if (err) 1183 if (err)
1172 break; 1184 break;
1173 1185
1174 err = __igt_write_huge(ctx, engine, obj, size, offset_high, dword, num + 1); 1186 err = __igt_write_huge(ctx, engine, obj, size, offset_high,
1187 dword, num + 1);
1175 if (err) 1188 if (err)
1176 break; 1189 break;
1177 1190
1178 if (igt_timeout(end_time, 1191 if (igt_timeout(end_time,
1179 "%s timed out on engine=%u, offset_low=%llx offset_high=%llx, max_page_size=%x\n", 1192 "%s timed out on engine=%u, offset_low=%llx offset_high=%llx, max_page_size=%x\n",
1180 __func__, engine->id, offset_low, offset_high, max_page_size)) 1193 __func__, engine->id, offset_low, offset_high,
1194 max_page_size))
1181 break; 1195 break;
1182 } 1196 }
1183 1197
@@ -1436,7 +1450,7 @@ static int igt_ppgtt_pin_update(void *arg)
1436 * huge-gtt-pages. 1450 * huge-gtt-pages.
1437 */ 1451 */
1438 1452
1439 if (!USES_FULL_48BIT_PPGTT(dev_priv)) { 1453 if (!HAS_FULL_48BIT_PPGTT(dev_priv)) {
1440 pr_info("48b PPGTT not supported, skipping\n"); 1454 pr_info("48b PPGTT not supported, skipping\n");
1441 return 0; 1455 return 0;
1442 } 1456 }
@@ -1687,10 +1701,9 @@ int i915_gem_huge_page_mock_selftests(void)
1687 SUBTEST(igt_mock_ppgtt_huge_fill), 1701 SUBTEST(igt_mock_ppgtt_huge_fill),
1688 SUBTEST(igt_mock_ppgtt_64K), 1702 SUBTEST(igt_mock_ppgtt_64K),
1689 }; 1703 };
1690 int saved_ppgtt = i915_modparams.enable_ppgtt;
1691 struct drm_i915_private *dev_priv; 1704 struct drm_i915_private *dev_priv;
1692 struct pci_dev *pdev;
1693 struct i915_hw_ppgtt *ppgtt; 1705 struct i915_hw_ppgtt *ppgtt;
1706 struct pci_dev *pdev;
1694 int err; 1707 int err;
1695 1708
1696 dev_priv = mock_gem_device(); 1709 dev_priv = mock_gem_device();
@@ -1698,7 +1711,7 @@ int i915_gem_huge_page_mock_selftests(void)
1698 return -ENOMEM; 1711 return -ENOMEM;
1699 1712
1700 /* Pretend to be a device which supports the 48b PPGTT */ 1713 /* Pretend to be a device which supports the 48b PPGTT */
1701 i915_modparams.enable_ppgtt = 3; 1714 mkwrite_device_info(dev_priv)->ppgtt = INTEL_PPGTT_FULL_4LVL;
1702 1715
1703 pdev = dev_priv->drm.pdev; 1716 pdev = dev_priv->drm.pdev;
1704 dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(39)); 1717 dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(39));
@@ -1731,9 +1744,6 @@ out_close:
1731 1744
1732out_unlock: 1745out_unlock:
1733 mutex_unlock(&dev_priv->drm.struct_mutex); 1746 mutex_unlock(&dev_priv->drm.struct_mutex);
1734
1735 i915_modparams.enable_ppgtt = saved_ppgtt;
1736
1737 drm_dev_put(&dev_priv->drm); 1747 drm_dev_put(&dev_priv->drm);
1738 1748
1739 return err; 1749 return err;
@@ -1753,7 +1763,7 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv)
1753 struct i915_gem_context *ctx; 1763 struct i915_gem_context *ctx;
1754 int err; 1764 int err;
1755 1765
1756 if (!USES_PPGTT(dev_priv)) { 1766 if (!HAS_PPGTT(dev_priv)) {
1757 pr_info("PPGTT not supported, skipping live-selftests\n"); 1767 pr_info("PPGTT not supported, skipping live-selftests\n");
1758 return 0; 1768 return 0;
1759 } 1769 }
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
index 76df25aa90c9..7d82043aff10 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
@@ -39,7 +39,8 @@ struct live_test {
39 const char *func; 39 const char *func;
40 const char *name; 40 const char *name;
41 41
42 unsigned int reset_count; 42 unsigned int reset_global;
43 unsigned int reset_engine[I915_NUM_ENGINES];
43}; 44};
44 45
45static int begin_live_test(struct live_test *t, 46static int begin_live_test(struct live_test *t,
@@ -47,6 +48,8 @@ static int begin_live_test(struct live_test *t,
47 const char *func, 48 const char *func,
48 const char *name) 49 const char *name)
49{ 50{
51 struct intel_engine_cs *engine;
52 enum intel_engine_id id;
50 int err; 53 int err;
51 54
52 t->i915 = i915; 55 t->i915 = i915;
@@ -63,7 +66,11 @@ static int begin_live_test(struct live_test *t,
63 } 66 }
64 67
65 i915->gpu_error.missed_irq_rings = 0; 68 i915->gpu_error.missed_irq_rings = 0;
66 t->reset_count = i915_reset_count(&i915->gpu_error); 69 t->reset_global = i915_reset_count(&i915->gpu_error);
70
71 for_each_engine(engine, i915, id)
72 t->reset_engine[id] =
73 i915_reset_engine_count(&i915->gpu_error, engine);
67 74
68 return 0; 75 return 0;
69} 76}
@@ -71,14 +78,28 @@ static int begin_live_test(struct live_test *t,
71static int end_live_test(struct live_test *t) 78static int end_live_test(struct live_test *t)
72{ 79{
73 struct drm_i915_private *i915 = t->i915; 80 struct drm_i915_private *i915 = t->i915;
81 struct intel_engine_cs *engine;
82 enum intel_engine_id id;
74 83
75 if (igt_flush_test(i915, I915_WAIT_LOCKED)) 84 if (igt_flush_test(i915, I915_WAIT_LOCKED))
76 return -EIO; 85 return -EIO;
77 86
78 if (t->reset_count != i915_reset_count(&i915->gpu_error)) { 87 if (t->reset_global != i915_reset_count(&i915->gpu_error)) {
79 pr_err("%s(%s): GPU was reset %d times!\n", 88 pr_err("%s(%s): GPU was reset %d times!\n",
80 t->func, t->name, 89 t->func, t->name,
81 i915_reset_count(&i915->gpu_error) - t->reset_count); 90 i915_reset_count(&i915->gpu_error) - t->reset_global);
91 return -EIO;
92 }
93
94 for_each_engine(engine, i915, id) {
95 if (t->reset_engine[id] ==
96 i915_reset_engine_count(&i915->gpu_error, engine))
97 continue;
98
99 pr_err("%s(%s): engine '%s' was reset %d times!\n",
100 t->func, t->name, engine->name,
101 i915_reset_engine_count(&i915->gpu_error, engine) -
102 t->reset_engine[id]);
82 return -EIO; 103 return -EIO;
83 } 104 }
84 105
@@ -531,11 +552,11 @@ static int igt_ctx_exec(void *arg)
531{ 552{
532 struct drm_i915_private *i915 = arg; 553 struct drm_i915_private *i915 = arg;
533 struct drm_i915_gem_object *obj = NULL; 554 struct drm_i915_gem_object *obj = NULL;
555 unsigned long ncontexts, ndwords, dw;
534 struct drm_file *file; 556 struct drm_file *file;
535 IGT_TIMEOUT(end_time); 557 IGT_TIMEOUT(end_time);
536 LIST_HEAD(objects); 558 LIST_HEAD(objects);
537 unsigned long ncontexts, ndwords, dw; 559 struct live_test t;
538 bool first_shared_gtt = true;
539 int err = -ENODEV; 560 int err = -ENODEV;
540 561
541 /* 562 /*
@@ -553,6 +574,10 @@ static int igt_ctx_exec(void *arg)
553 574
554 mutex_lock(&i915->drm.struct_mutex); 575 mutex_lock(&i915->drm.struct_mutex);
555 576
577 err = begin_live_test(&t, i915, __func__, "");
578 if (err)
579 goto out_unlock;
580
556 ncontexts = 0; 581 ncontexts = 0;
557 ndwords = 0; 582 ndwords = 0;
558 dw = 0; 583 dw = 0;
@@ -561,12 +586,7 @@ static int igt_ctx_exec(void *arg)
561 struct i915_gem_context *ctx; 586 struct i915_gem_context *ctx;
562 unsigned int id; 587 unsigned int id;
563 588
564 if (first_shared_gtt) { 589 ctx = i915_gem_create_context(i915, file->driver_priv);
565 ctx = __create_hw_context(i915, file->driver_priv);
566 first_shared_gtt = false;
567 } else {
568 ctx = i915_gem_create_context(i915, file->driver_priv);
569 }
570 if (IS_ERR(ctx)) { 590 if (IS_ERR(ctx)) {
571 err = PTR_ERR(ctx); 591 err = PTR_ERR(ctx);
572 goto out_unlock; 592 goto out_unlock;
@@ -622,7 +642,7 @@ static int igt_ctx_exec(void *arg)
622 } 642 }
623 643
624out_unlock: 644out_unlock:
625 if (igt_flush_test(i915, I915_WAIT_LOCKED)) 645 if (end_live_test(&t))
626 err = -EIO; 646 err = -EIO;
627 mutex_unlock(&i915->drm.struct_mutex); 647 mutex_unlock(&i915->drm.struct_mutex);
628 648
@@ -634,13 +654,14 @@ static int igt_ctx_readonly(void *arg)
634{ 654{
635 struct drm_i915_private *i915 = arg; 655 struct drm_i915_private *i915 = arg;
636 struct drm_i915_gem_object *obj = NULL; 656 struct drm_i915_gem_object *obj = NULL;
657 struct i915_gem_context *ctx;
658 struct i915_hw_ppgtt *ppgtt;
659 unsigned long ndwords, dw;
637 struct drm_file *file; 660 struct drm_file *file;
638 I915_RND_STATE(prng); 661 I915_RND_STATE(prng);
639 IGT_TIMEOUT(end_time); 662 IGT_TIMEOUT(end_time);
640 LIST_HEAD(objects); 663 LIST_HEAD(objects);
641 struct i915_gem_context *ctx; 664 struct live_test t;
642 struct i915_hw_ppgtt *ppgtt;
643 unsigned long ndwords, dw;
644 int err = -ENODEV; 665 int err = -ENODEV;
645 666
646 /* 667 /*
@@ -655,6 +676,10 @@ static int igt_ctx_readonly(void *arg)
655 676
656 mutex_lock(&i915->drm.struct_mutex); 677 mutex_lock(&i915->drm.struct_mutex);
657 678
679 err = begin_live_test(&t, i915, __func__, "");
680 if (err)
681 goto out_unlock;
682
658 ctx = i915_gem_create_context(i915, file->driver_priv); 683 ctx = i915_gem_create_context(i915, file->driver_priv);
659 if (IS_ERR(ctx)) { 684 if (IS_ERR(ctx)) {
660 err = PTR_ERR(ctx); 685 err = PTR_ERR(ctx);
@@ -727,7 +752,324 @@ static int igt_ctx_readonly(void *arg)
727 } 752 }
728 753
729out_unlock: 754out_unlock:
730 if (igt_flush_test(i915, I915_WAIT_LOCKED)) 755 if (end_live_test(&t))
756 err = -EIO;
757 mutex_unlock(&i915->drm.struct_mutex);
758
759 mock_file_free(i915, file);
760 return err;
761}
762
763static int check_scratch(struct i915_gem_context *ctx, u64 offset)
764{
765 struct drm_mm_node *node =
766 __drm_mm_interval_first(&ctx->ppgtt->vm.mm,
767 offset, offset + sizeof(u32) - 1);
768 if (!node || node->start > offset)
769 return 0;
770
771 GEM_BUG_ON(offset >= node->start + node->size);
772
773 pr_err("Target offset 0x%08x_%08x overlaps with a node in the mm!\n",
774 upper_32_bits(offset), lower_32_bits(offset));
775 return -EINVAL;
776}
777
778static int write_to_scratch(struct i915_gem_context *ctx,
779 struct intel_engine_cs *engine,
780 u64 offset, u32 value)
781{
782 struct drm_i915_private *i915 = ctx->i915;
783 struct drm_i915_gem_object *obj;
784 struct i915_request *rq;
785 struct i915_vma *vma;
786 u32 *cmd;
787 int err;
788
789 GEM_BUG_ON(offset < I915_GTT_PAGE_SIZE);
790
791 obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
792 if (IS_ERR(obj))
793 return PTR_ERR(obj);
794
795 cmd = i915_gem_object_pin_map(obj, I915_MAP_WB);
796 if (IS_ERR(cmd)) {
797 err = PTR_ERR(cmd);
798 goto err;
799 }
800
801 *cmd++ = MI_STORE_DWORD_IMM_GEN4;
802 if (INTEL_GEN(i915) >= 8) {
803 *cmd++ = lower_32_bits(offset);
804 *cmd++ = upper_32_bits(offset);
805 } else {
806 *cmd++ = 0;
807 *cmd++ = offset;
808 }
809 *cmd++ = value;
810 *cmd = MI_BATCH_BUFFER_END;
811 i915_gem_object_unpin_map(obj);
812
813 err = i915_gem_object_set_to_gtt_domain(obj, false);
814 if (err)
815 goto err;
816
817 vma = i915_vma_instance(obj, &ctx->ppgtt->vm, NULL);
818 if (IS_ERR(vma)) {
819 err = PTR_ERR(vma);
820 goto err;
821 }
822
823 err = i915_vma_pin(vma, 0, 0, PIN_USER | PIN_OFFSET_FIXED);
824 if (err)
825 goto err;
826
827 err = check_scratch(ctx, offset);
828 if (err)
829 goto err_unpin;
830
831 rq = i915_request_alloc(engine, ctx);
832 if (IS_ERR(rq)) {
833 err = PTR_ERR(rq);
834 goto err_unpin;
835 }
836
837 err = engine->emit_bb_start(rq, vma->node.start, vma->node.size, 0);
838 if (err)
839 goto err_request;
840
841 err = i915_vma_move_to_active(vma, rq, 0);
842 if (err)
843 goto skip_request;
844
845 i915_gem_object_set_active_reference(obj);
846 i915_vma_unpin(vma);
847 i915_vma_close(vma);
848
849 i915_request_add(rq);
850
851 return 0;
852
853skip_request:
854 i915_request_skip(rq, err);
855err_request:
856 i915_request_add(rq);
857err_unpin:
858 i915_vma_unpin(vma);
859err:
860 i915_gem_object_put(obj);
861 return err;
862}
863
864static int read_from_scratch(struct i915_gem_context *ctx,
865 struct intel_engine_cs *engine,
866 u64 offset, u32 *value)
867{
868 struct drm_i915_private *i915 = ctx->i915;
869 struct drm_i915_gem_object *obj;
870 const u32 RCS_GPR0 = 0x2600; /* not all engines have their own GPR! */
871 const u32 result = 0x100;
872 struct i915_request *rq;
873 struct i915_vma *vma;
874 u32 *cmd;
875 int err;
876
877 GEM_BUG_ON(offset < I915_GTT_PAGE_SIZE);
878
879 obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
880 if (IS_ERR(obj))
881 return PTR_ERR(obj);
882
883 cmd = i915_gem_object_pin_map(obj, I915_MAP_WB);
884 if (IS_ERR(cmd)) {
885 err = PTR_ERR(cmd);
886 goto err;
887 }
888
889 memset(cmd, POISON_INUSE, PAGE_SIZE);
890 if (INTEL_GEN(i915) >= 8) {
891 *cmd++ = MI_LOAD_REGISTER_MEM_GEN8;
892 *cmd++ = RCS_GPR0;
893 *cmd++ = lower_32_bits(offset);
894 *cmd++ = upper_32_bits(offset);
895 *cmd++ = MI_STORE_REGISTER_MEM_GEN8;
896 *cmd++ = RCS_GPR0;
897 *cmd++ = result;
898 *cmd++ = 0;
899 } else {
900 *cmd++ = MI_LOAD_REGISTER_MEM;
901 *cmd++ = RCS_GPR0;
902 *cmd++ = offset;
903 *cmd++ = MI_STORE_REGISTER_MEM;
904 *cmd++ = RCS_GPR0;
905 *cmd++ = result;
906 }
907 *cmd = MI_BATCH_BUFFER_END;
908 i915_gem_object_unpin_map(obj);
909
910 err = i915_gem_object_set_to_gtt_domain(obj, false);
911 if (err)
912 goto err;
913
914 vma = i915_vma_instance(obj, &ctx->ppgtt->vm, NULL);
915 if (IS_ERR(vma)) {
916 err = PTR_ERR(vma);
917 goto err;
918 }
919
920 err = i915_vma_pin(vma, 0, 0, PIN_USER | PIN_OFFSET_FIXED);
921 if (err)
922 goto err;
923
924 err = check_scratch(ctx, offset);
925 if (err)
926 goto err_unpin;
927
928 rq = i915_request_alloc(engine, ctx);
929 if (IS_ERR(rq)) {
930 err = PTR_ERR(rq);
931 goto err_unpin;
932 }
933
934 err = engine->emit_bb_start(rq, vma->node.start, vma->node.size, 0);
935 if (err)
936 goto err_request;
937
938 err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE);
939 if (err)
940 goto skip_request;
941
942 i915_vma_unpin(vma);
943 i915_vma_close(vma);
944
945 i915_request_add(rq);
946
947 err = i915_gem_object_set_to_cpu_domain(obj, false);
948 if (err)
949 goto err;
950
951 cmd = i915_gem_object_pin_map(obj, I915_MAP_WB);
952 if (IS_ERR(cmd)) {
953 err = PTR_ERR(cmd);
954 goto err;
955 }
956
957 *value = cmd[result / sizeof(*cmd)];
958 i915_gem_object_unpin_map(obj);
959 i915_gem_object_put(obj);
960
961 return 0;
962
963skip_request:
964 i915_request_skip(rq, err);
965err_request:
966 i915_request_add(rq);
967err_unpin:
968 i915_vma_unpin(vma);
969err:
970 i915_gem_object_put(obj);
971 return err;
972}
973
974static int igt_vm_isolation(void *arg)
975{
976 struct drm_i915_private *i915 = arg;
977 struct i915_gem_context *ctx_a, *ctx_b;
978 struct intel_engine_cs *engine;
979 struct drm_file *file;
980 I915_RND_STATE(prng);
981 unsigned long count;
982 struct live_test t;
983 unsigned int id;
984 u64 vm_total;
985 int err;
986
987 if (INTEL_GEN(i915) < 7)
988 return 0;
989
990 /*
991 * The simple goal here is that a write into one context is not
992 * observed in a second (separate page tables and scratch).
993 */
994
995 file = mock_file(i915);
996 if (IS_ERR(file))
997 return PTR_ERR(file);
998
999 mutex_lock(&i915->drm.struct_mutex);
1000
1001 err = begin_live_test(&t, i915, __func__, "");
1002 if (err)
1003 goto out_unlock;
1004
1005 ctx_a = i915_gem_create_context(i915, file->driver_priv);
1006 if (IS_ERR(ctx_a)) {
1007 err = PTR_ERR(ctx_a);
1008 goto out_unlock;
1009 }
1010
1011 ctx_b = i915_gem_create_context(i915, file->driver_priv);
1012 if (IS_ERR(ctx_b)) {
1013 err = PTR_ERR(ctx_b);
1014 goto out_unlock;
1015 }
1016
1017 /* We can only test vm isolation, if the vm are distinct */
1018 if (ctx_a->ppgtt == ctx_b->ppgtt)
1019 goto out_unlock;
1020
1021 vm_total = ctx_a->ppgtt->vm.total;
1022 GEM_BUG_ON(ctx_b->ppgtt->vm.total != vm_total);
1023 vm_total -= I915_GTT_PAGE_SIZE;
1024
1025 intel_runtime_pm_get(i915);
1026
1027 count = 0;
1028 for_each_engine(engine, i915, id) {
1029 IGT_TIMEOUT(end_time);
1030 unsigned long this = 0;
1031
1032 if (!intel_engine_can_store_dword(engine))
1033 continue;
1034
1035 while (!__igt_timeout(end_time, NULL)) {
1036 u32 value = 0xc5c5c5c5;
1037 u64 offset;
1038
1039 div64_u64_rem(i915_prandom_u64_state(&prng),
1040 vm_total, &offset);
1041 offset &= ~sizeof(u32);
1042 offset += I915_GTT_PAGE_SIZE;
1043
1044 err = write_to_scratch(ctx_a, engine,
1045 offset, 0xdeadbeef);
1046 if (err == 0)
1047 err = read_from_scratch(ctx_b, engine,
1048 offset, &value);
1049 if (err)
1050 goto out_rpm;
1051
1052 if (value) {
1053 pr_err("%s: Read %08x from scratch (offset 0x%08x_%08x), after %lu reads!\n",
1054 engine->name, value,
1055 upper_32_bits(offset),
1056 lower_32_bits(offset),
1057 this);
1058 err = -EINVAL;
1059 goto out_rpm;
1060 }
1061
1062 this++;
1063 }
1064 count += this;
1065 }
1066 pr_info("Checked %lu scratch offsets across %d engines\n",
1067 count, INTEL_INFO(i915)->num_rings);
1068
1069out_rpm:
1070 intel_runtime_pm_put(i915);
1071out_unlock:
1072 if (end_live_test(&t))
731 err = -EIO; 1073 err = -EIO;
732 mutex_unlock(&i915->drm.struct_mutex); 1074 mutex_unlock(&i915->drm.struct_mutex);
733 1075
@@ -865,33 +1207,6 @@ out_unlock:
865 return err; 1207 return err;
866} 1208}
867 1209
868static int fake_aliasing_ppgtt_enable(struct drm_i915_private *i915)
869{
870 struct drm_i915_gem_object *obj;
871 int err;
872
873 err = i915_gem_init_aliasing_ppgtt(i915);
874 if (err)
875 return err;
876
877 list_for_each_entry(obj, &i915->mm.bound_list, mm.link) {
878 struct i915_vma *vma;
879
880 vma = i915_vma_instance(obj, &i915->ggtt.vm, NULL);
881 if (IS_ERR(vma))
882 continue;
883
884 vma->flags &= ~I915_VMA_LOCAL_BIND;
885 }
886
887 return 0;
888}
889
890static void fake_aliasing_ppgtt_disable(struct drm_i915_private *i915)
891{
892 i915_gem_fini_aliasing_ppgtt(i915);
893}
894
895int i915_gem_context_mock_selftests(void) 1210int i915_gem_context_mock_selftests(void)
896{ 1211{
897 static const struct i915_subtest tests[] = { 1212 static const struct i915_subtest tests[] = {
@@ -917,32 +1232,11 @@ int i915_gem_context_live_selftests(struct drm_i915_private *dev_priv)
917 SUBTEST(live_nop_switch), 1232 SUBTEST(live_nop_switch),
918 SUBTEST(igt_ctx_exec), 1233 SUBTEST(igt_ctx_exec),
919 SUBTEST(igt_ctx_readonly), 1234 SUBTEST(igt_ctx_readonly),
1235 SUBTEST(igt_vm_isolation),
920 }; 1236 };
921 bool fake_alias = false;
922 int err;
923 1237
924 if (i915_terminally_wedged(&dev_priv->gpu_error)) 1238 if (i915_terminally_wedged(&dev_priv->gpu_error))
925 return 0; 1239 return 0;
926 1240
927 /* Install a fake aliasing gtt for exercise */ 1241 return i915_subtests(tests, dev_priv);
928 if (USES_PPGTT(dev_priv) && !dev_priv->mm.aliasing_ppgtt) {
929 mutex_lock(&dev_priv->drm.struct_mutex);
930 err = fake_aliasing_ppgtt_enable(dev_priv);
931 mutex_unlock(&dev_priv->drm.struct_mutex);
932 if (err)
933 return err;
934
935 GEM_BUG_ON(!dev_priv->mm.aliasing_ppgtt);
936 fake_alias = true;
937 }
938
939 err = i915_subtests(tests, dev_priv);
940
941 if (fake_alias) {
942 mutex_lock(&dev_priv->drm.struct_mutex);
943 fake_aliasing_ppgtt_disable(dev_priv);
944 mutex_unlock(&dev_priv->drm.struct_mutex);
945 }
946
947 return err;
948} 1242}
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
index 128ad1cf0647..4365979d8222 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
@@ -351,7 +351,7 @@ static int igt_evict_contexts(void *arg)
351 * where the GTT space of the request is separate from the GGTT 351 * where the GTT space of the request is separate from the GGTT
352 * allocation required to build the request. 352 * allocation required to build the request.
353 */ 353 */
354 if (!USES_FULL_PPGTT(i915)) 354 if (!HAS_FULL_PPGTT(i915))
355 return 0; 355 return 0;
356 356
357 mutex_lock(&i915->drm.struct_mutex); 357 mutex_lock(&i915->drm.struct_mutex);
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
index 8e2e269db97e..69fe86b30fbb 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
@@ -153,7 +153,7 @@ static int igt_ppgtt_alloc(void *arg)
153 153
154 /* Allocate a ppggt and try to fill the entire range */ 154 /* Allocate a ppggt and try to fill the entire range */
155 155
156 if (!USES_PPGTT(dev_priv)) 156 if (!HAS_PPGTT(dev_priv))
157 return 0; 157 return 0;
158 158
159 ppgtt = __hw_ppgtt_create(dev_priv); 159 ppgtt = __hw_ppgtt_create(dev_priv);
@@ -1001,7 +1001,7 @@ static int exercise_ppgtt(struct drm_i915_private *dev_priv,
1001 IGT_TIMEOUT(end_time); 1001 IGT_TIMEOUT(end_time);
1002 int err; 1002 int err;
1003 1003
1004 if (!USES_FULL_PPGTT(dev_priv)) 1004 if (!HAS_FULL_PPGTT(dev_priv))
1005 return 0; 1005 return 0;
1006 1006
1007 file = mock_file(dev_priv); 1007 file = mock_file(dev_priv);
@@ -1337,7 +1337,7 @@ static int igt_gtt_reserve(void *arg)
1337 GEM_BUG_ON(!drm_mm_node_allocated(&vma->node)); 1337 GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1338 if (vma->node.start != total || 1338 if (vma->node.start != total ||
1339 vma->node.size != 2*I915_GTT_PAGE_SIZE) { 1339 vma->node.size != 2*I915_GTT_PAGE_SIZE) {
1340 pr_err("i915_gem_gtt_reserve (pass 1) placement failed, found (%llx + %llx), expected (%llx + %lx)\n", 1340 pr_err("i915_gem_gtt_reserve (pass 1) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1341 vma->node.start, vma->node.size, 1341 vma->node.start, vma->node.size,
1342 total, 2*I915_GTT_PAGE_SIZE); 1342 total, 2*I915_GTT_PAGE_SIZE);
1343 err = -EINVAL; 1343 err = -EINVAL;
@@ -1386,7 +1386,7 @@ static int igt_gtt_reserve(void *arg)
1386 GEM_BUG_ON(!drm_mm_node_allocated(&vma->node)); 1386 GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1387 if (vma->node.start != total || 1387 if (vma->node.start != total ||
1388 vma->node.size != 2*I915_GTT_PAGE_SIZE) { 1388 vma->node.size != 2*I915_GTT_PAGE_SIZE) {
1389 pr_err("i915_gem_gtt_reserve (pass 2) placement failed, found (%llx + %llx), expected (%llx + %lx)\n", 1389 pr_err("i915_gem_gtt_reserve (pass 2) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1390 vma->node.start, vma->node.size, 1390 vma->node.start, vma->node.size,
1391 total, 2*I915_GTT_PAGE_SIZE); 1391 total, 2*I915_GTT_PAGE_SIZE);
1392 err = -EINVAL; 1392 err = -EINVAL;
@@ -1430,7 +1430,7 @@ static int igt_gtt_reserve(void *arg)
1430 GEM_BUG_ON(!drm_mm_node_allocated(&vma->node)); 1430 GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
1431 if (vma->node.start != offset || 1431 if (vma->node.start != offset ||
1432 vma->node.size != 2*I915_GTT_PAGE_SIZE) { 1432 vma->node.size != 2*I915_GTT_PAGE_SIZE) {
1433 pr_err("i915_gem_gtt_reserve (pass 3) placement failed, found (%llx + %llx), expected (%llx + %lx)\n", 1433 pr_err("i915_gem_gtt_reserve (pass 3) placement failed, found (%llx + %llx), expected (%llx + %llx)\n",
1434 vma->node.start, vma->node.size, 1434 vma->node.start, vma->node.size,
1435 offset, 2*I915_GTT_PAGE_SIZE); 1435 offset, 2*I915_GTT_PAGE_SIZE);
1436 err = -EINVAL; 1436 err = -EINVAL;
diff --git a/drivers/gpu/drm/i915/selftests/intel_guc.c b/drivers/gpu/drm/i915/selftests/intel_guc.c
index 0c0ab82b6228..32cba4cae31a 100644
--- a/drivers/gpu/drm/i915/selftests/intel_guc.c
+++ b/drivers/gpu/drm/i915/selftests/intel_guc.c
@@ -159,6 +159,7 @@ static int igt_guc_clients(void *args)
159 * Get rid of clients created during driver load because the test will 159 * Get rid of clients created during driver load because the test will
160 * recreate them. 160 * recreate them.
161 */ 161 */
162 guc_clients_disable(guc);
162 guc_clients_destroy(guc); 163 guc_clients_destroy(guc);
163 if (guc->execbuf_client || guc->preempt_client) { 164 if (guc->execbuf_client || guc->preempt_client) {
164 pr_err("guc_clients_destroy lied!\n"); 165 pr_err("guc_clients_destroy lied!\n");
@@ -197,8 +198,8 @@ static int igt_guc_clients(void *args)
197 goto out; 198 goto out;
198 } 199 }
199 200
200 /* Now create the doorbells */ 201 /* Now enable the clients */
201 guc_clients_doorbell_init(guc); 202 guc_clients_enable(guc);
202 203
203 /* each client should now have received a doorbell */ 204 /* each client should now have received a doorbell */
204 if (!client_doorbell_in_sync(guc->execbuf_client) || 205 if (!client_doorbell_in_sync(guc->execbuf_client) ||
@@ -212,63 +213,17 @@ static int igt_guc_clients(void *args)
212 * Basic test - an attempt to reallocate a valid doorbell to the 213 * Basic test - an attempt to reallocate a valid doorbell to the
213 * client it is currently assigned should not cause a failure. 214 * client it is currently assigned should not cause a failure.
214 */ 215 */
215 err = guc_clients_doorbell_init(guc);
216 if (err)
217 goto out;
218
219 /*
220 * Negative test - a client with no doorbell (invalid db id).
221 * After destroying the doorbell, the db id is changed to
222 * GUC_DOORBELL_INVALID and the firmware will reject any attempt to
223 * allocate a doorbell with an invalid id (db has to be reserved before
224 * allocation).
225 */
226 destroy_doorbell(guc->execbuf_client);
227 if (client_doorbell_in_sync(guc->execbuf_client)) {
228 pr_err("destroy db did not work\n");
229 err = -EINVAL;
230 goto out;
231 }
232
233 unreserve_doorbell(guc->execbuf_client);
234
235 __create_doorbell(guc->execbuf_client);
236 err = __guc_allocate_doorbell(guc, guc->execbuf_client->stage_id);
237 if (err != -EIO) {
238 pr_err("unexpected (err = %d)", err);
239 goto out_db;
240 }
241
242 if (!available_dbs(guc, guc->execbuf_client->priority)) {
243 pr_err("doorbell not available when it should\n");
244 err = -EIO;
245 goto out_db;
246 }
247
248out_db:
249 /* clean after test */
250 __destroy_doorbell(guc->execbuf_client);
251 err = reserve_doorbell(guc->execbuf_client);
252 if (err) {
253 pr_err("failed to reserve back the doorbell back\n");
254 }
255 err = create_doorbell(guc->execbuf_client); 216 err = create_doorbell(guc->execbuf_client);
256 if (err) {
257 pr_err("recreate doorbell failed\n");
258 goto out;
259 }
260 217
261out: 218out:
262 /* 219 /*
263 * Leave clean state for other test, plus the driver always destroy the 220 * Leave clean state for other test, plus the driver always destroy the
264 * clients during unload. 221 * clients during unload.
265 */ 222 */
266 destroy_doorbell(guc->execbuf_client); 223 guc_clients_disable(guc);
267 if (guc->preempt_client)
268 destroy_doorbell(guc->preempt_client);
269 guc_clients_destroy(guc); 224 guc_clients_destroy(guc);
270 guc_clients_create(guc); 225 guc_clients_create(guc);
271 guc_clients_doorbell_init(guc); 226 guc_clients_enable(guc);
272unlock: 227unlock:
273 intel_runtime_pm_put(dev_priv); 228 intel_runtime_pm_put(dev_priv);
274 mutex_unlock(&dev_priv->drm.struct_mutex); 229 mutex_unlock(&dev_priv->drm.struct_mutex);
@@ -352,7 +307,7 @@ static int igt_guc_doorbells(void *arg)
352 307
353 db_id = clients[i]->doorbell_id; 308 db_id = clients[i]->doorbell_id;
354 309
355 err = create_doorbell(clients[i]); 310 err = __guc_client_enable(clients[i]);
356 if (err) { 311 if (err) {
357 pr_err("[%d] Failed to create a doorbell\n", i); 312 pr_err("[%d] Failed to create a doorbell\n", i);
358 goto out; 313 goto out;
@@ -378,7 +333,7 @@ static int igt_guc_doorbells(void *arg)
378out: 333out:
379 for (i = 0; i < ATTEMPTS; i++) 334 for (i = 0; i < ATTEMPTS; i++)
380 if (!IS_ERR_OR_NULL(clients[i])) { 335 if (!IS_ERR_OR_NULL(clients[i])) {
381 destroy_doorbell(clients[i]); 336 __guc_client_disable(clients[i]);
382 guc_client_free(clients[i]); 337 guc_client_free(clients[i]);
383 } 338 }
384unlock: 339unlock:
diff --git a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
index db378226ac10..defe671130ab 100644
--- a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
+++ b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
@@ -76,7 +76,7 @@ static int hang_init(struct hang *h, struct drm_i915_private *i915)
76 h->seqno = memset(vaddr, 0xff, PAGE_SIZE); 76 h->seqno = memset(vaddr, 0xff, PAGE_SIZE);
77 77
78 vaddr = i915_gem_object_pin_map(h->obj, 78 vaddr = i915_gem_object_pin_map(h->obj,
79 HAS_LLC(i915) ? I915_MAP_WB : I915_MAP_WC); 79 i915_coherent_map_type(i915));
80 if (IS_ERR(vaddr)) { 80 if (IS_ERR(vaddr)) {
81 err = PTR_ERR(vaddr); 81 err = PTR_ERR(vaddr);
82 goto err_unpin_hws; 82 goto err_unpin_hws;
@@ -234,7 +234,7 @@ hang_create_request(struct hang *h, struct intel_engine_cs *engine)
234 return ERR_CAST(obj); 234 return ERR_CAST(obj);
235 235
236 vaddr = i915_gem_object_pin_map(obj, 236 vaddr = i915_gem_object_pin_map(obj,
237 HAS_LLC(h->i915) ? I915_MAP_WB : I915_MAP_WC); 237 i915_coherent_map_type(h->i915));
238 if (IS_ERR(vaddr)) { 238 if (IS_ERR(vaddr)) {
239 i915_gem_object_put(obj); 239 i915_gem_object_put(obj);
240 return ERR_CAST(vaddr); 240 return ERR_CAST(vaddr);
@@ -1150,6 +1150,7 @@ static int __igt_reset_evict_vma(struct drm_i915_private *i915,
1150 tsk = NULL; 1150 tsk = NULL;
1151 goto out_reset; 1151 goto out_reset;
1152 } 1152 }
1153 get_task_struct(tsk);
1153 1154
1154 wait_for_completion(&arg.completion); 1155 wait_for_completion(&arg.completion);
1155 1156
@@ -1172,6 +1173,8 @@ out_reset:
1172 /* The reset, even indirectly, should take less than 10ms. */ 1173 /* The reset, even indirectly, should take less than 10ms. */
1173 igt_wedge_on_timeout(&w, i915, HZ / 10 /* 100ms timeout*/) 1174 igt_wedge_on_timeout(&w, i915, HZ / 10 /* 100ms timeout*/)
1174 err = kthread_stop(tsk); 1175 err = kthread_stop(tsk);
1176
1177 put_task_struct(tsk);
1175 } 1178 }
1176 1179
1177 mutex_lock(&i915->drm.struct_mutex); 1180 mutex_lock(&i915->drm.struct_mutex);
diff --git a/drivers/gpu/drm/i915/selftests/intel_lrc.c b/drivers/gpu/drm/i915/selftests/intel_lrc.c
index 1aea7a8f2224..94fc0e5c8766 100644
--- a/drivers/gpu/drm/i915/selftests/intel_lrc.c
+++ b/drivers/gpu/drm/i915/selftests/intel_lrc.c
@@ -6,6 +6,7 @@
6 6
7#include "../i915_selftest.h" 7#include "../i915_selftest.h"
8#include "igt_flush_test.h" 8#include "igt_flush_test.h"
9#include "i915_random.h"
9 10
10#include "mock_context.h" 11#include "mock_context.h"
11 12
@@ -48,7 +49,7 @@ static int spinner_init(struct spinner *spin, struct drm_i915_private *i915)
48 } 49 }
49 spin->seqno = memset(vaddr, 0xff, PAGE_SIZE); 50 spin->seqno = memset(vaddr, 0xff, PAGE_SIZE);
50 51
51 mode = HAS_LLC(i915) ? I915_MAP_WB : I915_MAP_WC; 52 mode = i915_coherent_map_type(i915);
52 vaddr = i915_gem_object_pin_map(spin->obj, mode); 53 vaddr = i915_gem_object_pin_map(spin->obj, mode);
53 if (IS_ERR(vaddr)) { 54 if (IS_ERR(vaddr)) {
54 err = PTR_ERR(vaddr); 55 err = PTR_ERR(vaddr);
@@ -291,12 +292,14 @@ static int live_preempt(void *arg)
291 ctx_hi = kernel_context(i915); 292 ctx_hi = kernel_context(i915);
292 if (!ctx_hi) 293 if (!ctx_hi)
293 goto err_spin_lo; 294 goto err_spin_lo;
294 ctx_hi->sched.priority = I915_CONTEXT_MAX_USER_PRIORITY; 295 ctx_hi->sched.priority =
296 I915_USER_PRIORITY(I915_CONTEXT_MAX_USER_PRIORITY);
295 297
296 ctx_lo = kernel_context(i915); 298 ctx_lo = kernel_context(i915);
297 if (!ctx_lo) 299 if (!ctx_lo)
298 goto err_ctx_hi; 300 goto err_ctx_hi;
299 ctx_lo->sched.priority = I915_CONTEXT_MIN_USER_PRIORITY; 301 ctx_lo->sched.priority =
302 I915_USER_PRIORITY(I915_CONTEXT_MIN_USER_PRIORITY);
300 303
301 for_each_engine(engine, i915, id) { 304 for_each_engine(engine, i915, id) {
302 struct i915_request *rq; 305 struct i915_request *rq;
@@ -417,7 +420,7 @@ static int live_late_preempt(void *arg)
417 goto err_wedged; 420 goto err_wedged;
418 } 421 }
419 422
420 attr.priority = I915_PRIORITY_MAX; 423 attr.priority = I915_USER_PRIORITY(I915_PRIORITY_MAX);
421 engine->schedule(rq, &attr); 424 engine->schedule(rq, &attr);
422 425
423 if (!wait_for_spinner(&spin_hi, rq)) { 426 if (!wait_for_spinner(&spin_hi, rq)) {
@@ -573,6 +576,261 @@ err_unlock:
573 return err; 576 return err;
574} 577}
575 578
579static int random_range(struct rnd_state *rnd, int min, int max)
580{
581 return i915_prandom_u32_max_state(max - min, rnd) + min;
582}
583
584static int random_priority(struct rnd_state *rnd)
585{
586 return random_range(rnd, I915_PRIORITY_MIN, I915_PRIORITY_MAX);
587}
588
589struct preempt_smoke {
590 struct drm_i915_private *i915;
591 struct i915_gem_context **contexts;
592 struct intel_engine_cs *engine;
593 struct drm_i915_gem_object *batch;
594 unsigned int ncontext;
595 struct rnd_state prng;
596 unsigned long count;
597};
598
599static struct i915_gem_context *smoke_context(struct preempt_smoke *smoke)
600{
601 return smoke->contexts[i915_prandom_u32_max_state(smoke->ncontext,
602 &smoke->prng)];
603}
604
605static int smoke_submit(struct preempt_smoke *smoke,
606 struct i915_gem_context *ctx, int prio,
607 struct drm_i915_gem_object *batch)
608{
609 struct i915_request *rq;
610 struct i915_vma *vma = NULL;
611 int err = 0;
612
613 if (batch) {
614 vma = i915_vma_instance(batch, &ctx->ppgtt->vm, NULL);
615 if (IS_ERR(vma))
616 return PTR_ERR(vma);
617
618 err = i915_vma_pin(vma, 0, 0, PIN_USER);
619 if (err)
620 return err;
621 }
622
623 ctx->sched.priority = prio;
624
625 rq = i915_request_alloc(smoke->engine, ctx);
626 if (IS_ERR(rq)) {
627 err = PTR_ERR(rq);
628 goto unpin;
629 }
630
631 if (vma) {
632 err = rq->engine->emit_bb_start(rq,
633 vma->node.start,
634 PAGE_SIZE, 0);
635 if (!err)
636 err = i915_vma_move_to_active(vma, rq, 0);
637 }
638
639 i915_request_add(rq);
640
641unpin:
642 if (vma)
643 i915_vma_unpin(vma);
644
645 return err;
646}
647
648static int smoke_crescendo_thread(void *arg)
649{
650 struct preempt_smoke *smoke = arg;
651 IGT_TIMEOUT(end_time);
652 unsigned long count;
653
654 count = 0;
655 do {
656 struct i915_gem_context *ctx = smoke_context(smoke);
657 int err;
658
659 mutex_lock(&smoke->i915->drm.struct_mutex);
660 err = smoke_submit(smoke,
661 ctx, count % I915_PRIORITY_MAX,
662 smoke->batch);
663 mutex_unlock(&smoke->i915->drm.struct_mutex);
664 if (err)
665 return err;
666
667 count++;
668 } while (!__igt_timeout(end_time, NULL));
669
670 smoke->count = count;
671 return 0;
672}
673
674static int smoke_crescendo(struct preempt_smoke *smoke, unsigned int flags)
675#define BATCH BIT(0)
676{
677 struct task_struct *tsk[I915_NUM_ENGINES] = {};
678 struct preempt_smoke arg[I915_NUM_ENGINES];
679 struct intel_engine_cs *engine;
680 enum intel_engine_id id;
681 unsigned long count;
682 int err = 0;
683
684 mutex_unlock(&smoke->i915->drm.struct_mutex);
685
686 for_each_engine(engine, smoke->i915, id) {
687 arg[id] = *smoke;
688 arg[id].engine = engine;
689 if (!(flags & BATCH))
690 arg[id].batch = NULL;
691 arg[id].count = 0;
692
693 tsk[id] = kthread_run(smoke_crescendo_thread, &arg,
694 "igt/smoke:%d", id);
695 if (IS_ERR(tsk[id])) {
696 err = PTR_ERR(tsk[id]);
697 break;
698 }
699 get_task_struct(tsk[id]);
700 }
701
702 count = 0;
703 for_each_engine(engine, smoke->i915, id) {
704 int status;
705
706 if (IS_ERR_OR_NULL(tsk[id]))
707 continue;
708
709 status = kthread_stop(tsk[id]);
710 if (status && !err)
711 err = status;
712
713 count += arg[id].count;
714
715 put_task_struct(tsk[id]);
716 }
717
718 mutex_lock(&smoke->i915->drm.struct_mutex);
719
720 pr_info("Submitted %lu crescendo:%x requests across %d engines and %d contexts\n",
721 count, flags,
722 INTEL_INFO(smoke->i915)->num_rings, smoke->ncontext);
723 return 0;
724}
725
726static int smoke_random(struct preempt_smoke *smoke, unsigned int flags)
727{
728 enum intel_engine_id id;
729 IGT_TIMEOUT(end_time);
730 unsigned long count;
731
732 count = 0;
733 do {
734 for_each_engine(smoke->engine, smoke->i915, id) {
735 struct i915_gem_context *ctx = smoke_context(smoke);
736 int err;
737
738 err = smoke_submit(smoke,
739 ctx, random_priority(&smoke->prng),
740 flags & BATCH ? smoke->batch : NULL);
741 if (err)
742 return err;
743
744 count++;
745 }
746 } while (!__igt_timeout(end_time, NULL));
747
748 pr_info("Submitted %lu random:%x requests across %d engines and %d contexts\n",
749 count, flags,
750 INTEL_INFO(smoke->i915)->num_rings, smoke->ncontext);
751 return 0;
752}
753
754static int live_preempt_smoke(void *arg)
755{
756 struct preempt_smoke smoke = {
757 .i915 = arg,
758 .prng = I915_RND_STATE_INITIALIZER(i915_selftest.random_seed),
759 .ncontext = 1024,
760 };
761 const unsigned int phase[] = { 0, BATCH };
762 int err = -ENOMEM;
763 u32 *cs;
764 int n;
765
766 if (!HAS_LOGICAL_RING_PREEMPTION(smoke.i915))
767 return 0;
768
769 smoke.contexts = kmalloc_array(smoke.ncontext,
770 sizeof(*smoke.contexts),
771 GFP_KERNEL);
772 if (!smoke.contexts)
773 return -ENOMEM;
774
775 mutex_lock(&smoke.i915->drm.struct_mutex);
776 intel_runtime_pm_get(smoke.i915);
777
778 smoke.batch = i915_gem_object_create_internal(smoke.i915, PAGE_SIZE);
779 if (IS_ERR(smoke.batch)) {
780 err = PTR_ERR(smoke.batch);
781 goto err_unlock;
782 }
783
784 cs = i915_gem_object_pin_map(smoke.batch, I915_MAP_WB);
785 if (IS_ERR(cs)) {
786 err = PTR_ERR(cs);
787 goto err_batch;
788 }
789 for (n = 0; n < PAGE_SIZE / sizeof(*cs) - 1; n++)
790 cs[n] = MI_ARB_CHECK;
791 cs[n] = MI_BATCH_BUFFER_END;
792 i915_gem_object_unpin_map(smoke.batch);
793
794 err = i915_gem_object_set_to_gtt_domain(smoke.batch, false);
795 if (err)
796 goto err_batch;
797
798 for (n = 0; n < smoke.ncontext; n++) {
799 smoke.contexts[n] = kernel_context(smoke.i915);
800 if (!smoke.contexts[n])
801 goto err_ctx;
802 }
803
804 for (n = 0; n < ARRAY_SIZE(phase); n++) {
805 err = smoke_crescendo(&smoke, phase[n]);
806 if (err)
807 goto err_ctx;
808
809 err = smoke_random(&smoke, phase[n]);
810 if (err)
811 goto err_ctx;
812 }
813
814err_ctx:
815 if (igt_flush_test(smoke.i915, I915_WAIT_LOCKED))
816 err = -EIO;
817
818 for (n = 0; n < smoke.ncontext; n++) {
819 if (!smoke.contexts[n])
820 break;
821 kernel_context_close(smoke.contexts[n]);
822 }
823
824err_batch:
825 i915_gem_object_put(smoke.batch);
826err_unlock:
827 intel_runtime_pm_put(smoke.i915);
828 mutex_unlock(&smoke.i915->drm.struct_mutex);
829 kfree(smoke.contexts);
830
831 return err;
832}
833
576int intel_execlists_live_selftests(struct drm_i915_private *i915) 834int intel_execlists_live_selftests(struct drm_i915_private *i915)
577{ 835{
578 static const struct i915_subtest tests[] = { 836 static const struct i915_subtest tests[] = {
@@ -580,6 +838,7 @@ int intel_execlists_live_selftests(struct drm_i915_private *i915)
580 SUBTEST(live_preempt), 838 SUBTEST(live_preempt),
581 SUBTEST(live_late_preempt), 839 SUBTEST(live_late_preempt),
582 SUBTEST(live_preempt_hang), 840 SUBTEST(live_preempt_hang),
841 SUBTEST(live_preempt_smoke),
583 }; 842 };
584 843
585 if (!HAS_EXECLISTS(i915)) 844 if (!HAS_EXECLISTS(i915))
diff --git a/drivers/gpu/drm/i915/selftests/mock_engine.c b/drivers/gpu/drm/i915/selftests/mock_engine.c
index 22a73da45ad5..d0c44c18db42 100644
--- a/drivers/gpu/drm/i915/selftests/mock_engine.c
+++ b/drivers/gpu/drm/i915/selftests/mock_engine.c
@@ -200,7 +200,7 @@ struct intel_engine_cs *mock_engine(struct drm_i915_private *i915,
200 engine->base.submit_request = mock_submit_request; 200 engine->base.submit_request = mock_submit_request;
201 201
202 i915_timeline_init(i915, &engine->base.timeline, engine->base.name); 202 i915_timeline_init(i915, &engine->base.timeline, engine->base.name);
203 lockdep_set_subclass(&engine->base.timeline.lock, TIMELINE_ENGINE); 203 i915_timeline_set_subclass(&engine->base.timeline, TIMELINE_ENGINE);
204 204
205 intel_engine_init_breadcrumbs(&engine->base); 205 intel_engine_init_breadcrumbs(&engine->base);
206 engine->base.breadcrumbs.mock = true; /* prevent touching HW for irqs */ 206 engine->base.breadcrumbs.mock = true; /* prevent touching HW for irqs */
diff --git a/drivers/gpu/drm/i915/vlv_dsi.c b/drivers/gpu/drm/i915/vlv_dsi.c
index 435a2c35ee8c..361e962a7969 100644
--- a/drivers/gpu/drm/i915/vlv_dsi.c
+++ b/drivers/gpu/drm/i915/vlv_dsi.c
@@ -206,39 +206,6 @@ static const struct mipi_dsi_host_ops intel_dsi_host_ops = {
206 .transfer = intel_dsi_host_transfer, 206 .transfer = intel_dsi_host_transfer,
207}; 207};
208 208
209static struct intel_dsi_host *intel_dsi_host_init(struct intel_dsi *intel_dsi,
210 enum port port)
211{
212 struct intel_dsi_host *host;
213 struct mipi_dsi_device *device;
214
215 host = kzalloc(sizeof(*host), GFP_KERNEL);
216 if (!host)
217 return NULL;
218
219 host->base.ops = &intel_dsi_host_ops;
220 host->intel_dsi = intel_dsi;
221 host->port = port;
222
223 /*
224 * We should call mipi_dsi_host_register(&host->base) here, but we don't
225 * have a host->dev, and we don't have OF stuff either. So just use the
226 * dsi framework as a library and hope for the best. Create the dsi
227 * devices by ourselves here too. Need to be careful though, because we
228 * don't initialize any of the driver model devices here.
229 */
230 device = kzalloc(sizeof(*device), GFP_KERNEL);
231 if (!device) {
232 kfree(host);
233 return NULL;
234 }
235
236 device->host = &host->base;
237 host->device = device;
238
239 return host;
240}
241
242/* 209/*
243 * send a video mode command 210 * send a video mode command
244 * 211 *
@@ -290,16 +257,6 @@ static void band_gap_reset(struct drm_i915_private *dev_priv)
290 mutex_unlock(&dev_priv->sb_lock); 257 mutex_unlock(&dev_priv->sb_lock);
291} 258}
292 259
293static inline bool is_vid_mode(struct intel_dsi *intel_dsi)
294{
295 return intel_dsi->operation_mode == INTEL_DSI_VIDEO_MODE;
296}
297
298static inline bool is_cmd_mode(struct intel_dsi *intel_dsi)
299{
300 return intel_dsi->operation_mode == INTEL_DSI_COMMAND_MODE;
301}
302
303static bool intel_dsi_compute_config(struct intel_encoder *encoder, 260static bool intel_dsi_compute_config(struct intel_encoder *encoder,
304 struct intel_crtc_state *pipe_config, 261 struct intel_crtc_state *pipe_config,
305 struct drm_connector_state *conn_state) 262 struct drm_connector_state *conn_state)
@@ -314,6 +271,7 @@ static bool intel_dsi_compute_config(struct intel_encoder *encoder,
314 int ret; 271 int ret;
315 272
316 DRM_DEBUG_KMS("\n"); 273 DRM_DEBUG_KMS("\n");
274 pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
317 275
318 if (fixed_mode) { 276 if (fixed_mode) {
319 intel_fixed_panel_mode(fixed_mode, adjusted_mode); 277 intel_fixed_panel_mode(fixed_mode, adjusted_mode);
@@ -745,17 +703,6 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder,
745 const struct intel_crtc_state *pipe_config); 703 const struct intel_crtc_state *pipe_config);
746static void intel_dsi_unprepare(struct intel_encoder *encoder); 704static void intel_dsi_unprepare(struct intel_encoder *encoder);
747 705
748static void intel_dsi_msleep(struct intel_dsi *intel_dsi, int msec)
749{
750 struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev);
751
752 /* For v3 VBTs in vid-mode the delays are part of the VBT sequences */
753 if (is_vid_mode(intel_dsi) && dev_priv->vbt.dsi.seq_version >= 3)
754 return;
755
756 msleep(msec);
757}
758
759/* 706/*
760 * Panel enable/disable sequences from the VBT spec. 707 * Panel enable/disable sequences from the VBT spec.
761 * 708 *
@@ -793,6 +740,10 @@ static void intel_dsi_msleep(struct intel_dsi *intel_dsi, int msec)
793 * - wait t4 - wait t4 740 * - wait t4 - wait t4
794 */ 741 */
795 742
743/*
744 * DSI port enable has to be done before pipe and plane enable, so we do it in
745 * the pre_enable hook instead of the enable hook.
746 */
796static void intel_dsi_pre_enable(struct intel_encoder *encoder, 747static void intel_dsi_pre_enable(struct intel_encoder *encoder,
797 const struct intel_crtc_state *pipe_config, 748 const struct intel_crtc_state *pipe_config,
798 const struct drm_connector_state *conn_state) 749 const struct drm_connector_state *conn_state)
@@ -895,17 +846,6 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder,
895} 846}
896 847
897/* 848/*
898 * DSI port enable has to be done before pipe and plane enable, so we do it in
899 * the pre_enable hook.
900 */
901static void intel_dsi_enable_nop(struct intel_encoder *encoder,
902 const struct intel_crtc_state *pipe_config,
903 const struct drm_connector_state *conn_state)
904{
905 DRM_DEBUG_KMS("\n");
906}
907
908/*
909 * DSI port disable has to be done after pipe and plane disable, so we do it in 849 * DSI port disable has to be done after pipe and plane disable, so we do it in
910 * the post_disable hook. 850 * the post_disable hook.
911 */ 851 */
@@ -1272,31 +1212,6 @@ static void intel_dsi_get_config(struct intel_encoder *encoder,
1272 } 1212 }
1273} 1213}
1274 1214
1275static enum drm_mode_status
1276intel_dsi_mode_valid(struct drm_connector *connector,
1277 struct drm_display_mode *mode)
1278{
1279 struct intel_connector *intel_connector = to_intel_connector(connector);
1280 const struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
1281 int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
1282
1283 DRM_DEBUG_KMS("\n");
1284
1285 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
1286 return MODE_NO_DBLESCAN;
1287
1288 if (fixed_mode) {
1289 if (mode->hdisplay > fixed_mode->hdisplay)
1290 return MODE_PANEL;
1291 if (mode->vdisplay > fixed_mode->vdisplay)
1292 return MODE_PANEL;
1293 if (fixed_mode->clock > max_dotclk)
1294 return MODE_CLOCK_HIGH;
1295 }
1296
1297 return MODE_OK;
1298}
1299
1300/* return txclkesc cycles in terms of divider and duration in us */ 1215/* return txclkesc cycles in terms of divider and duration in us */
1301static u16 txclkesc(u32 divider, unsigned int us) 1216static u16 txclkesc(u32 divider, unsigned int us)
1302{ 1217{
@@ -1619,39 +1534,6 @@ static void intel_dsi_unprepare(struct intel_encoder *encoder)
1619 } 1534 }
1620} 1535}
1621 1536
1622static int intel_dsi_get_modes(struct drm_connector *connector)
1623{
1624 struct intel_connector *intel_connector = to_intel_connector(connector);
1625 struct drm_display_mode *mode;
1626
1627 DRM_DEBUG_KMS("\n");
1628
1629 if (!intel_connector->panel.fixed_mode) {
1630 DRM_DEBUG_KMS("no fixed mode\n");
1631 return 0;
1632 }
1633
1634 mode = drm_mode_duplicate(connector->dev,
1635 intel_connector->panel.fixed_mode);
1636 if (!mode) {
1637 DRM_DEBUG_KMS("drm_mode_duplicate failed\n");
1638 return 0;
1639 }
1640
1641 drm_mode_probed_add(connector, mode);
1642 return 1;
1643}
1644
1645static void intel_dsi_connector_destroy(struct drm_connector *connector)
1646{
1647 struct intel_connector *intel_connector = to_intel_connector(connector);
1648
1649 DRM_DEBUG_KMS("\n");
1650 intel_panel_fini(&intel_connector->panel);
1651 drm_connector_cleanup(connector);
1652 kfree(connector);
1653}
1654
1655static void intel_dsi_encoder_destroy(struct drm_encoder *encoder) 1537static void intel_dsi_encoder_destroy(struct drm_encoder *encoder)
1656{ 1538{
1657 struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); 1539 struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
@@ -1676,7 +1558,7 @@ static const struct drm_connector_helper_funcs intel_dsi_connector_helper_funcs
1676static const struct drm_connector_funcs intel_dsi_connector_funcs = { 1558static const struct drm_connector_funcs intel_dsi_connector_funcs = {
1677 .late_register = intel_connector_register, 1559 .late_register = intel_connector_register,
1678 .early_unregister = intel_connector_unregister, 1560 .early_unregister = intel_connector_unregister,
1679 .destroy = intel_dsi_connector_destroy, 1561 .destroy = intel_connector_destroy,
1680 .fill_modes = drm_helper_probe_single_connector_modes, 1562 .fill_modes = drm_helper_probe_single_connector_modes,
1681 .atomic_get_property = intel_digital_connector_atomic_get_property, 1563 .atomic_get_property = intel_digital_connector_atomic_get_property,
1682 .atomic_set_property = intel_digital_connector_atomic_set_property, 1564 .atomic_set_property = intel_digital_connector_atomic_set_property,
@@ -1684,27 +1566,57 @@ static const struct drm_connector_funcs intel_dsi_connector_funcs = {
1684 .atomic_duplicate_state = intel_digital_connector_duplicate_state, 1566 .atomic_duplicate_state = intel_digital_connector_duplicate_state,
1685}; 1567};
1686 1568
1687static int intel_dsi_get_panel_orientation(struct intel_connector *connector) 1569static enum drm_panel_orientation
1570vlv_dsi_get_hw_panel_orientation(struct intel_connector *connector)
1688{ 1571{
1689 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); 1572 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1690 int orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL; 1573 struct intel_encoder *encoder = connector->encoder;
1691 enum i9xx_plane_id i9xx_plane; 1574 enum intel_display_power_domain power_domain;
1575 enum drm_panel_orientation orientation;
1576 struct intel_plane *plane;
1577 struct intel_crtc *crtc;
1578 enum pipe pipe;
1692 u32 val; 1579 u32 val;
1693 1580
1694 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) { 1581 if (!encoder->get_hw_state(encoder, &pipe))
1695 if (connector->encoder->crtc_mask == BIT(PIPE_B)) 1582 return DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
1696 i9xx_plane = PLANE_B;
1697 else
1698 i9xx_plane = PLANE_A;
1699 1583
1700 val = I915_READ(DSPCNTR(i9xx_plane)); 1584 crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
1701 if (val & DISPPLANE_ROTATE_180) 1585 plane = to_intel_plane(crtc->base.primary);
1702 orientation = DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP; 1586
1703 } 1587 power_domain = POWER_DOMAIN_PIPE(pipe);
1588 if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
1589 return DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
1590
1591 val = I915_READ(DSPCNTR(plane->i9xx_plane));
1592
1593 if (!(val & DISPLAY_PLANE_ENABLE))
1594 orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
1595 else if (val & DISPPLANE_ROTATE_180)
1596 orientation = DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP;
1597 else
1598 orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL;
1599
1600 intel_display_power_put(dev_priv, power_domain);
1704 1601
1705 return orientation; 1602 return orientation;
1706} 1603}
1707 1604
1605static enum drm_panel_orientation
1606vlv_dsi_get_panel_orientation(struct intel_connector *connector)
1607{
1608 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1609 enum drm_panel_orientation orientation;
1610
1611 if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
1612 orientation = vlv_dsi_get_hw_panel_orientation(connector);
1613 if (orientation != DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
1614 return orientation;
1615 }
1616
1617 return intel_dsi_get_panel_orientation(connector);
1618}
1619
1708static void intel_dsi_add_properties(struct intel_connector *connector) 1620static void intel_dsi_add_properties(struct intel_connector *connector)
1709{ 1621{
1710 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); 1622 struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
@@ -1722,7 +1634,7 @@ static void intel_dsi_add_properties(struct intel_connector *connector)
1722 connector->base.state->scaling_mode = DRM_MODE_SCALE_ASPECT; 1634 connector->base.state->scaling_mode = DRM_MODE_SCALE_ASPECT;
1723 1635
1724 connector->base.display_info.panel_orientation = 1636 connector->base.display_info.panel_orientation =
1725 intel_dsi_get_panel_orientation(connector); 1637 vlv_dsi_get_panel_orientation(connector);
1726 drm_connector_init_panel_orientation_property( 1638 drm_connector_init_panel_orientation_property(
1727 &connector->base, 1639 &connector->base,
1728 connector->panel.fixed_mode->hdisplay, 1640 connector->panel.fixed_mode->hdisplay,
@@ -1773,7 +1685,6 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv)
1773 1685
1774 intel_encoder->compute_config = intel_dsi_compute_config; 1686 intel_encoder->compute_config = intel_dsi_compute_config;
1775 intel_encoder->pre_enable = intel_dsi_pre_enable; 1687 intel_encoder->pre_enable = intel_dsi_pre_enable;
1776 intel_encoder->enable = intel_dsi_enable_nop;
1777 intel_encoder->disable = intel_dsi_disable; 1688 intel_encoder->disable = intel_dsi_disable;
1778 intel_encoder->post_disable = intel_dsi_post_disable; 1689 intel_encoder->post_disable = intel_dsi_post_disable;
1779 intel_encoder->get_hw_state = intel_dsi_get_hw_state; 1690 intel_encoder->get_hw_state = intel_dsi_get_hw_state;
@@ -1806,7 +1717,8 @@ void vlv_dsi_init(struct drm_i915_private *dev_priv)
1806 for_each_dsi_port(port, intel_dsi->ports) { 1717 for_each_dsi_port(port, intel_dsi->ports) {
1807 struct intel_dsi_host *host; 1718 struct intel_dsi_host *host;
1808 1719
1809 host = intel_dsi_host_init(intel_dsi, port); 1720 host = intel_dsi_host_init(intel_dsi, &intel_dsi_host_ops,
1721 port);
1810 if (!host) 1722 if (!host)
1811 goto err; 1723 goto err;
1812 1724
diff --git a/drivers/gpu/drm/meson/meson_venc.c b/drivers/gpu/drm/meson/meson_venc.c
index bcffe8ea642c..e95e0e7a7fa1 100644
--- a/drivers/gpu/drm/meson/meson_venc.c
+++ b/drivers/gpu/drm/meson/meson_venc.c
@@ -983,6 +983,13 @@ void meson_venc_hdmi_mode_set(struct meson_drm *priv, int vic,
983 unsigned int sof_lines; 983 unsigned int sof_lines;
984 unsigned int vsync_lines; 984 unsigned int vsync_lines;
985 985
986 /* Use VENCI for 480i and 576i and double HDMI pixels */
987 if (mode->flags & DRM_MODE_FLAG_DBLCLK) {
988 hdmi_repeat = true;
989 use_enci = true;
990 venc_hdmi_latency = 1;
991 }
992
986 if (meson_venc_hdmi_supported_vic(vic)) { 993 if (meson_venc_hdmi_supported_vic(vic)) {
987 vmode = meson_venc_hdmi_get_vic_vmode(vic); 994 vmode = meson_venc_hdmi_get_vic_vmode(vic);
988 if (!vmode) { 995 if (!vmode) {
@@ -994,13 +1001,7 @@ void meson_venc_hdmi_mode_set(struct meson_drm *priv, int vic,
994 } else { 1001 } else {
995 meson_venc_hdmi_get_dmt_vmode(mode, &vmode_dmt); 1002 meson_venc_hdmi_get_dmt_vmode(mode, &vmode_dmt);
996 vmode = &vmode_dmt; 1003 vmode = &vmode_dmt;
997 } 1004 use_enci = false;
998
999 /* Use VENCI for 480i and 576i and double HDMI pixels */
1000 if (mode->flags & DRM_MODE_FLAG_DBLCLK) {
1001 hdmi_repeat = true;
1002 use_enci = true;
1003 venc_hdmi_latency = 1;
1004 } 1005 }
1005 1006
1006 /* Repeat VENC pixels for 480/576i/p, 720p50/60 and 1080p50/60 */ 1007 /* Repeat VENC pixels for 480/576i/p, 720p50/60 and 1080p50/60 */
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
index 04f1dfba12e5..0aaedc554879 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.h
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
@@ -212,8 +212,6 @@ struct mga_device {
212 int fb_mtrr; 212 int fb_mtrr;
213 213
214 struct { 214 struct {
215 struct drm_global_reference mem_global_ref;
216 struct ttm_bo_global_ref bo_global_ref;
217 struct ttm_bo_device bdev; 215 struct ttm_bo_device bdev;
218 } ttm; 216 } ttm;
219 217
diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
index 05570f0de4d7..d96a9b32455e 100644
--- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
+++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
@@ -36,63 +36,6 @@ mgag200_bdev(struct ttm_bo_device *bd)
36 return container_of(bd, struct mga_device, ttm.bdev); 36 return container_of(bd, struct mga_device, ttm.bdev);
37} 37}
38 38
39static int
40mgag200_ttm_mem_global_init(struct drm_global_reference *ref)
41{
42 return ttm_mem_global_init(ref->object);
43}
44
45static void
46mgag200_ttm_mem_global_release(struct drm_global_reference *ref)
47{
48 ttm_mem_global_release(ref->object);
49}
50
51static int mgag200_ttm_global_init(struct mga_device *ast)
52{
53 struct drm_global_reference *global_ref;
54 int r;
55
56 global_ref = &ast->ttm.mem_global_ref;
57 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
58 global_ref->size = sizeof(struct ttm_mem_global);
59 global_ref->init = &mgag200_ttm_mem_global_init;
60 global_ref->release = &mgag200_ttm_mem_global_release;
61 r = drm_global_item_ref(global_ref);
62 if (r != 0) {
63 DRM_ERROR("Failed setting up TTM memory accounting "
64 "subsystem.\n");
65 return r;
66 }
67
68 ast->ttm.bo_global_ref.mem_glob =
69 ast->ttm.mem_global_ref.object;
70 global_ref = &ast->ttm.bo_global_ref.ref;
71 global_ref->global_type = DRM_GLOBAL_TTM_BO;
72 global_ref->size = sizeof(struct ttm_bo_global);
73 global_ref->init = &ttm_bo_global_init;
74 global_ref->release = &ttm_bo_global_release;
75 r = drm_global_item_ref(global_ref);
76 if (r != 0) {
77 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
78 drm_global_item_unref(&ast->ttm.mem_global_ref);
79 return r;
80 }
81 return 0;
82}
83
84static void
85mgag200_ttm_global_release(struct mga_device *ast)
86{
87 if (ast->ttm.mem_global_ref.release == NULL)
88 return;
89
90 drm_global_item_unref(&ast->ttm.bo_global_ref.ref);
91 drm_global_item_unref(&ast->ttm.mem_global_ref);
92 ast->ttm.mem_global_ref.release = NULL;
93}
94
95
96static void mgag200_bo_ttm_destroy(struct ttm_buffer_object *tbo) 39static void mgag200_bo_ttm_destroy(struct ttm_buffer_object *tbo)
97{ 40{
98 struct mgag200_bo *bo; 41 struct mgag200_bo *bo;
@@ -232,12 +175,7 @@ int mgag200_mm_init(struct mga_device *mdev)
232 struct drm_device *dev = mdev->dev; 175 struct drm_device *dev = mdev->dev;
233 struct ttm_bo_device *bdev = &mdev->ttm.bdev; 176 struct ttm_bo_device *bdev = &mdev->ttm.bdev;
234 177
235 ret = mgag200_ttm_global_init(mdev);
236 if (ret)
237 return ret;
238
239 ret = ttm_bo_device_init(&mdev->ttm.bdev, 178 ret = ttm_bo_device_init(&mdev->ttm.bdev,
240 mdev->ttm.bo_global_ref.ref.object,
241 &mgag200_bo_driver, 179 &mgag200_bo_driver,
242 dev->anon_inode->i_mapping, 180 dev->anon_inode->i_mapping,
243 DRM_FILE_PAGE_OFFSET, 181 DRM_FILE_PAGE_OFFSET,
@@ -268,8 +206,6 @@ void mgag200_mm_fini(struct mga_device *mdev)
268 206
269 ttm_bo_device_release(&mdev->ttm.bdev); 207 ttm_bo_device_release(&mdev->ttm.bdev);
270 208
271 mgag200_ttm_global_release(mdev);
272
273 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0), 209 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
274 pci_resource_len(dev->pdev, 0)); 210 pci_resource_len(dev->pdev, 0));
275 arch_phys_wc_del(mdev->fb_mtrr); 211 arch_phys_wc_del(mdev->fb_mtrr);
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index 0b2191fa96f7..d20b9ba4b1c1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -146,8 +146,6 @@ struct nouveau_drm {
146 146
147 /* TTM interface support */ 147 /* TTM interface support */
148 struct { 148 struct {
149 struct drm_global_reference mem_global_ref;
150 struct ttm_bo_global_ref bo_global_ref;
151 struct ttm_bo_device bdev; 149 struct ttm_bo_device bdev;
152 atomic_t validate_sequence; 150 atomic_t validate_sequence;
153 int (*move)(struct nouveau_channel *, 151 int (*move)(struct nouveau_channel *,
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c
index 8edb9f2a4269..1543c2f8d3d3 100644
--- a/drivers/gpu/drm/nouveau/nouveau_ttm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c
@@ -175,66 +175,6 @@ nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma)
175} 175}
176 176
177static int 177static int
178nouveau_ttm_mem_global_init(struct drm_global_reference *ref)
179{
180 return ttm_mem_global_init(ref->object);
181}
182
183static void
184nouveau_ttm_mem_global_release(struct drm_global_reference *ref)
185{
186 ttm_mem_global_release(ref->object);
187}
188
189int
190nouveau_ttm_global_init(struct nouveau_drm *drm)
191{
192 struct drm_global_reference *global_ref;
193 int ret;
194
195 global_ref = &drm->ttm.mem_global_ref;
196 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
197 global_ref->size = sizeof(struct ttm_mem_global);
198 global_ref->init = &nouveau_ttm_mem_global_init;
199 global_ref->release = &nouveau_ttm_mem_global_release;
200
201 ret = drm_global_item_ref(global_ref);
202 if (unlikely(ret != 0)) {
203 DRM_ERROR("Failed setting up TTM memory accounting\n");
204 drm->ttm.mem_global_ref.release = NULL;
205 return ret;
206 }
207
208 drm->ttm.bo_global_ref.mem_glob = global_ref->object;
209 global_ref = &drm->ttm.bo_global_ref.ref;
210 global_ref->global_type = DRM_GLOBAL_TTM_BO;
211 global_ref->size = sizeof(struct ttm_bo_global);
212 global_ref->init = &ttm_bo_global_init;
213 global_ref->release = &ttm_bo_global_release;
214
215 ret = drm_global_item_ref(global_ref);
216 if (unlikely(ret != 0)) {
217 DRM_ERROR("Failed setting up TTM BO subsystem\n");
218 drm_global_item_unref(&drm->ttm.mem_global_ref);
219 drm->ttm.mem_global_ref.release = NULL;
220 return ret;
221 }
222
223 return 0;
224}
225
226void
227nouveau_ttm_global_release(struct nouveau_drm *drm)
228{
229 if (drm->ttm.mem_global_ref.release == NULL)
230 return;
231
232 drm_global_item_unref(&drm->ttm.bo_global_ref.ref);
233 drm_global_item_unref(&drm->ttm.mem_global_ref);
234 drm->ttm.mem_global_ref.release = NULL;
235}
236
237static int
238nouveau_ttm_init_host(struct nouveau_drm *drm, u8 kind) 178nouveau_ttm_init_host(struct nouveau_drm *drm, u8 kind)
239{ 179{
240 struct nvif_mmu *mmu = &drm->client.mmu; 180 struct nvif_mmu *mmu = &drm->client.mmu;
@@ -296,12 +236,7 @@ nouveau_ttm_init(struct nouveau_drm *drm)
296 drm->agp.cma = pci->agp.cma; 236 drm->agp.cma = pci->agp.cma;
297 } 237 }
298 238
299 ret = nouveau_ttm_global_init(drm);
300 if (ret)
301 return ret;
302
303 ret = ttm_bo_device_init(&drm->ttm.bdev, 239 ret = ttm_bo_device_init(&drm->ttm.bdev,
304 drm->ttm.bo_global_ref.ref.object,
305 &nouveau_bo_driver, 240 &nouveau_bo_driver,
306 dev->anon_inode->i_mapping, 241 dev->anon_inode->i_mapping,
307 DRM_FILE_PAGE_OFFSET, 242 DRM_FILE_PAGE_OFFSET,
@@ -356,8 +291,6 @@ nouveau_ttm_fini(struct nouveau_drm *drm)
356 291
357 ttm_bo_device_release(&drm->ttm.bdev); 292 ttm_bo_device_release(&drm->ttm.bdev);
358 293
359 nouveau_ttm_global_release(drm);
360
361 arch_phys_wc_del(drm->ttm.mtrr); 294 arch_phys_wc_del(drm->ttm.mtrr);
362 drm->ttm.mtrr = 0; 295 drm->ttm.mtrr = 0;
363 arch_io_free_memtype_wc(device->func->resource_addr(device, 1), 296 arch_io_free_memtype_wc(device->func->resource_addr(device, 1),
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 394c129cfb3b..0a485c5b982e 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -5409,11 +5409,14 @@ static int dsi_probe(struct platform_device *pdev)
5409 5409
5410 /* DSI on OMAP3 doesn't have register DSI_GNQ, set number 5410 /* DSI on OMAP3 doesn't have register DSI_GNQ, set number
5411 * of data to 3 by default */ 5411 * of data to 3 by default */
5412 if (dsi->data->quirks & DSI_QUIRK_GNQ) 5412 if (dsi->data->quirks & DSI_QUIRK_GNQ) {
5413 dsi_runtime_get(dsi);
5413 /* NB_DATA_LANES */ 5414 /* NB_DATA_LANES */
5414 dsi->num_lanes_supported = 1 + REG_GET(dsi, DSI_GNQ, 11, 9); 5415 dsi->num_lanes_supported = 1 + REG_GET(dsi, DSI_GNQ, 11, 9);
5415 else 5416 dsi_runtime_put(dsi);
5417 } else {
5416 dsi->num_lanes_supported = 3; 5418 dsi->num_lanes_supported = 3;
5419 }
5417 5420
5418 r = dsi_init_output(dsi); 5421 r = dsi_init_output(dsi);
5419 if (r) 5422 if (r)
@@ -5426,15 +5429,19 @@ static int dsi_probe(struct platform_device *pdev)
5426 } 5429 }
5427 5430
5428 r = of_platform_populate(dev->of_node, NULL, NULL, dev); 5431 r = of_platform_populate(dev->of_node, NULL, NULL, dev);
5429 if (r) 5432 if (r) {
5430 DSSERR("Failed to populate DSI child devices: %d\n", r); 5433 DSSERR("Failed to populate DSI child devices: %d\n", r);
5434 goto err_uninit_output;
5435 }
5431 5436
5432 r = component_add(&pdev->dev, &dsi_component_ops); 5437 r = component_add(&pdev->dev, &dsi_component_ops);
5433 if (r) 5438 if (r)
5434 goto err_uninit_output; 5439 goto err_of_depopulate;
5435 5440
5436 return 0; 5441 return 0;
5437 5442
5443err_of_depopulate:
5444 of_platform_depopulate(dev);
5438err_uninit_output: 5445err_uninit_output:
5439 dsi_uninit_output(dsi); 5446 dsi_uninit_output(dsi);
5440err_pm_disable: 5447err_pm_disable:
@@ -5470,19 +5477,12 @@ static int dsi_runtime_suspend(struct device *dev)
5470 /* wait for current handler to finish before turning the DSI off */ 5477 /* wait for current handler to finish before turning the DSI off */
5471 synchronize_irq(dsi->irq); 5478 synchronize_irq(dsi->irq);
5472 5479
5473 dispc_runtime_put(dsi->dss->dispc);
5474
5475 return 0; 5480 return 0;
5476} 5481}
5477 5482
5478static int dsi_runtime_resume(struct device *dev) 5483static int dsi_runtime_resume(struct device *dev)
5479{ 5484{
5480 struct dsi_data *dsi = dev_get_drvdata(dev); 5485 struct dsi_data *dsi = dev_get_drvdata(dev);
5481 int r;
5482
5483 r = dispc_runtime_get(dsi->dss->dispc);
5484 if (r)
5485 return r;
5486 5486
5487 dsi->is_enabled = true; 5487 dsi->is_enabled = true;
5488 /* ensure the irq handler sees the is_enabled value */ 5488 /* ensure the irq handler sees the is_enabled value */
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c
index 1aaf260aa9b8..7553c7fc1c45 100644
--- a/drivers/gpu/drm/omapdrm/dss/dss.c
+++ b/drivers/gpu/drm/omapdrm/dss/dss.c
@@ -1484,16 +1484,23 @@ static int dss_probe(struct platform_device *pdev)
1484 dss); 1484 dss);
1485 1485
1486 /* Add all the child devices as components. */ 1486 /* Add all the child devices as components. */
1487 r = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
1488 if (r)
1489 goto err_uninit_debugfs;
1490
1487 omapdss_gather_components(&pdev->dev); 1491 omapdss_gather_components(&pdev->dev);
1488 1492
1489 device_for_each_child(&pdev->dev, &match, dss_add_child_component); 1493 device_for_each_child(&pdev->dev, &match, dss_add_child_component);
1490 1494
1491 r = component_master_add_with_match(&pdev->dev, &dss_component_ops, match); 1495 r = component_master_add_with_match(&pdev->dev, &dss_component_ops, match);
1492 if (r) 1496 if (r)
1493 goto err_uninit_debugfs; 1497 goto err_of_depopulate;
1494 1498
1495 return 0; 1499 return 0;
1496 1500
1501err_of_depopulate:
1502 of_platform_depopulate(&pdev->dev);
1503
1497err_uninit_debugfs: 1504err_uninit_debugfs:
1498 dss_debugfs_remove_file(dss->debugfs.clk); 1505 dss_debugfs_remove_file(dss->debugfs.clk);
1499 dss_debugfs_remove_file(dss->debugfs.dss); 1506 dss_debugfs_remove_file(dss->debugfs.dss);
@@ -1522,6 +1529,8 @@ static int dss_remove(struct platform_device *pdev)
1522{ 1529{
1523 struct dss_device *dss = platform_get_drvdata(pdev); 1530 struct dss_device *dss = platform_get_drvdata(pdev);
1524 1531
1532 of_platform_depopulate(&pdev->dev);
1533
1525 component_master_del(&pdev->dev, &dss_component_ops); 1534 component_master_del(&pdev->dev, &dss_component_ops);
1526 1535
1527 dss_debugfs_remove_file(dss->debugfs.clk); 1536 dss_debugfs_remove_file(dss->debugfs.clk);
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
index cf6230eac31a..aabdda394c9c 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c
@@ -635,10 +635,14 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
635 635
636 hdmi->dss = dss; 636 hdmi->dss = dss;
637 637
638 r = hdmi_pll_init(dss, hdmi->pdev, &hdmi->pll, &hdmi->wp); 638 r = hdmi_runtime_get(hdmi);
639 if (r) 639 if (r)
640 return r; 640 return r;
641 641
642 r = hdmi_pll_init(dss, hdmi->pdev, &hdmi->pll, &hdmi->wp);
643 if (r)
644 goto err_runtime_put;
645
642 r = hdmi4_cec_init(hdmi->pdev, &hdmi->core, &hdmi->wp); 646 r = hdmi4_cec_init(hdmi->pdev, &hdmi->core, &hdmi->wp);
643 if (r) 647 if (r)
644 goto err_pll_uninit; 648 goto err_pll_uninit;
@@ -652,12 +656,16 @@ static int hdmi4_bind(struct device *dev, struct device *master, void *data)
652 hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs, 656 hdmi->debugfs = dss_debugfs_create_file(dss, "hdmi", hdmi_dump_regs,
653 hdmi); 657 hdmi);
654 658
659 hdmi_runtime_put(hdmi);
660
655 return 0; 661 return 0;
656 662
657err_cec_uninit: 663err_cec_uninit:
658 hdmi4_cec_uninit(&hdmi->core); 664 hdmi4_cec_uninit(&hdmi->core);
659err_pll_uninit: 665err_pll_uninit:
660 hdmi_pll_uninit(&hdmi->pll); 666 hdmi_pll_uninit(&hdmi->pll);
667err_runtime_put:
668 hdmi_runtime_put(hdmi);
661 return r; 669 return r;
662} 670}
663 671
@@ -833,32 +841,6 @@ static int hdmi4_remove(struct platform_device *pdev)
833 return 0; 841 return 0;
834} 842}
835 843
836static int hdmi_runtime_suspend(struct device *dev)
837{
838 struct omap_hdmi *hdmi = dev_get_drvdata(dev);
839
840 dispc_runtime_put(hdmi->dss->dispc);
841
842 return 0;
843}
844
845static int hdmi_runtime_resume(struct device *dev)
846{
847 struct omap_hdmi *hdmi = dev_get_drvdata(dev);
848 int r;
849
850 r = dispc_runtime_get(hdmi->dss->dispc);
851 if (r < 0)
852 return r;
853
854 return 0;
855}
856
857static const struct dev_pm_ops hdmi_pm_ops = {
858 .runtime_suspend = hdmi_runtime_suspend,
859 .runtime_resume = hdmi_runtime_resume,
860};
861
862static const struct of_device_id hdmi_of_match[] = { 844static const struct of_device_id hdmi_of_match[] = {
863 { .compatible = "ti,omap4-hdmi", }, 845 { .compatible = "ti,omap4-hdmi", },
864 {}, 846 {},
@@ -869,7 +851,6 @@ struct platform_driver omapdss_hdmi4hw_driver = {
869 .remove = hdmi4_remove, 851 .remove = hdmi4_remove,
870 .driver = { 852 .driver = {
871 .name = "omapdss_hdmi", 853 .name = "omapdss_hdmi",
872 .pm = &hdmi_pm_ops,
873 .of_match_table = hdmi_of_match, 854 .of_match_table = hdmi_of_match,
874 .suppress_bind_attrs = true, 855 .suppress_bind_attrs = true,
875 }, 856 },
diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
index b0e4a7463f8c..9e8556f67a29 100644
--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c
+++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c
@@ -825,32 +825,6 @@ static int hdmi5_remove(struct platform_device *pdev)
825 return 0; 825 return 0;
826} 826}
827 827
828static int hdmi_runtime_suspend(struct device *dev)
829{
830 struct omap_hdmi *hdmi = dev_get_drvdata(dev);
831
832 dispc_runtime_put(hdmi->dss->dispc);
833
834 return 0;
835}
836
837static int hdmi_runtime_resume(struct device *dev)
838{
839 struct omap_hdmi *hdmi = dev_get_drvdata(dev);
840 int r;
841
842 r = dispc_runtime_get(hdmi->dss->dispc);
843 if (r < 0)
844 return r;
845
846 return 0;
847}
848
849static const struct dev_pm_ops hdmi_pm_ops = {
850 .runtime_suspend = hdmi_runtime_suspend,
851 .runtime_resume = hdmi_runtime_resume,
852};
853
854static const struct of_device_id hdmi_of_match[] = { 828static const struct of_device_id hdmi_of_match[] = {
855 { .compatible = "ti,omap5-hdmi", }, 829 { .compatible = "ti,omap5-hdmi", },
856 { .compatible = "ti,dra7-hdmi", }, 830 { .compatible = "ti,dra7-hdmi", },
@@ -862,7 +836,6 @@ struct platform_driver omapdss_hdmi5hw_driver = {
862 .remove = hdmi5_remove, 836 .remove = hdmi5_remove,
863 .driver = { 837 .driver = {
864 .name = "omapdss_hdmi5", 838 .name = "omapdss_hdmi5",
865 .pm = &hdmi_pm_ops,
866 .of_match_table = hdmi_of_match, 839 .of_match_table = hdmi_of_match,
867 .suppress_bind_attrs = true, 840 .suppress_bind_attrs = true,
868 }, 841 },
diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c
index ff0b18c8e4ac..b5f52727f8b1 100644
--- a/drivers/gpu/drm/omapdrm/dss/venc.c
+++ b/drivers/gpu/drm/omapdrm/dss/venc.c
@@ -946,19 +946,12 @@ static int venc_runtime_suspend(struct device *dev)
946 if (venc->tv_dac_clk) 946 if (venc->tv_dac_clk)
947 clk_disable_unprepare(venc->tv_dac_clk); 947 clk_disable_unprepare(venc->tv_dac_clk);
948 948
949 dispc_runtime_put(venc->dss->dispc);
950
951 return 0; 949 return 0;
952} 950}
953 951
954static int venc_runtime_resume(struct device *dev) 952static int venc_runtime_resume(struct device *dev)
955{ 953{
956 struct venc_device *venc = dev_get_drvdata(dev); 954 struct venc_device *venc = dev_get_drvdata(dev);
957 int r;
958
959 r = dispc_runtime_get(venc->dss->dispc);
960 if (r < 0)
961 return r;
962 955
963 if (venc->tv_dac_clk) 956 if (venc->tv_dac_clk)
964 clk_prepare_enable(venc->tv_dac_clk); 957 clk_prepare_enable(venc->tv_dac_clk);
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index 62928ec0e7db..caffc547ef97 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -350,11 +350,14 @@ static void omap_crtc_arm_event(struct drm_crtc *crtc)
350static void omap_crtc_atomic_enable(struct drm_crtc *crtc, 350static void omap_crtc_atomic_enable(struct drm_crtc *crtc,
351 struct drm_crtc_state *old_state) 351 struct drm_crtc_state *old_state)
352{ 352{
353 struct omap_drm_private *priv = crtc->dev->dev_private;
353 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 354 struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
354 int ret; 355 int ret;
355 356
356 DBG("%s", omap_crtc->name); 357 DBG("%s", omap_crtc->name);
357 358
359 priv->dispc_ops->runtime_get(priv->dispc);
360
358 spin_lock_irq(&crtc->dev->event_lock); 361 spin_lock_irq(&crtc->dev->event_lock);
359 drm_crtc_vblank_on(crtc); 362 drm_crtc_vblank_on(crtc);
360 ret = drm_crtc_vblank_get(crtc); 363 ret = drm_crtc_vblank_get(crtc);
@@ -367,6 +370,7 @@ static void omap_crtc_atomic_enable(struct drm_crtc *crtc,
367static void omap_crtc_atomic_disable(struct drm_crtc *crtc, 370static void omap_crtc_atomic_disable(struct drm_crtc *crtc,
368 struct drm_crtc_state *old_state) 371 struct drm_crtc_state *old_state)
369{ 372{
373 struct omap_drm_private *priv = crtc->dev->dev_private;
370 struct omap_crtc *omap_crtc = to_omap_crtc(crtc); 374 struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
371 375
372 DBG("%s", omap_crtc->name); 376 DBG("%s", omap_crtc->name);
@@ -379,6 +383,8 @@ static void omap_crtc_atomic_disable(struct drm_crtc *crtc,
379 spin_unlock_irq(&crtc->dev->event_lock); 383 spin_unlock_irq(&crtc->dev->event_lock);
380 384
381 drm_crtc_vblank_off(crtc); 385 drm_crtc_vblank_off(crtc);
386
387 priv->dispc_ops->runtime_put(priv->dispc);
382} 388}
383 389
384static enum drm_mode_status omap_crtc_mode_valid(struct drm_crtc *crtc, 390static enum drm_mode_status omap_crtc_mode_valid(struct drm_crtc *crtc,
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index 14d3fa855708..13a0254b59a1 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -126,9 +126,6 @@ struct qxl_output {
126#define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, enc) 126#define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, enc)
127 127
128struct qxl_mman { 128struct qxl_mman {
129 struct ttm_bo_global_ref bo_global_ref;
130 struct drm_global_reference mem_global_ref;
131 unsigned int mem_global_referenced:1;
132 struct ttm_bo_device bdev; 129 struct ttm_bo_device bdev;
133}; 130};
134 131
diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
index 559a10113837..886f61e94f24 100644
--- a/drivers/gpu/drm/qxl/qxl_ttm.c
+++ b/drivers/gpu/drm/qxl/qxl_ttm.c
@@ -46,62 +46,6 @@ static struct qxl_device *qxl_get_qdev(struct ttm_bo_device *bdev)
46 return qdev; 46 return qdev;
47} 47}
48 48
49static int qxl_ttm_mem_global_init(struct drm_global_reference *ref)
50{
51 return ttm_mem_global_init(ref->object);
52}
53
54static void qxl_ttm_mem_global_release(struct drm_global_reference *ref)
55{
56 ttm_mem_global_release(ref->object);
57}
58
59static int qxl_ttm_global_init(struct qxl_device *qdev)
60{
61 struct drm_global_reference *global_ref;
62 int r;
63
64 qdev->mman.mem_global_referenced = false;
65 global_ref = &qdev->mman.mem_global_ref;
66 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
67 global_ref->size = sizeof(struct ttm_mem_global);
68 global_ref->init = &qxl_ttm_mem_global_init;
69 global_ref->release = &qxl_ttm_mem_global_release;
70
71 r = drm_global_item_ref(global_ref);
72 if (r != 0) {
73 DRM_ERROR("Failed setting up TTM memory accounting "
74 "subsystem.\n");
75 return r;
76 }
77
78 qdev->mman.bo_global_ref.mem_glob =
79 qdev->mman.mem_global_ref.object;
80 global_ref = &qdev->mman.bo_global_ref.ref;
81 global_ref->global_type = DRM_GLOBAL_TTM_BO;
82 global_ref->size = sizeof(struct ttm_bo_global);
83 global_ref->init = &ttm_bo_global_init;
84 global_ref->release = &ttm_bo_global_release;
85 r = drm_global_item_ref(global_ref);
86 if (r != 0) {
87 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
88 drm_global_item_unref(&qdev->mman.mem_global_ref);
89 return r;
90 }
91
92 qdev->mman.mem_global_referenced = true;
93 return 0;
94}
95
96static void qxl_ttm_global_fini(struct qxl_device *qdev)
97{
98 if (qdev->mman.mem_global_referenced) {
99 drm_global_item_unref(&qdev->mman.bo_global_ref.ref);
100 drm_global_item_unref(&qdev->mman.mem_global_ref);
101 qdev->mman.mem_global_referenced = false;
102 }
103}
104
105static struct vm_operations_struct qxl_ttm_vm_ops; 49static struct vm_operations_struct qxl_ttm_vm_ops;
106static const struct vm_operations_struct *ttm_vm_ops; 50static const struct vm_operations_struct *ttm_vm_ops;
107 51
@@ -372,12 +316,8 @@ int qxl_ttm_init(struct qxl_device *qdev)
372 int r; 316 int r;
373 int num_io_pages; /* != rom->num_io_pages, we include surface0 */ 317 int num_io_pages; /* != rom->num_io_pages, we include surface0 */
374 318
375 r = qxl_ttm_global_init(qdev);
376 if (r)
377 return r;
378 /* No others user of address space so set it to 0 */ 319 /* No others user of address space so set it to 0 */
379 r = ttm_bo_device_init(&qdev->mman.bdev, 320 r = ttm_bo_device_init(&qdev->mman.bdev,
380 qdev->mman.bo_global_ref.ref.object,
381 &qxl_bo_driver, 321 &qxl_bo_driver,
382 qdev->ddev.anon_inode->i_mapping, 322 qdev->ddev.anon_inode->i_mapping,
383 DRM_FILE_PAGE_OFFSET, 0); 323 DRM_FILE_PAGE_OFFSET, 0);
@@ -413,7 +353,6 @@ void qxl_ttm_fini(struct qxl_device *qdev)
413 ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_VRAM); 353 ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_VRAM);
414 ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_PRIV); 354 ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_PRIV);
415 ttm_bo_device_release(&qdev->mman.bdev); 355 ttm_bo_device_release(&qdev->mman.bdev);
416 qxl_ttm_global_fini(qdev);
417 DRM_INFO("qxl: ttm finalized\n"); 356 DRM_INFO("qxl: ttm finalized\n");
418} 357}
419 358
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
index 21161aa8acbf..652126fd6dd4 100644
--- a/drivers/gpu/drm/radeon/r300.c
+++ b/drivers/gpu/drm/radeon/r300.c
@@ -814,7 +814,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
814 ((idx_value >> 21) & 0xF)); 814 ((idx_value >> 21) & 0xF));
815 return -EINVAL; 815 return -EINVAL;
816 } 816 }
817 /* Pass through. */ 817 /* Fall through. */
818 case 6: 818 case 6:
819 track->cb[i].cpp = 4; 819 track->cb[i].cpp = 4;
820 break; 820 break;
@@ -965,7 +965,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
965 return -EINVAL; 965 return -EINVAL;
966 } 966 }
967 /* The same rules apply as for DXT3/5. */ 967 /* The same rules apply as for DXT3/5. */
968 /* Pass through. */ 968 /* Fall through. */
969 case R300_TX_FORMAT_DXT3: 969 case R300_TX_FORMAT_DXT3:
970 case R300_TX_FORMAT_DXT5: 970 case R300_TX_FORMAT_DXT5:
971 track->textures[i].cpp = 1; 971 track->textures[i].cpp = 1;
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
index 45e1d4e60759..2318d9e3ed96 100644
--- a/drivers/gpu/drm/radeon/r420.c
+++ b/drivers/gpu/drm/radeon/r420.c
@@ -109,6 +109,7 @@ void r420_pipes_init(struct radeon_device *rdev)
109 default: 109 default:
110 /* force to 1 pipe */ 110 /* force to 1 pipe */
111 num_pipes = 1; 111 num_pipes = 1;
112 /* fall through */
112 case 1: 113 case 1:
113 tmp = (0 << 1); 114 tmp = (0 << 1);
114 break; 115 break;
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 1a6f6edb3515..32808e50be12 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -448,10 +448,7 @@ struct radeon_surface_reg {
448 * TTM. 448 * TTM.
449 */ 449 */
450struct radeon_mman { 450struct radeon_mman {
451 struct ttm_bo_global_ref bo_global_ref;
452 struct drm_global_reference mem_global_ref;
453 struct ttm_bo_device bdev; 451 struct ttm_bo_device bdev;
454 bool mem_global_referenced;
455 bool initialized; 452 bool initialized;
456 453
457#if defined(CONFIG_DEBUG_FS) 454#if defined(CONFIG_DEBUG_FS)
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_tv.c b/drivers/gpu/drm/radeon/radeon_legacy_tv.c
index 4278272e3191..3dae2c4dec71 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_tv.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_tv.c
@@ -421,24 +421,14 @@ static void radeon_legacy_write_tv_restarts(struct radeon_encoder *radeon_encode
421 421
422static bool radeon_legacy_tv_init_restarts(struct drm_encoder *encoder) 422static bool radeon_legacy_tv_init_restarts(struct drm_encoder *encoder)
423{ 423{
424 struct drm_device *dev = encoder->dev;
425 struct radeon_device *rdev = dev->dev_private;
426 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 424 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
427 struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv; 425 struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
428 struct radeon_crtc *radeon_crtc;
429 int restart; 426 int restart;
430 unsigned int h_total, v_total, f_total; 427 unsigned int h_total, v_total, f_total;
431 int v_offset, h_offset; 428 int v_offset, h_offset;
432 u16 p1, p2, h_inc; 429 u16 p1, p2, h_inc;
433 bool h_changed; 430 bool h_changed;
434 const struct radeon_tv_mode_constants *const_ptr; 431 const struct radeon_tv_mode_constants *const_ptr;
435 struct radeon_pll *pll;
436
437 radeon_crtc = to_radeon_crtc(radeon_encoder->base.crtc);
438 if (radeon_crtc->crtc_id == 1)
439 pll = &rdev->clock.p2pll;
440 else
441 pll = &rdev->clock.p1pll;
442 432
443 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL); 433 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
444 if (!const_ptr) 434 if (!const_ptr)
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 92f6d4002eea..833e909706a9 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -314,11 +314,9 @@ struct radeon_bo *radeon_bo_ref(struct radeon_bo *bo)
314void radeon_bo_unref(struct radeon_bo **bo) 314void radeon_bo_unref(struct radeon_bo **bo)
315{ 315{
316 struct ttm_buffer_object *tbo; 316 struct ttm_buffer_object *tbo;
317 struct radeon_device *rdev;
318 317
319 if ((*bo) == NULL) 318 if ((*bo) == NULL)
320 return; 319 return;
321 rdev = (*bo)->rdev;
322 tbo = &((*bo)->tbo); 320 tbo = &((*bo)->tbo);
323 ttm_bo_put(tbo); 321 ttm_bo_put(tbo);
324 *bo = NULL; 322 *bo = NULL;
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index cbb67e9ffb3a..9920a6fc11bf 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -60,65 +60,6 @@ static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
60 return rdev; 60 return rdev;
61} 61}
62 62
63
64/*
65 * Global memory.
66 */
67static int radeon_ttm_mem_global_init(struct drm_global_reference *ref)
68{
69 return ttm_mem_global_init(ref->object);
70}
71
72static void radeon_ttm_mem_global_release(struct drm_global_reference *ref)
73{
74 ttm_mem_global_release(ref->object);
75}
76
77static int radeon_ttm_global_init(struct radeon_device *rdev)
78{
79 struct drm_global_reference *global_ref;
80 int r;
81
82 rdev->mman.mem_global_referenced = false;
83 global_ref = &rdev->mman.mem_global_ref;
84 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
85 global_ref->size = sizeof(struct ttm_mem_global);
86 global_ref->init = &radeon_ttm_mem_global_init;
87 global_ref->release = &radeon_ttm_mem_global_release;
88 r = drm_global_item_ref(global_ref);
89 if (r != 0) {
90 DRM_ERROR("Failed setting up TTM memory accounting "
91 "subsystem.\n");
92 return r;
93 }
94
95 rdev->mman.bo_global_ref.mem_glob =
96 rdev->mman.mem_global_ref.object;
97 global_ref = &rdev->mman.bo_global_ref.ref;
98 global_ref->global_type = DRM_GLOBAL_TTM_BO;
99 global_ref->size = sizeof(struct ttm_bo_global);
100 global_ref->init = &ttm_bo_global_init;
101 global_ref->release = &ttm_bo_global_release;
102 r = drm_global_item_ref(global_ref);
103 if (r != 0) {
104 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
105 drm_global_item_unref(&rdev->mman.mem_global_ref);
106 return r;
107 }
108
109 rdev->mman.mem_global_referenced = true;
110 return 0;
111}
112
113static void radeon_ttm_global_fini(struct radeon_device *rdev)
114{
115 if (rdev->mman.mem_global_referenced) {
116 drm_global_item_unref(&rdev->mman.bo_global_ref.ref);
117 drm_global_item_unref(&rdev->mman.mem_global_ref);
118 rdev->mman.mem_global_referenced = false;
119 }
120}
121
122static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags) 63static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
123{ 64{
124 return 0; 65 return 0;
@@ -847,13 +788,8 @@ int radeon_ttm_init(struct radeon_device *rdev)
847{ 788{
848 int r; 789 int r;
849 790
850 r = radeon_ttm_global_init(rdev);
851 if (r) {
852 return r;
853 }
854 /* No others user of address space so set it to 0 */ 791 /* No others user of address space so set it to 0 */
855 r = ttm_bo_device_init(&rdev->mman.bdev, 792 r = ttm_bo_device_init(&rdev->mman.bdev,
856 rdev->mman.bo_global_ref.ref.object,
857 &radeon_bo_driver, 793 &radeon_bo_driver,
858 rdev->ddev->anon_inode->i_mapping, 794 rdev->ddev->anon_inode->i_mapping,
859 DRM_FILE_PAGE_OFFSET, 795 DRM_FILE_PAGE_OFFSET,
@@ -925,7 +861,6 @@ void radeon_ttm_fini(struct radeon_device *rdev)
925 ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_TT); 861 ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_TT);
926 ttm_bo_device_release(&rdev->mman.bdev); 862 ttm_bo_device_release(&rdev->mman.bdev);
927 radeon_gart_fini(rdev); 863 radeon_gart_fini(rdev);
928 radeon_ttm_global_fini(rdev);
929 rdev->mman.initialized = false; 864 rdev->mman.initialized = false;
930 DRM_INFO("radeon: ttm finalized\n"); 865 DRM_INFO("radeon: ttm finalized\n");
931} 866}
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
index 17741843cf51..90dacab67be5 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c
@@ -226,9 +226,6 @@ static void rcar_du_crtc_set_display_timing(struct rcar_du_crtc *rcrtc)
226 * system clock, and have no internal clock divider. 226 * system clock, and have no internal clock divider.
227 */ 227 */
228 228
229 if (WARN_ON(!rcrtc->extclock))
230 return;
231
232 /* 229 /*
233 * The H3 ES1.x exhibits dot clock duty cycle stability issues. 230 * The H3 ES1.x exhibits dot clock duty cycle stability issues.
234 * We can work around them by configuring the DPLL to twice the 231 * We can work around them by configuring the DPLL to twice the
@@ -701,7 +698,7 @@ static void rcar_du_crtc_atomic_begin(struct drm_crtc *crtc,
701 * CRTC will be put later in .atomic_disable(). 698 * CRTC will be put later in .atomic_disable().
702 * 699 *
703 * If a mode set is not in progress the CRTC is enabled, and the 700 * If a mode set is not in progress the CRTC is enabled, and the
704 * following get call will be a no-op. There is thus no need to belance 701 * following get call will be a no-op. There is thus no need to balance
705 * it in .atomic_flush() either. 702 * it in .atomic_flush() either.
706 */ 703 */
707 rcar_du_crtc_get(rcrtc); 704 rcar_du_crtc_get(rcrtc);
@@ -738,10 +735,22 @@ enum drm_mode_status rcar_du_crtc_mode_valid(struct drm_crtc *crtc,
738 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); 735 struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
739 struct rcar_du_device *rcdu = rcrtc->group->dev; 736 struct rcar_du_device *rcdu = rcrtc->group->dev;
740 bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE; 737 bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
738 unsigned int vbp;
741 739
742 if (interlaced && !rcar_du_has(rcdu, RCAR_DU_FEATURE_INTERLACED)) 740 if (interlaced && !rcar_du_has(rcdu, RCAR_DU_FEATURE_INTERLACED))
743 return MODE_NO_INTERLACE; 741 return MODE_NO_INTERLACE;
744 742
743 /*
744 * The hardware requires a minimum combined horizontal sync and back
745 * porch of 20 pixels and a minimum vertical back porch of 3 lines.
746 */
747 if (mode->htotal - mode->hsync_start < 20)
748 return MODE_HBLANK_NARROW;
749
750 vbp = (mode->vtotal - mode->vsync_end) / (interlaced ? 2 : 1);
751 if (vbp < 3)
752 return MODE_VBLANK_NARROW;
753
745 return MODE_OK; 754 return MODE_OK;
746} 755}
747 756
@@ -1002,7 +1011,7 @@ unlock:
1002 drm_modeset_drop_locks(&ctx); 1011 drm_modeset_drop_locks(&ctx);
1003 drm_modeset_acquire_fini(&ctx); 1012 drm_modeset_acquire_fini(&ctx);
1004 1013
1005 return 0; 1014 return ret;
1006} 1015}
1007 1016
1008static const struct drm_crtc_funcs crtc_funcs_gen2 = { 1017static const struct drm_crtc_funcs crtc_funcs_gen2 = {
@@ -1113,9 +1122,16 @@ int rcar_du_crtc_create(struct rcar_du_group *rgrp, unsigned int swindex,
1113 clk = devm_clk_get(rcdu->dev, clk_name); 1122 clk = devm_clk_get(rcdu->dev, clk_name);
1114 if (!IS_ERR(clk)) { 1123 if (!IS_ERR(clk)) {
1115 rcrtc->extclock = clk; 1124 rcrtc->extclock = clk;
1116 } else if (PTR_ERR(rcrtc->clock) == -EPROBE_DEFER) { 1125 } else if (PTR_ERR(clk) == -EPROBE_DEFER) {
1117 dev_info(rcdu->dev, "can't get external clock %u\n", hwindex);
1118 return -EPROBE_DEFER; 1126 return -EPROBE_DEFER;
1127 } else if (rcdu->info->dpll_mask & BIT(hwindex)) {
1128 /*
1129 * DU channels that have a display PLL can't use the internal
1130 * system clock and thus require an external clock.
1131 */
1132 ret = PTR_ERR(clk);
1133 dev_err(rcdu->dev, "can't get dclkin.%u: %d\n", hwindex, ret);
1134 return ret;
1119 } 1135 }
1120 1136
1121 init_waitqueue_head(&rcrtc->flip_wait); 1137 init_waitqueue_head(&rcrtc->flip_wait);
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/rcar-du/rcar_du_drv.c
index c6770043dcdc..94f055186b95 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_drv.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.c
@@ -41,7 +41,7 @@ static const struct rcar_du_device_info rzg1_du_r8a7743_info = {
41 .channels_mask = BIT(1) | BIT(0), 41 .channels_mask = BIT(1) | BIT(0),
42 .routes = { 42 .routes = {
43 /* 43 /*
44 * R8A7743 has one RGB output and one LVDS output 44 * R8A774[34] has one RGB output and one LVDS output
45 */ 45 */
46 [RCAR_DU_OUTPUT_DPAD0] = { 46 [RCAR_DU_OUTPUT_DPAD0] = {
47 .possible_crtcs = BIT(1) | BIT(0), 47 .possible_crtcs = BIT(1) | BIT(0),
@@ -77,6 +77,33 @@ static const struct rcar_du_device_info rzg1_du_r8a7745_info = {
77 }, 77 },
78}; 78};
79 79
80static const struct rcar_du_device_info rzg1_du_r8a77470_info = {
81 .gen = 2,
82 .features = RCAR_DU_FEATURE_CRTC_IRQ_CLOCK
83 | RCAR_DU_FEATURE_EXT_CTRL_REGS
84 | RCAR_DU_FEATURE_INTERLACED
85 | RCAR_DU_FEATURE_TVM_SYNC,
86 .channels_mask = BIT(1) | BIT(0),
87 .routes = {
88 /*
89 * R8A77470 has two RGB outputs, one LVDS output, and
90 * one (currently unsupported) analog video output
91 */
92 [RCAR_DU_OUTPUT_DPAD0] = {
93 .possible_crtcs = BIT(0),
94 .port = 0,
95 },
96 [RCAR_DU_OUTPUT_DPAD1] = {
97 .possible_crtcs = BIT(1),
98 .port = 1,
99 },
100 [RCAR_DU_OUTPUT_LVDS0] = {
101 .possible_crtcs = BIT(0) | BIT(1),
102 .port = 2,
103 },
104 },
105};
106
80static const struct rcar_du_device_info rcar_du_r8a7779_info = { 107static const struct rcar_du_device_info rcar_du_r8a7779_info = {
81 .gen = 2, 108 .gen = 2,
82 .features = RCAR_DU_FEATURE_INTERLACED 109 .features = RCAR_DU_FEATURE_INTERLACED
@@ -341,7 +368,9 @@ static const struct rcar_du_device_info rcar_du_r8a7799x_info = {
341 368
342static const struct of_device_id rcar_du_of_table[] = { 369static const struct of_device_id rcar_du_of_table[] = {
343 { .compatible = "renesas,du-r8a7743", .data = &rzg1_du_r8a7743_info }, 370 { .compatible = "renesas,du-r8a7743", .data = &rzg1_du_r8a7743_info },
371 { .compatible = "renesas,du-r8a7744", .data = &rzg1_du_r8a7743_info },
344 { .compatible = "renesas,du-r8a7745", .data = &rzg1_du_r8a7745_info }, 372 { .compatible = "renesas,du-r8a7745", .data = &rzg1_du_r8a7745_info },
373 { .compatible = "renesas,du-r8a77470", .data = &rzg1_du_r8a77470_info },
345 { .compatible = "renesas,du-r8a7779", .data = &rcar_du_r8a7779_info }, 374 { .compatible = "renesas,du-r8a7779", .data = &rcar_du_r8a7779_info },
346 { .compatible = "renesas,du-r8a7790", .data = &rcar_du_r8a7790_info }, 375 { .compatible = "renesas,du-r8a7790", .data = &rcar_du_r8a7790_info },
347 { .compatible = "renesas,du-r8a7791", .data = &rcar_du_r8a7791_info }, 376 { .compatible = "renesas,du-r8a7791", .data = &rcar_du_r8a7791_info },
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
index 4ebd61ecbee1..fe6f65c94eef 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
@@ -582,7 +582,7 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu)
582 * Initialize vertical blanking interrupts handling. Start with vblank 582 * Initialize vertical blanking interrupts handling. Start with vblank
583 * disabled for all CRTCs. 583 * disabled for all CRTCs.
584 */ 584 */
585 ret = drm_vblank_init(dev, (1 << rcdu->num_crtcs) - 1); 585 ret = drm_vblank_init(dev, rcdu->num_crtcs);
586 if (ret < 0) 586 if (ret < 0)
587 return ret; 587 return ret;
588 588
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
index 9e07758a755c..39d5ae3fdf72 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c
@@ -783,13 +783,14 @@ int rcar_du_planes_init(struct rcar_du_group *rgrp)
783 drm_plane_helper_add(&plane->plane, 783 drm_plane_helper_add(&plane->plane,
784 &rcar_du_plane_helper_funcs); 784 &rcar_du_plane_helper_funcs);
785 785
786 drm_plane_create_alpha_property(&plane->plane);
787
786 if (type == DRM_PLANE_TYPE_PRIMARY) 788 if (type == DRM_PLANE_TYPE_PRIMARY)
787 continue; 789 continue;
788 790
789 drm_object_attach_property(&plane->plane.base, 791 drm_object_attach_property(&plane->plane.base,
790 rcdu->props.colorkey, 792 rcdu->props.colorkey,
791 RCAR_DU_COLORKEY_NONE); 793 RCAR_DU_COLORKEY_NONE);
792 drm_plane_create_alpha_property(&plane->plane);
793 drm_plane_create_zpos_property(&plane->plane, 1, 1, 7); 794 drm_plane_create_zpos_property(&plane->plane, 1, 1, 7);
794 } 795 }
795 796
diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c b/drivers/gpu/drm/rcar-du/rcar_lvds.c
index 173d7ad0b991..534a128a869d 100644
--- a/drivers/gpu/drm/rcar-du/rcar_lvds.c
+++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c
@@ -790,6 +790,7 @@ static const struct of_device_id rcar_lvds_of_table[] = {
790 { .compatible = "renesas,r8a7793-lvds", .data = &rcar_lvds_gen2_info }, 790 { .compatible = "renesas,r8a7793-lvds", .data = &rcar_lvds_gen2_info },
791 { .compatible = "renesas,r8a7795-lvds", .data = &rcar_lvds_gen3_info }, 791 { .compatible = "renesas,r8a7795-lvds", .data = &rcar_lvds_gen3_info },
792 { .compatible = "renesas,r8a7796-lvds", .data = &rcar_lvds_gen3_info }, 792 { .compatible = "renesas,r8a7796-lvds", .data = &rcar_lvds_gen3_info },
793 { .compatible = "renesas,r8a77965-lvds", .data = &rcar_lvds_gen3_info },
793 { .compatible = "renesas,r8a77970-lvds", .data = &rcar_lvds_r8a77970_info }, 794 { .compatible = "renesas,r8a77970-lvds", .data = &rcar_lvds_r8a77970_info },
794 { .compatible = "renesas,r8a77980-lvds", .data = &rcar_lvds_gen3_info }, 795 { .compatible = "renesas,r8a77980-lvds", .data = &rcar_lvds_gen3_info },
795 { .compatible = "renesas,r8a77990-lvds", .data = &rcar_lvds_r8a77990_info }, 796 { .compatible = "renesas,r8a77990-lvds", .data = &rcar_lvds_r8a77990_info },
diff --git a/drivers/gpu/drm/scheduler/sched_entity.c b/drivers/gpu/drm/scheduler/sched_entity.c
index 3e22a54a99c2..4463d3826ecb 100644
--- a/drivers/gpu/drm/scheduler/sched_entity.c
+++ b/drivers/gpu/drm/scheduler/sched_entity.c
@@ -130,7 +130,14 @@ drm_sched_entity_get_free_sched(struct drm_sched_entity *entity)
130 int i; 130 int i;
131 131
132 for (i = 0; i < entity->num_rq_list; ++i) { 132 for (i = 0; i < entity->num_rq_list; ++i) {
133 num_jobs = atomic_read(&entity->rq_list[i]->sched->num_jobs); 133 struct drm_gpu_scheduler *sched = entity->rq_list[i]->sched;
134
135 if (!entity->rq_list[i]->sched->ready) {
136 DRM_WARN("sched%s is not ready, skipping", sched->name);
137 continue;
138 }
139
140 num_jobs = atomic_read(&sched->num_jobs);
134 if (num_jobs < min_jobs) { 141 if (num_jobs < min_jobs) {
135 min_jobs = num_jobs; 142 min_jobs = num_jobs;
136 rq = entity->rq_list[i]; 143 rq = entity->rq_list[i];
@@ -204,7 +211,6 @@ static void drm_sched_entity_kill_jobs_cb(struct dma_fence *f,
204 211
205 drm_sched_fence_finished(job->s_fence); 212 drm_sched_fence_finished(job->s_fence);
206 WARN_ON(job->s_fence->parent); 213 WARN_ON(job->s_fence->parent);
207 dma_fence_put(&job->s_fence->finished);
208 job->sched->ops->free_job(job); 214 job->sched->ops->free_job(job);
209} 215}
210 216
diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
index 44fe587aaef9..18ebbb05762e 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -196,6 +196,19 @@ static void drm_sched_start_timeout(struct drm_gpu_scheduler *sched)
196 schedule_delayed_work(&sched->work_tdr, sched->timeout); 196 schedule_delayed_work(&sched->work_tdr, sched->timeout);
197} 197}
198 198
199/**
200 * drm_sched_fault - immediately start timeout handler
201 *
202 * @sched: scheduler where the timeout handling should be started.
203 *
204 * Start timeout handling immediately when the driver detects a hardware fault.
205 */
206void drm_sched_fault(struct drm_gpu_scheduler *sched)
207{
208 mod_delayed_work(system_wq, &sched->work_tdr, 0);
209}
210EXPORT_SYMBOL(drm_sched_fault);
211
199/* job_finish is called after hw fence signaled 212/* job_finish is called after hw fence signaled
200 */ 213 */
201static void drm_sched_job_finish(struct work_struct *work) 214static void drm_sched_job_finish(struct work_struct *work)
@@ -220,7 +233,6 @@ static void drm_sched_job_finish(struct work_struct *work)
220 drm_sched_start_timeout(sched); 233 drm_sched_start_timeout(sched);
221 spin_unlock(&sched->job_list_lock); 234 spin_unlock(&sched->job_list_lock);
222 235
223 dma_fence_put(&s_job->s_fence->finished);
224 sched->ops->free_job(s_job); 236 sched->ops->free_job(s_job);
225} 237}
226 238
@@ -283,6 +295,7 @@ static void drm_sched_job_timedout(struct work_struct *work)
283already_signaled: 295already_signaled:
284 ; 296 ;
285 } 297 }
298 drm_sched_start_timeout(sched);
286 spin_unlock(&sched->job_list_lock); 299 spin_unlock(&sched->job_list_lock);
287} 300}
288 301
@@ -406,6 +419,9 @@ int drm_sched_job_init(struct drm_sched_job *job,
406 struct drm_gpu_scheduler *sched; 419 struct drm_gpu_scheduler *sched;
407 420
408 drm_sched_entity_select_rq(entity); 421 drm_sched_entity_select_rq(entity);
422 if (!entity->rq)
423 return -ENOENT;
424
409 sched = entity->rq->sched; 425 sched = entity->rq->sched;
410 426
411 job->sched = sched; 427 job->sched = sched;
@@ -424,6 +440,18 @@ int drm_sched_job_init(struct drm_sched_job *job,
424EXPORT_SYMBOL(drm_sched_job_init); 440EXPORT_SYMBOL(drm_sched_job_init);
425 441
426/** 442/**
443 * drm_sched_job_cleanup - clean up scheduler job resources
444 *
445 * @job: scheduler job to clean up
446 */
447void drm_sched_job_cleanup(struct drm_sched_job *job)
448{
449 dma_fence_put(&job->s_fence->finished);
450 job->s_fence = NULL;
451}
452EXPORT_SYMBOL(drm_sched_job_cleanup);
453
454/**
427 * drm_sched_ready - is the scheduler ready 455 * drm_sched_ready - is the scheduler ready
428 * 456 *
429 * @sched: scheduler instance 457 * @sched: scheduler instance
@@ -619,6 +647,7 @@ int drm_sched_init(struct drm_gpu_scheduler *sched,
619 return PTR_ERR(sched->thread); 647 return PTR_ERR(sched->thread);
620 } 648 }
621 649
650 sched->ready = true;
622 return 0; 651 return 0;
623} 652}
624EXPORT_SYMBOL(drm_sched_init); 653EXPORT_SYMBOL(drm_sched_init);
@@ -634,5 +663,7 @@ void drm_sched_fini(struct drm_gpu_scheduler *sched)
634{ 663{
635 if (sched->thread) 664 if (sched->thread)
636 kthread_stop(sched->thread); 665 kthread_stop(sched->thread);
666
667 sched->ready = false;
637} 668}
638EXPORT_SYMBOL(drm_sched_fini); 669EXPORT_SYMBOL(drm_sched_fini);
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 83b4657ffb10..d87935bf8e30 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -45,6 +45,14 @@
45 45
46static void ttm_bo_global_kobj_release(struct kobject *kobj); 46static void ttm_bo_global_kobj_release(struct kobject *kobj);
47 47
48/**
49 * ttm_global_mutex - protecting the global BO state
50 */
51DEFINE_MUTEX(ttm_global_mutex);
52struct ttm_bo_global ttm_bo_glob = {
53 .use_count = 0
54};
55
48static struct attribute ttm_bo_count = { 56static struct attribute ttm_bo_count = {
49 .name = "bo_count", 57 .name = "bo_count",
50 .mode = S_IRUGO 58 .mode = S_IRUGO
@@ -1519,35 +1527,45 @@ static void ttm_bo_global_kobj_release(struct kobject *kobj)
1519 container_of(kobj, struct ttm_bo_global, kobj); 1527 container_of(kobj, struct ttm_bo_global, kobj);
1520 1528
1521 __free_page(glob->dummy_read_page); 1529 __free_page(glob->dummy_read_page);
1522 kfree(glob);
1523} 1530}
1524 1531
1525void ttm_bo_global_release(struct drm_global_reference *ref) 1532static void ttm_bo_global_release(void)
1526{ 1533{
1527 struct ttm_bo_global *glob = ref->object; 1534 struct ttm_bo_global *glob = &ttm_bo_glob;
1535
1536 mutex_lock(&ttm_global_mutex);
1537 if (--glob->use_count > 0)
1538 goto out;
1528 1539
1529 kobject_del(&glob->kobj); 1540 kobject_del(&glob->kobj);
1530 kobject_put(&glob->kobj); 1541 kobject_put(&glob->kobj);
1542 ttm_mem_global_release(&ttm_mem_glob);
1543out:
1544 mutex_unlock(&ttm_global_mutex);
1531} 1545}
1532EXPORT_SYMBOL(ttm_bo_global_release);
1533 1546
1534int ttm_bo_global_init(struct drm_global_reference *ref) 1547static int ttm_bo_global_init(void)
1535{ 1548{
1536 struct ttm_bo_global_ref *bo_ref = 1549 struct ttm_bo_global *glob = &ttm_bo_glob;
1537 container_of(ref, struct ttm_bo_global_ref, ref); 1550 int ret = 0;
1538 struct ttm_bo_global *glob = ref->object;
1539 int ret;
1540 unsigned i; 1551 unsigned i;
1541 1552
1542 mutex_init(&glob->device_list_mutex); 1553 mutex_lock(&ttm_global_mutex);
1554 if (++glob->use_count > 1)
1555 goto out;
1556
1557 ret = ttm_mem_global_init(&ttm_mem_glob);
1558 if (ret)
1559 goto out;
1560
1543 spin_lock_init(&glob->lru_lock); 1561 spin_lock_init(&glob->lru_lock);
1544 glob->mem_glob = bo_ref->mem_glob; 1562 glob->mem_glob = &ttm_mem_glob;
1545 glob->mem_glob->bo_glob = glob; 1563 glob->mem_glob->bo_glob = glob;
1546 glob->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32); 1564 glob->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32);
1547 1565
1548 if (unlikely(glob->dummy_read_page == NULL)) { 1566 if (unlikely(glob->dummy_read_page == NULL)) {
1549 ret = -ENOMEM; 1567 ret = -ENOMEM;
1550 goto out_no_drp; 1568 goto out;
1551 } 1569 }
1552 1570
1553 for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) 1571 for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i)
@@ -1559,13 +1577,10 @@ int ttm_bo_global_init(struct drm_global_reference *ref)
1559 &glob->kobj, &ttm_bo_glob_kobj_type, ttm_get_kobj(), "buffer_objects"); 1577 &glob->kobj, &ttm_bo_glob_kobj_type, ttm_get_kobj(), "buffer_objects");
1560 if (unlikely(ret != 0)) 1578 if (unlikely(ret != 0))
1561 kobject_put(&glob->kobj); 1579 kobject_put(&glob->kobj);
1562 return ret; 1580out:
1563out_no_drp: 1581 mutex_unlock(&ttm_global_mutex);
1564 kfree(glob);
1565 return ret; 1582 return ret;
1566} 1583}
1567EXPORT_SYMBOL(ttm_bo_global_init);
1568
1569 1584
1570int ttm_bo_device_release(struct ttm_bo_device *bdev) 1585int ttm_bo_device_release(struct ttm_bo_device *bdev)
1571{ 1586{
@@ -1587,9 +1602,9 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev)
1587 } 1602 }
1588 } 1603 }
1589 1604
1590 mutex_lock(&glob->device_list_mutex); 1605 mutex_lock(&ttm_global_mutex);
1591 list_del(&bdev->device_list); 1606 list_del(&bdev->device_list);
1592 mutex_unlock(&glob->device_list_mutex); 1607 mutex_unlock(&ttm_global_mutex);
1593 1608
1594 cancel_delayed_work_sync(&bdev->wq); 1609 cancel_delayed_work_sync(&bdev->wq);
1595 1610
@@ -1604,18 +1619,25 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev)
1604 1619
1605 drm_vma_offset_manager_destroy(&bdev->vma_manager); 1620 drm_vma_offset_manager_destroy(&bdev->vma_manager);
1606 1621
1622 if (!ret)
1623 ttm_bo_global_release();
1624
1607 return ret; 1625 return ret;
1608} 1626}
1609EXPORT_SYMBOL(ttm_bo_device_release); 1627EXPORT_SYMBOL(ttm_bo_device_release);
1610 1628
1611int ttm_bo_device_init(struct ttm_bo_device *bdev, 1629int ttm_bo_device_init(struct ttm_bo_device *bdev,
1612 struct ttm_bo_global *glob,
1613 struct ttm_bo_driver *driver, 1630 struct ttm_bo_driver *driver,
1614 struct address_space *mapping, 1631 struct address_space *mapping,
1615 uint64_t file_page_offset, 1632 uint64_t file_page_offset,
1616 bool need_dma32) 1633 bool need_dma32)
1617{ 1634{
1618 int ret = -EINVAL; 1635 struct ttm_bo_global *glob = &ttm_bo_glob;
1636 int ret;
1637
1638 ret = ttm_bo_global_init();
1639 if (ret)
1640 return ret;
1619 1641
1620 bdev->driver = driver; 1642 bdev->driver = driver;
1621 1643
@@ -1636,12 +1658,13 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev,
1636 bdev->dev_mapping = mapping; 1658 bdev->dev_mapping = mapping;
1637 bdev->glob = glob; 1659 bdev->glob = glob;
1638 bdev->need_dma32 = need_dma32; 1660 bdev->need_dma32 = need_dma32;
1639 mutex_lock(&glob->device_list_mutex); 1661 mutex_lock(&ttm_global_mutex);
1640 list_add_tail(&bdev->device_list, &glob->device_list); 1662 list_add_tail(&bdev->device_list, &glob->device_list);
1641 mutex_unlock(&glob->device_list_mutex); 1663 mutex_unlock(&ttm_global_mutex);
1642 1664
1643 return 0; 1665 return 0;
1644out_no_sys: 1666out_no_sys:
1667 ttm_bo_global_release();
1645 return ret; 1668 return ret;
1646} 1669}
1647EXPORT_SYMBOL(ttm_bo_device_init); 1670EXPORT_SYMBOL(ttm_bo_device_init);
diff --git a/drivers/gpu/drm/ttm/ttm_execbuf_util.c b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
index e493edb0d3e7..efa005a1c1b7 100644
--- a/drivers/gpu/drm/ttm/ttm_execbuf_util.c
+++ b/drivers/gpu/drm/ttm/ttm_execbuf_util.c
@@ -187,14 +187,12 @@ void ttm_eu_fence_buffer_objects(struct ww_acquire_ctx *ticket,
187 struct ttm_buffer_object *bo; 187 struct ttm_buffer_object *bo;
188 struct ttm_bo_global *glob; 188 struct ttm_bo_global *glob;
189 struct ttm_bo_device *bdev; 189 struct ttm_bo_device *bdev;
190 struct ttm_bo_driver *driver;
191 190
192 if (list_empty(list)) 191 if (list_empty(list))
193 return; 192 return;
194 193
195 bo = list_first_entry(list, struct ttm_validate_buffer, head)->bo; 194 bo = list_first_entry(list, struct ttm_validate_buffer, head)->bo;
196 bdev = bo->bdev; 195 bdev = bo->bdev;
197 driver = bdev->driver;
198 glob = bo->bdev->glob; 196 glob = bo->bdev->glob;
199 197
200 spin_lock(&glob->lru_lock); 198 spin_lock(&glob->lru_lock);
diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
index 450387c92b63..f1567c353b54 100644
--- a/drivers/gpu/drm/ttm/ttm_memory.c
+++ b/drivers/gpu/drm/ttm/ttm_memory.c
@@ -41,6 +41,9 @@
41 41
42#define TTM_MEMORY_ALLOC_RETRIES 4 42#define TTM_MEMORY_ALLOC_RETRIES 4
43 43
44struct ttm_mem_global ttm_mem_glob;
45EXPORT_SYMBOL(ttm_mem_glob);
46
44struct ttm_mem_zone { 47struct ttm_mem_zone {
45 struct kobject kobj; 48 struct kobject kobj;
46 struct ttm_mem_global *glob; 49 struct ttm_mem_global *glob;
@@ -216,14 +219,6 @@ static ssize_t ttm_mem_global_store(struct kobject *kobj,
216 return size; 219 return size;
217} 220}
218 221
219static void ttm_mem_global_kobj_release(struct kobject *kobj)
220{
221 struct ttm_mem_global *glob =
222 container_of(kobj, struct ttm_mem_global, kobj);
223
224 kfree(glob);
225}
226
227static struct attribute *ttm_mem_global_attrs[] = { 222static struct attribute *ttm_mem_global_attrs[] = {
228 &ttm_mem_global_lower_mem_limit, 223 &ttm_mem_global_lower_mem_limit,
229 NULL 224 NULL
@@ -235,7 +230,6 @@ static const struct sysfs_ops ttm_mem_global_ops = {
235}; 230};
236 231
237static struct kobj_type ttm_mem_glob_kobj_type = { 232static struct kobj_type ttm_mem_glob_kobj_type = {
238 .release = &ttm_mem_global_kobj_release,
239 .sysfs_ops = &ttm_mem_global_ops, 233 .sysfs_ops = &ttm_mem_global_ops,
240 .default_attrs = ttm_mem_global_attrs, 234 .default_attrs = ttm_mem_global_attrs,
241}; 235};
@@ -464,7 +458,6 @@ out_no_zone:
464 ttm_mem_global_release(glob); 458 ttm_mem_global_release(glob);
465 return ret; 459 return ret;
466} 460}
467EXPORT_SYMBOL(ttm_mem_global_init);
468 461
469void ttm_mem_global_release(struct ttm_mem_global *glob) 462void ttm_mem_global_release(struct ttm_mem_global *glob)
470{ 463{
@@ -486,7 +479,6 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
486 kobject_del(&glob->kobj); 479 kobject_del(&glob->kobj);
487 kobject_put(&glob->kobj); 480 kobject_put(&glob->kobj);
488} 481}
489EXPORT_SYMBOL(ttm_mem_global_release);
490 482
491static void ttm_check_swapping(struct ttm_mem_global *glob) 483static void ttm_check_swapping(struct ttm_mem_global *glob)
492{ 484{
diff --git a/drivers/gpu/drm/v3d/v3d_sched.c b/drivers/gpu/drm/v3d/v3d_sched.c
index e1f2aab0717b..c66d0ce21435 100644
--- a/drivers/gpu/drm/v3d/v3d_sched.c
+++ b/drivers/gpu/drm/v3d/v3d_sched.c
@@ -35,6 +35,8 @@ v3d_job_free(struct drm_sched_job *sched_job)
35{ 35{
36 struct v3d_job *job = to_v3d_job(sched_job); 36 struct v3d_job *job = to_v3d_job(sched_job);
37 37
38 drm_sched_job_cleanup(sched_job);
39
38 v3d_exec_put(job->exec); 40 v3d_exec_put(job->exec);
39} 41}
40 42
@@ -167,9 +169,6 @@ v3d_job_timedout(struct drm_sched_job *sched_job)
167 if (job->timedout_ctca != ctca || job->timedout_ctra != ctra) { 169 if (job->timedout_ctca != ctca || job->timedout_ctra != ctra) {
168 job->timedout_ctca = ctca; 170 job->timedout_ctca = ctca;
169 job->timedout_ctra = ctra; 171 job->timedout_ctra = ctra;
170
171 schedule_delayed_work(&job->base.sched->work_tdr,
172 job->base.sched->timeout);
173 return; 172 return;
174 } 173 }
175 174
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 7bec6e36886b..f7e877857c1f 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -145,9 +145,6 @@ struct virtio_gpu_fbdev {
145}; 145};
146 146
147struct virtio_gpu_mman { 147struct virtio_gpu_mman {
148 struct ttm_bo_global_ref bo_global_ref;
149 struct drm_global_reference mem_global_ref;
150 bool mem_global_referenced;
151 struct ttm_bo_device bdev; 148 struct ttm_bo_device bdev;
152}; 149};
153 150
diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
index cd63dffa6d40..4bfbf25fabff 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
@@ -50,62 +50,6 @@ virtio_gpu_device *virtio_gpu_get_vgdev(struct ttm_bo_device *bdev)
50 return vgdev; 50 return vgdev;
51} 51}
52 52
53static int virtio_gpu_ttm_mem_global_init(struct drm_global_reference *ref)
54{
55 return ttm_mem_global_init(ref->object);
56}
57
58static void virtio_gpu_ttm_mem_global_release(struct drm_global_reference *ref)
59{
60 ttm_mem_global_release(ref->object);
61}
62
63static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
64{
65 struct drm_global_reference *global_ref;
66 int r;
67
68 vgdev->mman.mem_global_referenced = false;
69 global_ref = &vgdev->mman.mem_global_ref;
70 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
71 global_ref->size = sizeof(struct ttm_mem_global);
72 global_ref->init = &virtio_gpu_ttm_mem_global_init;
73 global_ref->release = &virtio_gpu_ttm_mem_global_release;
74
75 r = drm_global_item_ref(global_ref);
76 if (r != 0) {
77 DRM_ERROR("Failed setting up TTM memory accounting "
78 "subsystem.\n");
79 return r;
80 }
81
82 vgdev->mman.bo_global_ref.mem_glob =
83 vgdev->mman.mem_global_ref.object;
84 global_ref = &vgdev->mman.bo_global_ref.ref;
85 global_ref->global_type = DRM_GLOBAL_TTM_BO;
86 global_ref->size = sizeof(struct ttm_bo_global);
87 global_ref->init = &ttm_bo_global_init;
88 global_ref->release = &ttm_bo_global_release;
89 r = drm_global_item_ref(global_ref);
90 if (r != 0) {
91 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
92 drm_global_item_unref(&vgdev->mman.mem_global_ref);
93 return r;
94 }
95
96 vgdev->mman.mem_global_referenced = true;
97 return 0;
98}
99
100static void virtio_gpu_ttm_global_fini(struct virtio_gpu_device *vgdev)
101{
102 if (vgdev->mman.mem_global_referenced) {
103 drm_global_item_unref(&vgdev->mman.bo_global_ref.ref);
104 drm_global_item_unref(&vgdev->mman.mem_global_ref);
105 vgdev->mman.mem_global_referenced = false;
106 }
107}
108
109int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma) 53int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma)
110{ 54{
111 struct drm_file *file_priv; 55 struct drm_file *file_priv;
@@ -382,12 +326,8 @@ int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
382{ 326{
383 int r; 327 int r;
384 328
385 r = virtio_gpu_ttm_global_init(vgdev);
386 if (r)
387 return r;
388 /* No others user of address space so set it to 0 */ 329 /* No others user of address space so set it to 0 */
389 r = ttm_bo_device_init(&vgdev->mman.bdev, 330 r = ttm_bo_device_init(&vgdev->mman.bdev,
390 vgdev->mman.bo_global_ref.ref.object,
391 &virtio_gpu_bo_driver, 331 &virtio_gpu_bo_driver,
392 vgdev->ddev->anon_inode->i_mapping, 332 vgdev->ddev->anon_inode->i_mapping,
393 DRM_FILE_PAGE_OFFSET, 0); 333 DRM_FILE_PAGE_OFFSET, 0);
@@ -406,13 +346,11 @@ int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
406err_mm_init: 346err_mm_init:
407 ttm_bo_device_release(&vgdev->mman.bdev); 347 ttm_bo_device_release(&vgdev->mman.bdev);
408err_dev_init: 348err_dev_init:
409 virtio_gpu_ttm_global_fini(vgdev);
410 return r; 349 return r;
411} 350}
412 351
413void virtio_gpu_ttm_fini(struct virtio_gpu_device *vgdev) 352void virtio_gpu_ttm_fini(struct virtio_gpu_device *vgdev)
414{ 353{
415 ttm_bo_device_release(&vgdev->mman.bdev); 354 ttm_bo_device_release(&vgdev->mman.bdev);
416 virtio_gpu_ttm_global_fini(vgdev);
417 DRM_INFO("virtio_gpu: ttm finalized\n"); 355 DRM_INFO("virtio_gpu: ttm finalized\n");
418} 356}
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 61a84b958d67..b9c078860a7c 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -801,11 +801,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
801 DRM_INFO("MMIO at 0x%08x size is %u kiB\n", 801 DRM_INFO("MMIO at 0x%08x size is %u kiB\n",
802 dev_priv->mmio_start, dev_priv->mmio_size / 1024); 802 dev_priv->mmio_start, dev_priv->mmio_size / 1024);
803 803
804 ret = vmw_ttm_global_init(dev_priv);
805 if (unlikely(ret != 0))
806 goto out_err0;
807
808
809 vmw_master_init(&dev_priv->fbdev_master); 804 vmw_master_init(&dev_priv->fbdev_master);
810 ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM); 805 ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM);
811 dev_priv->active_master = &dev_priv->fbdev_master; 806 dev_priv->active_master = &dev_priv->fbdev_master;
@@ -816,7 +811,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
816 if (unlikely(dev_priv->mmio_virt == NULL)) { 811 if (unlikely(dev_priv->mmio_virt == NULL)) {
817 ret = -ENOMEM; 812 ret = -ENOMEM;
818 DRM_ERROR("Failed mapping MMIO.\n"); 813 DRM_ERROR("Failed mapping MMIO.\n");
819 goto out_err3; 814 goto out_err0;
820 } 815 }
821 816
822 /* Need mmio memory to check for fifo pitchlock cap. */ 817 /* Need mmio memory to check for fifo pitchlock cap. */
@@ -828,8 +823,8 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
828 goto out_err4; 823 goto out_err4;
829 } 824 }
830 825
831 dev_priv->tdev = ttm_object_device_init 826 dev_priv->tdev = ttm_object_device_init(&ttm_mem_glob, 12,
832 (dev_priv->mem_global_ref.object, 12, &vmw_prime_dmabuf_ops); 827 &vmw_prime_dmabuf_ops);
833 828
834 if (unlikely(dev_priv->tdev == NULL)) { 829 if (unlikely(dev_priv->tdev == NULL)) {
835 DRM_ERROR("Unable to initialize TTM object management.\n"); 830 DRM_ERROR("Unable to initialize TTM object management.\n");
@@ -870,7 +865,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
870 } 865 }
871 866
872 ret = ttm_bo_device_init(&dev_priv->bdev, 867 ret = ttm_bo_device_init(&dev_priv->bdev,
873 dev_priv->bo_global_ref.ref.object,
874 &vmw_bo_driver, 868 &vmw_bo_driver,
875 dev->anon_inode->i_mapping, 869 dev->anon_inode->i_mapping,
876 VMWGFX_FILE_PAGE_OFFSET, 870 VMWGFX_FILE_PAGE_OFFSET,
@@ -992,8 +986,6 @@ out_no_device:
992 ttm_object_device_release(&dev_priv->tdev); 986 ttm_object_device_release(&dev_priv->tdev);
993out_err4: 987out_err4:
994 memunmap(dev_priv->mmio_virt); 988 memunmap(dev_priv->mmio_virt);
995out_err3:
996 vmw_ttm_global_release(dev_priv);
997out_err0: 989out_err0:
998 for (i = vmw_res_context; i < vmw_res_max; ++i) 990 for (i = vmw_res_context; i < vmw_res_max; ++i)
999 idr_destroy(&dev_priv->res_idr[i]); 991 idr_destroy(&dev_priv->res_idr[i]);
@@ -1045,7 +1037,6 @@ static void vmw_driver_unload(struct drm_device *dev)
1045 memunmap(dev_priv->mmio_virt); 1037 memunmap(dev_priv->mmio_virt);
1046 if (dev_priv->ctx.staged_bindings) 1038 if (dev_priv->ctx.staged_bindings)
1047 vmw_binding_state_free(dev_priv->ctx.staged_bindings); 1039 vmw_binding_state_free(dev_priv->ctx.staged_bindings);
1048 vmw_ttm_global_release(dev_priv);
1049 1040
1050 for (i = vmw_res_context; i < vmw_res_max; ++i) 1041 for (i = vmw_res_context; i < vmw_res_max; ++i)
1051 idr_destroy(&dev_priv->res_idr[i]); 1042 idr_destroy(&dev_priv->res_idr[i]);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index 59f614225bcd..28df788da44e 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -417,8 +417,6 @@ enum {
417 417
418struct vmw_private { 418struct vmw_private {
419 struct ttm_bo_device bdev; 419 struct ttm_bo_device bdev;
420 struct ttm_bo_global_ref bo_global_ref;
421 struct drm_global_reference mem_global_ref;
422 420
423 struct vmw_fifo_state fifo; 421 struct vmw_fifo_state fifo;
424 422
@@ -842,8 +840,6 @@ extern int vmw_fifo_flush(struct vmw_private *dev_priv,
842 * TTM glue - vmwgfx_ttm_glue.c 840 * TTM glue - vmwgfx_ttm_glue.c
843 */ 841 */
844 842
845extern int vmw_ttm_global_init(struct vmw_private *dev_priv);
846extern void vmw_ttm_global_release(struct vmw_private *dev_priv);
847extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma); 843extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma);
848 844
849/** 845/**
@@ -1363,7 +1359,7 @@ vmw_bo_reference(struct vmw_buffer_object *buf)
1363 1359
1364static inline struct ttm_mem_global *vmw_mem_glob(struct vmw_private *dev_priv) 1360static inline struct ttm_mem_global *vmw_mem_glob(struct vmw_private *dev_priv)
1365{ 1361{
1366 return (struct ttm_mem_global *) dev_priv->mem_global_ref.object; 1362 return &ttm_mem_glob;
1367} 1363}
1368 1364
1369static inline void vmw_fifo_resource_inc(struct vmw_private *dev_priv) 1365static inline void vmw_fifo_resource_inc(struct vmw_private *dev_priv)
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
index 7b1e5a5cbd2c..154eb09aa91e 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
@@ -42,57 +42,3 @@ int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
42 dev_priv = vmw_priv(file_priv->minor->dev); 42 dev_priv = vmw_priv(file_priv->minor->dev);
43 return ttm_bo_mmap(filp, vma, &dev_priv->bdev); 43 return ttm_bo_mmap(filp, vma, &dev_priv->bdev);
44} 44}
45
46static int vmw_ttm_mem_global_init(struct drm_global_reference *ref)
47{
48 DRM_INFO("global init.\n");
49 return ttm_mem_global_init(ref->object);
50}
51
52static void vmw_ttm_mem_global_release(struct drm_global_reference *ref)
53{
54 ttm_mem_global_release(ref->object);
55}
56
57int vmw_ttm_global_init(struct vmw_private *dev_priv)
58{
59 struct drm_global_reference *global_ref;
60 int ret;
61
62 global_ref = &dev_priv->mem_global_ref;
63 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
64 global_ref->size = sizeof(struct ttm_mem_global);
65 global_ref->init = &vmw_ttm_mem_global_init;
66 global_ref->release = &vmw_ttm_mem_global_release;
67
68 ret = drm_global_item_ref(global_ref);
69 if (unlikely(ret != 0)) {
70 DRM_ERROR("Failed setting up TTM memory accounting.\n");
71 return ret;
72 }
73
74 dev_priv->bo_global_ref.mem_glob =
75 dev_priv->mem_global_ref.object;
76 global_ref = &dev_priv->bo_global_ref.ref;
77 global_ref->global_type = DRM_GLOBAL_TTM_BO;
78 global_ref->size = sizeof(struct ttm_bo_global);
79 global_ref->init = &ttm_bo_global_init;
80 global_ref->release = &ttm_bo_global_release;
81 ret = drm_global_item_ref(global_ref);
82
83 if (unlikely(ret != 0)) {
84 DRM_ERROR("Failed setting up TTM buffer objects.\n");
85 goto out_no_bo;
86 }
87
88 return 0;
89out_no_bo:
90 drm_global_item_unref(&dev_priv->mem_global_ref);
91 return ret;
92}
93
94void vmw_ttm_global_release(struct vmw_private *dev_priv)
95{
96 drm_global_item_unref(&dev_priv->bo_global_ref.ref);
97 drm_global_item_unref(&dev_priv->mem_global_ref);
98}
diff --git a/drivers/gpu/vga/vga_switcheroo.c b/drivers/gpu/vga/vga_switcheroo.c
index cf2a18571d48..a132c37d7334 100644
--- a/drivers/gpu/vga/vga_switcheroo.c
+++ b/drivers/gpu/vga/vga_switcheroo.c
@@ -380,6 +380,9 @@ int vga_switcheroo_register_audio_client(struct pci_dev *pdev,
380 mutex_unlock(&vgasr_mutex); 380 mutex_unlock(&vgasr_mutex);
381 return -EINVAL; 381 return -EINVAL;
382 } 382 }
383 /* notify if GPU has been already bound */
384 if (ops->gpu_bound)
385 ops->gpu_bound(pdev, id);
383 } 386 }
384 mutex_unlock(&vgasr_mutex); 387 mutex_unlock(&vgasr_mutex);
385 388
diff --git a/drivers/hid/hid-alps.c b/drivers/hid/hid-alps.c
index aec253b44156..3cd7229b6e54 100644
--- a/drivers/hid/hid-alps.c
+++ b/drivers/hid/hid-alps.c
@@ -660,6 +660,20 @@ exit:
660 return ret; 660 return ret;
661} 661}
662 662
663static int alps_sp_open(struct input_dev *dev)
664{
665 struct hid_device *hid = input_get_drvdata(dev);
666
667 return hid_hw_open(hid);
668}
669
670static void alps_sp_close(struct input_dev *dev)
671{
672 struct hid_device *hid = input_get_drvdata(dev);
673
674 hid_hw_close(hid);
675}
676
663static int alps_input_configured(struct hid_device *hdev, struct hid_input *hi) 677static int alps_input_configured(struct hid_device *hdev, struct hid_input *hi)
664{ 678{
665 struct alps_dev *data = hid_get_drvdata(hdev); 679 struct alps_dev *data = hid_get_drvdata(hdev);
@@ -733,6 +747,10 @@ static int alps_input_configured(struct hid_device *hdev, struct hid_input *hi)
733 input2->id.version = input->id.version; 747 input2->id.version = input->id.version;
734 input2->dev.parent = input->dev.parent; 748 input2->dev.parent = input->dev.parent;
735 749
750 input_set_drvdata(input2, hdev);
751 input2->open = alps_sp_open;
752 input2->close = alps_sp_close;
753
736 __set_bit(EV_KEY, input2->evbit); 754 __set_bit(EV_KEY, input2->evbit);
737 data->sp_btn_cnt = (data->sp_btn_info & 0x0F); 755 data->sp_btn_cnt = (data->sp_btn_info & 0x0F);
738 for (i = 0; i < data->sp_btn_cnt; i++) 756 for (i = 0; i < data->sp_btn_cnt; i++)
diff --git a/drivers/hid/hid-asus.c b/drivers/hid/hid-asus.c
index dc6d6477e961..a1fa2fc8c9b5 100644
--- a/drivers/hid/hid-asus.c
+++ b/drivers/hid/hid-asus.c
@@ -359,6 +359,9 @@ static bool asus_kbd_wmi_led_control_present(struct hid_device *hdev)
359 u32 value; 359 u32 value;
360 int ret; 360 int ret;
361 361
362 if (!IS_ENABLED(CONFIG_ASUS_WMI))
363 return false;
364
362 ret = asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS2, 365 ret = asus_wmi_evaluate_method(ASUS_WMI_METHODID_DSTS2,
363 ASUS_WMI_DEVID_KBD_BACKLIGHT, 0, &value); 366 ASUS_WMI_DEVID_KBD_BACKLIGHT, 0, &value);
364 hid_dbg(hdev, "WMI backlight check: rc %d value %x", ret, value); 367 hid_dbg(hdev, "WMI backlight check: rc %d value %x", ret, value);
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index f63489c882bb..c0d668944dbe 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -927,6 +927,9 @@
927#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3003 0x3003 927#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3003 0x3003
928#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008 0x3008 928#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008 0x3008
929 929
930#define I2C_VENDOR_ID_RAYDIUM 0x2386
931#define I2C_PRODUCT_ID_RAYDIUM_4B33 0x4b33
932
930#define USB_VENDOR_ID_RAZER 0x1532 933#define USB_VENDOR_ID_RAZER 0x1532
931#define USB_DEVICE_ID_RAZER_BLADE_14 0x011D 934#define USB_DEVICE_ID_RAZER_BLADE_14 0x011D
932 935
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
index 52c3b01917e7..8237dd86fb17 100644
--- a/drivers/hid/hid-quirks.c
+++ b/drivers/hid/hid-quirks.c
@@ -107,7 +107,6 @@ static const struct hid_device_id hid_quirks[] = {
107 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOUSE_C05A), HID_QUIRK_ALWAYS_POLL }, 107 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOUSE_C05A), HID_QUIRK_ALWAYS_POLL },
108 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOUSE_C06A), HID_QUIRK_ALWAYS_POLL }, 108 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOUSE_C06A), HID_QUIRK_ALWAYS_POLL },
109 { HID_USB_DEVICE(USB_VENDOR_ID_MCS, USB_DEVICE_ID_MCS_GAMEPADBLOCK), HID_QUIRK_MULTI_INPUT }, 109 { HID_USB_DEVICE(USB_VENDOR_ID_MCS, USB_DEVICE_ID_MCS_GAMEPADBLOCK), HID_QUIRK_MULTI_INPUT },
110 { HID_USB_DEVICE(USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS), HID_QUIRK_NOGET },
111 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER), HID_QUIRK_NO_INIT_REPORTS }, 110 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER), HID_QUIRK_NO_INIT_REPORTS },
112 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_PRO_2), HID_QUIRK_NO_INIT_REPORTS }, 111 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_PRO_2), HID_QUIRK_NO_INIT_REPORTS },
113 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2), HID_QUIRK_NO_INIT_REPORTS }, 112 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2), HID_QUIRK_NO_INIT_REPORTS },
diff --git a/drivers/hid/i2c-hid/i2c-hid-core.c b/drivers/hid/i2c-hid/i2c-hid-core.c
index 4aab96cf0818..3cde7c1b9c33 100644
--- a/drivers/hid/i2c-hid/i2c-hid-core.c
+++ b/drivers/hid/i2c-hid/i2c-hid-core.c
@@ -49,6 +49,7 @@
49#define I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV BIT(0) 49#define I2C_HID_QUIRK_SET_PWR_WAKEUP_DEV BIT(0)
50#define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET BIT(1) 50#define I2C_HID_QUIRK_NO_IRQ_AFTER_RESET BIT(1)
51#define I2C_HID_QUIRK_NO_RUNTIME_PM BIT(2) 51#define I2C_HID_QUIRK_NO_RUNTIME_PM BIT(2)
52#define I2C_HID_QUIRK_DELAY_AFTER_SLEEP BIT(3)
52 53
53/* flags */ 54/* flags */
54#define I2C_HID_STARTED 0 55#define I2C_HID_STARTED 0
@@ -158,6 +159,8 @@ struct i2c_hid {
158 159
159 bool irq_wake_enabled; 160 bool irq_wake_enabled;
160 struct mutex reset_lock; 161 struct mutex reset_lock;
162
163 unsigned long sleep_delay;
161}; 164};
162 165
163static const struct i2c_hid_quirks { 166static const struct i2c_hid_quirks {
@@ -172,6 +175,8 @@ static const struct i2c_hid_quirks {
172 { I2C_VENDOR_ID_HANTICK, I2C_PRODUCT_ID_HANTICK_5288, 175 { I2C_VENDOR_ID_HANTICK, I2C_PRODUCT_ID_HANTICK_5288,
173 I2C_HID_QUIRK_NO_IRQ_AFTER_RESET | 176 I2C_HID_QUIRK_NO_IRQ_AFTER_RESET |
174 I2C_HID_QUIRK_NO_RUNTIME_PM }, 177 I2C_HID_QUIRK_NO_RUNTIME_PM },
178 { I2C_VENDOR_ID_RAYDIUM, I2C_PRODUCT_ID_RAYDIUM_4B33,
179 I2C_HID_QUIRK_DELAY_AFTER_SLEEP },
175 { 0, 0 } 180 { 0, 0 }
176}; 181};
177 182
@@ -387,6 +392,7 @@ static int i2c_hid_set_power(struct i2c_client *client, int power_state)
387{ 392{
388 struct i2c_hid *ihid = i2c_get_clientdata(client); 393 struct i2c_hid *ihid = i2c_get_clientdata(client);
389 int ret; 394 int ret;
395 unsigned long now, delay;
390 396
391 i2c_hid_dbg(ihid, "%s\n", __func__); 397 i2c_hid_dbg(ihid, "%s\n", __func__);
392 398
@@ -404,9 +410,22 @@ static int i2c_hid_set_power(struct i2c_client *client, int power_state)
404 goto set_pwr_exit; 410 goto set_pwr_exit;
405 } 411 }
406 412
413 if (ihid->quirks & I2C_HID_QUIRK_DELAY_AFTER_SLEEP &&
414 power_state == I2C_HID_PWR_ON) {
415 now = jiffies;
416 if (time_after(ihid->sleep_delay, now)) {
417 delay = jiffies_to_usecs(ihid->sleep_delay - now);
418 usleep_range(delay, delay + 1);
419 }
420 }
421
407 ret = __i2c_hid_command(client, &hid_set_power_cmd, power_state, 422 ret = __i2c_hid_command(client, &hid_set_power_cmd, power_state,
408 0, NULL, 0, NULL, 0); 423 0, NULL, 0, NULL, 0);
409 424
425 if (ihid->quirks & I2C_HID_QUIRK_DELAY_AFTER_SLEEP &&
426 power_state == I2C_HID_PWR_SLEEP)
427 ihid->sleep_delay = jiffies + msecs_to_jiffies(20);
428
410 if (ret) 429 if (ret)
411 dev_err(&client->dev, "failed to change power setting.\n"); 430 dev_err(&client->dev, "failed to change power setting.\n");
412 431
diff --git a/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c b/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c
index cac262a912c1..89f2976f9c53 100644
--- a/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c
+++ b/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c
@@ -331,6 +331,14 @@ static const struct dmi_system_id i2c_hid_dmi_desc_override_table[] = {
331 .driver_data = (void *)&sipodev_desc 331 .driver_data = (void *)&sipodev_desc
332 }, 332 },
333 { 333 {
334 .ident = "Direkt-Tek DTLAPY133-1",
335 .matches = {
336 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Direkt-Tek"),
337 DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "DTLAPY133-1"),
338 },
339 .driver_data = (void *)&sipodev_desc
340 },
341 {
334 .ident = "Mediacom Flexbook Edge 11", 342 .ident = "Mediacom Flexbook Edge 11",
335 .matches = { 343 .matches = {
336 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "MEDIACOM"), 344 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "MEDIACOM"),
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c
index 23872d08308c..a746017fac17 100644
--- a/drivers/hid/usbhid/hiddev.c
+++ b/drivers/hid/usbhid/hiddev.c
@@ -512,14 +512,24 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
512 if (cmd == HIDIOCGCOLLECTIONINDEX) { 512 if (cmd == HIDIOCGCOLLECTIONINDEX) {
513 if (uref->usage_index >= field->maxusage) 513 if (uref->usage_index >= field->maxusage)
514 goto inval; 514 goto inval;
515 uref->usage_index =
516 array_index_nospec(uref->usage_index,
517 field->maxusage);
515 } else if (uref->usage_index >= field->report_count) 518 } else if (uref->usage_index >= field->report_count)
516 goto inval; 519 goto inval;
517 } 520 }
518 521
519 if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) && 522 if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
520 (uref_multi->num_values > HID_MAX_MULTI_USAGES || 523 if (uref_multi->num_values > HID_MAX_MULTI_USAGES ||
521 uref->usage_index + uref_multi->num_values > field->report_count)) 524 uref->usage_index + uref_multi->num_values >
522 goto inval; 525 field->report_count)
526 goto inval;
527
528 uref->usage_index =
529 array_index_nospec(uref->usage_index,
530 field->report_count -
531 uref_multi->num_values);
532 }
523 533
524 switch (cmd) { 534 switch (cmd) {
525 case HIDIOCGUSAGE: 535 case HIDIOCGUSAGE:
diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
index 975c95169884..84f61cec6319 100644
--- a/drivers/hwmon/hwmon.c
+++ b/drivers/hwmon/hwmon.c
@@ -649,8 +649,10 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
649 if (info[i]->config[j] & HWMON_T_INPUT) { 649 if (info[i]->config[j] & HWMON_T_INPUT) {
650 err = hwmon_thermal_add_sensor(dev, 650 err = hwmon_thermal_add_sensor(dev,
651 hwdev, j); 651 hwdev, j);
652 if (err) 652 if (err) {
653 goto free_device; 653 device_unregister(hdev);
654 goto ida_remove;
655 }
654 } 656 }
655 } 657 }
656 } 658 }
@@ -658,8 +660,6 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
658 660
659 return hdev; 661 return hdev;
660 662
661free_device:
662 device_unregister(hdev);
663free_hwmon: 663free_hwmon:
664 kfree(hwdev); 664 kfree(hwdev);
665ida_remove: 665ida_remove:
diff --git a/drivers/hwmon/ibmpowernv.c b/drivers/hwmon/ibmpowernv.c
index 0ccca87f5271..293dd1c6c7b3 100644
--- a/drivers/hwmon/ibmpowernv.c
+++ b/drivers/hwmon/ibmpowernv.c
@@ -181,7 +181,7 @@ static ssize_t show_label(struct device *dev, struct device_attribute *devattr,
181 return sprintf(buf, "%s\n", sdata->label); 181 return sprintf(buf, "%s\n", sdata->label);
182} 182}
183 183
184static int __init get_logical_cpu(int hwcpu) 184static int get_logical_cpu(int hwcpu)
185{ 185{
186 int cpu; 186 int cpu;
187 187
@@ -192,9 +192,8 @@ static int __init get_logical_cpu(int hwcpu)
192 return -ENOENT; 192 return -ENOENT;
193} 193}
194 194
195static void __init make_sensor_label(struct device_node *np, 195static void make_sensor_label(struct device_node *np,
196 struct sensor_data *sdata, 196 struct sensor_data *sdata, const char *label)
197 const char *label)
198{ 197{
199 u32 id; 198 u32 id;
200 size_t n; 199 size_t n;
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
index 56ccb1ea7da5..f2c681971201 100644
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
@@ -224,6 +224,15 @@ config I2C_NFORCE2_S4985
224 This driver can also be built as a module. If so, the module 224 This driver can also be built as a module. If so, the module
225 will be called i2c-nforce2-s4985. 225 will be called i2c-nforce2-s4985.
226 226
227config I2C_NVIDIA_GPU
228 tristate "NVIDIA GPU I2C controller"
229 depends on PCI
230 help
231 If you say yes to this option, support will be included for the
232 NVIDIA GPU I2C controller which is used to communicate with the GPU's
233 Type-C controller. This driver can also be built as a module called
234 i2c-nvidia-gpu.
235
227config I2C_SIS5595 236config I2C_SIS5595
228 tristate "SiS 5595" 237 tristate "SiS 5595"
229 depends on PCI 238 depends on PCI
@@ -752,7 +761,7 @@ config I2C_OCORES
752 761
753config I2C_OMAP 762config I2C_OMAP
754 tristate "OMAP I2C adapter" 763 tristate "OMAP I2C adapter"
755 depends on ARCH_OMAP 764 depends on ARCH_OMAP || ARCH_K3
756 default y if MACH_OMAP_H3 || MACH_OMAP_OSK 765 default y if MACH_OMAP_H3 || MACH_OMAP_OSK
757 help 766 help
758 If you say yes to this option, support will be included for the 767 If you say yes to this option, support will be included for the
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
index 18b26af82b1c..5f0cb6915969 100644
--- a/drivers/i2c/busses/Makefile
+++ b/drivers/i2c/busses/Makefile
@@ -19,6 +19,7 @@ obj-$(CONFIG_I2C_ISCH) += i2c-isch.o
19obj-$(CONFIG_I2C_ISMT) += i2c-ismt.o 19obj-$(CONFIG_I2C_ISMT) += i2c-ismt.o
20obj-$(CONFIG_I2C_NFORCE2) += i2c-nforce2.o 20obj-$(CONFIG_I2C_NFORCE2) += i2c-nforce2.o
21obj-$(CONFIG_I2C_NFORCE2_S4985) += i2c-nforce2-s4985.o 21obj-$(CONFIG_I2C_NFORCE2_S4985) += i2c-nforce2-s4985.o
22obj-$(CONFIG_I2C_NVIDIA_GPU) += i2c-nvidia-gpu.o
22obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o 23obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o
23obj-$(CONFIG_I2C_SIS5595) += i2c-sis5595.o 24obj-$(CONFIG_I2C_SIS5595) += i2c-sis5595.o
24obj-$(CONFIG_I2C_SIS630) += i2c-sis630.o 25obj-$(CONFIG_I2C_SIS630) += i2c-sis630.o
diff --git a/drivers/i2c/busses/i2c-nvidia-gpu.c b/drivers/i2c/busses/i2c-nvidia-gpu.c
new file mode 100644
index 000000000000..8822357bca0c
--- /dev/null
+++ b/drivers/i2c/busses/i2c-nvidia-gpu.c
@@ -0,0 +1,368 @@
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Nvidia GPU I2C controller Driver
4 *
5 * Copyright (C) 2018 NVIDIA Corporation. All rights reserved.
6 * Author: Ajay Gupta <ajayg@nvidia.com>
7 */
8#include <linux/delay.h>
9#include <linux/i2c.h>
10#include <linux/interrupt.h>
11#include <linux/module.h>
12#include <linux/pci.h>
13#include <linux/platform_device.h>
14#include <linux/pm.h>
15#include <linux/pm_runtime.h>
16
17#include <asm/unaligned.h>
18
19/* I2C definitions */
20#define I2C_MST_CNTL 0x00
21#define I2C_MST_CNTL_GEN_START BIT(0)
22#define I2C_MST_CNTL_GEN_STOP BIT(1)
23#define I2C_MST_CNTL_CMD_READ (1 << 2)
24#define I2C_MST_CNTL_CMD_WRITE (2 << 2)
25#define I2C_MST_CNTL_BURST_SIZE_SHIFT 6
26#define I2C_MST_CNTL_GEN_NACK BIT(28)
27#define I2C_MST_CNTL_STATUS GENMASK(30, 29)
28#define I2C_MST_CNTL_STATUS_OKAY (0 << 29)
29#define I2C_MST_CNTL_STATUS_NO_ACK (1 << 29)
30#define I2C_MST_CNTL_STATUS_TIMEOUT (2 << 29)
31#define I2C_MST_CNTL_STATUS_BUS_BUSY (3 << 29)
32#define I2C_MST_CNTL_CYCLE_TRIGGER BIT(31)
33
34#define I2C_MST_ADDR 0x04
35
36#define I2C_MST_I2C0_TIMING 0x08
37#define I2C_MST_I2C0_TIMING_SCL_PERIOD_100KHZ 0x10e
38#define I2C_MST_I2C0_TIMING_TIMEOUT_CLK_CNT 16
39#define I2C_MST_I2C0_TIMING_TIMEOUT_CLK_CNT_MAX 255
40#define I2C_MST_I2C0_TIMING_TIMEOUT_CHECK BIT(24)
41
42#define I2C_MST_DATA 0x0c
43
44#define I2C_MST_HYBRID_PADCTL 0x20
45#define I2C_MST_HYBRID_PADCTL_MODE_I2C BIT(0)
46#define I2C_MST_HYBRID_PADCTL_I2C_SCL_INPUT_RCV BIT(14)
47#define I2C_MST_HYBRID_PADCTL_I2C_SDA_INPUT_RCV BIT(15)
48
49struct gpu_i2c_dev {
50 struct device *dev;
51 void __iomem *regs;
52 struct i2c_adapter adapter;
53 struct i2c_board_info *gpu_ccgx_ucsi;
54};
55
56static void gpu_enable_i2c_bus(struct gpu_i2c_dev *i2cd)
57{
58 u32 val;
59
60 /* enable I2C */
61 val = readl(i2cd->regs + I2C_MST_HYBRID_PADCTL);
62 val |= I2C_MST_HYBRID_PADCTL_MODE_I2C |
63 I2C_MST_HYBRID_PADCTL_I2C_SCL_INPUT_RCV |
64 I2C_MST_HYBRID_PADCTL_I2C_SDA_INPUT_RCV;
65 writel(val, i2cd->regs + I2C_MST_HYBRID_PADCTL);
66
67 /* enable 100KHZ mode */
68 val = I2C_MST_I2C0_TIMING_SCL_PERIOD_100KHZ;
69 val |= (I2C_MST_I2C0_TIMING_TIMEOUT_CLK_CNT_MAX
70 << I2C_MST_I2C0_TIMING_TIMEOUT_CLK_CNT);
71 val |= I2C_MST_I2C0_TIMING_TIMEOUT_CHECK;
72 writel(val, i2cd->regs + I2C_MST_I2C0_TIMING);
73}
74
75static int gpu_i2c_check_status(struct gpu_i2c_dev *i2cd)
76{
77 unsigned long target = jiffies + msecs_to_jiffies(1000);
78 u32 val;
79
80 do {
81 val = readl(i2cd->regs + I2C_MST_CNTL);
82 if (!(val & I2C_MST_CNTL_CYCLE_TRIGGER))
83 break;
84 if ((val & I2C_MST_CNTL_STATUS) !=
85 I2C_MST_CNTL_STATUS_BUS_BUSY)
86 break;
87 usleep_range(500, 600);
88 } while (time_is_after_jiffies(target));
89
90 if (time_is_before_jiffies(target)) {
91 dev_err(i2cd->dev, "i2c timeout error %x\n", val);
92 return -ETIME;
93 }
94
95 val = readl(i2cd->regs + I2C_MST_CNTL);
96 switch (val & I2C_MST_CNTL_STATUS) {
97 case I2C_MST_CNTL_STATUS_OKAY:
98 return 0;
99 case I2C_MST_CNTL_STATUS_NO_ACK:
100 return -EIO;
101 case I2C_MST_CNTL_STATUS_TIMEOUT:
102 return -ETIME;
103 default:
104 return 0;
105 }
106}
107
108static int gpu_i2c_read(struct gpu_i2c_dev *i2cd, u8 *data, u16 len)
109{
110 int status;
111 u32 val;
112
113 val = I2C_MST_CNTL_GEN_START | I2C_MST_CNTL_CMD_READ |
114 (len << I2C_MST_CNTL_BURST_SIZE_SHIFT) |
115 I2C_MST_CNTL_CYCLE_TRIGGER | I2C_MST_CNTL_GEN_NACK;
116 writel(val, i2cd->regs + I2C_MST_CNTL);
117
118 status = gpu_i2c_check_status(i2cd);
119 if (status < 0)
120 return status;
121
122 val = readl(i2cd->regs + I2C_MST_DATA);
123 switch (len) {
124 case 1:
125 data[0] = val;
126 break;
127 case 2:
128 put_unaligned_be16(val, data);
129 break;
130 case 3:
131 put_unaligned_be16(val >> 8, data);
132 data[2] = val;
133 break;
134 case 4:
135 put_unaligned_be32(val, data);
136 break;
137 default:
138 break;
139 }
140 return status;
141}
142
143static int gpu_i2c_start(struct gpu_i2c_dev *i2cd)
144{
145 writel(I2C_MST_CNTL_GEN_START, i2cd->regs + I2C_MST_CNTL);
146 return gpu_i2c_check_status(i2cd);
147}
148
149static int gpu_i2c_stop(struct gpu_i2c_dev *i2cd)
150{
151 writel(I2C_MST_CNTL_GEN_STOP, i2cd->regs + I2C_MST_CNTL);
152 return gpu_i2c_check_status(i2cd);
153}
154
155static int gpu_i2c_write(struct gpu_i2c_dev *i2cd, u8 data)
156{
157 u32 val;
158
159 writel(data, i2cd->regs + I2C_MST_DATA);
160
161 val = I2C_MST_CNTL_CMD_WRITE | (1 << I2C_MST_CNTL_BURST_SIZE_SHIFT);
162 writel(val, i2cd->regs + I2C_MST_CNTL);
163
164 return gpu_i2c_check_status(i2cd);
165}
166
167static int gpu_i2c_master_xfer(struct i2c_adapter *adap,
168 struct i2c_msg *msgs, int num)
169{
170 struct gpu_i2c_dev *i2cd = i2c_get_adapdata(adap);
171 int status, status2;
172 int i, j;
173
174 /*
175 * The controller supports maximum 4 byte read due to known
176 * limitation of sending STOP after every read.
177 */
178 for (i = 0; i < num; i++) {
179 if (msgs[i].flags & I2C_M_RD) {
180 /* program client address before starting read */
181 writel(msgs[i].addr, i2cd->regs + I2C_MST_ADDR);
182 /* gpu_i2c_read has implicit start */
183 status = gpu_i2c_read(i2cd, msgs[i].buf, msgs[i].len);
184 if (status < 0)
185 goto stop;
186 } else {
187 u8 addr = i2c_8bit_addr_from_msg(msgs + i);
188
189 status = gpu_i2c_start(i2cd);
190 if (status < 0) {
191 if (i == 0)
192 return status;
193 goto stop;
194 }
195
196 status = gpu_i2c_write(i2cd, addr);
197 if (status < 0)
198 goto stop;
199
200 for (j = 0; j < msgs[i].len; j++) {
201 status = gpu_i2c_write(i2cd, msgs[i].buf[j]);
202 if (status < 0)
203 goto stop;
204 }
205 }
206 }
207 status = gpu_i2c_stop(i2cd);
208 if (status < 0)
209 return status;
210
211 return i;
212stop:
213 status2 = gpu_i2c_stop(i2cd);
214 if (status2 < 0)
215 dev_err(i2cd->dev, "i2c stop failed %d\n", status2);
216 return status;
217}
218
219static const struct i2c_adapter_quirks gpu_i2c_quirks = {
220 .max_read_len = 4,
221 .flags = I2C_AQ_COMB_WRITE_THEN_READ,
222};
223
224static u32 gpu_i2c_functionality(struct i2c_adapter *adap)
225{
226 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
227}
228
229static const struct i2c_algorithm gpu_i2c_algorithm = {
230 .master_xfer = gpu_i2c_master_xfer,
231 .functionality = gpu_i2c_functionality,
232};
233
234/*
235 * This driver is for Nvidia GPU cards with USB Type-C interface.
236 * We want to identify the cards using vendor ID and class code only
237 * to avoid dependency of adding product id for any new card which
238 * requires this driver.
239 * Currently there is no class code defined for UCSI device over PCI
240 * so using UNKNOWN class for now and it will be updated when UCSI
241 * over PCI gets a class code.
242 * There is no other NVIDIA cards with UNKNOWN class code. Even if the
243 * driver gets loaded for an undesired card then eventually i2c_read()
244 * (initiated from UCSI i2c_client) will timeout or UCSI commands will
245 * timeout.
246 */
247#define PCI_CLASS_SERIAL_UNKNOWN 0x0c80
248static const struct pci_device_id gpu_i2c_ids[] = {
249 { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
250 PCI_CLASS_SERIAL_UNKNOWN << 8, 0xffffff00},
251 { }
252};
253MODULE_DEVICE_TABLE(pci, gpu_i2c_ids);
254
255static int gpu_populate_client(struct gpu_i2c_dev *i2cd, int irq)
256{
257 struct i2c_client *ccgx_client;
258
259 i2cd->gpu_ccgx_ucsi = devm_kzalloc(i2cd->dev,
260 sizeof(*i2cd->gpu_ccgx_ucsi),
261 GFP_KERNEL);
262 if (!i2cd->gpu_ccgx_ucsi)
263 return -ENOMEM;
264
265 strlcpy(i2cd->gpu_ccgx_ucsi->type, "ccgx-ucsi",
266 sizeof(i2cd->gpu_ccgx_ucsi->type));
267 i2cd->gpu_ccgx_ucsi->addr = 0x8;
268 i2cd->gpu_ccgx_ucsi->irq = irq;
269 ccgx_client = i2c_new_device(&i2cd->adapter, i2cd->gpu_ccgx_ucsi);
270 if (!ccgx_client)
271 return -ENODEV;
272
273 return 0;
274}
275
276static int gpu_i2c_probe(struct pci_dev *pdev, const struct pci_device_id *id)
277{
278 struct gpu_i2c_dev *i2cd;
279 int status;
280
281 i2cd = devm_kzalloc(&pdev->dev, sizeof(*i2cd), GFP_KERNEL);
282 if (!i2cd)
283 return -ENOMEM;
284
285 i2cd->dev = &pdev->dev;
286 dev_set_drvdata(&pdev->dev, i2cd);
287
288 status = pcim_enable_device(pdev);
289 if (status < 0) {
290 dev_err(&pdev->dev, "pcim_enable_device failed %d\n", status);
291 return status;
292 }
293
294 pci_set_master(pdev);
295
296 i2cd->regs = pcim_iomap(pdev, 0, 0);
297 if (!i2cd->regs) {
298 dev_err(&pdev->dev, "pcim_iomap failed\n");
299 return -ENOMEM;
300 }
301
302 status = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI);
303 if (status < 0) {
304 dev_err(&pdev->dev, "pci_alloc_irq_vectors err %d\n", status);
305 return status;
306 }
307
308 gpu_enable_i2c_bus(i2cd);
309
310 i2c_set_adapdata(&i2cd->adapter, i2cd);
311 i2cd->adapter.owner = THIS_MODULE;
312 strlcpy(i2cd->adapter.name, "NVIDIA GPU I2C adapter",
313 sizeof(i2cd->adapter.name));
314 i2cd->adapter.algo = &gpu_i2c_algorithm;
315 i2cd->adapter.quirks = &gpu_i2c_quirks;
316 i2cd->adapter.dev.parent = &pdev->dev;
317 status = i2c_add_adapter(&i2cd->adapter);
318 if (status < 0)
319 goto free_irq_vectors;
320
321 status = gpu_populate_client(i2cd, pdev->irq);
322 if (status < 0) {
323 dev_err(&pdev->dev, "gpu_populate_client failed %d\n", status);
324 goto del_adapter;
325 }
326
327 return 0;
328
329del_adapter:
330 i2c_del_adapter(&i2cd->adapter);
331free_irq_vectors:
332 pci_free_irq_vectors(pdev);
333 return status;
334}
335
336static void gpu_i2c_remove(struct pci_dev *pdev)
337{
338 struct gpu_i2c_dev *i2cd = dev_get_drvdata(&pdev->dev);
339
340 i2c_del_adapter(&i2cd->adapter);
341 pci_free_irq_vectors(pdev);
342}
343
344static int gpu_i2c_resume(struct device *dev)
345{
346 struct gpu_i2c_dev *i2cd = dev_get_drvdata(dev);
347
348 gpu_enable_i2c_bus(i2cd);
349 return 0;
350}
351
352static UNIVERSAL_DEV_PM_OPS(gpu_i2c_driver_pm, NULL, gpu_i2c_resume, NULL);
353
354static struct pci_driver gpu_i2c_driver = {
355 .name = "nvidia-gpu",
356 .id_table = gpu_i2c_ids,
357 .probe = gpu_i2c_probe,
358 .remove = gpu_i2c_remove,
359 .driver = {
360 .pm = &gpu_i2c_driver_pm,
361 },
362};
363
364module_pci_driver(gpu_i2c_driver);
365
366MODULE_AUTHOR("Ajay Gupta <ajayg@nvidia.com>");
367MODULE_DESCRIPTION("Nvidia GPU I2C controller Driver");
368MODULE_LICENSE("GPL v2");
diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c
index 527f55c8c4c7..db075bc0d952 100644
--- a/drivers/i2c/busses/i2c-qcom-geni.c
+++ b/drivers/i2c/busses/i2c-qcom-geni.c
@@ -571,18 +571,19 @@ static int geni_i2c_probe(struct platform_device *pdev)
571 571
572 dev_dbg(&pdev->dev, "i2c fifo/se-dma mode. fifo depth:%d\n", tx_depth); 572 dev_dbg(&pdev->dev, "i2c fifo/se-dma mode. fifo depth:%d\n", tx_depth);
573 573
574 ret = i2c_add_adapter(&gi2c->adap);
575 if (ret) {
576 dev_err(&pdev->dev, "Error adding i2c adapter %d\n", ret);
577 return ret;
578 }
579
580 gi2c->suspended = 1; 574 gi2c->suspended = 1;
581 pm_runtime_set_suspended(gi2c->se.dev); 575 pm_runtime_set_suspended(gi2c->se.dev);
582 pm_runtime_set_autosuspend_delay(gi2c->se.dev, I2C_AUTO_SUSPEND_DELAY); 576 pm_runtime_set_autosuspend_delay(gi2c->se.dev, I2C_AUTO_SUSPEND_DELAY);
583 pm_runtime_use_autosuspend(gi2c->se.dev); 577 pm_runtime_use_autosuspend(gi2c->se.dev);
584 pm_runtime_enable(gi2c->se.dev); 578 pm_runtime_enable(gi2c->se.dev);
585 579
580 ret = i2c_add_adapter(&gi2c->adap);
581 if (ret) {
582 dev_err(&pdev->dev, "Error adding i2c adapter %d\n", ret);
583 pm_runtime_disable(gi2c->se.dev);
584 return ret;
585 }
586
586 return 0; 587 return 0;
587} 588}
588 589
@@ -590,8 +591,8 @@ static int geni_i2c_remove(struct platform_device *pdev)
590{ 591{
591 struct geni_i2c_dev *gi2c = platform_get_drvdata(pdev); 592 struct geni_i2c_dev *gi2c = platform_get_drvdata(pdev);
592 593
593 pm_runtime_disable(gi2c->se.dev);
594 i2c_del_adapter(&gi2c->adap); 594 i2c_del_adapter(&gi2c->adap);
595 pm_runtime_disable(gi2c->se.dev);
595 return 0; 596 return 0;
596} 597}
597 598
diff --git a/drivers/leds/trigger/ledtrig-pattern.c b/drivers/leds/trigger/ledtrig-pattern.c
index ce7acd115dd8..1870cf87afe1 100644
--- a/drivers/leds/trigger/ledtrig-pattern.c
+++ b/drivers/leds/trigger/ledtrig-pattern.c
@@ -75,8 +75,6 @@ static void pattern_trig_timer_function(struct timer_list *t)
75{ 75{
76 struct pattern_trig_data *data = from_timer(data, t, timer); 76 struct pattern_trig_data *data = from_timer(data, t, timer);
77 77
78 mutex_lock(&data->lock);
79
80 for (;;) { 78 for (;;) {
81 if (!data->is_indefinite && !data->repeat) 79 if (!data->is_indefinite && !data->repeat)
82 break; 80 break;
@@ -87,9 +85,10 @@ static void pattern_trig_timer_function(struct timer_list *t)
87 data->curr->brightness); 85 data->curr->brightness);
88 mod_timer(&data->timer, 86 mod_timer(&data->timer,
89 jiffies + msecs_to_jiffies(data->curr->delta_t)); 87 jiffies + msecs_to_jiffies(data->curr->delta_t));
90 88 if (!data->next->delta_t) {
91 /* Skip the tuple with zero duration */ 89 /* Skip the tuple with zero duration */
92 pattern_trig_update_patterns(data); 90 pattern_trig_update_patterns(data);
91 }
93 /* Select next tuple */ 92 /* Select next tuple */
94 pattern_trig_update_patterns(data); 93 pattern_trig_update_patterns(data);
95 } else { 94 } else {
@@ -116,8 +115,6 @@ static void pattern_trig_timer_function(struct timer_list *t)
116 115
117 break; 116 break;
118 } 117 }
119
120 mutex_unlock(&data->lock);
121} 118}
122 119
123static int pattern_trig_start_pattern(struct led_classdev *led_cdev) 120static int pattern_trig_start_pattern(struct led_classdev *led_cdev)
@@ -176,14 +173,10 @@ static ssize_t repeat_store(struct device *dev, struct device_attribute *attr,
176 if (res < -1 || res == 0) 173 if (res < -1 || res == 0)
177 return -EINVAL; 174 return -EINVAL;
178 175
179 /*
180 * Clear previous patterns' performence firstly, and remove the timer
181 * without mutex lock to avoid dead lock.
182 */
183 del_timer_sync(&data->timer);
184
185 mutex_lock(&data->lock); 176 mutex_lock(&data->lock);
186 177
178 del_timer_sync(&data->timer);
179
187 if (data->is_hw_pattern) 180 if (data->is_hw_pattern)
188 led_cdev->pattern_clear(led_cdev); 181 led_cdev->pattern_clear(led_cdev);
189 182
@@ -234,14 +227,10 @@ static ssize_t pattern_trig_store_patterns(struct led_classdev *led_cdev,
234 struct pattern_trig_data *data = led_cdev->trigger_data; 227 struct pattern_trig_data *data = led_cdev->trigger_data;
235 int ccount, cr, offset = 0, err = 0; 228 int ccount, cr, offset = 0, err = 0;
236 229
237 /*
238 * Clear previous patterns' performence firstly, and remove the timer
239 * without mutex lock to avoid dead lock.
240 */
241 del_timer_sync(&data->timer);
242
243 mutex_lock(&data->lock); 230 mutex_lock(&data->lock);
244 231
232 del_timer_sync(&data->timer);
233
245 if (data->is_hw_pattern) 234 if (data->is_hw_pattern)
246 led_cdev->pattern_clear(led_cdev); 235 led_cdev->pattern_clear(led_cdev);
247 236
diff --git a/drivers/mtd/devices/Kconfig b/drivers/mtd/devices/Kconfig
index e514d57a0419..aa983422aa97 100644
--- a/drivers/mtd/devices/Kconfig
+++ b/drivers/mtd/devices/Kconfig
@@ -207,7 +207,7 @@ comment "Disk-On-Chip Device Drivers"
207config MTD_DOCG3 207config MTD_DOCG3
208 tristate "M-Systems Disk-On-Chip G3" 208 tristate "M-Systems Disk-On-Chip G3"
209 select BCH 209 select BCH
210 select BCH_CONST_PARAMS 210 select BCH_CONST_PARAMS if !MTD_NAND_BCH
211 select BITREVERSE 211 select BITREVERSE
212 help 212 help
213 This provides an MTD device driver for the M-Systems DiskOnChip 213 This provides an MTD device driver for the M-Systems DiskOnChip
diff --git a/drivers/mtd/maps/sa1100-flash.c b/drivers/mtd/maps/sa1100-flash.c
index 784c6e1a0391..fd5fe12d7461 100644
--- a/drivers/mtd/maps/sa1100-flash.c
+++ b/drivers/mtd/maps/sa1100-flash.c
@@ -221,7 +221,14 @@ static struct sa_info *sa1100_setup_mtd(struct platform_device *pdev,
221 info->mtd = info->subdev[0].mtd; 221 info->mtd = info->subdev[0].mtd;
222 ret = 0; 222 ret = 0;
223 } else if (info->num_subdev > 1) { 223 } else if (info->num_subdev > 1) {
224 struct mtd_info *cdev[nr]; 224 struct mtd_info **cdev;
225
226 cdev = kmalloc_array(nr, sizeof(*cdev), GFP_KERNEL);
227 if (!cdev) {
228 ret = -ENOMEM;
229 goto err;
230 }
231
225 /* 232 /*
226 * We detected multiple devices. Concatenate them together. 233 * We detected multiple devices. Concatenate them together.
227 */ 234 */
@@ -230,6 +237,7 @@ static struct sa_info *sa1100_setup_mtd(struct platform_device *pdev,
230 237
231 info->mtd = mtd_concat_create(cdev, info->num_subdev, 238 info->mtd = mtd_concat_create(cdev, info->num_subdev,
232 plat->name); 239 plat->name);
240 kfree(cdev);
233 if (info->mtd == NULL) { 241 if (info->mtd == NULL) {
234 ret = -ENXIO; 242 ret = -ENXIO;
235 goto err; 243 goto err;
diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c
index 05bd0779fe9b..71050a0b31df 100644
--- a/drivers/mtd/nand/raw/nand_base.c
+++ b/drivers/mtd/nand/raw/nand_base.c
@@ -590,7 +590,6 @@ retry:
590 590
591/** 591/**
592 * panic_nand_wait - [GENERIC] wait until the command is done 592 * panic_nand_wait - [GENERIC] wait until the command is done
593 * @mtd: MTD device structure
594 * @chip: NAND chip structure 593 * @chip: NAND chip structure
595 * @timeo: timeout 594 * @timeo: timeout
596 * 595 *
diff --git a/drivers/mtd/spi-nor/cadence-quadspi.c b/drivers/mtd/spi-nor/cadence-quadspi.c
index e24db817154e..d846428ef038 100644
--- a/drivers/mtd/spi-nor/cadence-quadspi.c
+++ b/drivers/mtd/spi-nor/cadence-quadspi.c
@@ -996,7 +996,7 @@ static int cqspi_direct_read_execute(struct spi_nor *nor, u_char *buf,
996err_unmap: 996err_unmap:
997 dma_unmap_single(nor->dev, dma_dst, len, DMA_FROM_DEVICE); 997 dma_unmap_single(nor->dev, dma_dst, len, DMA_FROM_DEVICE);
998 998
999 return 0; 999 return ret;
1000} 1000}
1001 1001
1002static ssize_t cqspi_read(struct spi_nor *nor, loff_t from, 1002static ssize_t cqspi_read(struct spi_nor *nor, loff_t from,
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index 9407ca5f9443..3e54e31889c7 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -3250,12 +3250,14 @@ static int spi_nor_init_params(struct spi_nor *nor,
3250 memcpy(&sfdp_params, params, sizeof(sfdp_params)); 3250 memcpy(&sfdp_params, params, sizeof(sfdp_params));
3251 memcpy(&prev_map, &nor->erase_map, sizeof(prev_map)); 3251 memcpy(&prev_map, &nor->erase_map, sizeof(prev_map));
3252 3252
3253 if (spi_nor_parse_sfdp(nor, &sfdp_params)) 3253 if (spi_nor_parse_sfdp(nor, &sfdp_params)) {
3254 nor->addr_width = 0;
3254 /* restore previous erase map */ 3255 /* restore previous erase map */
3255 memcpy(&nor->erase_map, &prev_map, 3256 memcpy(&nor->erase_map, &prev_map,
3256 sizeof(nor->erase_map)); 3257 sizeof(nor->erase_map));
3257 else 3258 } else {
3258 memcpy(params, &sfdp_params, sizeof(*params)); 3259 memcpy(params, &sfdp_params, sizeof(*params));
3260 }
3259 } 3261 }
3260 3262
3261 return 0; 3263 return 0;
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index ffa37adb7681..333387f1f1fe 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -3112,13 +3112,13 @@ static int bond_slave_netdev_event(unsigned long event,
3112 case NETDEV_CHANGE: 3112 case NETDEV_CHANGE:
3113 /* For 802.3ad mode only: 3113 /* For 802.3ad mode only:
3114 * Getting invalid Speed/Duplex values here will put slave 3114 * Getting invalid Speed/Duplex values here will put slave
3115 * in weird state. So mark it as link-down for the time 3115 * in weird state. So mark it as link-fail for the time
3116 * being and let link-monitoring (miimon) set it right when 3116 * being and let link-monitoring (miimon) set it right when
3117 * correct speeds/duplex are available. 3117 * correct speeds/duplex are available.
3118 */ 3118 */
3119 if (bond_update_speed_duplex(slave) && 3119 if (bond_update_speed_duplex(slave) &&
3120 BOND_MODE(bond) == BOND_MODE_8023AD) 3120 BOND_MODE(bond) == BOND_MODE_8023AD)
3121 slave->link = BOND_LINK_DOWN; 3121 slave->link = BOND_LINK_FAIL;
3122 3122
3123 if (BOND_MODE(bond) == BOND_MODE_8023AD) 3123 if (BOND_MODE(bond) == BOND_MODE_8023AD)
3124 bond_3ad_adapter_speed_duplex_changed(slave); 3124 bond_3ad_adapter_speed_duplex_changed(slave);
diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c
index 54e0ca6ed730..86b6464b4525 100644
--- a/drivers/net/dsa/microchip/ksz_common.c
+++ b/drivers/net/dsa/microchip/ksz_common.c
@@ -1117,11 +1117,6 @@ static int ksz_switch_init(struct ksz_device *dev)
1117{ 1117{
1118 int i; 1118 int i;
1119 1119
1120 mutex_init(&dev->reg_mutex);
1121 mutex_init(&dev->stats_mutex);
1122 mutex_init(&dev->alu_mutex);
1123 mutex_init(&dev->vlan_mutex);
1124
1125 dev->ds->ops = &ksz_switch_ops; 1120 dev->ds->ops = &ksz_switch_ops;
1126 1121
1127 for (i = 0; i < ARRAY_SIZE(ksz_switch_chips); i++) { 1122 for (i = 0; i < ARRAY_SIZE(ksz_switch_chips); i++) {
@@ -1206,6 +1201,11 @@ int ksz_switch_register(struct ksz_device *dev)
1206 if (dev->pdata) 1201 if (dev->pdata)
1207 dev->chip_id = dev->pdata->chip_id; 1202 dev->chip_id = dev->pdata->chip_id;
1208 1203
1204 mutex_init(&dev->reg_mutex);
1205 mutex_init(&dev->stats_mutex);
1206 mutex_init(&dev->alu_mutex);
1207 mutex_init(&dev->vlan_mutex);
1208
1209 if (ksz_switch_detect(dev)) 1209 if (ksz_switch_detect(dev))
1210 return -EINVAL; 1210 return -EINVAL;
1211 1211
diff --git a/drivers/net/dsa/mv88e6xxx/global1.c b/drivers/net/dsa/mv88e6xxx/global1.c
index d721ccf7d8be..38e399e0f30e 100644
--- a/drivers/net/dsa/mv88e6xxx/global1.c
+++ b/drivers/net/dsa/mv88e6xxx/global1.c
@@ -567,6 +567,8 @@ int mv88e6xxx_g1_stats_clear(struct mv88e6xxx_chip *chip)
567 if (err) 567 if (err)
568 return err; 568 return err;
569 569
570 /* Keep the histogram mode bits */
571 val &= MV88E6XXX_G1_STATS_OP_HIST_RX_TX;
570 val |= MV88E6XXX_G1_STATS_OP_BUSY | MV88E6XXX_G1_STATS_OP_FLUSH_ALL; 572 val |= MV88E6XXX_G1_STATS_OP_BUSY | MV88E6XXX_G1_STATS_OP_FLUSH_ALL;
571 573
572 err = mv88e6xxx_g1_write(chip, MV88E6XXX_G1_STATS_OP, val); 574 err = mv88e6xxx_g1_write(chip, MV88E6XXX_G1_STATS_OP, val);
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
index 6a633c70f603..99ef1daaa4d8 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
@@ -407,13 +407,13 @@ static void aq_ethtool_get_pauseparam(struct net_device *ndev,
407 struct ethtool_pauseparam *pause) 407 struct ethtool_pauseparam *pause)
408{ 408{
409 struct aq_nic_s *aq_nic = netdev_priv(ndev); 409 struct aq_nic_s *aq_nic = netdev_priv(ndev);
410 u32 fc = aq_nic->aq_nic_cfg.flow_control;
410 411
411 pause->autoneg = 0; 412 pause->autoneg = 0;
412 413
413 if (aq_nic->aq_hw->aq_nic_cfg->flow_control & AQ_NIC_FC_RX) 414 pause->rx_pause = !!(fc & AQ_NIC_FC_RX);
414 pause->rx_pause = 1; 415 pause->tx_pause = !!(fc & AQ_NIC_FC_TX);
415 if (aq_nic->aq_hw->aq_nic_cfg->flow_control & AQ_NIC_FC_TX) 416
416 pause->tx_pause = 1;
417} 417}
418 418
419static int aq_ethtool_set_pauseparam(struct net_device *ndev, 419static int aq_ethtool_set_pauseparam(struct net_device *ndev,
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_hw.h b/drivers/net/ethernet/aquantia/atlantic/aq_hw.h
index e8689241204e..a1e70da358ca 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_hw.h
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_hw.h
@@ -204,6 +204,10 @@ struct aq_hw_ops {
204 204
205 int (*hw_get_fw_version)(struct aq_hw_s *self, u32 *fw_version); 205 int (*hw_get_fw_version)(struct aq_hw_s *self, u32 *fw_version);
206 206
207 int (*hw_set_offload)(struct aq_hw_s *self,
208 struct aq_nic_cfg_s *aq_nic_cfg);
209
210 int (*hw_set_fc)(struct aq_hw_s *self, u32 fc, u32 tc);
207}; 211};
208 212
209struct aq_fw_ops { 213struct aq_fw_ops {
@@ -226,6 +230,8 @@ struct aq_fw_ops {
226 230
227 int (*update_stats)(struct aq_hw_s *self); 231 int (*update_stats)(struct aq_hw_s *self);
228 232
233 u32 (*get_flow_control)(struct aq_hw_s *self, u32 *fcmode);
234
229 int (*set_flow_control)(struct aq_hw_s *self); 235 int (*set_flow_control)(struct aq_hw_s *self);
230 236
231 int (*set_power)(struct aq_hw_s *self, unsigned int power_state, 237 int (*set_power)(struct aq_hw_s *self, unsigned int power_state,
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_main.c b/drivers/net/ethernet/aquantia/atlantic/aq_main.c
index e3ae29e523f0..7c07eef275eb 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_main.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_main.c
@@ -99,8 +99,11 @@ static int aq_ndev_set_features(struct net_device *ndev,
99 struct aq_nic_s *aq_nic = netdev_priv(ndev); 99 struct aq_nic_s *aq_nic = netdev_priv(ndev);
100 struct aq_nic_cfg_s *aq_cfg = aq_nic_get_cfg(aq_nic); 100 struct aq_nic_cfg_s *aq_cfg = aq_nic_get_cfg(aq_nic);
101 bool is_lro = false; 101 bool is_lro = false;
102 int err = 0;
103
104 aq_cfg->features = features;
102 105
103 if (aq_cfg->hw_features & NETIF_F_LRO) { 106 if (aq_cfg->aq_hw_caps->hw_features & NETIF_F_LRO) {
104 is_lro = features & NETIF_F_LRO; 107 is_lro = features & NETIF_F_LRO;
105 108
106 if (aq_cfg->is_lro != is_lro) { 109 if (aq_cfg->is_lro != is_lro) {
@@ -112,8 +115,11 @@ static int aq_ndev_set_features(struct net_device *ndev,
112 } 115 }
113 } 116 }
114 } 117 }
118 if ((aq_nic->ndev->features ^ features) & NETIF_F_RXCSUM)
119 err = aq_nic->aq_hw_ops->hw_set_offload(aq_nic->aq_hw,
120 aq_cfg);
115 121
116 return 0; 122 return err;
117} 123}
118 124
119static int aq_ndev_set_mac_address(struct net_device *ndev, void *addr) 125static int aq_ndev_set_mac_address(struct net_device *ndev, void *addr)
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
index 5fed24446687..7abdc0952425 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
@@ -118,12 +118,13 @@ void aq_nic_cfg_start(struct aq_nic_s *self)
118 } 118 }
119 119
120 cfg->link_speed_msk &= cfg->aq_hw_caps->link_speed_msk; 120 cfg->link_speed_msk &= cfg->aq_hw_caps->link_speed_msk;
121 cfg->hw_features = cfg->aq_hw_caps->hw_features; 121 cfg->features = cfg->aq_hw_caps->hw_features;
122} 122}
123 123
124static int aq_nic_update_link_status(struct aq_nic_s *self) 124static int aq_nic_update_link_status(struct aq_nic_s *self)
125{ 125{
126 int err = self->aq_fw_ops->update_link_status(self->aq_hw); 126 int err = self->aq_fw_ops->update_link_status(self->aq_hw);
127 u32 fc = 0;
127 128
128 if (err) 129 if (err)
129 return err; 130 return err;
@@ -133,6 +134,15 @@ static int aq_nic_update_link_status(struct aq_nic_s *self)
133 AQ_CFG_DRV_NAME, self->link_status.mbps, 134 AQ_CFG_DRV_NAME, self->link_status.mbps,
134 self->aq_hw->aq_link_status.mbps); 135 self->aq_hw->aq_link_status.mbps);
135 aq_nic_update_interrupt_moderation_settings(self); 136 aq_nic_update_interrupt_moderation_settings(self);
137
138 /* Driver has to update flow control settings on RX block
139 * on any link event.
140 * We should query FW whether it negotiated FC.
141 */
142 if (self->aq_fw_ops->get_flow_control)
143 self->aq_fw_ops->get_flow_control(self->aq_hw, &fc);
144 if (self->aq_hw_ops->hw_set_fc)
145 self->aq_hw_ops->hw_set_fc(self->aq_hw, fc, 0);
136 } 146 }
137 147
138 self->link_status = self->aq_hw->aq_link_status; 148 self->link_status = self->aq_hw->aq_link_status;
@@ -590,7 +600,7 @@ int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev)
590 } 600 }
591 } 601 }
592 602
593 if (i > 0 && i < AQ_HW_MULTICAST_ADDRESS_MAX) { 603 if (i > 0 && i <= AQ_HW_MULTICAST_ADDRESS_MAX) {
594 packet_filter |= IFF_MULTICAST; 604 packet_filter |= IFF_MULTICAST;
595 self->mc_list.count = i; 605 self->mc_list.count = i;
596 self->aq_hw_ops->hw_multicast_list_set(self->aq_hw, 606 self->aq_hw_ops->hw_multicast_list_set(self->aq_hw,
@@ -772,7 +782,9 @@ void aq_nic_get_link_ksettings(struct aq_nic_s *self,
772 ethtool_link_ksettings_add_link_mode(cmd, advertising, 782 ethtool_link_ksettings_add_link_mode(cmd, advertising,
773 Pause); 783 Pause);
774 784
775 if (self->aq_nic_cfg.flow_control & AQ_NIC_FC_TX) 785 /* Asym is when either RX or TX, but not both */
786 if (!!(self->aq_nic_cfg.flow_control & AQ_NIC_FC_TX) ^
787 !!(self->aq_nic_cfg.flow_control & AQ_NIC_FC_RX))
776 ethtool_link_ksettings_add_link_mode(cmd, advertising, 788 ethtool_link_ksettings_add_link_mode(cmd, advertising,
777 Asym_Pause); 789 Asym_Pause);
778 790
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
index c1582f4e8e1b..44ec47a3d60a 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h
@@ -23,7 +23,7 @@ struct aq_vec_s;
23 23
24struct aq_nic_cfg_s { 24struct aq_nic_cfg_s {
25 const struct aq_hw_caps_s *aq_hw_caps; 25 const struct aq_hw_caps_s *aq_hw_caps;
26 u64 hw_features; 26 u64 features;
27 u32 rxds; /* rx ring size, descriptors # */ 27 u32 rxds; /* rx ring size, descriptors # */
28 u32 txds; /* tx ring size, descriptors # */ 28 u32 txds; /* tx ring size, descriptors # */
29 u32 vecs; /* vecs==allocated irqs */ 29 u32 vecs; /* vecs==allocated irqs */
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
index 3db91446cc67..74550ccc7a20 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c
@@ -172,6 +172,27 @@ bool aq_ring_tx_clean(struct aq_ring_s *self)
172 return !!budget; 172 return !!budget;
173} 173}
174 174
175static void aq_rx_checksum(struct aq_ring_s *self,
176 struct aq_ring_buff_s *buff,
177 struct sk_buff *skb)
178{
179 if (!(self->aq_nic->ndev->features & NETIF_F_RXCSUM))
180 return;
181
182 if (unlikely(buff->is_cso_err)) {
183 ++self->stats.rx.errors;
184 skb->ip_summed = CHECKSUM_NONE;
185 return;
186 }
187 if (buff->is_ip_cso) {
188 __skb_incr_checksum_unnecessary(skb);
189 if (buff->is_udp_cso || buff->is_tcp_cso)
190 __skb_incr_checksum_unnecessary(skb);
191 } else {
192 skb->ip_summed = CHECKSUM_NONE;
193 }
194}
195
175#define AQ_SKB_ALIGN SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) 196#define AQ_SKB_ALIGN SKB_DATA_ALIGN(sizeof(struct skb_shared_info))
176int aq_ring_rx_clean(struct aq_ring_s *self, 197int aq_ring_rx_clean(struct aq_ring_s *self,
177 struct napi_struct *napi, 198 struct napi_struct *napi,
@@ -267,18 +288,8 @@ int aq_ring_rx_clean(struct aq_ring_s *self,
267 } 288 }
268 289
269 skb->protocol = eth_type_trans(skb, ndev); 290 skb->protocol = eth_type_trans(skb, ndev);
270 if (unlikely(buff->is_cso_err)) { 291
271 ++self->stats.rx.errors; 292 aq_rx_checksum(self, buff, skb);
272 skb->ip_summed = CHECKSUM_NONE;
273 } else {
274 if (buff->is_ip_cso) {
275 __skb_incr_checksum_unnecessary(skb);
276 if (buff->is_udp_cso || buff->is_tcp_cso)
277 __skb_incr_checksum_unnecessary(skb);
278 } else {
279 skb->ip_summed = CHECKSUM_NONE;
280 }
281 }
282 293
283 skb_set_hash(skb, buff->rss_hash, 294 skb_set_hash(skb, buff->rss_hash,
284 buff->is_hash_l4 ? PKT_HASH_TYPE_L4 : 295 buff->is_hash_l4 ? PKT_HASH_TYPE_L4 :
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c
index 76d25d594a0f..f02592f43fe3 100644
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c
@@ -100,12 +100,17 @@ static int hw_atl_b0_hw_reset(struct aq_hw_s *self)
100 return err; 100 return err;
101} 101}
102 102
103static int hw_atl_b0_set_fc(struct aq_hw_s *self, u32 fc, u32 tc)
104{
105 hw_atl_rpb_rx_xoff_en_per_tc_set(self, !!(fc & AQ_NIC_FC_RX), tc);
106 return 0;
107}
108
103static int hw_atl_b0_hw_qos_set(struct aq_hw_s *self) 109static int hw_atl_b0_hw_qos_set(struct aq_hw_s *self)
104{ 110{
105 u32 tc = 0U; 111 u32 tc = 0U;
106 u32 buff_size = 0U; 112 u32 buff_size = 0U;
107 unsigned int i_priority = 0U; 113 unsigned int i_priority = 0U;
108 bool is_rx_flow_control = false;
109 114
110 /* TPS Descriptor rate init */ 115 /* TPS Descriptor rate init */
111 hw_atl_tps_tx_pkt_shed_desc_rate_curr_time_res_set(self, 0x0U); 116 hw_atl_tps_tx_pkt_shed_desc_rate_curr_time_res_set(self, 0x0U);
@@ -138,7 +143,6 @@ static int hw_atl_b0_hw_qos_set(struct aq_hw_s *self)
138 143
139 /* QoS Rx buf size per TC */ 144 /* QoS Rx buf size per TC */
140 tc = 0; 145 tc = 0;
141 is_rx_flow_control = (AQ_NIC_FC_RX & self->aq_nic_cfg->flow_control);
142 buff_size = HW_ATL_B0_RXBUF_MAX; 146 buff_size = HW_ATL_B0_RXBUF_MAX;
143 147
144 hw_atl_rpb_rx_pkt_buff_size_per_tc_set(self, buff_size, tc); 148 hw_atl_rpb_rx_pkt_buff_size_per_tc_set(self, buff_size, tc);
@@ -150,7 +154,8 @@ static int hw_atl_b0_hw_qos_set(struct aq_hw_s *self)
150 (buff_size * 154 (buff_size *
151 (1024U / 32U) * 50U) / 155 (1024U / 32U) * 50U) /
152 100U, tc); 156 100U, tc);
153 hw_atl_rpb_rx_xoff_en_per_tc_set(self, is_rx_flow_control ? 1U : 0U, tc); 157
158 hw_atl_b0_set_fc(self, self->aq_nic_cfg->flow_control, tc);
154 159
155 /* QoS 802.1p priority -> TC mapping */ 160 /* QoS 802.1p priority -> TC mapping */
156 for (i_priority = 8U; i_priority--;) 161 for (i_priority = 8U; i_priority--;)
@@ -229,8 +234,10 @@ static int hw_atl_b0_hw_offload_set(struct aq_hw_s *self,
229 hw_atl_tpo_tcp_udp_crc_offload_en_set(self, 1); 234 hw_atl_tpo_tcp_udp_crc_offload_en_set(self, 1);
230 235
231 /* RX checksums offloads*/ 236 /* RX checksums offloads*/
232 hw_atl_rpo_ipv4header_crc_offload_en_set(self, 1); 237 hw_atl_rpo_ipv4header_crc_offload_en_set(self, !!(aq_nic_cfg->features &
233 hw_atl_rpo_tcp_udp_crc_offload_en_set(self, 1); 238 NETIF_F_RXCSUM));
239 hw_atl_rpo_tcp_udp_crc_offload_en_set(self, !!(aq_nic_cfg->features &
240 NETIF_F_RXCSUM));
234 241
235 /* LSO offloads*/ 242 /* LSO offloads*/
236 hw_atl_tdm_large_send_offload_en_set(self, 0xFFFFFFFFU); 243 hw_atl_tdm_large_send_offload_en_set(self, 0xFFFFFFFFU);
@@ -655,9 +662,9 @@ static int hw_atl_b0_hw_ring_rx_receive(struct aq_hw_s *self,
655 struct hw_atl_rxd_wb_s *rxd_wb = (struct hw_atl_rxd_wb_s *) 662 struct hw_atl_rxd_wb_s *rxd_wb = (struct hw_atl_rxd_wb_s *)
656 &ring->dx_ring[ring->hw_head * HW_ATL_B0_RXD_SIZE]; 663 &ring->dx_ring[ring->hw_head * HW_ATL_B0_RXD_SIZE];
657 664
658 unsigned int is_err = 1U;
659 unsigned int is_rx_check_sum_enabled = 0U; 665 unsigned int is_rx_check_sum_enabled = 0U;
660 unsigned int pkt_type = 0U; 666 unsigned int pkt_type = 0U;
667 u8 rx_stat = 0U;
661 668
662 if (!(rxd_wb->status & 0x1U)) { /* RxD is not done */ 669 if (!(rxd_wb->status & 0x1U)) { /* RxD is not done */
663 break; 670 break;
@@ -665,35 +672,35 @@ static int hw_atl_b0_hw_ring_rx_receive(struct aq_hw_s *self,
665 672
666 buff = &ring->buff_ring[ring->hw_head]; 673 buff = &ring->buff_ring[ring->hw_head];
667 674
668 is_err = (0x0000003CU & rxd_wb->status); 675 rx_stat = (0x0000003CU & rxd_wb->status) >> 2;
669 676
670 is_rx_check_sum_enabled = (rxd_wb->type) & (0x3U << 19); 677 is_rx_check_sum_enabled = (rxd_wb->type) & (0x3U << 19);
671 is_err &= ~0x20U; /* exclude validity bit */
672 678
673 pkt_type = 0xFFU & (rxd_wb->type >> 4); 679 pkt_type = 0xFFU & (rxd_wb->type >> 4);
674 680
675 if (is_rx_check_sum_enabled) { 681 if (is_rx_check_sum_enabled & BIT(0) &&
676 if (0x0U == (pkt_type & 0x3U)) 682 (0x0U == (pkt_type & 0x3U)))
677 buff->is_ip_cso = (is_err & 0x08U) ? 0U : 1U; 683 buff->is_ip_cso = (rx_stat & BIT(1)) ? 0U : 1U;
678 684
685 if (is_rx_check_sum_enabled & BIT(1)) {
679 if (0x4U == (pkt_type & 0x1CU)) 686 if (0x4U == (pkt_type & 0x1CU))
680 buff->is_udp_cso = buff->is_cso_err ? 0U : 1U; 687 buff->is_udp_cso = (rx_stat & BIT(2)) ? 0U :
688 !!(rx_stat & BIT(3));
681 else if (0x0U == (pkt_type & 0x1CU)) 689 else if (0x0U == (pkt_type & 0x1CU))
682 buff->is_tcp_cso = buff->is_cso_err ? 0U : 1U; 690 buff->is_tcp_cso = (rx_stat & BIT(2)) ? 0U :
683 691 !!(rx_stat & BIT(3));
684 /* Checksum offload workaround for small packets */ 692 }
685 if (rxd_wb->pkt_len <= 60) { 693 buff->is_cso_err = !!(rx_stat & 0x6);
686 buff->is_ip_cso = 0U; 694 /* Checksum offload workaround for small packets */
687 buff->is_cso_err = 0U; 695 if (unlikely(rxd_wb->pkt_len <= 60)) {
688 } 696 buff->is_ip_cso = 0U;
697 buff->is_cso_err = 0U;
689 } 698 }
690
691 is_err &= ~0x18U;
692 699
693 dma_unmap_page(ndev, buff->pa, buff->len, DMA_FROM_DEVICE); 700 dma_unmap_page(ndev, buff->pa, buff->len, DMA_FROM_DEVICE);
694 701
695 if (is_err || rxd_wb->type & 0x1000U) { 702 if ((rx_stat & BIT(0)) || rxd_wb->type & 0x1000U) {
696 /* status error or DMA error */ 703 /* MAC error or DMA error */
697 buff->is_error = 1U; 704 buff->is_error = 1U;
698 } else { 705 } else {
699 if (self->aq_nic_cfg->is_rss) { 706 if (self->aq_nic_cfg->is_rss) {
@@ -915,6 +922,12 @@ static int hw_atl_b0_hw_interrupt_moderation_set(struct aq_hw_s *self)
915static int hw_atl_b0_hw_stop(struct aq_hw_s *self) 922static int hw_atl_b0_hw_stop(struct aq_hw_s *self)
916{ 923{
917 hw_atl_b0_hw_irq_disable(self, HW_ATL_B0_INT_MASK); 924 hw_atl_b0_hw_irq_disable(self, HW_ATL_B0_INT_MASK);
925
926 /* Invalidate Descriptor Cache to prevent writing to the cached
927 * descriptors and to the data pointer of those descriptors
928 */
929 hw_atl_rdm_rx_dma_desc_cache_init_set(self, 1);
930
918 return aq_hw_err_from_flags(self); 931 return aq_hw_err_from_flags(self);
919} 932}
920 933
@@ -963,4 +976,6 @@ const struct aq_hw_ops hw_atl_ops_b0 = {
963 .hw_get_regs = hw_atl_utils_hw_get_regs, 976 .hw_get_regs = hw_atl_utils_hw_get_regs,
964 .hw_get_hw_stats = hw_atl_utils_get_hw_stats, 977 .hw_get_hw_stats = hw_atl_utils_get_hw_stats,
965 .hw_get_fw_version = hw_atl_utils_get_fw_version, 978 .hw_get_fw_version = hw_atl_utils_get_fw_version,
979 .hw_set_offload = hw_atl_b0_hw_offload_set,
980 .hw_set_fc = hw_atl_b0_set_fc,
966}; 981};
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c
index be0a3a90dfad..5502ec5f0f69 100644
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.c
@@ -619,6 +619,14 @@ void hw_atl_rpb_rx_flow_ctl_mode_set(struct aq_hw_s *aq_hw, u32 rx_flow_ctl_mode
619 HW_ATL_RPB_RX_FC_MODE_SHIFT, rx_flow_ctl_mode); 619 HW_ATL_RPB_RX_FC_MODE_SHIFT, rx_flow_ctl_mode);
620} 620}
621 621
622void hw_atl_rdm_rx_dma_desc_cache_init_set(struct aq_hw_s *aq_hw, u32 init)
623{
624 aq_hw_write_reg_bit(aq_hw, HW_ATL_RDM_RX_DMA_DESC_CACHE_INIT_ADR,
625 HW_ATL_RDM_RX_DMA_DESC_CACHE_INIT_MSK,
626 HW_ATL_RDM_RX_DMA_DESC_CACHE_INIT_SHIFT,
627 init);
628}
629
622void hw_atl_rpb_rx_pkt_buff_size_per_tc_set(struct aq_hw_s *aq_hw, 630void hw_atl_rpb_rx_pkt_buff_size_per_tc_set(struct aq_hw_s *aq_hw,
623 u32 rx_pkt_buff_size_per_tc, u32 buffer) 631 u32 rx_pkt_buff_size_per_tc, u32 buffer)
624{ 632{
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h
index 7056c7342afc..41f239928c15 100644
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh.h
@@ -325,6 +325,9 @@ void hw_atl_rpb_rx_pkt_buff_size_per_tc_set(struct aq_hw_s *aq_hw,
325 u32 rx_pkt_buff_size_per_tc, 325 u32 rx_pkt_buff_size_per_tc,
326 u32 buffer); 326 u32 buffer);
327 327
328/* set rdm rx dma descriptor cache init */
329void hw_atl_rdm_rx_dma_desc_cache_init_set(struct aq_hw_s *aq_hw, u32 init);
330
328/* set rx xoff enable (per tc) */ 331/* set rx xoff enable (per tc) */
329void hw_atl_rpb_rx_xoff_en_per_tc_set(struct aq_hw_s *aq_hw, u32 rx_xoff_en_per_tc, 332void hw_atl_rpb_rx_xoff_en_per_tc_set(struct aq_hw_s *aq_hw, u32 rx_xoff_en_per_tc,
330 u32 buffer); 333 u32 buffer);
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h
index 716674a9b729..a715fa317b1c 100644
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_llh_internal.h
@@ -293,6 +293,24 @@
293/* default value of bitfield desc{d}_reset */ 293/* default value of bitfield desc{d}_reset */
294#define HW_ATL_RDM_DESCDRESET_DEFAULT 0x0 294#define HW_ATL_RDM_DESCDRESET_DEFAULT 0x0
295 295
296/* rdm_desc_init_i bitfield definitions
297 * preprocessor definitions for the bitfield rdm_desc_init_i.
298 * port="pif_rdm_desc_init_i"
299 */
300
301/* register address for bitfield rdm_desc_init_i */
302#define HW_ATL_RDM_RX_DMA_DESC_CACHE_INIT_ADR 0x00005a00
303/* bitmask for bitfield rdm_desc_init_i */
304#define HW_ATL_RDM_RX_DMA_DESC_CACHE_INIT_MSK 0xffffffff
305/* inverted bitmask for bitfield rdm_desc_init_i */
306#define HW_ATL_RDM_RX_DMA_DESC_CACHE_INIT_MSKN 0x00000000
307/* lower bit position of bitfield rdm_desc_init_i */
308#define HW_ATL_RDM_RX_DMA_DESC_CACHE_INIT_SHIFT 0
309/* width of bitfield rdm_desc_init_i */
310#define HW_ATL_RDM_RX_DMA_DESC_CACHE_INIT_WIDTH 32
311/* default value of bitfield rdm_desc_init_i */
312#define HW_ATL_RDM_RX_DMA_DESC_CACHE_INIT_DEFAULT 0x0
313
296/* rx int_desc_wrb_en bitfield definitions 314/* rx int_desc_wrb_en bitfield definitions
297 * preprocessor definitions for the bitfield "int_desc_wrb_en". 315 * preprocessor definitions for the bitfield "int_desc_wrb_en".
298 * port="pif_rdm_int_desc_wrb_en_i" 316 * port="pif_rdm_int_desc_wrb_en_i"
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c
index 096ca5730887..7de3220d9cab 100644
--- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c
+++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils_fw2x.c
@@ -30,6 +30,8 @@
30#define HW_ATL_FW2X_MPI_STATE_ADDR 0x370 30#define HW_ATL_FW2X_MPI_STATE_ADDR 0x370
31#define HW_ATL_FW2X_MPI_STATE2_ADDR 0x374 31#define HW_ATL_FW2X_MPI_STATE2_ADDR 0x374
32 32
33#define HW_ATL_FW2X_CAP_PAUSE BIT(CAPS_HI_PAUSE)
34#define HW_ATL_FW2X_CAP_ASYM_PAUSE BIT(CAPS_HI_ASYMMETRIC_PAUSE)
33#define HW_ATL_FW2X_CAP_SLEEP_PROXY BIT(CAPS_HI_SLEEP_PROXY) 35#define HW_ATL_FW2X_CAP_SLEEP_PROXY BIT(CAPS_HI_SLEEP_PROXY)
34#define HW_ATL_FW2X_CAP_WOL BIT(CAPS_HI_WOL) 36#define HW_ATL_FW2X_CAP_WOL BIT(CAPS_HI_WOL)
35 37
@@ -451,6 +453,24 @@ static int aq_fw2x_set_flow_control(struct aq_hw_s *self)
451 return 0; 453 return 0;
452} 454}
453 455
456static u32 aq_fw2x_get_flow_control(struct aq_hw_s *self, u32 *fcmode)
457{
458 u32 mpi_state = aq_hw_read_reg(self, HW_ATL_FW2X_MPI_STATE2_ADDR);
459
460 if (mpi_state & HW_ATL_FW2X_CAP_PAUSE)
461 if (mpi_state & HW_ATL_FW2X_CAP_ASYM_PAUSE)
462 *fcmode = AQ_NIC_FC_RX;
463 else
464 *fcmode = AQ_NIC_FC_RX | AQ_NIC_FC_TX;
465 else
466 if (mpi_state & HW_ATL_FW2X_CAP_ASYM_PAUSE)
467 *fcmode = AQ_NIC_FC_TX;
468 else
469 *fcmode = 0;
470
471 return 0;
472}
473
454const struct aq_fw_ops aq_fw_2x_ops = { 474const struct aq_fw_ops aq_fw_2x_ops = {
455 .init = aq_fw2x_init, 475 .init = aq_fw2x_init,
456 .deinit = aq_fw2x_deinit, 476 .deinit = aq_fw2x_deinit,
@@ -465,4 +485,5 @@ const struct aq_fw_ops aq_fw_2x_ops = {
465 .set_eee_rate = aq_fw2x_set_eee_rate, 485 .set_eee_rate = aq_fw2x_set_eee_rate,
466 .get_eee_rate = aq_fw2x_get_eee_rate, 486 .get_eee_rate = aq_fw2x_get_eee_rate,
467 .set_flow_control = aq_fw2x_set_flow_control, 487 .set_flow_control = aq_fw2x_set_flow_control,
488 .get_flow_control = aq_fw2x_get_flow_control
468}; 489};
diff --git a/drivers/net/ethernet/atheros/alx/alx.h b/drivers/net/ethernet/atheros/alx/alx.h
index 78c5de467426..9d0e74f6b089 100644
--- a/drivers/net/ethernet/atheros/alx/alx.h
+++ b/drivers/net/ethernet/atheros/alx/alx.h
@@ -140,6 +140,5 @@ struct alx_priv {
140}; 140};
141 141
142extern const struct ethtool_ops alx_ethtool_ops; 142extern const struct ethtool_ops alx_ethtool_ops;
143extern const char alx_drv_name[];
144 143
145#endif 144#endif
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c
index 7968c644ad86..c131cfc1b79d 100644
--- a/drivers/net/ethernet/atheros/alx/main.c
+++ b/drivers/net/ethernet/atheros/alx/main.c
@@ -49,7 +49,7 @@
49#include "hw.h" 49#include "hw.h"
50#include "reg.h" 50#include "reg.h"
51 51
52const char alx_drv_name[] = "alx"; 52static const char alx_drv_name[] = "alx";
53 53
54static void alx_free_txbuf(struct alx_tx_queue *txq, int entry) 54static void alx_free_txbuf(struct alx_tx_queue *txq, int entry)
55{ 55{
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index 4122553e224b..0e2d99c737e3 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -1902,9 +1902,6 @@ static void bcm_sysport_netif_start(struct net_device *dev)
1902 intrl2_1_mask_clear(priv, 0xffffffff); 1902 intrl2_1_mask_clear(priv, 0xffffffff);
1903 else 1903 else
1904 intrl2_0_mask_clear(priv, INTRL2_0_TDMA_MBDONE_MASK); 1904 intrl2_0_mask_clear(priv, INTRL2_0_TDMA_MBDONE_MASK);
1905
1906 /* Last call before we start the real business */
1907 netif_tx_start_all_queues(dev);
1908} 1905}
1909 1906
1910static void rbuf_init(struct bcm_sysport_priv *priv) 1907static void rbuf_init(struct bcm_sysport_priv *priv)
@@ -2048,6 +2045,8 @@ static int bcm_sysport_open(struct net_device *dev)
2048 2045
2049 bcm_sysport_netif_start(dev); 2046 bcm_sysport_netif_start(dev);
2050 2047
2048 netif_tx_start_all_queues(dev);
2049
2051 return 0; 2050 return 0;
2052 2051
2053out_clear_rx_int: 2052out_clear_rx_int:
@@ -2071,7 +2070,7 @@ static void bcm_sysport_netif_stop(struct net_device *dev)
2071 struct bcm_sysport_priv *priv = netdev_priv(dev); 2070 struct bcm_sysport_priv *priv = netdev_priv(dev);
2072 2071
2073 /* stop all software from updating hardware */ 2072 /* stop all software from updating hardware */
2074 netif_tx_stop_all_queues(dev); 2073 netif_tx_disable(dev);
2075 napi_disable(&priv->napi); 2074 napi_disable(&priv->napi);
2076 cancel_work_sync(&priv->dim.dim.work); 2075 cancel_work_sync(&priv->dim.dim.work);
2077 phy_stop(dev->phydev); 2076 phy_stop(dev->phydev);
@@ -2658,12 +2657,12 @@ static int __maybe_unused bcm_sysport_suspend(struct device *d)
2658 if (!netif_running(dev)) 2657 if (!netif_running(dev))
2659 return 0; 2658 return 0;
2660 2659
2660 netif_device_detach(dev);
2661
2661 bcm_sysport_netif_stop(dev); 2662 bcm_sysport_netif_stop(dev);
2662 2663
2663 phy_suspend(dev->phydev); 2664 phy_suspend(dev->phydev);
2664 2665
2665 netif_device_detach(dev);
2666
2667 /* Disable UniMAC RX */ 2666 /* Disable UniMAC RX */
2668 umac_enable_set(priv, CMD_RX_EN, 0); 2667 umac_enable_set(priv, CMD_RX_EN, 0);
2669 2668
@@ -2746,8 +2745,6 @@ static int __maybe_unused bcm_sysport_resume(struct device *d)
2746 goto out_free_rx_ring; 2745 goto out_free_rx_ring;
2747 } 2746 }
2748 2747
2749 netif_device_attach(dev);
2750
2751 /* RX pipe enable */ 2748 /* RX pipe enable */
2752 topctrl_writel(priv, 0, RX_FLUSH_CNTL); 2749 topctrl_writel(priv, 0, RX_FLUSH_CNTL);
2753 2750
@@ -2788,6 +2785,8 @@ static int __maybe_unused bcm_sysport_resume(struct device *d)
2788 2785
2789 bcm_sysport_netif_start(dev); 2786 bcm_sysport_netif_start(dev);
2790 2787
2788 netif_device_attach(dev);
2789
2791 return 0; 2790 return 0;
2792 2791
2793out_free_rx_ring: 2792out_free_rx_ring:
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 20c1681bb1af..2d6f090bf644 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -2855,7 +2855,6 @@ static void bcmgenet_netif_start(struct net_device *dev)
2855 2855
2856 umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, true); 2856 umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, true);
2857 2857
2858 netif_tx_start_all_queues(dev);
2859 bcmgenet_enable_tx_napi(priv); 2858 bcmgenet_enable_tx_napi(priv);
2860 2859
2861 /* Monitor link interrupts now */ 2860 /* Monitor link interrupts now */
@@ -2937,6 +2936,8 @@ static int bcmgenet_open(struct net_device *dev)
2937 2936
2938 bcmgenet_netif_start(dev); 2937 bcmgenet_netif_start(dev);
2939 2938
2939 netif_tx_start_all_queues(dev);
2940
2940 return 0; 2941 return 0;
2941 2942
2942err_irq1: 2943err_irq1:
@@ -2958,7 +2959,7 @@ static void bcmgenet_netif_stop(struct net_device *dev)
2958 struct bcmgenet_priv *priv = netdev_priv(dev); 2959 struct bcmgenet_priv *priv = netdev_priv(dev);
2959 2960
2960 bcmgenet_disable_tx_napi(priv); 2961 bcmgenet_disable_tx_napi(priv);
2961 netif_tx_stop_all_queues(dev); 2962 netif_tx_disable(dev);
2962 2963
2963 /* Disable MAC receive */ 2964 /* Disable MAC receive */
2964 umac_enable_set(priv, CMD_RX_EN, false); 2965 umac_enable_set(priv, CMD_RX_EN, false);
@@ -3620,13 +3621,13 @@ static int bcmgenet_suspend(struct device *d)
3620 if (!netif_running(dev)) 3621 if (!netif_running(dev))
3621 return 0; 3622 return 0;
3622 3623
3624 netif_device_detach(dev);
3625
3623 bcmgenet_netif_stop(dev); 3626 bcmgenet_netif_stop(dev);
3624 3627
3625 if (!device_may_wakeup(d)) 3628 if (!device_may_wakeup(d))
3626 phy_suspend(dev->phydev); 3629 phy_suspend(dev->phydev);
3627 3630
3628 netif_device_detach(dev);
3629
3630 /* Prepare the device for Wake-on-LAN and switch to the slow clock */ 3631 /* Prepare the device for Wake-on-LAN and switch to the slow clock */
3631 if (device_may_wakeup(d) && priv->wolopts) { 3632 if (device_may_wakeup(d) && priv->wolopts) {
3632 ret = bcmgenet_power_down(priv, GENET_POWER_WOL_MAGIC); 3633 ret = bcmgenet_power_down(priv, GENET_POWER_WOL_MAGIC);
@@ -3700,8 +3701,6 @@ static int bcmgenet_resume(struct device *d)
3700 /* Always enable ring 16 - descriptor ring */ 3701 /* Always enable ring 16 - descriptor ring */
3701 bcmgenet_enable_dma(priv, dma_ctrl); 3702 bcmgenet_enable_dma(priv, dma_ctrl);
3702 3703
3703 netif_device_attach(dev);
3704
3705 if (!device_may_wakeup(d)) 3704 if (!device_may_wakeup(d))
3706 phy_resume(dev->phydev); 3705 phy_resume(dev->phydev);
3707 3706
@@ -3710,6 +3709,8 @@ static int bcmgenet_resume(struct device *d)
3710 3709
3711 bcmgenet_netif_start(dev); 3710 bcmgenet_netif_start(dev);
3712 3711
3712 netif_device_attach(dev);
3713
3713 return 0; 3714 return 0;
3714 3715
3715out_clk_disable: 3716out_clk_disable:
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
index 3f96aa30068e..20fcf0d1c2ce 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
@@ -3760,7 +3760,8 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
3760 /* Hardware table is only clear when pf resets */ 3760 /* Hardware table is only clear when pf resets */
3761 if (!(handle->flags & HNAE3_SUPPORT_VF)) { 3761 if (!(handle->flags & HNAE3_SUPPORT_VF)) {
3762 ret = hns3_restore_vlan(netdev); 3762 ret = hns3_restore_vlan(netdev);
3763 return ret; 3763 if (ret)
3764 return ret;
3764 } 3765 }
3765 3766
3766 ret = hns3_restore_fd_rules(netdev); 3767 ret = hns3_restore_fd_rules(netdev);
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
index aa5cb9834d73..494e562fe8c7 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
@@ -1168,14 +1168,14 @@ static int hclge_pfc_setup_hw(struct hclge_dev *hdev)
1168 */ 1168 */
1169static int hclge_bp_setup_hw(struct hclge_dev *hdev, u8 tc) 1169static int hclge_bp_setup_hw(struct hclge_dev *hdev, u8 tc)
1170{ 1170{
1171 struct hclge_vport *vport = hdev->vport; 1171 int i;
1172 u32 i, k, qs_bitmap;
1173 int ret;
1174 1172
1175 for (i = 0; i < HCLGE_BP_GRP_NUM; i++) { 1173 for (i = 0; i < HCLGE_BP_GRP_NUM; i++) {
1176 qs_bitmap = 0; 1174 u32 qs_bitmap = 0;
1175 int k, ret;
1177 1176
1178 for (k = 0; k < hdev->num_alloc_vport; k++) { 1177 for (k = 0; k < hdev->num_alloc_vport; k++) {
1178 struct hclge_vport *vport = &hdev->vport[k];
1179 u16 qs_id = vport->qs_offset + tc; 1179 u16 qs_id = vport->qs_offset + tc;
1180 u8 grp, sub_grp; 1180 u8 grp, sub_grp;
1181 1181
@@ -1185,8 +1185,6 @@ static int hclge_bp_setup_hw(struct hclge_dev *hdev, u8 tc)
1185 HCLGE_BP_SUB_GRP_ID_S); 1185 HCLGE_BP_SUB_GRP_ID_S);
1186 if (i == grp) 1186 if (i == grp)
1187 qs_bitmap |= (1 << sub_grp); 1187 qs_bitmap |= (1 << sub_grp);
1188
1189 vport++;
1190 } 1188 }
1191 1189
1192 ret = hclge_tm_qs_bp_cfg(hdev, tc, i, qs_bitmap); 1190 ret = hclge_tm_qs_bp_cfg(hdev, tc, i, qs_bitmap);
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 7893beffcc71..c9d5d0a7fbf1 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -1545,7 +1545,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
1545 tx_crq.v1.sge_len = cpu_to_be32(skb->len); 1545 tx_crq.v1.sge_len = cpu_to_be32(skb->len);
1546 tx_crq.v1.ioba = cpu_to_be64(data_dma_addr); 1546 tx_crq.v1.ioba = cpu_to_be64(data_dma_addr);
1547 1547
1548 if (adapter->vlan_header_insertion) { 1548 if (adapter->vlan_header_insertion && skb_vlan_tag_present(skb)) {
1549 tx_crq.v1.flags2 |= IBMVNIC_TX_VLAN_INSERT; 1549 tx_crq.v1.flags2 |= IBMVNIC_TX_VLAN_INSERT;
1550 tx_crq.v1.vlan_id = cpu_to_be16(skb->vlan_tci); 1550 tx_crq.v1.vlan_id = cpu_to_be16(skb->vlan_tci);
1551 } 1551 }
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index bc71a21c1dc2..21c2688d6308 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -12249,6 +12249,8 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
12249 NETIF_F_GSO_GRE | 12249 NETIF_F_GSO_GRE |
12250 NETIF_F_GSO_GRE_CSUM | 12250 NETIF_F_GSO_GRE_CSUM |
12251 NETIF_F_GSO_PARTIAL | 12251 NETIF_F_GSO_PARTIAL |
12252 NETIF_F_GSO_IPXIP4 |
12253 NETIF_F_GSO_IPXIP6 |
12252 NETIF_F_GSO_UDP_TUNNEL | 12254 NETIF_F_GSO_UDP_TUNNEL |
12253 NETIF_F_GSO_UDP_TUNNEL_CSUM | 12255 NETIF_F_GSO_UDP_TUNNEL_CSUM |
12254 NETIF_F_SCTP_CRC | 12256 NETIF_F_SCTP_CRC |
@@ -12266,13 +12268,13 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
12266 /* record features VLANs can make use of */ 12268 /* record features VLANs can make use of */
12267 netdev->vlan_features |= hw_enc_features | NETIF_F_TSO_MANGLEID; 12269 netdev->vlan_features |= hw_enc_features | NETIF_F_TSO_MANGLEID;
12268 12270
12269 if (!(pf->flags & I40E_FLAG_MFP_ENABLED))
12270 netdev->hw_features |= NETIF_F_NTUPLE | NETIF_F_HW_TC;
12271
12272 hw_features = hw_enc_features | 12271 hw_features = hw_enc_features |
12273 NETIF_F_HW_VLAN_CTAG_TX | 12272 NETIF_F_HW_VLAN_CTAG_TX |
12274 NETIF_F_HW_VLAN_CTAG_RX; 12273 NETIF_F_HW_VLAN_CTAG_RX;
12275 12274
12275 if (!(pf->flags & I40E_FLAG_MFP_ENABLED))
12276 hw_features |= NETIF_F_NTUPLE | NETIF_F_HW_TC;
12277
12276 netdev->hw_features |= hw_features; 12278 netdev->hw_features |= hw_features;
12277 12279
12278 netdev->features |= hw_features | NETIF_F_HW_VLAN_CTAG_FILTER; 12280 netdev->features |= hw_features | NETIF_F_HW_VLAN_CTAG_FILTER;
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
index 4c4b5717a627..b8548370f1c7 100644
--- a/drivers/net/ethernet/intel/ice/ice.h
+++ b/drivers/net/ethernet/intel/ice/ice.h
@@ -76,6 +76,8 @@ extern const char ice_drv_ver[];
76#define ICE_MIN_INTR_PER_VF (ICE_MIN_QS_PER_VF + 1) 76#define ICE_MIN_INTR_PER_VF (ICE_MIN_QS_PER_VF + 1)
77#define ICE_DFLT_INTR_PER_VF (ICE_DFLT_QS_PER_VF + 1) 77#define ICE_DFLT_INTR_PER_VF (ICE_DFLT_QS_PER_VF + 1)
78 78
79#define ICE_MAX_RESET_WAIT 20
80
79#define ICE_VSIQF_HKEY_ARRAY_SIZE ((VSIQF_HKEY_MAX_INDEX + 1) * 4) 81#define ICE_VSIQF_HKEY_ARRAY_SIZE ((VSIQF_HKEY_MAX_INDEX + 1) * 4)
80 82
81#define ICE_DFLT_NETIF_M (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK) 83#define ICE_DFLT_NETIF_M (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_LINK)
@@ -189,7 +191,6 @@ struct ice_vsi {
189 u64 tx_linearize; 191 u64 tx_linearize;
190 DECLARE_BITMAP(state, __ICE_STATE_NBITS); 192 DECLARE_BITMAP(state, __ICE_STATE_NBITS);
191 DECLARE_BITMAP(flags, ICE_VSI_FLAG_NBITS); 193 DECLARE_BITMAP(flags, ICE_VSI_FLAG_NBITS);
192 unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
193 unsigned int current_netdev_flags; 194 unsigned int current_netdev_flags;
194 u32 tx_restart; 195 u32 tx_restart;
195 u32 tx_busy; 196 u32 tx_busy;
@@ -369,5 +370,6 @@ int ice_set_rss(struct ice_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size);
369int ice_get_rss(struct ice_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size); 370int ice_get_rss(struct ice_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size);
370void ice_fill_rss_lut(u8 *lut, u16 rss_table_size, u16 rss_size); 371void ice_fill_rss_lut(u8 *lut, u16 rss_table_size, u16 rss_size);
371void ice_print_link_msg(struct ice_vsi *vsi, bool isup); 372void ice_print_link_msg(struct ice_vsi *vsi, bool isup);
373void ice_napi_del(struct ice_vsi *vsi);
372 374
373#endif /* _ICE_H_ */ 375#endif /* _ICE_H_ */
diff --git a/drivers/net/ethernet/intel/ice/ice_common.c b/drivers/net/ethernet/intel/ice/ice_common.c
index 8cd6a2401fd9..554fd707a6d6 100644
--- a/drivers/net/ethernet/intel/ice/ice_common.c
+++ b/drivers/net/ethernet/intel/ice/ice_common.c
@@ -811,6 +811,9 @@ void ice_deinit_hw(struct ice_hw *hw)
811 /* Attempt to disable FW logging before shutting down control queues */ 811 /* Attempt to disable FW logging before shutting down control queues */
812 ice_cfg_fw_log(hw, false); 812 ice_cfg_fw_log(hw, false);
813 ice_shutdown_all_ctrlq(hw); 813 ice_shutdown_all_ctrlq(hw);
814
815 /* Clear VSI contexts if not already cleared */
816 ice_clear_all_vsi_ctx(hw);
814} 817}
815 818
816/** 819/**
diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c
index 96923580f2a6..648acdb4c644 100644
--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
@@ -1517,10 +1517,15 @@ ice_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause)
1517 } 1517 }
1518 1518
1519 if (!test_bit(__ICE_DOWN, pf->state)) { 1519 if (!test_bit(__ICE_DOWN, pf->state)) {
1520 /* Give it a little more time to try to come back */ 1520 /* Give it a little more time to try to come back. If still
1521 * down, restart autoneg link or reinitialize the interface.
1522 */
1521 msleep(75); 1523 msleep(75);
1522 if (!test_bit(__ICE_DOWN, pf->state)) 1524 if (!test_bit(__ICE_DOWN, pf->state))
1523 return ice_nway_reset(netdev); 1525 return ice_nway_reset(netdev);
1526
1527 ice_down(vsi);
1528 ice_up(vsi);
1524 } 1529 }
1525 1530
1526 return err; 1531 return err;
diff --git a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h
index 5fdea6ec7675..596b9fb1c510 100644
--- a/drivers/net/ethernet/intel/ice/ice_hw_autogen.h
+++ b/drivers/net/ethernet/intel/ice/ice_hw_autogen.h
@@ -242,6 +242,8 @@
242#define GLNVM_ULD 0x000B6008 242#define GLNVM_ULD 0x000B6008
243#define GLNVM_ULD_CORER_DONE_M BIT(3) 243#define GLNVM_ULD_CORER_DONE_M BIT(3)
244#define GLNVM_ULD_GLOBR_DONE_M BIT(4) 244#define GLNVM_ULD_GLOBR_DONE_M BIT(4)
245#define GLPCI_CNF2 0x000BE004
246#define GLPCI_CNF2_CACHELINE_SIZE_M BIT(1)
245#define PF_FUNC_RID 0x0009E880 247#define PF_FUNC_RID 0x0009E880
246#define PF_FUNC_RID_FUNC_NUM_S 0 248#define PF_FUNC_RID_FUNC_NUM_S 0
247#define PF_FUNC_RID_FUNC_NUM_M ICE_M(0x7, 0) 249#define PF_FUNC_RID_FUNC_NUM_M ICE_M(0x7, 0)
diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c
index 5bacad01f0c9..1041fa2a7767 100644
--- a/drivers/net/ethernet/intel/ice/ice_lib.c
+++ b/drivers/net/ethernet/intel/ice/ice_lib.c
@@ -1997,7 +1997,7 @@ int ice_cfg_vlan_pruning(struct ice_vsi *vsi, bool ena)
1997 status = ice_update_vsi(&vsi->back->hw, vsi->idx, ctxt, NULL); 1997 status = ice_update_vsi(&vsi->back->hw, vsi->idx, ctxt, NULL);
1998 if (status) { 1998 if (status) {
1999 netdev_err(vsi->netdev, "%sabling VLAN pruning on VSI handle: %d, VSI HW ID: %d failed, err = %d, aq_err = %d\n", 1999 netdev_err(vsi->netdev, "%sabling VLAN pruning on VSI handle: %d, VSI HW ID: %d failed, err = %d, aq_err = %d\n",
2000 ena ? "Ena" : "Dis", vsi->idx, vsi->vsi_num, status, 2000 ena ? "En" : "Dis", vsi->idx, vsi->vsi_num, status,
2001 vsi->back->hw.adminq.sq_last_status); 2001 vsi->back->hw.adminq.sq_last_status);
2002 goto err_out; 2002 goto err_out;
2003 } 2003 }
@@ -2458,6 +2458,7 @@ int ice_vsi_release(struct ice_vsi *vsi)
2458 * on this wq 2458 * on this wq
2459 */ 2459 */
2460 if (vsi->netdev && !ice_is_reset_in_progress(pf->state)) { 2460 if (vsi->netdev && !ice_is_reset_in_progress(pf->state)) {
2461 ice_napi_del(vsi);
2461 unregister_netdev(vsi->netdev); 2462 unregister_netdev(vsi->netdev);
2462 free_netdev(vsi->netdev); 2463 free_netdev(vsi->netdev);
2463 vsi->netdev = NULL; 2464 vsi->netdev = NULL;
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index 05993451147a..333312a1d595 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -1465,7 +1465,7 @@ skip_req_irq:
1465 * ice_napi_del - Remove NAPI handler for the VSI 1465 * ice_napi_del - Remove NAPI handler for the VSI
1466 * @vsi: VSI for which NAPI handler is to be removed 1466 * @vsi: VSI for which NAPI handler is to be removed
1467 */ 1467 */
1468static void ice_napi_del(struct ice_vsi *vsi) 1468void ice_napi_del(struct ice_vsi *vsi)
1469{ 1469{
1470 int v_idx; 1470 int v_idx;
1471 1471
@@ -1622,7 +1622,6 @@ static int ice_vlan_rx_add_vid(struct net_device *netdev,
1622{ 1622{
1623 struct ice_netdev_priv *np = netdev_priv(netdev); 1623 struct ice_netdev_priv *np = netdev_priv(netdev);
1624 struct ice_vsi *vsi = np->vsi; 1624 struct ice_vsi *vsi = np->vsi;
1625 int ret;
1626 1625
1627 if (vid >= VLAN_N_VID) { 1626 if (vid >= VLAN_N_VID) {
1628 netdev_err(netdev, "VLAN id requested %d is out of range %d\n", 1627 netdev_err(netdev, "VLAN id requested %d is out of range %d\n",
@@ -1635,7 +1634,8 @@ static int ice_vlan_rx_add_vid(struct net_device *netdev,
1635 1634
1636 /* Enable VLAN pruning when VLAN 0 is added */ 1635 /* Enable VLAN pruning when VLAN 0 is added */
1637 if (unlikely(!vid)) { 1636 if (unlikely(!vid)) {
1638 ret = ice_cfg_vlan_pruning(vsi, true); 1637 int ret = ice_cfg_vlan_pruning(vsi, true);
1638
1639 if (ret) 1639 if (ret)
1640 return ret; 1640 return ret;
1641 } 1641 }
@@ -1644,12 +1644,7 @@ static int ice_vlan_rx_add_vid(struct net_device *netdev,
1644 * needed to continue allowing all untagged packets since VLAN prune 1644 * needed to continue allowing all untagged packets since VLAN prune
1645 * list is applied to all packets by the switch 1645 * list is applied to all packets by the switch
1646 */ 1646 */
1647 ret = ice_vsi_add_vlan(vsi, vid); 1647 return ice_vsi_add_vlan(vsi, vid);
1648
1649 if (!ret)
1650 set_bit(vid, vsi->active_vlans);
1651
1652 return ret;
1653} 1648}
1654 1649
1655/** 1650/**
@@ -1677,8 +1672,6 @@ static int ice_vlan_rx_kill_vid(struct net_device *netdev,
1677 if (status) 1672 if (status)
1678 return status; 1673 return status;
1679 1674
1680 clear_bit(vid, vsi->active_vlans);
1681
1682 /* Disable VLAN pruning when VLAN 0 is removed */ 1675 /* Disable VLAN pruning when VLAN 0 is removed */
1683 if (unlikely(!vid)) 1676 if (unlikely(!vid))
1684 status = ice_cfg_vlan_pruning(vsi, false); 1677 status = ice_cfg_vlan_pruning(vsi, false);
@@ -2002,6 +1995,22 @@ static int ice_init_interrupt_scheme(struct ice_pf *pf)
2002} 1995}
2003 1996
2004/** 1997/**
1998 * ice_verify_cacheline_size - verify driver's assumption of 64 Byte cache lines
1999 * @pf: pointer to the PF structure
2000 *
2001 * There is no error returned here because the driver should be able to handle
2002 * 128 Byte cache lines, so we only print a warning in case issues are seen,
2003 * specifically with Tx.
2004 */
2005static void ice_verify_cacheline_size(struct ice_pf *pf)
2006{
2007 if (rd32(&pf->hw, GLPCI_CNF2) & GLPCI_CNF2_CACHELINE_SIZE_M)
2008 dev_warn(&pf->pdev->dev,
2009 "%d Byte cache line assumption is invalid, driver may have Tx timeouts!\n",
2010 ICE_CACHE_LINE_BYTES);
2011}
2012
2013/**
2005 * ice_probe - Device initialization routine 2014 * ice_probe - Device initialization routine
2006 * @pdev: PCI device information struct 2015 * @pdev: PCI device information struct
2007 * @ent: entry in ice_pci_tbl 2016 * @ent: entry in ice_pci_tbl
@@ -2151,6 +2160,8 @@ static int ice_probe(struct pci_dev *pdev,
2151 /* since everything is good, start the service timer */ 2160 /* since everything is good, start the service timer */
2152 mod_timer(&pf->serv_tmr, round_jiffies(jiffies + pf->serv_tmr_period)); 2161 mod_timer(&pf->serv_tmr, round_jiffies(jiffies + pf->serv_tmr_period));
2153 2162
2163 ice_verify_cacheline_size(pf);
2164
2154 return 0; 2165 return 0;
2155 2166
2156err_alloc_sw_unroll: 2167err_alloc_sw_unroll:
@@ -2182,6 +2193,12 @@ static void ice_remove(struct pci_dev *pdev)
2182 if (!pf) 2193 if (!pf)
2183 return; 2194 return;
2184 2195
2196 for (i = 0; i < ICE_MAX_RESET_WAIT; i++) {
2197 if (!ice_is_reset_in_progress(pf->state))
2198 break;
2199 msleep(100);
2200 }
2201
2185 set_bit(__ICE_DOWN, pf->state); 2202 set_bit(__ICE_DOWN, pf->state);
2186 ice_service_task_stop(pf); 2203 ice_service_task_stop(pf);
2187 2204
@@ -2510,31 +2527,6 @@ static int ice_vsi_vlan_setup(struct ice_vsi *vsi)
2510} 2527}
2511 2528
2512/** 2529/**
2513 * ice_restore_vlan - Reinstate VLANs when vsi/netdev comes back up
2514 * @vsi: the VSI being brought back up
2515 */
2516static int ice_restore_vlan(struct ice_vsi *vsi)
2517{
2518 int err;
2519 u16 vid;
2520
2521 if (!vsi->netdev)
2522 return -EINVAL;
2523
2524 err = ice_vsi_vlan_setup(vsi);
2525 if (err)
2526 return err;
2527
2528 for_each_set_bit(vid, vsi->active_vlans, VLAN_N_VID) {
2529 err = ice_vlan_rx_add_vid(vsi->netdev, htons(ETH_P_8021Q), vid);
2530 if (err)
2531 break;
2532 }
2533
2534 return err;
2535}
2536
2537/**
2538 * ice_vsi_cfg - Setup the VSI 2530 * ice_vsi_cfg - Setup the VSI
2539 * @vsi: the VSI being configured 2531 * @vsi: the VSI being configured
2540 * 2532 *
@@ -2546,7 +2538,9 @@ static int ice_vsi_cfg(struct ice_vsi *vsi)
2546 2538
2547 if (vsi->netdev) { 2539 if (vsi->netdev) {
2548 ice_set_rx_mode(vsi->netdev); 2540 ice_set_rx_mode(vsi->netdev);
2549 err = ice_restore_vlan(vsi); 2541
2542 err = ice_vsi_vlan_setup(vsi);
2543
2550 if (err) 2544 if (err)
2551 return err; 2545 return err;
2552 } 2546 }
@@ -3296,7 +3290,7 @@ static void ice_rebuild(struct ice_pf *pf)
3296 struct device *dev = &pf->pdev->dev; 3290 struct device *dev = &pf->pdev->dev;
3297 struct ice_hw *hw = &pf->hw; 3291 struct ice_hw *hw = &pf->hw;
3298 enum ice_status ret; 3292 enum ice_status ret;
3299 int err; 3293 int err, i;
3300 3294
3301 if (test_bit(__ICE_DOWN, pf->state)) 3295 if (test_bit(__ICE_DOWN, pf->state))
3302 goto clear_recovery; 3296 goto clear_recovery;
@@ -3370,6 +3364,22 @@ static void ice_rebuild(struct ice_pf *pf)
3370 } 3364 }
3371 3365
3372 ice_reset_all_vfs(pf, true); 3366 ice_reset_all_vfs(pf, true);
3367
3368 for (i = 0; i < pf->num_alloc_vsi; i++) {
3369 bool link_up;
3370
3371 if (!pf->vsi[i] || pf->vsi[i]->type != ICE_VSI_PF)
3372 continue;
3373 ice_get_link_status(pf->vsi[i]->port_info, &link_up);
3374 if (link_up) {
3375 netif_carrier_on(pf->vsi[i]->netdev);
3376 netif_tx_wake_all_queues(pf->vsi[i]->netdev);
3377 } else {
3378 netif_carrier_off(pf->vsi[i]->netdev);
3379 netif_tx_stop_all_queues(pf->vsi[i]->netdev);
3380 }
3381 }
3382
3373 /* if we get here, reset flow is successful */ 3383 /* if we get here, reset flow is successful */
3374 clear_bit(__ICE_RESET_FAILED, pf->state); 3384 clear_bit(__ICE_RESET_FAILED, pf->state);
3375 return; 3385 return;
diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c b/drivers/net/ethernet/intel/ice/ice_switch.c
index 33403f39f1b3..40c9c6558956 100644
--- a/drivers/net/ethernet/intel/ice/ice_switch.c
+++ b/drivers/net/ethernet/intel/ice/ice_switch.c
@@ -348,6 +348,18 @@ static void ice_clear_vsi_ctx(struct ice_hw *hw, u16 vsi_handle)
348} 348}
349 349
350/** 350/**
351 * ice_clear_all_vsi_ctx - clear all the VSI context entries
352 * @hw: pointer to the hw struct
353 */
354void ice_clear_all_vsi_ctx(struct ice_hw *hw)
355{
356 u16 i;
357
358 for (i = 0; i < ICE_MAX_VSI; i++)
359 ice_clear_vsi_ctx(hw, i);
360}
361
362/**
351 * ice_add_vsi - add VSI context to the hardware and VSI handle list 363 * ice_add_vsi - add VSI context to the hardware and VSI handle list
352 * @hw: pointer to the hw struct 364 * @hw: pointer to the hw struct
353 * @vsi_handle: unique VSI handle provided by drivers 365 * @vsi_handle: unique VSI handle provided by drivers
diff --git a/drivers/net/ethernet/intel/ice/ice_switch.h b/drivers/net/ethernet/intel/ice/ice_switch.h
index b88d96a1ef69..d5ef0bd58bf9 100644
--- a/drivers/net/ethernet/intel/ice/ice_switch.h
+++ b/drivers/net/ethernet/intel/ice/ice_switch.h
@@ -190,6 +190,8 @@ ice_update_vsi(struct ice_hw *hw, u16 vsi_handle, struct ice_vsi_ctx *vsi_ctx,
190 struct ice_sq_cd *cd); 190 struct ice_sq_cd *cd);
191bool ice_is_vsi_valid(struct ice_hw *hw, u16 vsi_handle); 191bool ice_is_vsi_valid(struct ice_hw *hw, u16 vsi_handle);
192struct ice_vsi_ctx *ice_get_vsi_ctx(struct ice_hw *hw, u16 vsi_handle); 192struct ice_vsi_ctx *ice_get_vsi_ctx(struct ice_hw *hw, u16 vsi_handle);
193void ice_clear_all_vsi_ctx(struct ice_hw *hw);
194/* Switch config */
193enum ice_status ice_get_initial_sw_cfg(struct ice_hw *hw); 195enum ice_status ice_get_initial_sw_cfg(struct ice_hw *hw);
194 196
195/* Switch/bridge related commands */ 197/* Switch/bridge related commands */
diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.c b/drivers/net/ethernet/intel/ice/ice_txrx.c
index 5dae968d853e..fe5bbabbb41e 100644
--- a/drivers/net/ethernet/intel/ice/ice_txrx.c
+++ b/drivers/net/ethernet/intel/ice/ice_txrx.c
@@ -1520,7 +1520,7 @@ int ice_tso(struct ice_tx_buf *first, struct ice_tx_offload_params *off)
1520 1520
1521 /* update gso_segs and bytecount */ 1521 /* update gso_segs and bytecount */
1522 first->gso_segs = skb_shinfo(skb)->gso_segs; 1522 first->gso_segs = skb_shinfo(skb)->gso_segs;
1523 first->bytecount = (first->gso_segs - 1) * off->header_len; 1523 first->bytecount += (first->gso_segs - 1) * off->header_len;
1524 1524
1525 cd_tso_len = skb->len - off->header_len; 1525 cd_tso_len = skb->len - off->header_len;
1526 cd_mss = skb_shinfo(skb)->gso_size; 1526 cd_mss = skb_shinfo(skb)->gso_size;
@@ -1556,15 +1556,15 @@ int ice_tso(struct ice_tx_buf *first, struct ice_tx_offload_params *off)
1556 * magnitude greater than our largest possible GSO size. 1556 * magnitude greater than our largest possible GSO size.
1557 * 1557 *
1558 * This would then be implemented as: 1558 * This would then be implemented as:
1559 * return (((size >> 12) * 85) >> 8) + 1; 1559 * return (((size >> 12) * 85) >> 8) + ICE_DESCS_FOR_SKB_DATA_PTR;
1560 * 1560 *
1561 * Since multiplication and division are commutative, we can reorder 1561 * Since multiplication and division are commutative, we can reorder
1562 * operations into: 1562 * operations into:
1563 * return ((size * 85) >> 20) + 1; 1563 * return ((size * 85) >> 20) + ICE_DESCS_FOR_SKB_DATA_PTR;
1564 */ 1564 */
1565static unsigned int ice_txd_use_count(unsigned int size) 1565static unsigned int ice_txd_use_count(unsigned int size)
1566{ 1566{
1567 return ((size * 85) >> 20) + 1; 1567 return ((size * 85) >> 20) + ICE_DESCS_FOR_SKB_DATA_PTR;
1568} 1568}
1569 1569
1570/** 1570/**
@@ -1706,7 +1706,8 @@ ice_xmit_frame_ring(struct sk_buff *skb, struct ice_ring *tx_ring)
1706 * + 1 desc for context descriptor, 1706 * + 1 desc for context descriptor,
1707 * otherwise try next time 1707 * otherwise try next time
1708 */ 1708 */
1709 if (ice_maybe_stop_tx(tx_ring, count + 4 + 1)) { 1709 if (ice_maybe_stop_tx(tx_ring, count + ICE_DESCS_PER_CACHE_LINE +
1710 ICE_DESCS_FOR_CTX_DESC)) {
1710 tx_ring->tx_stats.tx_busy++; 1711 tx_ring->tx_stats.tx_busy++;
1711 return NETDEV_TX_BUSY; 1712 return NETDEV_TX_BUSY;
1712 } 1713 }
diff --git a/drivers/net/ethernet/intel/ice/ice_txrx.h b/drivers/net/ethernet/intel/ice/ice_txrx.h
index 1d0f58bd389b..75d0eaf6c9dd 100644
--- a/drivers/net/ethernet/intel/ice/ice_txrx.h
+++ b/drivers/net/ethernet/intel/ice/ice_txrx.h
@@ -22,8 +22,21 @@
22#define ICE_RX_BUF_WRITE 16 /* Must be power of 2 */ 22#define ICE_RX_BUF_WRITE 16 /* Must be power of 2 */
23#define ICE_MAX_TXQ_PER_TXQG 128 23#define ICE_MAX_TXQ_PER_TXQG 128
24 24
25/* Tx Descriptors needed, worst case */ 25/* We are assuming that the cache line is always 64 Bytes here for ice.
26#define DESC_NEEDED (MAX_SKB_FRAGS + 4) 26 * In order to make sure that is a correct assumption there is a check in probe
27 * to print a warning if the read from GLPCI_CNF2 tells us that the cache line
28 * size is 128 bytes. We do it this way because we do not want to read the
29 * GLPCI_CNF2 register or a variable containing the value on every pass through
30 * the Tx path.
31 */
32#define ICE_CACHE_LINE_BYTES 64
33#define ICE_DESCS_PER_CACHE_LINE (ICE_CACHE_LINE_BYTES / \
34 sizeof(struct ice_tx_desc))
35#define ICE_DESCS_FOR_CTX_DESC 1
36#define ICE_DESCS_FOR_SKB_DATA_PTR 1
37/* Tx descriptors needed, worst case */
38#define DESC_NEEDED (MAX_SKB_FRAGS + ICE_DESCS_FOR_CTX_DESC + \
39 ICE_DESCS_PER_CACHE_LINE + ICE_DESCS_FOR_SKB_DATA_PTR)
27#define ICE_DESC_UNUSED(R) \ 40#define ICE_DESC_UNUSED(R) \
28 ((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \ 41 ((((R)->next_to_clean > (R)->next_to_use) ? 0 : (R)->count) + \
29 (R)->next_to_clean - (R)->next_to_use - 1) 42 (R)->next_to_clean - (R)->next_to_use - 1)
diff --git a/drivers/net/ethernet/intel/ice/ice_type.h b/drivers/net/ethernet/intel/ice/ice_type.h
index 12f9432abf11..f4dbc81c1988 100644
--- a/drivers/net/ethernet/intel/ice/ice_type.h
+++ b/drivers/net/ethernet/intel/ice/ice_type.h
@@ -92,12 +92,12 @@ struct ice_link_status {
92 u64 phy_type_low; 92 u64 phy_type_low;
93 u16 max_frame_size; 93 u16 max_frame_size;
94 u16 link_speed; 94 u16 link_speed;
95 u16 req_speeds;
95 u8 lse_ena; /* Link Status Event notification */ 96 u8 lse_ena; /* Link Status Event notification */
96 u8 link_info; 97 u8 link_info;
97 u8 an_info; 98 u8 an_info;
98 u8 ext_info; 99 u8 ext_info;
99 u8 pacing; 100 u8 pacing;
100 u8 req_speeds;
101 /* Refer to #define from module_type[ICE_MODULE_TYPE_TOTAL_BYTE] of 101 /* Refer to #define from module_type[ICE_MODULE_TYPE_TOTAL_BYTE] of
102 * ice_aqc_get_phy_caps structure 102 * ice_aqc_get_phy_caps structure
103 */ 103 */
diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
index 45f10f8f01dc..e71065f9d391 100644
--- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
@@ -348,7 +348,7 @@ static int ice_vsi_set_pvid(struct ice_vsi *vsi, u16 vid)
348 struct ice_vsi_ctx ctxt = { 0 }; 348 struct ice_vsi_ctx ctxt = { 0 };
349 enum ice_status status; 349 enum ice_status status;
350 350
351 ctxt.info.vlan_flags = ICE_AQ_VSI_VLAN_MODE_TAGGED | 351 ctxt.info.vlan_flags = ICE_AQ_VSI_VLAN_MODE_UNTAGGED |
352 ICE_AQ_VSI_PVLAN_INSERT_PVID | 352 ICE_AQ_VSI_PVLAN_INSERT_PVID |
353 ICE_AQ_VSI_VLAN_EMOD_STR; 353 ICE_AQ_VSI_VLAN_EMOD_STR;
354 ctxt.info.pvid = cpu_to_le16(vid); 354 ctxt.info.pvid = cpu_to_le16(vid);
@@ -2171,7 +2171,6 @@ static int ice_vc_process_vlan_msg(struct ice_vf *vf, u8 *msg, bool add_v)
2171 2171
2172 if (!ice_vsi_add_vlan(vsi, vid)) { 2172 if (!ice_vsi_add_vlan(vsi, vid)) {
2173 vf->num_vlan++; 2173 vf->num_vlan++;
2174 set_bit(vid, vsi->active_vlans);
2175 2174
2176 /* Enable VLAN pruning when VLAN 0 is added */ 2175 /* Enable VLAN pruning when VLAN 0 is added */
2177 if (unlikely(!vid)) 2176 if (unlikely(!vid))
@@ -2190,7 +2189,6 @@ static int ice_vc_process_vlan_msg(struct ice_vf *vf, u8 *msg, bool add_v)
2190 */ 2189 */
2191 if (!ice_vsi_kill_vlan(vsi, vid)) { 2190 if (!ice_vsi_kill_vlan(vsi, vid)) {
2192 vf->num_vlan--; 2191 vf->num_vlan--;
2193 clear_bit(vid, vsi->active_vlans);
2194 2192
2195 /* Disable VLAN pruning when removing VLAN 0 */ 2193 /* Disable VLAN pruning when removing VLAN 0 */
2196 if (unlikely(!vid)) 2194 if (unlikely(!vid))
diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c
index 29ced6b74d36..2b95dc9c7a6a 100644
--- a/drivers/net/ethernet/intel/igb/igb_ptp.c
+++ b/drivers/net/ethernet/intel/igb/igb_ptp.c
@@ -53,13 +53,15 @@
53 * 2^40 * 10^-9 / 60 = 18.3 minutes. 53 * 2^40 * 10^-9 / 60 = 18.3 minutes.
54 * 54 *
55 * SYSTIM is converted to real time using a timecounter. As 55 * SYSTIM is converted to real time using a timecounter. As
56 * timecounter_cyc2time() allows old timestamps, the timecounter 56 * timecounter_cyc2time() allows old timestamps, the timecounter needs
57 * needs to be updated at least once per half of the SYSTIM interval. 57 * to be updated at least once per half of the SYSTIM interval.
58 * Scheduling of delayed work is not very accurate, so we aim for 8 58 * Scheduling of delayed work is not very accurate, and also the NIC
59 * minutes to be sure the actual interval is shorter than 9.16 minutes. 59 * clock can be adjusted to run up to 6% faster and the system clock
60 * up to 10% slower, so we aim for 6 minutes to be sure the actual
61 * interval in the NIC time is shorter than 9.16 minutes.
60 */ 62 */
61 63
62#define IGB_SYSTIM_OVERFLOW_PERIOD (HZ * 60 * 8) 64#define IGB_SYSTIM_OVERFLOW_PERIOD (HZ * 60 * 6)
63#define IGB_PTP_TX_TIMEOUT (HZ * 15) 65#define IGB_PTP_TX_TIMEOUT (HZ * 15)
64#define INCPERIOD_82576 BIT(E1000_TIMINCA_16NS_SHIFT) 66#define INCPERIOD_82576 BIT(E1000_TIMINCA_16NS_SHIFT)
65#define INCVALUE_82576_MASK GENMASK(E1000_TIMINCA_16NS_SHIFT - 1, 0) 67#define INCVALUE_82576_MASK GENMASK(E1000_TIMINCA_16NS_SHIFT - 1, 0)
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index 5bfd349bf41a..3ba672e9e353 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -494,7 +494,7 @@ struct mvneta_port {
494#if defined(__LITTLE_ENDIAN) 494#if defined(__LITTLE_ENDIAN)
495struct mvneta_tx_desc { 495struct mvneta_tx_desc {
496 u32 command; /* Options used by HW for packet transmitting.*/ 496 u32 command; /* Options used by HW for packet transmitting.*/
497 u16 reserverd1; /* csum_l4 (for future use) */ 497 u16 reserved1; /* csum_l4 (for future use) */
498 u16 data_size; /* Data size of transmitted packet in bytes */ 498 u16 data_size; /* Data size of transmitted packet in bytes */
499 u32 buf_phys_addr; /* Physical addr of transmitted buffer */ 499 u32 buf_phys_addr; /* Physical addr of transmitted buffer */
500 u32 reserved2; /* hw_cmd - (for future use, PMT) */ 500 u32 reserved2; /* hw_cmd - (for future use, PMT) */
@@ -519,7 +519,7 @@ struct mvneta_rx_desc {
519#else 519#else
520struct mvneta_tx_desc { 520struct mvneta_tx_desc {
521 u16 data_size; /* Data size of transmitted packet in bytes */ 521 u16 data_size; /* Data size of transmitted packet in bytes */
522 u16 reserverd1; /* csum_l4 (for future use) */ 522 u16 reserved1; /* csum_l4 (for future use) */
523 u32 command; /* Options used by HW for packet transmitting.*/ 523 u32 command; /* Options used by HW for packet transmitting.*/
524 u32 reserved2; /* hw_cmd - (for future use, PMT) */ 524 u32 reserved2; /* hw_cmd - (for future use, PMT) */
525 u32 buf_phys_addr; /* Physical addr of transmitted buffer */ 525 u32 buf_phys_addr; /* Physical addr of transmitted buffer */
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
index 1857ee0f0871..6f5153afcab4 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
@@ -1006,7 +1006,6 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
1006 ring->packets++; 1006 ring->packets++;
1007 } 1007 }
1008 ring->bytes += tx_info->nr_bytes; 1008 ring->bytes += tx_info->nr_bytes;
1009 netdev_tx_sent_queue(ring->tx_queue, tx_info->nr_bytes);
1010 AVG_PERF_COUNTER(priv->pstats.tx_pktsz_avg, skb->len); 1009 AVG_PERF_COUNTER(priv->pstats.tx_pktsz_avg, skb->len);
1011 1010
1012 if (tx_info->inl) 1011 if (tx_info->inl)
@@ -1044,7 +1043,10 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
1044 netif_tx_stop_queue(ring->tx_queue); 1043 netif_tx_stop_queue(ring->tx_queue);
1045 ring->queue_stopped++; 1044 ring->queue_stopped++;
1046 } 1045 }
1047 send_doorbell = !skb->xmit_more || netif_xmit_stopped(ring->tx_queue); 1046
1047 send_doorbell = __netdev_tx_sent_queue(ring->tx_queue,
1048 tx_info->nr_bytes,
1049 skb->xmit_more);
1048 1050
1049 real_size = (real_size / 16) & 0x3f; 1051 real_size = (real_size / 16) & 0x3f;
1050 1052
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index a2df12b79f8e..9bec940330a4 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -3568,7 +3568,6 @@ static int mlxsw_sp_cpu_policers_set(struct mlxsw_core *mlxsw_core)
3568 burst_size = 7; 3568 burst_size = 7;
3569 break; 3569 break;
3570 case MLXSW_REG_HTGT_TRAP_GROUP_SP_IP2ME: 3570 case MLXSW_REG_HTGT_TRAP_GROUP_SP_IP2ME:
3571 is_bytes = true;
3572 rate = 4 * 1024; 3571 rate = 4 * 1024;
3573 burst_size = 4; 3572 burst_size = 4;
3574 break; 3573 break;
diff --git a/drivers/net/ethernet/qlogic/qed/qed_fcoe.c b/drivers/net/ethernet/qlogic/qed/qed_fcoe.c
index cc1b373c0ace..46dc93d3b9b5 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_fcoe.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_fcoe.c
@@ -147,7 +147,8 @@ qed_sp_fcoe_func_start(struct qed_hwfn *p_hwfn,
147 "Cannot satisfy CQ amount. CQs requested %d, CQs available %d. Aborting function start\n", 147 "Cannot satisfy CQ amount. CQs requested %d, CQs available %d. Aborting function start\n",
148 fcoe_pf_params->num_cqs, 148 fcoe_pf_params->num_cqs,
149 p_hwfn->hw_info.feat_num[QED_FCOE_CQ]); 149 p_hwfn->hw_info.feat_num[QED_FCOE_CQ]);
150 return -EINVAL; 150 rc = -EINVAL;
151 goto err;
151 } 152 }
152 153
153 p_data->mtu = cpu_to_le16(fcoe_pf_params->mtu); 154 p_data->mtu = cpu_to_le16(fcoe_pf_params->mtu);
@@ -156,14 +157,14 @@ qed_sp_fcoe_func_start(struct qed_hwfn *p_hwfn,
156 157
157 rc = qed_cxt_acquire_cid(p_hwfn, PROTOCOLID_FCOE, &dummy_cid); 158 rc = qed_cxt_acquire_cid(p_hwfn, PROTOCOLID_FCOE, &dummy_cid);
158 if (rc) 159 if (rc)
159 return rc; 160 goto err;
160 161
161 cxt_info.iid = dummy_cid; 162 cxt_info.iid = dummy_cid;
162 rc = qed_cxt_get_cid_info(p_hwfn, &cxt_info); 163 rc = qed_cxt_get_cid_info(p_hwfn, &cxt_info);
163 if (rc) { 164 if (rc) {
164 DP_NOTICE(p_hwfn, "Cannot find context info for dummy cid=%d\n", 165 DP_NOTICE(p_hwfn, "Cannot find context info for dummy cid=%d\n",
165 dummy_cid); 166 dummy_cid);
166 return rc; 167 goto err;
167 } 168 }
168 p_cxt = cxt_info.p_cxt; 169 p_cxt = cxt_info.p_cxt;
169 SET_FIELD(p_cxt->tstorm_ag_context.flags3, 170 SET_FIELD(p_cxt->tstorm_ag_context.flags3,
@@ -240,6 +241,10 @@ qed_sp_fcoe_func_start(struct qed_hwfn *p_hwfn,
240 rc = qed_spq_post(p_hwfn, p_ent, NULL); 241 rc = qed_spq_post(p_hwfn, p_ent, NULL);
241 242
242 return rc; 243 return rc;
244
245err:
246 qed_sp_destroy_request(p_hwfn, p_ent);
247 return rc;
243} 248}
244 249
245static int 250static int
diff --git a/drivers/net/ethernet/qlogic/qed/qed_iscsi.c b/drivers/net/ethernet/qlogic/qed/qed_iscsi.c
index 1135387bd99d..4f8a685d1a55 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_iscsi.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_iscsi.c
@@ -200,6 +200,7 @@ qed_sp_iscsi_func_start(struct qed_hwfn *p_hwfn,
200 "Cannot satisfy CQ amount. Queues requested %d, CQs available %d. Aborting function start\n", 200 "Cannot satisfy CQ amount. Queues requested %d, CQs available %d. Aborting function start\n",
201 p_params->num_queues, 201 p_params->num_queues,
202 p_hwfn->hw_info.feat_num[QED_ISCSI_CQ]); 202 p_hwfn->hw_info.feat_num[QED_ISCSI_CQ]);
203 qed_sp_destroy_request(p_hwfn, p_ent);
203 return -EINVAL; 204 return -EINVAL;
204 } 205 }
205 206
diff --git a/drivers/net/ethernet/qlogic/qed/qed_l2.c b/drivers/net/ethernet/qlogic/qed/qed_l2.c
index 82a1bd1f8a8c..67c02ea93906 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_l2.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_l2.c
@@ -740,8 +740,7 @@ int qed_sp_vport_update(struct qed_hwfn *p_hwfn,
740 740
741 rc = qed_sp_vport_update_rss(p_hwfn, p_ramrod, p_rss_params); 741 rc = qed_sp_vport_update_rss(p_hwfn, p_ramrod, p_rss_params);
742 if (rc) { 742 if (rc) {
743 /* Return spq entry which is taken in qed_sp_init_request()*/ 743 qed_sp_destroy_request(p_hwfn, p_ent);
744 qed_spq_return_entry(p_hwfn, p_ent);
745 return rc; 744 return rc;
746 } 745 }
747 746
@@ -1355,6 +1354,7 @@ qed_filter_ucast_common(struct qed_hwfn *p_hwfn,
1355 DP_NOTICE(p_hwfn, 1354 DP_NOTICE(p_hwfn,
1356 "%d is not supported yet\n", 1355 "%d is not supported yet\n",
1357 p_filter_cmd->opcode); 1356 p_filter_cmd->opcode);
1357 qed_sp_destroy_request(p_hwfn, *pp_ent);
1358 return -EINVAL; 1358 return -EINVAL;
1359 } 1359 }
1360 1360
@@ -2056,13 +2056,13 @@ qed_configure_rfs_ntuple_filter(struct qed_hwfn *p_hwfn,
2056 } else { 2056 } else {
2057 rc = qed_fw_vport(p_hwfn, p_params->vport_id, &abs_vport_id); 2057 rc = qed_fw_vport(p_hwfn, p_params->vport_id, &abs_vport_id);
2058 if (rc) 2058 if (rc)
2059 return rc; 2059 goto err;
2060 2060
2061 if (p_params->qid != QED_RFS_NTUPLE_QID_RSS) { 2061 if (p_params->qid != QED_RFS_NTUPLE_QID_RSS) {
2062 rc = qed_fw_l2_queue(p_hwfn, p_params->qid, 2062 rc = qed_fw_l2_queue(p_hwfn, p_params->qid,
2063 &abs_rx_q_id); 2063 &abs_rx_q_id);
2064 if (rc) 2064 if (rc)
2065 return rc; 2065 goto err;
2066 2066
2067 p_ramrod->rx_qid_valid = 1; 2067 p_ramrod->rx_qid_valid = 1;
2068 p_ramrod->rx_qid = cpu_to_le16(abs_rx_q_id); 2068 p_ramrod->rx_qid = cpu_to_le16(abs_rx_q_id);
@@ -2083,6 +2083,10 @@ qed_configure_rfs_ntuple_filter(struct qed_hwfn *p_hwfn,
2083 (u64)p_params->addr, p_params->length); 2083 (u64)p_params->addr, p_params->length);
2084 2084
2085 return qed_spq_post(p_hwfn, p_ent, NULL); 2085 return qed_spq_post(p_hwfn, p_ent, NULL);
2086
2087err:
2088 qed_sp_destroy_request(p_hwfn, p_ent);
2089 return rc;
2086} 2090}
2087 2091
2088int qed_get_rxq_coalesce(struct qed_hwfn *p_hwfn, 2092int qed_get_rxq_coalesce(struct qed_hwfn *p_hwfn,
diff --git a/drivers/net/ethernet/qlogic/qed/qed_mcp.c b/drivers/net/ethernet/qlogic/qed/qed_mcp.c
index f40f654398a0..a96364df4320 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c
@@ -1944,9 +1944,12 @@ int qed_mcp_trans_speed_mask(struct qed_hwfn *p_hwfn,
1944 struct qed_ptt *p_ptt, u32 *p_speed_mask) 1944 struct qed_ptt *p_ptt, u32 *p_speed_mask)
1945{ 1945{
1946 u32 transceiver_type, transceiver_state; 1946 u32 transceiver_type, transceiver_state;
1947 int ret;
1947 1948
1948 qed_mcp_get_transceiver_data(p_hwfn, p_ptt, &transceiver_state, 1949 ret = qed_mcp_get_transceiver_data(p_hwfn, p_ptt, &transceiver_state,
1949 &transceiver_type); 1950 &transceiver_type);
1951 if (ret)
1952 return ret;
1950 1953
1951 if (qed_is_transceiver_ready(transceiver_state, transceiver_type) == 1954 if (qed_is_transceiver_ready(transceiver_state, transceiver_type) ==
1952 false) 1955 false)
diff --git a/drivers/net/ethernet/qlogic/qed/qed_rdma.c b/drivers/net/ethernet/qlogic/qed/qed_rdma.c
index c71391b9c757..62113438c880 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_rdma.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_rdma.c
@@ -1514,6 +1514,7 @@ qed_rdma_register_tid(void *rdma_cxt,
1514 default: 1514 default:
1515 rc = -EINVAL; 1515 rc = -EINVAL;
1516 DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "rc = %d\n", rc); 1516 DP_VERBOSE(p_hwfn, QED_MSG_RDMA, "rc = %d\n", rc);
1517 qed_sp_destroy_request(p_hwfn, p_ent);
1517 return rc; 1518 return rc;
1518 } 1519 }
1519 SET_FIELD(p_ramrod->flags1, 1520 SET_FIELD(p_ramrod->flags1,
diff --git a/drivers/net/ethernet/qlogic/qed/qed_roce.c b/drivers/net/ethernet/qlogic/qed/qed_roce.c
index f9167d1354bb..e49fada85410 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_roce.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_roce.c
@@ -745,6 +745,7 @@ static int qed_roce_sp_destroy_qp_responder(struct qed_hwfn *p_hwfn,
745 DP_NOTICE(p_hwfn, 745 DP_NOTICE(p_hwfn,
746 "qed destroy responder failed: cannot allocate memory (ramrod). rc = %d\n", 746 "qed destroy responder failed: cannot allocate memory (ramrod). rc = %d\n",
747 rc); 747 rc);
748 qed_sp_destroy_request(p_hwfn, p_ent);
748 return rc; 749 return rc;
749 } 750 }
750 751
diff --git a/drivers/net/ethernet/qlogic/qed/qed_sp.h b/drivers/net/ethernet/qlogic/qed/qed_sp.h
index e95431f6acd4..3157c0d99441 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_sp.h
+++ b/drivers/net/ethernet/qlogic/qed/qed_sp.h
@@ -167,6 +167,9 @@ struct qed_spq_entry {
167 enum spq_mode comp_mode; 167 enum spq_mode comp_mode;
168 struct qed_spq_comp_cb comp_cb; 168 struct qed_spq_comp_cb comp_cb;
169 struct qed_spq_comp_done comp_done; /* SPQ_MODE_EBLOCK */ 169 struct qed_spq_comp_done comp_done; /* SPQ_MODE_EBLOCK */
170
171 /* Posted entry for unlimited list entry in EBLOCK mode */
172 struct qed_spq_entry *post_ent;
170}; 173};
171 174
172struct qed_eq { 175struct qed_eq {
@@ -396,6 +399,17 @@ struct qed_sp_init_data {
396 struct qed_spq_comp_cb *p_comp_data; 399 struct qed_spq_comp_cb *p_comp_data;
397}; 400};
398 401
402/**
403 * @brief Returns a SPQ entry to the pool / frees the entry if allocated.
404 * Should be called on in error flows after initializing the SPQ entry
405 * and before posting it.
406 *
407 * @param p_hwfn
408 * @param p_ent
409 */
410void qed_sp_destroy_request(struct qed_hwfn *p_hwfn,
411 struct qed_spq_entry *p_ent);
412
399int qed_sp_init_request(struct qed_hwfn *p_hwfn, 413int qed_sp_init_request(struct qed_hwfn *p_hwfn,
400 struct qed_spq_entry **pp_ent, 414 struct qed_spq_entry **pp_ent,
401 u8 cmd, 415 u8 cmd,
diff --git a/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c b/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c
index 77b6248ad3b9..888274fa208b 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_sp_commands.c
@@ -47,6 +47,19 @@
47#include "qed_sp.h" 47#include "qed_sp.h"
48#include "qed_sriov.h" 48#include "qed_sriov.h"
49 49
50void qed_sp_destroy_request(struct qed_hwfn *p_hwfn,
51 struct qed_spq_entry *p_ent)
52{
53 /* qed_spq_get_entry() can either get an entry from the free_pool,
54 * or, if no entries are left, allocate a new entry and add it to
55 * the unlimited_pending list.
56 */
57 if (p_ent->queue == &p_hwfn->p_spq->unlimited_pending)
58 kfree(p_ent);
59 else
60 qed_spq_return_entry(p_hwfn, p_ent);
61}
62
50int qed_sp_init_request(struct qed_hwfn *p_hwfn, 63int qed_sp_init_request(struct qed_hwfn *p_hwfn,
51 struct qed_spq_entry **pp_ent, 64 struct qed_spq_entry **pp_ent,
52 u8 cmd, u8 protocol, struct qed_sp_init_data *p_data) 65 u8 cmd, u8 protocol, struct qed_sp_init_data *p_data)
@@ -80,7 +93,7 @@ int qed_sp_init_request(struct qed_hwfn *p_hwfn,
80 93
81 case QED_SPQ_MODE_BLOCK: 94 case QED_SPQ_MODE_BLOCK:
82 if (!p_data->p_comp_data) 95 if (!p_data->p_comp_data)
83 return -EINVAL; 96 goto err;
84 97
85 p_ent->comp_cb.cookie = p_data->p_comp_data->cookie; 98 p_ent->comp_cb.cookie = p_data->p_comp_data->cookie;
86 break; 99 break;
@@ -95,7 +108,7 @@ int qed_sp_init_request(struct qed_hwfn *p_hwfn,
95 default: 108 default:
96 DP_NOTICE(p_hwfn, "Unknown SPQE completion mode %d\n", 109 DP_NOTICE(p_hwfn, "Unknown SPQE completion mode %d\n",
97 p_ent->comp_mode); 110 p_ent->comp_mode);
98 return -EINVAL; 111 goto err;
99 } 112 }
100 113
101 DP_VERBOSE(p_hwfn, QED_MSG_SPQ, 114 DP_VERBOSE(p_hwfn, QED_MSG_SPQ,
@@ -109,6 +122,11 @@ int qed_sp_init_request(struct qed_hwfn *p_hwfn,
109 memset(&p_ent->ramrod, 0, sizeof(p_ent->ramrod)); 122 memset(&p_ent->ramrod, 0, sizeof(p_ent->ramrod));
110 123
111 return 0; 124 return 0;
125
126err:
127 qed_sp_destroy_request(p_hwfn, p_ent);
128
129 return -EINVAL;
112} 130}
113 131
114static enum tunnel_clss qed_tunn_clss_to_fw_clss(u8 type) 132static enum tunnel_clss qed_tunn_clss_to_fw_clss(u8 type)
diff --git a/drivers/net/ethernet/qlogic/qed/qed_spq.c b/drivers/net/ethernet/qlogic/qed/qed_spq.c
index c4a6274dd625..0a9c5bb0fa48 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_spq.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_spq.c
@@ -142,6 +142,7 @@ static int qed_spq_block(struct qed_hwfn *p_hwfn,
142 142
143 DP_INFO(p_hwfn, "Ramrod is stuck, requesting MCP drain\n"); 143 DP_INFO(p_hwfn, "Ramrod is stuck, requesting MCP drain\n");
144 rc = qed_mcp_drain(p_hwfn, p_ptt); 144 rc = qed_mcp_drain(p_hwfn, p_ptt);
145 qed_ptt_release(p_hwfn, p_ptt);
145 if (rc) { 146 if (rc) {
146 DP_NOTICE(p_hwfn, "MCP drain failed\n"); 147 DP_NOTICE(p_hwfn, "MCP drain failed\n");
147 goto err; 148 goto err;
@@ -150,18 +151,15 @@ static int qed_spq_block(struct qed_hwfn *p_hwfn,
150 /* Retry after drain */ 151 /* Retry after drain */
151 rc = __qed_spq_block(p_hwfn, p_ent, p_fw_ret, true); 152 rc = __qed_spq_block(p_hwfn, p_ent, p_fw_ret, true);
152 if (!rc) 153 if (!rc)
153 goto out; 154 return 0;
154 155
155 comp_done = (struct qed_spq_comp_done *)p_ent->comp_cb.cookie; 156 comp_done = (struct qed_spq_comp_done *)p_ent->comp_cb.cookie;
156 if (comp_done->done == 1) 157 if (comp_done->done == 1) {
157 if (p_fw_ret) 158 if (p_fw_ret)
158 *p_fw_ret = comp_done->fw_return_code; 159 *p_fw_ret = comp_done->fw_return_code;
159out: 160 return 0;
160 qed_ptt_release(p_hwfn, p_ptt); 161 }
161 return 0;
162
163err: 162err:
164 qed_ptt_release(p_hwfn, p_ptt);
165 DP_NOTICE(p_hwfn, 163 DP_NOTICE(p_hwfn,
166 "Ramrod is stuck [CID %08x cmd %02x protocol %02x echo %04x]\n", 164 "Ramrod is stuck [CID %08x cmd %02x protocol %02x echo %04x]\n",
167 le32_to_cpu(p_ent->elem.hdr.cid), 165 le32_to_cpu(p_ent->elem.hdr.cid),
@@ -685,6 +683,8 @@ static int qed_spq_add_entry(struct qed_hwfn *p_hwfn,
685 /* EBLOCK responsible to free the allocated p_ent */ 683 /* EBLOCK responsible to free the allocated p_ent */
686 if (p_ent->comp_mode != QED_SPQ_MODE_EBLOCK) 684 if (p_ent->comp_mode != QED_SPQ_MODE_EBLOCK)
687 kfree(p_ent); 685 kfree(p_ent);
686 else
687 p_ent->post_ent = p_en2;
688 688
689 p_ent = p_en2; 689 p_ent = p_en2;
690 } 690 }
@@ -767,6 +767,25 @@ static int qed_spq_pend_post(struct qed_hwfn *p_hwfn)
767 SPQ_HIGH_PRI_RESERVE_DEFAULT); 767 SPQ_HIGH_PRI_RESERVE_DEFAULT);
768} 768}
769 769
770/* Avoid overriding of SPQ entries when getting out-of-order completions, by
771 * marking the completions in a bitmap and increasing the chain consumer only
772 * for the first successive completed entries.
773 */
774static void qed_spq_comp_bmap_update(struct qed_hwfn *p_hwfn, __le16 echo)
775{
776 u16 pos = le16_to_cpu(echo) % SPQ_RING_SIZE;
777 struct qed_spq *p_spq = p_hwfn->p_spq;
778
779 __set_bit(pos, p_spq->p_comp_bitmap);
780 while (test_bit(p_spq->comp_bitmap_idx,
781 p_spq->p_comp_bitmap)) {
782 __clear_bit(p_spq->comp_bitmap_idx,
783 p_spq->p_comp_bitmap);
784 p_spq->comp_bitmap_idx++;
785 qed_chain_return_produced(&p_spq->chain);
786 }
787}
788
770int qed_spq_post(struct qed_hwfn *p_hwfn, 789int qed_spq_post(struct qed_hwfn *p_hwfn,
771 struct qed_spq_entry *p_ent, u8 *fw_return_code) 790 struct qed_spq_entry *p_ent, u8 *fw_return_code)
772{ 791{
@@ -824,11 +843,12 @@ int qed_spq_post(struct qed_hwfn *p_hwfn,
824 p_ent->queue == &p_spq->unlimited_pending); 843 p_ent->queue == &p_spq->unlimited_pending);
825 844
826 if (p_ent->queue == &p_spq->unlimited_pending) { 845 if (p_ent->queue == &p_spq->unlimited_pending) {
827 /* This is an allocated p_ent which does not need to 846 struct qed_spq_entry *p_post_ent = p_ent->post_ent;
828 * return to pool. 847
829 */
830 kfree(p_ent); 848 kfree(p_ent);
831 return rc; 849
850 /* Return the entry which was actually posted */
851 p_ent = p_post_ent;
832 } 852 }
833 853
834 if (rc) 854 if (rc)
@@ -842,7 +862,7 @@ int qed_spq_post(struct qed_hwfn *p_hwfn,
842spq_post_fail2: 862spq_post_fail2:
843 spin_lock_bh(&p_spq->lock); 863 spin_lock_bh(&p_spq->lock);
844 list_del(&p_ent->list); 864 list_del(&p_ent->list);
845 qed_chain_return_produced(&p_spq->chain); 865 qed_spq_comp_bmap_update(p_hwfn, p_ent->elem.hdr.echo);
846 866
847spq_post_fail: 867spq_post_fail:
848 /* return to the free pool */ 868 /* return to the free pool */
@@ -874,25 +894,8 @@ int qed_spq_completion(struct qed_hwfn *p_hwfn,
874 spin_lock_bh(&p_spq->lock); 894 spin_lock_bh(&p_spq->lock);
875 list_for_each_entry_safe(p_ent, tmp, &p_spq->completion_pending, list) { 895 list_for_each_entry_safe(p_ent, tmp, &p_spq->completion_pending, list) {
876 if (p_ent->elem.hdr.echo == echo) { 896 if (p_ent->elem.hdr.echo == echo) {
877 u16 pos = le16_to_cpu(echo) % SPQ_RING_SIZE;
878
879 list_del(&p_ent->list); 897 list_del(&p_ent->list);
880 898 qed_spq_comp_bmap_update(p_hwfn, echo);
881 /* Avoid overriding of SPQ entries when getting
882 * out-of-order completions, by marking the completions
883 * in a bitmap and increasing the chain consumer only
884 * for the first successive completed entries.
885 */
886 __set_bit(pos, p_spq->p_comp_bitmap);
887
888 while (test_bit(p_spq->comp_bitmap_idx,
889 p_spq->p_comp_bitmap)) {
890 __clear_bit(p_spq->comp_bitmap_idx,
891 p_spq->p_comp_bitmap);
892 p_spq->comp_bitmap_idx++;
893 qed_chain_return_produced(&p_spq->chain);
894 }
895
896 p_spq->comp_count++; 899 p_spq->comp_count++;
897 found = p_ent; 900 found = p_ent;
898 break; 901 break;
@@ -931,11 +934,9 @@ int qed_spq_completion(struct qed_hwfn *p_hwfn,
931 QED_MSG_SPQ, 934 QED_MSG_SPQ,
932 "Got a completion without a callback function\n"); 935 "Got a completion without a callback function\n");
933 936
934 if ((found->comp_mode != QED_SPQ_MODE_EBLOCK) || 937 if (found->comp_mode != QED_SPQ_MODE_EBLOCK)
935 (found->queue == &p_spq->unlimited_pending))
936 /* EBLOCK is responsible for returning its own entry into the 938 /* EBLOCK is responsible for returning its own entry into the
937 * free list, unless it originally added the entry into the 939 * free list.
938 * unlimited pending list.
939 */ 940 */
940 qed_spq_return_entry(p_hwfn, found); 941 qed_spq_return_entry(p_hwfn, found);
941 942
diff --git a/drivers/net/ethernet/qlogic/qed/qed_sriov.c b/drivers/net/ethernet/qlogic/qed/qed_sriov.c
index 9b08a9d9e151..ca6290fa0f30 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_sriov.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_sriov.c
@@ -101,6 +101,7 @@ static int qed_sp_vf_start(struct qed_hwfn *p_hwfn, struct qed_vf_info *p_vf)
101 default: 101 default:
102 DP_NOTICE(p_hwfn, "Unknown VF personality %d\n", 102 DP_NOTICE(p_hwfn, "Unknown VF personality %d\n",
103 p_hwfn->hw_info.personality); 103 p_hwfn->hw_info.personality);
104 qed_sp_destroy_request(p_hwfn, p_ent);
104 return -EINVAL; 105 return -EINVAL;
105 } 106 }
106 107
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
index 9647578cbe6a..14f26bf3b388 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
@@ -459,7 +459,7 @@ static int qlcnic_tx_pkt(struct qlcnic_adapter *adapter,
459 struct cmd_desc_type0 *first_desc, struct sk_buff *skb, 459 struct cmd_desc_type0 *first_desc, struct sk_buff *skb,
460 struct qlcnic_host_tx_ring *tx_ring) 460 struct qlcnic_host_tx_ring *tx_ring)
461{ 461{
462 u8 l4proto, opcode = 0, hdr_len = 0; 462 u8 l4proto, opcode = 0, hdr_len = 0, tag_vlan = 0;
463 u16 flags = 0, vlan_tci = 0; 463 u16 flags = 0, vlan_tci = 0;
464 int copied, offset, copy_len, size; 464 int copied, offset, copy_len, size;
465 struct cmd_desc_type0 *hwdesc; 465 struct cmd_desc_type0 *hwdesc;
@@ -472,14 +472,16 @@ static int qlcnic_tx_pkt(struct qlcnic_adapter *adapter,
472 flags = QLCNIC_FLAGS_VLAN_TAGGED; 472 flags = QLCNIC_FLAGS_VLAN_TAGGED;
473 vlan_tci = ntohs(vh->h_vlan_TCI); 473 vlan_tci = ntohs(vh->h_vlan_TCI);
474 protocol = ntohs(vh->h_vlan_encapsulated_proto); 474 protocol = ntohs(vh->h_vlan_encapsulated_proto);
475 tag_vlan = 1;
475 } else if (skb_vlan_tag_present(skb)) { 476 } else if (skb_vlan_tag_present(skb)) {
476 flags = QLCNIC_FLAGS_VLAN_OOB; 477 flags = QLCNIC_FLAGS_VLAN_OOB;
477 vlan_tci = skb_vlan_tag_get(skb); 478 vlan_tci = skb_vlan_tag_get(skb);
479 tag_vlan = 1;
478 } 480 }
479 if (unlikely(adapter->tx_pvid)) { 481 if (unlikely(adapter->tx_pvid)) {
480 if (vlan_tci && !(adapter->flags & QLCNIC_TAGGING_ENABLED)) 482 if (tag_vlan && !(adapter->flags & QLCNIC_TAGGING_ENABLED))
481 return -EIO; 483 return -EIO;
482 if (vlan_tci && (adapter->flags & QLCNIC_TAGGING_ENABLED)) 484 if (tag_vlan && (adapter->flags & QLCNIC_TAGGING_ENABLED))
483 goto set_flags; 485 goto set_flags;
484 486
485 flags = QLCNIC_FLAGS_VLAN_OOB; 487 flags = QLCNIC_FLAGS_VLAN_OOB;
diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c
index 0afc3d335d56..d11c16aeb19a 100644
--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c
+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_vnd.c
@@ -234,7 +234,7 @@ int rmnet_vnd_newlink(u8 id, struct net_device *rmnet_dev,
234 struct net_device *real_dev, 234 struct net_device *real_dev,
235 struct rmnet_endpoint *ep) 235 struct rmnet_endpoint *ep)
236{ 236{
237 struct rmnet_priv *priv; 237 struct rmnet_priv *priv = netdev_priv(rmnet_dev);
238 int rc; 238 int rc;
239 239
240 if (ep->egress_dev) 240 if (ep->egress_dev)
@@ -247,6 +247,8 @@ int rmnet_vnd_newlink(u8 id, struct net_device *rmnet_dev,
247 rmnet_dev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; 247 rmnet_dev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
248 rmnet_dev->hw_features |= NETIF_F_SG; 248 rmnet_dev->hw_features |= NETIF_F_SG;
249 249
250 priv->real_dev = real_dev;
251
250 rc = register_netdevice(rmnet_dev); 252 rc = register_netdevice(rmnet_dev);
251 if (!rc) { 253 if (!rc) {
252 ep->egress_dev = rmnet_dev; 254 ep->egress_dev = rmnet_dev;
@@ -255,9 +257,7 @@ int rmnet_vnd_newlink(u8 id, struct net_device *rmnet_dev,
255 257
256 rmnet_dev->rtnl_link_ops = &rmnet_link_ops; 258 rmnet_dev->rtnl_link_ops = &rmnet_link_ops;
257 259
258 priv = netdev_priv(rmnet_dev);
259 priv->mux_id = id; 260 priv->mux_id = id;
260 priv->real_dev = real_dev;
261 261
262 netdev_dbg(rmnet_dev, "rmnet dev created\n"); 262 netdev_dbg(rmnet_dev, "rmnet dev created\n");
263 } 263 }
diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h
index b1b305f8f414..272b9ca66314 100644
--- a/drivers/net/ethernet/stmicro/stmmac/common.h
+++ b/drivers/net/ethernet/stmicro/stmmac/common.h
@@ -365,7 +365,8 @@ struct dma_features {
365 365
366/* GMAC TX FIFO is 8K, Rx FIFO is 16K */ 366/* GMAC TX FIFO is 8K, Rx FIFO is 16K */
367#define BUF_SIZE_16KiB 16384 367#define BUF_SIZE_16KiB 16384
368#define BUF_SIZE_8KiB 8192 368/* RX Buffer size must be < 8191 and multiple of 4/8/16 bytes */
369#define BUF_SIZE_8KiB 8188
369#define BUF_SIZE_4KiB 4096 370#define BUF_SIZE_4KiB 4096
370#define BUF_SIZE_2KiB 2048 371#define BUF_SIZE_2KiB 2048
371 372
diff --git a/drivers/net/ethernet/stmicro/stmmac/descs_com.h b/drivers/net/ethernet/stmicro/stmmac/descs_com.h
index ca9d7e48034c..40d6356a7e73 100644
--- a/drivers/net/ethernet/stmicro/stmmac/descs_com.h
+++ b/drivers/net/ethernet/stmicro/stmmac/descs_com.h
@@ -31,7 +31,7 @@
31/* Enhanced descriptors */ 31/* Enhanced descriptors */
32static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end) 32static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end)
33{ 33{
34 p->des1 |= cpu_to_le32(((BUF_SIZE_8KiB - 1) 34 p->des1 |= cpu_to_le32((BUF_SIZE_8KiB
35 << ERDES1_BUFFER2_SIZE_SHIFT) 35 << ERDES1_BUFFER2_SIZE_SHIFT)
36 & ERDES1_BUFFER2_SIZE_MASK); 36 & ERDES1_BUFFER2_SIZE_MASK);
37 37
diff --git a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
index 77914c89d749..5ef91a790f9d 100644
--- a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
+++ b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
@@ -262,7 +262,7 @@ static void enh_desc_init_rx_desc(struct dma_desc *p, int disable_rx_ic,
262 int mode, int end) 262 int mode, int end)
263{ 263{
264 p->des0 |= cpu_to_le32(RDES0_OWN); 264 p->des0 |= cpu_to_le32(RDES0_OWN);
265 p->des1 |= cpu_to_le32((BUF_SIZE_8KiB - 1) & ERDES1_BUFFER1_SIZE_MASK); 265 p->des1 |= cpu_to_le32(BUF_SIZE_8KiB & ERDES1_BUFFER1_SIZE_MASK);
266 266
267 if (mode == STMMAC_CHAIN_MODE) 267 if (mode == STMMAC_CHAIN_MODE)
268 ehn_desc_rx_set_on_chain(p); 268 ehn_desc_rx_set_on_chain(p);
diff --git a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
index abc3f85270cd..d8c5bc412219 100644
--- a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
+++ b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
@@ -140,7 +140,7 @@ static void clean_desc3(void *priv_ptr, struct dma_desc *p)
140static int set_16kib_bfsize(int mtu) 140static int set_16kib_bfsize(int mtu)
141{ 141{
142 int ret = 0; 142 int ret = 0;
143 if (unlikely(mtu >= BUF_SIZE_8KiB)) 143 if (unlikely(mtu > BUF_SIZE_8KiB))
144 ret = BUF_SIZE_16KiB; 144 ret = BUF_SIZE_16KiB;
145 return ret; 145 return ret;
146} 146}
diff --git a/drivers/net/fddi/defza.c b/drivers/net/fddi/defza.c
index 3b7f10a5f06a..c5cae8e74dc4 100644
--- a/drivers/net/fddi/defza.c
+++ b/drivers/net/fddi/defza.c
@@ -1,4 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0 1// SPDX-License-Identifier: GPL-2.0+
2/* FDDI network adapter driver for DEC FDDIcontroller 700/700-C devices. 2/* FDDI network adapter driver for DEC FDDIcontroller 700/700-C devices.
3 * 3 *
4 * Copyright (c) 2018 Maciej W. Rozycki 4 * Copyright (c) 2018 Maciej W. Rozycki
@@ -56,7 +56,7 @@
56#define DRV_VERSION "v.1.1.4" 56#define DRV_VERSION "v.1.1.4"
57#define DRV_RELDATE "Oct 6 2018" 57#define DRV_RELDATE "Oct 6 2018"
58 58
59static char version[] = 59static const char version[] =
60 DRV_NAME ": " DRV_VERSION " " DRV_RELDATE " Maciej W. Rozycki\n"; 60 DRV_NAME ": " DRV_VERSION " " DRV_RELDATE " Maciej W. Rozycki\n";
61 61
62MODULE_AUTHOR("Maciej W. Rozycki <macro@linux-mips.org>"); 62MODULE_AUTHOR("Maciej W. Rozycki <macro@linux-mips.org>");
@@ -784,7 +784,7 @@ err_rx:
784static void fza_tx_smt(struct net_device *dev) 784static void fza_tx_smt(struct net_device *dev)
785{ 785{
786 struct fza_private *fp = netdev_priv(dev); 786 struct fza_private *fp = netdev_priv(dev);
787 struct fza_buffer_tx __iomem *smt_tx_ptr, *skb_data_ptr; 787 struct fza_buffer_tx __iomem *smt_tx_ptr;
788 int i, len; 788 int i, len;
789 u32 own; 789 u32 own;
790 790
@@ -799,6 +799,7 @@ static void fza_tx_smt(struct net_device *dev)
799 799
800 if (!netif_queue_stopped(dev)) { 800 if (!netif_queue_stopped(dev)) {
801 if (dev_nit_active(dev)) { 801 if (dev_nit_active(dev)) {
802 struct fza_buffer_tx *skb_data_ptr;
802 struct sk_buff *skb; 803 struct sk_buff *skb;
803 804
804 /* Length must be a multiple of 4 as only word 805 /* Length must be a multiple of 4 as only word
diff --git a/drivers/net/fddi/defza.h b/drivers/net/fddi/defza.h
index b06acf32738e..93bda61be8e3 100644
--- a/drivers/net/fddi/defza.h
+++ b/drivers/net/fddi/defza.h
@@ -1,4 +1,4 @@
1/* SPDX-License-Identifier: GPL-2.0 */ 1/* SPDX-License-Identifier: GPL-2.0+ */
2/* FDDI network adapter driver for DEC FDDIcontroller 700/700-C devices. 2/* FDDI network adapter driver for DEC FDDIcontroller 700/700-C devices.
3 * 3 *
4 * Copyright (c) 2018 Maciej W. Rozycki 4 * Copyright (c) 2018 Maciej W. Rozycki
@@ -235,6 +235,7 @@ struct fza_ring_cmd {
235#define FZA_RING_CMD 0x200400 /* command ring address */ 235#define FZA_RING_CMD 0x200400 /* command ring address */
236#define FZA_RING_CMD_SIZE 0x40 /* command descriptor ring 236#define FZA_RING_CMD_SIZE 0x40 /* command descriptor ring
237 * size 237 * size
238 */
238/* Command constants. */ 239/* Command constants. */
239#define FZA_RING_CMD_MASK 0x7fffffff 240#define FZA_RING_CMD_MASK 0x7fffffff
240#define FZA_RING_CMD_NOP 0x00000000 /* nop */ 241#define FZA_RING_CMD_NOP 0x00000000 /* nop */
diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c
index e86ea105c802..704537010453 100644
--- a/drivers/net/phy/broadcom.c
+++ b/drivers/net/phy/broadcom.c
@@ -92,7 +92,7 @@ static int bcm54612e_config_init(struct phy_device *phydev)
92 return 0; 92 return 0;
93} 93}
94 94
95static int bcm5481x_config(struct phy_device *phydev) 95static int bcm54xx_config_clock_delay(struct phy_device *phydev)
96{ 96{
97 int rc, val; 97 int rc, val;
98 98
@@ -429,7 +429,7 @@ static int bcm5481_config_aneg(struct phy_device *phydev)
429 ret = genphy_config_aneg(phydev); 429 ret = genphy_config_aneg(phydev);
430 430
431 /* Then we can set up the delay. */ 431 /* Then we can set up the delay. */
432 bcm5481x_config(phydev); 432 bcm54xx_config_clock_delay(phydev);
433 433
434 if (of_property_read_bool(np, "enet-phy-lane-swap")) { 434 if (of_property_read_bool(np, "enet-phy-lane-swap")) {
435 /* Lane Swap - Undocumented register...magic! */ 435 /* Lane Swap - Undocumented register...magic! */
@@ -442,6 +442,19 @@ static int bcm5481_config_aneg(struct phy_device *phydev)
442 return ret; 442 return ret;
443} 443}
444 444
445static int bcm54616s_config_aneg(struct phy_device *phydev)
446{
447 int ret;
448
449 /* Aneg firsly. */
450 ret = genphy_config_aneg(phydev);
451
452 /* Then we can set up the delay. */
453 bcm54xx_config_clock_delay(phydev);
454
455 return ret;
456}
457
445static int brcm_phy_setbits(struct phy_device *phydev, int reg, int set) 458static int brcm_phy_setbits(struct phy_device *phydev, int reg, int set)
446{ 459{
447 int val; 460 int val;
@@ -636,6 +649,7 @@ static struct phy_driver broadcom_drivers[] = {
636 .features = PHY_GBIT_FEATURES, 649 .features = PHY_GBIT_FEATURES,
637 .flags = PHY_HAS_INTERRUPT, 650 .flags = PHY_HAS_INTERRUPT,
638 .config_init = bcm54xx_config_init, 651 .config_init = bcm54xx_config_init,
652 .config_aneg = bcm54616s_config_aneg,
639 .ack_interrupt = bcm_phy_ack_intr, 653 .ack_interrupt = bcm_phy_ack_intr,
640 .config_intr = bcm_phy_config_intr, 654 .config_intr = bcm_phy_config_intr,
641}, { 655}, {
diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
index 7fc8508b5231..271e8adc39f1 100644
--- a/drivers/net/phy/realtek.c
+++ b/drivers/net/phy/realtek.c
@@ -220,7 +220,7 @@ static struct phy_driver realtek_drvs[] = {
220 .flags = PHY_HAS_INTERRUPT, 220 .flags = PHY_HAS_INTERRUPT,
221 }, { 221 }, {
222 .phy_id = 0x001cc816, 222 .phy_id = 0x001cc816,
223 .name = "RTL8201F 10/100Mbps Ethernet", 223 .name = "RTL8201F Fast Ethernet",
224 .phy_id_mask = 0x001fffff, 224 .phy_id_mask = 0x001fffff,
225 .features = PHY_BASIC_FEATURES, 225 .features = PHY_BASIC_FEATURES,
226 .flags = PHY_HAS_INTERRUPT, 226 .flags = PHY_HAS_INTERRUPT,
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index 262e7a3c23cb..f2d01cb6f958 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -1321,6 +1321,8 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
1321 dev->net->ethtool_ops = &smsc95xx_ethtool_ops; 1321 dev->net->ethtool_ops = &smsc95xx_ethtool_ops;
1322 dev->net->flags |= IFF_MULTICAST; 1322 dev->net->flags |= IFF_MULTICAST;
1323 dev->net->hard_header_len += SMSC95XX_TX_OVERHEAD_CSUM; 1323 dev->net->hard_header_len += SMSC95XX_TX_OVERHEAD_CSUM;
1324 dev->net->min_mtu = ETH_MIN_MTU;
1325 dev->net->max_mtu = ETH_DATA_LEN;
1324 dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len; 1326 dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
1325 1327
1326 pdata->dev = dev; 1328 pdata->dev = dev;
@@ -1598,6 +1600,8 @@ static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message)
1598 return ret; 1600 return ret;
1599 } 1601 }
1600 1602
1603 cancel_delayed_work_sync(&pdata->carrier_check);
1604
1601 if (pdata->suspend_flags) { 1605 if (pdata->suspend_flags) {
1602 netdev_warn(dev->net, "error during last resume\n"); 1606 netdev_warn(dev->net, "error during last resume\n");
1603 pdata->suspend_flags = 0; 1607 pdata->suspend_flags = 0;
@@ -1840,6 +1844,11 @@ done:
1840 */ 1844 */
1841 if (ret && PMSG_IS_AUTO(message)) 1845 if (ret && PMSG_IS_AUTO(message))
1842 usbnet_resume(intf); 1846 usbnet_resume(intf);
1847
1848 if (ret)
1849 schedule_delayed_work(&pdata->carrier_check,
1850 CARRIER_CHECK_DELAY);
1851
1843 return ret; 1852 return ret;
1844} 1853}
1845 1854
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 2e65be8b1387..559d567693b8 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1519,8 +1519,10 @@ static void __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id)
1519 if (ns->ndev) 1519 if (ns->ndev)
1520 nvme_nvm_update_nvm_info(ns); 1520 nvme_nvm_update_nvm_info(ns);
1521#ifdef CONFIG_NVME_MULTIPATH 1521#ifdef CONFIG_NVME_MULTIPATH
1522 if (ns->head->disk) 1522 if (ns->head->disk) {
1523 nvme_update_disk_info(ns->head->disk, ns, id); 1523 nvme_update_disk_info(ns->head->disk, ns, id);
1524 blk_queue_stack_limits(ns->head->disk->queue, ns->queue);
1525 }
1524#endif 1526#endif
1525} 1527}
1526 1528
diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c
index 5e3cc8c59a39..9901afd804ce 100644
--- a/drivers/nvme/host/multipath.c
+++ b/drivers/nvme/host/multipath.c
@@ -285,6 +285,7 @@ int nvme_mpath_alloc_disk(struct nvme_ctrl *ctrl, struct nvme_ns_head *head)
285 blk_queue_flag_set(QUEUE_FLAG_NONROT, q); 285 blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
286 /* set to a default value for 512 until disk is validated */ 286 /* set to a default value for 512 until disk is validated */
287 blk_queue_logical_block_size(q, 512); 287 blk_queue_logical_block_size(q, 512);
288 blk_set_stacking_limits(&q->limits);
288 289
289 /* we need to propagate up the VMC settings */ 290 /* we need to propagate up the VMC settings */
290 if (ctrl->vwc & NVME_CTRL_VWC_PRESENT) 291 if (ctrl->vwc & NVME_CTRL_VWC_PRESENT)
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
index f4efe289dc7b..a5f9bbce863f 100644
--- a/drivers/nvme/target/core.c
+++ b/drivers/nvme/target/core.c
@@ -420,7 +420,7 @@ static void nvmet_p2pmem_ns_add_p2p(struct nvmet_ctrl *ctrl,
420 struct pci_dev *p2p_dev; 420 struct pci_dev *p2p_dev;
421 int ret; 421 int ret;
422 422
423 if (!ctrl->p2p_client) 423 if (!ctrl->p2p_client || !ns->use_p2pmem)
424 return; 424 return;
425 425
426 if (ns->p2p_dev) { 426 if (ns->p2p_dev) {
diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c
index ddce100be57a..3f7971d3706d 100644
--- a/drivers/nvme/target/rdma.c
+++ b/drivers/nvme/target/rdma.c
@@ -122,7 +122,6 @@ struct nvmet_rdma_device {
122 int inline_page_count; 122 int inline_page_count;
123}; 123};
124 124
125static struct workqueue_struct *nvmet_rdma_delete_wq;
126static bool nvmet_rdma_use_srq; 125static bool nvmet_rdma_use_srq;
127module_param_named(use_srq, nvmet_rdma_use_srq, bool, 0444); 126module_param_named(use_srq, nvmet_rdma_use_srq, bool, 0444);
128MODULE_PARM_DESC(use_srq, "Use shared receive queue."); 127MODULE_PARM_DESC(use_srq, "Use shared receive queue.");
@@ -1274,12 +1273,12 @@ static int nvmet_rdma_queue_connect(struct rdma_cm_id *cm_id,
1274 1273
1275 if (queue->host_qid == 0) { 1274 if (queue->host_qid == 0) {
1276 /* Let inflight controller teardown complete */ 1275 /* Let inflight controller teardown complete */
1277 flush_workqueue(nvmet_rdma_delete_wq); 1276 flush_scheduled_work();
1278 } 1277 }
1279 1278
1280 ret = nvmet_rdma_cm_accept(cm_id, queue, &event->param.conn); 1279 ret = nvmet_rdma_cm_accept(cm_id, queue, &event->param.conn);
1281 if (ret) { 1280 if (ret) {
1282 queue_work(nvmet_rdma_delete_wq, &queue->release_work); 1281 schedule_work(&queue->release_work);
1283 /* Destroying rdma_cm id is not needed here */ 1282 /* Destroying rdma_cm id is not needed here */
1284 return 0; 1283 return 0;
1285 } 1284 }
@@ -1344,7 +1343,7 @@ static void __nvmet_rdma_queue_disconnect(struct nvmet_rdma_queue *queue)
1344 1343
1345 if (disconnect) { 1344 if (disconnect) {
1346 rdma_disconnect(queue->cm_id); 1345 rdma_disconnect(queue->cm_id);
1347 queue_work(nvmet_rdma_delete_wq, &queue->release_work); 1346 schedule_work(&queue->release_work);
1348 } 1347 }
1349} 1348}
1350 1349
@@ -1374,7 +1373,7 @@ static void nvmet_rdma_queue_connect_fail(struct rdma_cm_id *cm_id,
1374 mutex_unlock(&nvmet_rdma_queue_mutex); 1373 mutex_unlock(&nvmet_rdma_queue_mutex);
1375 1374
1376 pr_err("failed to connect queue %d\n", queue->idx); 1375 pr_err("failed to connect queue %d\n", queue->idx);
1377 queue_work(nvmet_rdma_delete_wq, &queue->release_work); 1376 schedule_work(&queue->release_work);
1378} 1377}
1379 1378
1380/** 1379/**
@@ -1656,17 +1655,8 @@ static int __init nvmet_rdma_init(void)
1656 if (ret) 1655 if (ret)
1657 goto err_ib_client; 1656 goto err_ib_client;
1658 1657
1659 nvmet_rdma_delete_wq = alloc_workqueue("nvmet-rdma-delete-wq",
1660 WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0);
1661 if (!nvmet_rdma_delete_wq) {
1662 ret = -ENOMEM;
1663 goto err_unreg_transport;
1664 }
1665
1666 return 0; 1658 return 0;
1667 1659
1668err_unreg_transport:
1669 nvmet_unregister_transport(&nvmet_rdma_ops);
1670err_ib_client: 1660err_ib_client:
1671 ib_unregister_client(&nvmet_rdma_ib_client); 1661 ib_unregister_client(&nvmet_rdma_ib_client);
1672 return ret; 1662 return ret;
@@ -1674,7 +1664,6 @@ err_ib_client:
1674 1664
1675static void __exit nvmet_rdma_exit(void) 1665static void __exit nvmet_rdma_exit(void)
1676{ 1666{
1677 destroy_workqueue(nvmet_rdma_delete_wq);
1678 nvmet_unregister_transport(&nvmet_rdma_ops); 1667 nvmet_unregister_transport(&nvmet_rdma_ops);
1679 ib_unregister_client(&nvmet_rdma_ib_client); 1668 ib_unregister_client(&nvmet_rdma_ib_client);
1680 WARN_ON_ONCE(!list_empty(&nvmet_rdma_queue_list)); 1669 WARN_ON_ONCE(!list_empty(&nvmet_rdma_queue_list));
diff --git a/drivers/of/device.c b/drivers/of/device.c
index 0f27fad9fe94..5592437bb3d1 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -149,9 +149,11 @@ int of_dma_configure(struct device *dev, struct device_node *np, bool force_dma)
149 * set by the driver. 149 * set by the driver.
150 */ 150 */
151 mask = DMA_BIT_MASK(ilog2(dma_addr + size - 1) + 1); 151 mask = DMA_BIT_MASK(ilog2(dma_addr + size - 1) + 1);
152 dev->bus_dma_mask = mask;
153 dev->coherent_dma_mask &= mask; 152 dev->coherent_dma_mask &= mask;
154 *dev->dma_mask &= mask; 153 *dev->dma_mask &= mask;
154 /* ...but only set bus mask if we found valid dma-ranges earlier */
155 if (!ret)
156 dev->bus_dma_mask = mask;
155 157
156 coherent = of_dma_is_coherent(np); 158 coherent = of_dma_is_coherent(np);
157 dev_dbg(dev, "device is%sdma coherent\n", 159 dev_dbg(dev, "device is%sdma coherent\n",
diff --git a/drivers/of/of_numa.c b/drivers/of/of_numa.c
index 35c64a4295e0..fe6b13608e51 100644
--- a/drivers/of/of_numa.c
+++ b/drivers/of/of_numa.c
@@ -104,9 +104,14 @@ static int __init of_numa_parse_distance_map_v1(struct device_node *map)
104 distance = of_read_number(matrix, 1); 104 distance = of_read_number(matrix, 1);
105 matrix++; 105 matrix++;
106 106
107 if ((nodea == nodeb && distance != LOCAL_DISTANCE) ||
108 (nodea != nodeb && distance <= LOCAL_DISTANCE)) {
109 pr_err("Invalid distance[node%d -> node%d] = %d\n",
110 nodea, nodeb, distance);
111 return -EINVAL;
112 }
113
107 numa_set_distance(nodea, nodeb, distance); 114 numa_set_distance(nodea, nodeb, distance);
108 pr_debug("distance[node%d -> node%d] = %d\n",
109 nodea, nodeb, distance);
110 115
111 /* Set default distance of node B->A same as A->B */ 116 /* Set default distance of node B->A same as A->B */
112 if (nodeb > nodea) 117 if (nodeb > nodea)
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c
index 2a4aa6468579..921db6f80340 100644
--- a/drivers/pci/pci-acpi.c
+++ b/drivers/pci/pci-acpi.c
@@ -793,15 +793,10 @@ static void pci_acpi_setup(struct device *dev)
793{ 793{
794 struct pci_dev *pci_dev = to_pci_dev(dev); 794 struct pci_dev *pci_dev = to_pci_dev(dev);
795 struct acpi_device *adev = ACPI_COMPANION(dev); 795 struct acpi_device *adev = ACPI_COMPANION(dev);
796 int node;
797 796
798 if (!adev) 797 if (!adev)
799 return; 798 return;
800 799
801 node = acpi_get_node(adev->handle);
802 if (node != NUMA_NO_NODE)
803 set_dev_node(dev, node);
804
805 pci_acpi_optimize_delay(pci_dev, adev->handle); 800 pci_acpi_optimize_delay(pci_dev, adev->handle);
806 801
807 pci_acpi_add_pm_notifier(adev, pci_dev); 802 pci_acpi_add_pm_notifier(adev, pci_dev);
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
index 4ceb06f8a33c..4edeb4cae72a 100644
--- a/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxbb.c
@@ -830,7 +830,7 @@ static struct meson_bank meson_gxbb_periphs_banks[] = {
830 830
831static struct meson_bank meson_gxbb_aobus_banks[] = { 831static struct meson_bank meson_gxbb_aobus_banks[] = {
832 /* name first last irq pullen pull dir out in */ 832 /* name first last irq pullen pull dir out in */
833 BANK("AO", GPIOAO_0, GPIOAO_13, 0, 13, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0), 833 BANK("AO", GPIOAO_0, GPIOAO_13, 0, 13, 0, 16, 0, 0, 0, 0, 0, 16, 1, 0),
834}; 834};
835 835
836static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = { 836static struct meson_pinctrl_data meson_gxbb_periphs_pinctrl_data = {
diff --git a/drivers/pinctrl/meson/pinctrl-meson-gxl.c b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
index 7dae1d7bf6b0..158f618f1695 100644
--- a/drivers/pinctrl/meson/pinctrl-meson-gxl.c
+++ b/drivers/pinctrl/meson/pinctrl-meson-gxl.c
@@ -807,7 +807,7 @@ static struct meson_bank meson_gxl_periphs_banks[] = {
807 807
808static struct meson_bank meson_gxl_aobus_banks[] = { 808static struct meson_bank meson_gxl_aobus_banks[] = {
809 /* name first last irq pullen pull dir out in */ 809 /* name first last irq pullen pull dir out in */
810 BANK("AO", GPIOAO_0, GPIOAO_9, 0, 9, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0), 810 BANK("AO", GPIOAO_0, GPIOAO_9, 0, 9, 0, 16, 0, 0, 0, 0, 0, 16, 1, 0),
811}; 811};
812 812
813static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = { 813static struct meson_pinctrl_data meson_gxl_periphs_pinctrl_data = {
diff --git a/drivers/pinctrl/meson/pinctrl-meson.c b/drivers/pinctrl/meson/pinctrl-meson.c
index f8b778a7d471..53d449076dee 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.c
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
@@ -192,7 +192,7 @@ static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
192 dev_dbg(pc->dev, "pin %u: disable bias\n", pin); 192 dev_dbg(pc->dev, "pin %u: disable bias\n", pin);
193 193
194 meson_calc_reg_and_bit(bank, pin, REG_PULL, &reg, &bit); 194 meson_calc_reg_and_bit(bank, pin, REG_PULL, &reg, &bit);
195 ret = regmap_update_bits(pc->reg_pull, reg, 195 ret = regmap_update_bits(pc->reg_pullen, reg,
196 BIT(bit), 0); 196 BIT(bit), 0);
197 if (ret) 197 if (ret)
198 return ret; 198 return ret;
diff --git a/drivers/pinctrl/meson/pinctrl-meson8.c b/drivers/pinctrl/meson/pinctrl-meson8.c
index c6d79315218f..86466173114d 100644
--- a/drivers/pinctrl/meson/pinctrl-meson8.c
+++ b/drivers/pinctrl/meson/pinctrl-meson8.c
@@ -1053,7 +1053,7 @@ static struct meson_bank meson8_cbus_banks[] = {
1053 1053
1054static struct meson_bank meson8_aobus_banks[] = { 1054static struct meson_bank meson8_aobus_banks[] = {
1055 /* name first last irq pullen pull dir out in */ 1055 /* name first last irq pullen pull dir out in */
1056 BANK("AO", GPIOAO_0, GPIO_TEST_N, 0, 13, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0), 1056 BANK("AO", GPIOAO_0, GPIO_TEST_N, 0, 13, 0, 16, 0, 0, 0, 0, 0, 16, 1, 0),
1057}; 1057};
1058 1058
1059static struct meson_pinctrl_data meson8_cbus_pinctrl_data = { 1059static struct meson_pinctrl_data meson8_cbus_pinctrl_data = {
diff --git a/drivers/pinctrl/meson/pinctrl-meson8b.c b/drivers/pinctrl/meson/pinctrl-meson8b.c
index bb2a30964fc6..647ad15d5c3c 100644
--- a/drivers/pinctrl/meson/pinctrl-meson8b.c
+++ b/drivers/pinctrl/meson/pinctrl-meson8b.c
@@ -906,7 +906,7 @@ static struct meson_bank meson8b_cbus_banks[] = {
906 906
907static struct meson_bank meson8b_aobus_banks[] = { 907static struct meson_bank meson8b_aobus_banks[] = {
908 /* name first lastc irq pullen pull dir out in */ 908 /* name first lastc irq pullen pull dir out in */
909 BANK("AO", GPIOAO_0, GPIO_TEST_N, 0, 13, 0, 0, 0, 16, 0, 0, 0, 16, 1, 0), 909 BANK("AO", GPIOAO_0, GPIO_TEST_N, 0, 13, 0, 16, 0, 0, 0, 0, 0, 16, 1, 0),
910}; 910};
911 911
912static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = { 912static struct meson_pinctrl_data meson8b_cbus_pinctrl_data = {
diff --git a/drivers/rtc/hctosys.c b/drivers/rtc/hctosys.c
index e79f2a181ad2..b9ec4a16db1f 100644
--- a/drivers/rtc/hctosys.c
+++ b/drivers/rtc/hctosys.c
@@ -50,8 +50,10 @@ static int __init rtc_hctosys(void)
50 tv64.tv_sec = rtc_tm_to_time64(&tm); 50 tv64.tv_sec = rtc_tm_to_time64(&tm);
51 51
52#if BITS_PER_LONG == 32 52#if BITS_PER_LONG == 32
53 if (tv64.tv_sec > INT_MAX) 53 if (tv64.tv_sec > INT_MAX) {
54 err = -ERANGE;
54 goto err_read; 55 goto err_read;
56 }
55#endif 57#endif
56 58
57 err = do_settimeofday64(&tv64); 59 err = do_settimeofday64(&tv64);
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
index df0c5776d49b..a5a19ff10535 100644
--- a/drivers/rtc/rtc-cmos.c
+++ b/drivers/rtc/rtc-cmos.c
@@ -257,6 +257,7 @@ static int cmos_read_alarm(struct device *dev, struct rtc_wkalrm *t)
257 struct cmos_rtc *cmos = dev_get_drvdata(dev); 257 struct cmos_rtc *cmos = dev_get_drvdata(dev);
258 unsigned char rtc_control; 258 unsigned char rtc_control;
259 259
260 /* This not only a rtc_op, but also called directly */
260 if (!is_valid_irq(cmos->irq)) 261 if (!is_valid_irq(cmos->irq))
261 return -EIO; 262 return -EIO;
262 263
@@ -452,6 +453,7 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
452 unsigned char mon, mday, hrs, min, sec, rtc_control; 453 unsigned char mon, mday, hrs, min, sec, rtc_control;
453 int ret; 454 int ret;
454 455
456 /* This not only a rtc_op, but also called directly */
455 if (!is_valid_irq(cmos->irq)) 457 if (!is_valid_irq(cmos->irq))
456 return -EIO; 458 return -EIO;
457 459
@@ -516,9 +518,6 @@ static int cmos_alarm_irq_enable(struct device *dev, unsigned int enabled)
516 struct cmos_rtc *cmos = dev_get_drvdata(dev); 518 struct cmos_rtc *cmos = dev_get_drvdata(dev);
517 unsigned long flags; 519 unsigned long flags;
518 520
519 if (!is_valid_irq(cmos->irq))
520 return -EINVAL;
521
522 spin_lock_irqsave(&rtc_lock, flags); 521 spin_lock_irqsave(&rtc_lock, flags);
523 522
524 if (enabled) 523 if (enabled)
@@ -579,6 +578,12 @@ static const struct rtc_class_ops cmos_rtc_ops = {
579 .alarm_irq_enable = cmos_alarm_irq_enable, 578 .alarm_irq_enable = cmos_alarm_irq_enable,
580}; 579};
581 580
581static const struct rtc_class_ops cmos_rtc_ops_no_alarm = {
582 .read_time = cmos_read_time,
583 .set_time = cmos_set_time,
584 .proc = cmos_procfs,
585};
586
582/*----------------------------------------------------------------*/ 587/*----------------------------------------------------------------*/
583 588
584/* 589/*
@@ -855,9 +860,12 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
855 dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq); 860 dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq);
856 goto cleanup1; 861 goto cleanup1;
857 } 862 }
863
864 cmos_rtc.rtc->ops = &cmos_rtc_ops;
865 } else {
866 cmos_rtc.rtc->ops = &cmos_rtc_ops_no_alarm;
858 } 867 }
859 868
860 cmos_rtc.rtc->ops = &cmos_rtc_ops;
861 cmos_rtc.rtc->nvram_old_abi = true; 869 cmos_rtc.rtc->nvram_old_abi = true;
862 retval = rtc_register_device(cmos_rtc.rtc); 870 retval = rtc_register_device(cmos_rtc.rtc);
863 if (retval) 871 if (retval)
diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c
index 9f99a0966550..7cb786d76e3c 100644
--- a/drivers/rtc/rtc-pcf2127.c
+++ b/drivers/rtc/rtc-pcf2127.c
@@ -303,6 +303,9 @@ static int pcf2127_i2c_gather_write(void *context,
303 memcpy(buf + 1, val, val_size); 303 memcpy(buf + 1, val, val_size);
304 304
305 ret = i2c_master_send(client, buf, val_size + 1); 305 ret = i2c_master_send(client, buf, val_size + 1);
306
307 kfree(buf);
308
306 if (ret != val_size + 1) 309 if (ret != val_size + 1)
307 return ret < 0 ? ret : -EIO; 310 return ret < 0 ? ret : -EIO;
308 311
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
index 6843bc7ee9f2..04e294d1d16d 100644
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -87,6 +87,18 @@ struct qeth_dbf_info {
87#define SENSE_RESETTING_EVENT_BYTE 1 87#define SENSE_RESETTING_EVENT_BYTE 1
88#define SENSE_RESETTING_EVENT_FLAG 0x80 88#define SENSE_RESETTING_EVENT_FLAG 0x80
89 89
90static inline u32 qeth_get_device_id(struct ccw_device *cdev)
91{
92 struct ccw_dev_id dev_id;
93 u32 id;
94
95 ccw_device_get_id(cdev, &dev_id);
96 id = dev_id.devno;
97 id |= (u32) (dev_id.ssid << 16);
98
99 return id;
100}
101
90/* 102/*
91 * Common IO related definitions 103 * Common IO related definitions
92 */ 104 */
@@ -97,7 +109,8 @@ struct qeth_dbf_info {
97#define CARD_RDEV_ID(card) dev_name(&card->read.ccwdev->dev) 109#define CARD_RDEV_ID(card) dev_name(&card->read.ccwdev->dev)
98#define CARD_WDEV_ID(card) dev_name(&card->write.ccwdev->dev) 110#define CARD_WDEV_ID(card) dev_name(&card->write.ccwdev->dev)
99#define CARD_DDEV_ID(card) dev_name(&card->data.ccwdev->dev) 111#define CARD_DDEV_ID(card) dev_name(&card->data.ccwdev->dev)
100#define CHANNEL_ID(channel) dev_name(&channel->ccwdev->dev) 112#define CCW_DEVID(cdev) (qeth_get_device_id(cdev))
113#define CARD_DEVID(card) (CCW_DEVID(CARD_RDEV(card)))
101 114
102/** 115/**
103 * card stuff 116 * card stuff
@@ -830,6 +843,11 @@ struct qeth_trap_id {
830/*some helper functions*/ 843/*some helper functions*/
831#define QETH_CARD_IFNAME(card) (((card)->dev)? (card)->dev->name : "") 844#define QETH_CARD_IFNAME(card) (((card)->dev)? (card)->dev->name : "")
832 845
846static inline bool qeth_netdev_is_registered(struct net_device *dev)
847{
848 return dev->netdev_ops != NULL;
849}
850
833static inline void qeth_scrub_qdio_buffer(struct qdio_buffer *buf, 851static inline void qeth_scrub_qdio_buffer(struct qdio_buffer *buf,
834 unsigned int elements) 852 unsigned int elements)
835{ 853{
@@ -973,7 +991,7 @@ int qeth_wait_for_threads(struct qeth_card *, unsigned long);
973int qeth_do_run_thread(struct qeth_card *, unsigned long); 991int qeth_do_run_thread(struct qeth_card *, unsigned long);
974void qeth_clear_thread_start_bit(struct qeth_card *, unsigned long); 992void qeth_clear_thread_start_bit(struct qeth_card *, unsigned long);
975void qeth_clear_thread_running_bit(struct qeth_card *, unsigned long); 993void qeth_clear_thread_running_bit(struct qeth_card *, unsigned long);
976int qeth_core_hardsetup_card(struct qeth_card *); 994int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok);
977void qeth_print_status_message(struct qeth_card *); 995void qeth_print_status_message(struct qeth_card *);
978int qeth_init_qdio_queues(struct qeth_card *); 996int qeth_init_qdio_queues(struct qeth_card *);
979int qeth_send_ipa_cmd(struct qeth_card *, struct qeth_cmd_buffer *, 997int qeth_send_ipa_cmd(struct qeth_card *, struct qeth_cmd_buffer *,
@@ -1028,11 +1046,6 @@ int qeth_configure_cq(struct qeth_card *, enum qeth_cq);
1028int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action); 1046int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action);
1029void qeth_trace_features(struct qeth_card *); 1047void qeth_trace_features(struct qeth_card *);
1030void qeth_close_dev(struct qeth_card *); 1048void qeth_close_dev(struct qeth_card *);
1031int qeth_send_setassparms(struct qeth_card *, struct qeth_cmd_buffer *, __u16,
1032 long,
1033 int (*reply_cb)(struct qeth_card *,
1034 struct qeth_reply *, unsigned long),
1035 void *);
1036int qeth_setassparms_cb(struct qeth_card *, struct qeth_reply *, unsigned long); 1049int qeth_setassparms_cb(struct qeth_card *, struct qeth_reply *, unsigned long);
1037struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *, 1050struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *,
1038 enum qeth_ipa_funcs, 1051 enum qeth_ipa_funcs,
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 3274f13aad57..4bce5ae65a55 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -167,6 +167,8 @@ const char *qeth_get_cardname_short(struct qeth_card *card)
167 return "OSD_1000"; 167 return "OSD_1000";
168 case QETH_LINK_TYPE_10GBIT_ETH: 168 case QETH_LINK_TYPE_10GBIT_ETH:
169 return "OSD_10GIG"; 169 return "OSD_10GIG";
170 case QETH_LINK_TYPE_25GBIT_ETH:
171 return "OSD_25GIG";
170 case QETH_LINK_TYPE_LANE_ETH100: 172 case QETH_LINK_TYPE_LANE_ETH100:
171 return "OSD_FE_LANE"; 173 return "OSD_FE_LANE";
172 case QETH_LINK_TYPE_LANE_TR: 174 case QETH_LINK_TYPE_LANE_TR:
@@ -554,8 +556,8 @@ static int __qeth_issue_next_read(struct qeth_card *card)
554 if (!iob) { 556 if (!iob) {
555 dev_warn(&card->gdev->dev, "The qeth device driver " 557 dev_warn(&card->gdev->dev, "The qeth device driver "
556 "failed to recover an error on the device\n"); 558 "failed to recover an error on the device\n");
557 QETH_DBF_MESSAGE(2, "%s issue_next_read failed: no iob " 559 QETH_DBF_MESSAGE(2, "issue_next_read on device %x failed: no iob available\n",
558 "available\n", dev_name(&card->gdev->dev)); 560 CARD_DEVID(card));
559 return -ENOMEM; 561 return -ENOMEM;
560 } 562 }
561 qeth_setup_ccw(channel->ccw, CCW_CMD_READ, QETH_BUFSIZE, iob->data); 563 qeth_setup_ccw(channel->ccw, CCW_CMD_READ, QETH_BUFSIZE, iob->data);
@@ -563,8 +565,8 @@ static int __qeth_issue_next_read(struct qeth_card *card)
563 rc = ccw_device_start(channel->ccwdev, channel->ccw, 565 rc = ccw_device_start(channel->ccwdev, channel->ccw,
564 (addr_t) iob, 0, 0); 566 (addr_t) iob, 0, 0);
565 if (rc) { 567 if (rc) {
566 QETH_DBF_MESSAGE(2, "%s error in starting next read ccw! " 568 QETH_DBF_MESSAGE(2, "error %i on device %x when starting next read ccw!\n",
567 "rc=%i\n", dev_name(&card->gdev->dev), rc); 569 rc, CARD_DEVID(card));
568 atomic_set(&channel->irq_pending, 0); 570 atomic_set(&channel->irq_pending, 0);
569 card->read_or_write_problem = 1; 571 card->read_or_write_problem = 1;
570 qeth_schedule_recovery(card); 572 qeth_schedule_recovery(card);
@@ -613,16 +615,14 @@ static void qeth_issue_ipa_msg(struct qeth_ipa_cmd *cmd, int rc,
613 const char *ipa_name; 615 const char *ipa_name;
614 int com = cmd->hdr.command; 616 int com = cmd->hdr.command;
615 ipa_name = qeth_get_ipa_cmd_name(com); 617 ipa_name = qeth_get_ipa_cmd_name(com);
618
616 if (rc) 619 if (rc)
617 QETH_DBF_MESSAGE(2, "IPA: %s(x%X) for %s/%s returned " 620 QETH_DBF_MESSAGE(2, "IPA: %s(%#x) for device %x returned %#x \"%s\"\n",
618 "x%X \"%s\"\n", 621 ipa_name, com, CARD_DEVID(card), rc,
619 ipa_name, com, dev_name(&card->gdev->dev), 622 qeth_get_ipa_msg(rc));
620 QETH_CARD_IFNAME(card), rc,
621 qeth_get_ipa_msg(rc));
622 else 623 else
623 QETH_DBF_MESSAGE(5, "IPA: %s(x%X) for %s/%s succeeded\n", 624 QETH_DBF_MESSAGE(5, "IPA: %s(%#x) for device %x succeeded\n",
624 ipa_name, com, dev_name(&card->gdev->dev), 625 ipa_name, com, CARD_DEVID(card));
625 QETH_CARD_IFNAME(card));
626} 626}
627 627
628static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card, 628static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
@@ -711,7 +711,7 @@ static int qeth_check_idx_response(struct qeth_card *card,
711 711
712 QETH_DBF_HEX(CTRL, 2, buffer, QETH_DBF_CTRL_LEN); 712 QETH_DBF_HEX(CTRL, 2, buffer, QETH_DBF_CTRL_LEN);
713 if ((buffer[2] & 0xc0) == 0xc0) { 713 if ((buffer[2] & 0xc0) == 0xc0) {
714 QETH_DBF_MESSAGE(2, "received an IDX TERMINATE with cause code %#02x\n", 714 QETH_DBF_MESSAGE(2, "received an IDX TERMINATE with cause code %#04x\n",
715 buffer[4]); 715 buffer[4]);
716 QETH_CARD_TEXT(card, 2, "ckidxres"); 716 QETH_CARD_TEXT(card, 2, "ckidxres");
717 QETH_CARD_TEXT(card, 2, " idxterm"); 717 QETH_CARD_TEXT(card, 2, " idxterm");
@@ -972,8 +972,8 @@ static int qeth_get_problem(struct qeth_card *card, struct ccw_device *cdev,
972 QETH_CARD_TEXT(card, 2, "CGENCHK"); 972 QETH_CARD_TEXT(card, 2, "CGENCHK");
973 dev_warn(&cdev->dev, "The qeth device driver " 973 dev_warn(&cdev->dev, "The qeth device driver "
974 "failed to recover an error on the device\n"); 974 "failed to recover an error on the device\n");
975 QETH_DBF_MESSAGE(2, "%s check on device dstat=x%x, cstat=x%x\n", 975 QETH_DBF_MESSAGE(2, "check on channel %x with dstat=%#x, cstat=%#x\n",
976 dev_name(&cdev->dev), dstat, cstat); 976 CCW_DEVID(cdev), dstat, cstat);
977 print_hex_dump(KERN_WARNING, "qeth: irb ", DUMP_PREFIX_OFFSET, 977 print_hex_dump(KERN_WARNING, "qeth: irb ", DUMP_PREFIX_OFFSET,
978 16, 1, irb, 64, 1); 978 16, 1, irb, 64, 1);
979 return 1; 979 return 1;
@@ -1013,8 +1013,8 @@ static long qeth_check_irb_error(struct qeth_card *card,
1013 1013
1014 switch (PTR_ERR(irb)) { 1014 switch (PTR_ERR(irb)) {
1015 case -EIO: 1015 case -EIO:
1016 QETH_DBF_MESSAGE(2, "%s i/o-error on device\n", 1016 QETH_DBF_MESSAGE(2, "i/o-error on channel %x\n",
1017 dev_name(&cdev->dev)); 1017 CCW_DEVID(cdev));
1018 QETH_CARD_TEXT(card, 2, "ckirberr"); 1018 QETH_CARD_TEXT(card, 2, "ckirberr");
1019 QETH_CARD_TEXT_(card, 2, " rc%d", -EIO); 1019 QETH_CARD_TEXT_(card, 2, " rc%d", -EIO);
1020 break; 1020 break;
@@ -1031,8 +1031,8 @@ static long qeth_check_irb_error(struct qeth_card *card,
1031 } 1031 }
1032 break; 1032 break;
1033 default: 1033 default:
1034 QETH_DBF_MESSAGE(2, "%s unknown error %ld on device\n", 1034 QETH_DBF_MESSAGE(2, "unknown error %ld on channel %x\n",
1035 dev_name(&cdev->dev), PTR_ERR(irb)); 1035 PTR_ERR(irb), CCW_DEVID(cdev));
1036 QETH_CARD_TEXT(card, 2, "ckirberr"); 1036 QETH_CARD_TEXT(card, 2, "ckirberr");
1037 QETH_CARD_TEXT(card, 2, " rc???"); 1037 QETH_CARD_TEXT(card, 2, " rc???");
1038 } 1038 }
@@ -1114,9 +1114,9 @@ static void qeth_irq(struct ccw_device *cdev, unsigned long intparm,
1114 dev_warn(&channel->ccwdev->dev, 1114 dev_warn(&channel->ccwdev->dev,
1115 "The qeth device driver failed to recover " 1115 "The qeth device driver failed to recover "
1116 "an error on the device\n"); 1116 "an error on the device\n");
1117 QETH_DBF_MESSAGE(2, "%s sense data available. cstat " 1117 QETH_DBF_MESSAGE(2, "sense data available on channel %x: cstat %#X dstat %#X\n",
1118 "0x%X dstat 0x%X\n", 1118 CCW_DEVID(channel->ccwdev), cstat,
1119 dev_name(&channel->ccwdev->dev), cstat, dstat); 1119 dstat);
1120 print_hex_dump(KERN_WARNING, "qeth: irb ", 1120 print_hex_dump(KERN_WARNING, "qeth: irb ",
1121 DUMP_PREFIX_OFFSET, 16, 1, irb, 32, 1); 1121 DUMP_PREFIX_OFFSET, 16, 1, irb, 32, 1);
1122 print_hex_dump(KERN_WARNING, "qeth: sense data ", 1122 print_hex_dump(KERN_WARNING, "qeth: sense data ",
@@ -1890,8 +1890,8 @@ static int qeth_idx_activate_channel(struct qeth_card *card,
1890 if (channel->state != CH_STATE_ACTIVATING) { 1890 if (channel->state != CH_STATE_ACTIVATING) {
1891 dev_warn(&channel->ccwdev->dev, "The qeth device driver" 1891 dev_warn(&channel->ccwdev->dev, "The qeth device driver"
1892 " failed to recover an error on the device\n"); 1892 " failed to recover an error on the device\n");
1893 QETH_DBF_MESSAGE(2, "%s IDX activate timed out\n", 1893 QETH_DBF_MESSAGE(2, "IDX activate timed out on channel %x\n",
1894 dev_name(&channel->ccwdev->dev)); 1894 CCW_DEVID(channel->ccwdev));
1895 QETH_DBF_TEXT_(SETUP, 2, "2err%d", -ETIME); 1895 QETH_DBF_TEXT_(SETUP, 2, "2err%d", -ETIME);
1896 return -ETIME; 1896 return -ETIME;
1897 } 1897 }
@@ -1926,17 +1926,15 @@ static void qeth_idx_write_cb(struct qeth_card *card,
1926 "The adapter is used exclusively by another " 1926 "The adapter is used exclusively by another "
1927 "host\n"); 1927 "host\n");
1928 else 1928 else
1929 QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on write channel:" 1929 QETH_DBF_MESSAGE(2, "IDX_ACTIVATE on channel %x: negative reply\n",
1930 " negative reply\n", 1930 CCW_DEVID(channel->ccwdev));
1931 dev_name(&channel->ccwdev->dev));
1932 goto out; 1931 goto out;
1933 } 1932 }
1934 memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2); 1933 memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
1935 if ((temp & ~0x0100) != qeth_peer_func_level(card->info.func_level)) { 1934 if ((temp & ~0x0100) != qeth_peer_func_level(card->info.func_level)) {
1936 QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on write channel: " 1935 QETH_DBF_MESSAGE(2, "IDX_ACTIVATE on channel %x: function level mismatch (sent: %#x, received: %#x)\n",
1937 "function level mismatch (sent: 0x%x, received: " 1936 CCW_DEVID(channel->ccwdev),
1938 "0x%x)\n", dev_name(&channel->ccwdev->dev), 1937 card->info.func_level, temp);
1939 card->info.func_level, temp);
1940 goto out; 1938 goto out;
1941 } 1939 }
1942 channel->state = CH_STATE_UP; 1940 channel->state = CH_STATE_UP;
@@ -1973,9 +1971,8 @@ static void qeth_idx_read_cb(struct qeth_card *card,
1973 "insufficient authorization\n"); 1971 "insufficient authorization\n");
1974 break; 1972 break;
1975 default: 1973 default:
1976 QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on read channel:" 1974 QETH_DBF_MESSAGE(2, "IDX_ACTIVATE on channel %x: negative reply\n",
1977 " negative reply\n", 1975 CCW_DEVID(channel->ccwdev));
1978 dev_name(&channel->ccwdev->dev));
1979 } 1976 }
1980 QETH_CARD_TEXT_(card, 2, "idxread%c", 1977 QETH_CARD_TEXT_(card, 2, "idxread%c",
1981 QETH_IDX_ACT_CAUSE_CODE(iob->data)); 1978 QETH_IDX_ACT_CAUSE_CODE(iob->data));
@@ -1984,10 +1981,9 @@ static void qeth_idx_read_cb(struct qeth_card *card,
1984 1981
1985 memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2); 1982 memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2);
1986 if (temp != qeth_peer_func_level(card->info.func_level)) { 1983 if (temp != qeth_peer_func_level(card->info.func_level)) {
1987 QETH_DBF_MESSAGE(2, "%s IDX_ACTIVATE on read channel: function " 1984 QETH_DBF_MESSAGE(2, "IDX_ACTIVATE on channel %x: function level mismatch (sent: %#x, received: %#x)\n",
1988 "level mismatch (sent: 0x%x, received: 0x%x)\n", 1985 CCW_DEVID(channel->ccwdev),
1989 dev_name(&channel->ccwdev->dev), 1986 card->info.func_level, temp);
1990 card->info.func_level, temp);
1991 goto out; 1987 goto out;
1992 } 1988 }
1993 memcpy(&card->token.issuer_rm_r, 1989 memcpy(&card->token.issuer_rm_r,
@@ -2096,9 +2092,8 @@ int qeth_send_control_data(struct qeth_card *card, int len,
2096 (addr_t) iob, 0, 0, event_timeout); 2092 (addr_t) iob, 0, 0, event_timeout);
2097 spin_unlock_irq(get_ccwdev_lock(channel->ccwdev)); 2093 spin_unlock_irq(get_ccwdev_lock(channel->ccwdev));
2098 if (rc) { 2094 if (rc) {
2099 QETH_DBF_MESSAGE(2, "%s qeth_send_control_data: " 2095 QETH_DBF_MESSAGE(2, "qeth_send_control_data on device %x: ccw_device_start rc = %i\n",
2100 "ccw_device_start rc = %i\n", 2096 CARD_DEVID(card), rc);
2101 dev_name(&channel->ccwdev->dev), rc);
2102 QETH_CARD_TEXT_(card, 2, " err%d", rc); 2097 QETH_CARD_TEXT_(card, 2, " err%d", rc);
2103 spin_lock_irq(&card->lock); 2098 spin_lock_irq(&card->lock);
2104 list_del_init(&reply->list); 2099 list_del_init(&reply->list);
@@ -2853,8 +2848,8 @@ struct qeth_cmd_buffer *qeth_get_ipacmd_buffer(struct qeth_card *card,
2853 } else { 2848 } else {
2854 dev_warn(&card->gdev->dev, 2849 dev_warn(&card->gdev->dev,
2855 "The qeth driver ran out of channel command buffers\n"); 2850 "The qeth driver ran out of channel command buffers\n");
2856 QETH_DBF_MESSAGE(1, "%s The qeth driver ran out of channel command buffers", 2851 QETH_DBF_MESSAGE(1, "device %x ran out of channel command buffers",
2857 dev_name(&card->gdev->dev)); 2852 CARD_DEVID(card));
2858 } 2853 }
2859 2854
2860 return iob; 2855 return iob;
@@ -2989,10 +2984,9 @@ static int qeth_query_ipassists_cb(struct qeth_card *card,
2989 return 0; 2984 return 0;
2990 default: 2985 default:
2991 if (cmd->hdr.return_code) { 2986 if (cmd->hdr.return_code) {
2992 QETH_DBF_MESSAGE(1, "%s IPA_CMD_QIPASSIST: Unhandled " 2987 QETH_DBF_MESSAGE(1, "IPA_CMD_QIPASSIST on device %x: Unhandled rc=%#x\n",
2993 "rc=%d\n", 2988 CARD_DEVID(card),
2994 dev_name(&card->gdev->dev), 2989 cmd->hdr.return_code);
2995 cmd->hdr.return_code);
2996 return 0; 2990 return 0;
2997 } 2991 }
2998 } 2992 }
@@ -3004,8 +2998,8 @@ static int qeth_query_ipassists_cb(struct qeth_card *card,
3004 card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported; 2998 card->options.ipa6.supported_funcs = cmd->hdr.ipa_supported;
3005 card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled; 2999 card->options.ipa6.enabled_funcs = cmd->hdr.ipa_enabled;
3006 } else 3000 } else
3007 QETH_DBF_MESSAGE(1, "%s IPA_CMD_QIPASSIST: Flawed LIC detected" 3001 QETH_DBF_MESSAGE(1, "IPA_CMD_QIPASSIST on device %x: Flawed LIC detected\n",
3008 "\n", dev_name(&card->gdev->dev)); 3002 CARD_DEVID(card));
3009 return 0; 3003 return 0;
3010} 3004}
3011 3005
@@ -4297,10 +4291,9 @@ static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
4297 cmd->data.setadapterparms.hdr.return_code); 4291 cmd->data.setadapterparms.hdr.return_code);
4298 if (cmd->data.setadapterparms.hdr.return_code != 4292 if (cmd->data.setadapterparms.hdr.return_code !=
4299 SET_ACCESS_CTRL_RC_SUCCESS) 4293 SET_ACCESS_CTRL_RC_SUCCESS)
4300 QETH_DBF_MESSAGE(3, "ERR:SET_ACCESS_CTRL(%s,%d)==%d\n", 4294 QETH_DBF_MESSAGE(3, "ERR:SET_ACCESS_CTRL(%#x) on device %x: %#x\n",
4301 card->gdev->dev.kobj.name, 4295 access_ctrl_req->subcmd_code, CARD_DEVID(card),
4302 access_ctrl_req->subcmd_code, 4296 cmd->data.setadapterparms.hdr.return_code);
4303 cmd->data.setadapterparms.hdr.return_code);
4304 switch (cmd->data.setadapterparms.hdr.return_code) { 4297 switch (cmd->data.setadapterparms.hdr.return_code) {
4305 case SET_ACCESS_CTRL_RC_SUCCESS: 4298 case SET_ACCESS_CTRL_RC_SUCCESS:
4306 if (card->options.isolation == ISOLATION_MODE_NONE) { 4299 if (card->options.isolation == ISOLATION_MODE_NONE) {
@@ -4312,14 +4305,14 @@ static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
4312 } 4305 }
4313 break; 4306 break;
4314 case SET_ACCESS_CTRL_RC_ALREADY_NOT_ISOLATED: 4307 case SET_ACCESS_CTRL_RC_ALREADY_NOT_ISOLATED:
4315 QETH_DBF_MESSAGE(2, "%s QDIO data connection isolation already " 4308 QETH_DBF_MESSAGE(2, "QDIO data connection isolation on device %x already deactivated\n",
4316 "deactivated\n", dev_name(&card->gdev->dev)); 4309 CARD_DEVID(card));
4317 if (fallback) 4310 if (fallback)
4318 card->options.isolation = card->options.prev_isolation; 4311 card->options.isolation = card->options.prev_isolation;
4319 break; 4312 break;
4320 case SET_ACCESS_CTRL_RC_ALREADY_ISOLATED: 4313 case SET_ACCESS_CTRL_RC_ALREADY_ISOLATED:
4321 QETH_DBF_MESSAGE(2, "%s QDIO data connection isolation already" 4314 QETH_DBF_MESSAGE(2, "QDIO data connection isolation on device %x already activated\n",
4322 " activated\n", dev_name(&card->gdev->dev)); 4315 CARD_DEVID(card));
4323 if (fallback) 4316 if (fallback)
4324 card->options.isolation = card->options.prev_isolation; 4317 card->options.isolation = card->options.prev_isolation;
4325 break; 4318 break;
@@ -4405,10 +4398,8 @@ int qeth_set_access_ctrl_online(struct qeth_card *card, int fallback)
4405 rc = qeth_setadpparms_set_access_ctrl(card, 4398 rc = qeth_setadpparms_set_access_ctrl(card,
4406 card->options.isolation, fallback); 4399 card->options.isolation, fallback);
4407 if (rc) { 4400 if (rc) {
4408 QETH_DBF_MESSAGE(3, 4401 QETH_DBF_MESSAGE(3, "IPA(SET_ACCESS_CTRL(%d) on device %x: sent failed\n",
4409 "IPA(SET_ACCESS_CTRL,%s,%d) sent failed\n", 4402 rc, CARD_DEVID(card));
4410 card->gdev->dev.kobj.name,
4411 rc);
4412 rc = -EOPNOTSUPP; 4403 rc = -EOPNOTSUPP;
4413 } 4404 }
4414 } else if (card->options.isolation != ISOLATION_MODE_NONE) { 4405 } else if (card->options.isolation != ISOLATION_MODE_NONE) {
@@ -4443,7 +4434,8 @@ static int qeth_mdio_read(struct net_device *dev, int phy_id, int regnum)
4443 rc = BMCR_FULLDPLX; 4434 rc = BMCR_FULLDPLX;
4444 if ((card->info.link_type != QETH_LINK_TYPE_GBIT_ETH) && 4435 if ((card->info.link_type != QETH_LINK_TYPE_GBIT_ETH) &&
4445 (card->info.link_type != QETH_LINK_TYPE_OSN) && 4436 (card->info.link_type != QETH_LINK_TYPE_OSN) &&
4446 (card->info.link_type != QETH_LINK_TYPE_10GBIT_ETH)) 4437 (card->info.link_type != QETH_LINK_TYPE_10GBIT_ETH) &&
4438 (card->info.link_type != QETH_LINK_TYPE_25GBIT_ETH))
4447 rc |= BMCR_SPEED100; 4439 rc |= BMCR_SPEED100;
4448 break; 4440 break;
4449 case MII_BMSR: /* Basic mode status register */ 4441 case MII_BMSR: /* Basic mode status register */
@@ -4634,8 +4626,8 @@ static int qeth_snmp_command(struct qeth_card *card, char __user *udata)
4634 rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len, 4626 rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len,
4635 qeth_snmp_command_cb, (void *)&qinfo); 4627 qeth_snmp_command_cb, (void *)&qinfo);
4636 if (rc) 4628 if (rc)
4637 QETH_DBF_MESSAGE(2, "SNMP command failed on %s: (0x%x)\n", 4629 QETH_DBF_MESSAGE(2, "SNMP command failed on device %x: (%#x)\n",
4638 QETH_CARD_IFNAME(card), rc); 4630 CARD_DEVID(card), rc);
4639 else { 4631 else {
4640 if (copy_to_user(udata, qinfo.udata, qinfo.udata_len)) 4632 if (copy_to_user(udata, qinfo.udata, qinfo.udata_len))
4641 rc = -EFAULT; 4633 rc = -EFAULT;
@@ -4869,8 +4861,8 @@ static void qeth_determine_capabilities(struct qeth_card *card)
4869 4861
4870 rc = qeth_read_conf_data(card, (void **) &prcd, &length); 4862 rc = qeth_read_conf_data(card, (void **) &prcd, &length);
4871 if (rc) { 4863 if (rc) {
4872 QETH_DBF_MESSAGE(2, "%s qeth_read_conf_data returned %i\n", 4864 QETH_DBF_MESSAGE(2, "qeth_read_conf_data on device %x returned %i\n",
4873 dev_name(&card->gdev->dev), rc); 4865 CARD_DEVID(card), rc);
4874 QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc); 4866 QETH_DBF_TEXT_(SETUP, 2, "5err%d", rc);
4875 goto out_offline; 4867 goto out_offline;
4876 } 4868 }
@@ -5086,7 +5078,7 @@ static struct ccw_driver qeth_ccw_driver = {
5086 .remove = ccwgroup_remove_ccwdev, 5078 .remove = ccwgroup_remove_ccwdev,
5087}; 5079};
5088 5080
5089int qeth_core_hardsetup_card(struct qeth_card *card) 5081int qeth_core_hardsetup_card(struct qeth_card *card, bool *carrier_ok)
5090{ 5082{
5091 int retries = 3; 5083 int retries = 3;
5092 int rc; 5084 int rc;
@@ -5096,8 +5088,8 @@ int qeth_core_hardsetup_card(struct qeth_card *card)
5096 qeth_update_from_chp_desc(card); 5088 qeth_update_from_chp_desc(card);
5097retry: 5089retry:
5098 if (retries < 3) 5090 if (retries < 3)
5099 QETH_DBF_MESSAGE(2, "%s Retrying to do IDX activates.\n", 5091 QETH_DBF_MESSAGE(2, "Retrying to do IDX activates on device %x.\n",
5100 dev_name(&card->gdev->dev)); 5092 CARD_DEVID(card));
5101 rc = qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD); 5093 rc = qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD);
5102 ccw_device_set_offline(CARD_DDEV(card)); 5094 ccw_device_set_offline(CARD_DDEV(card));
5103 ccw_device_set_offline(CARD_WDEV(card)); 5095 ccw_device_set_offline(CARD_WDEV(card));
@@ -5161,13 +5153,20 @@ retriable:
5161 if (rc == IPA_RC_LAN_OFFLINE) { 5153 if (rc == IPA_RC_LAN_OFFLINE) {
5162 dev_warn(&card->gdev->dev, 5154 dev_warn(&card->gdev->dev,
5163 "The LAN is offline\n"); 5155 "The LAN is offline\n");
5164 netif_carrier_off(card->dev); 5156 *carrier_ok = false;
5165 } else { 5157 } else {
5166 rc = -ENODEV; 5158 rc = -ENODEV;
5167 goto out; 5159 goto out;
5168 } 5160 }
5169 } else { 5161 } else {
5170 netif_carrier_on(card->dev); 5162 *carrier_ok = true;
5163 }
5164
5165 if (qeth_netdev_is_registered(card->dev)) {
5166 if (*carrier_ok)
5167 netif_carrier_on(card->dev);
5168 else
5169 netif_carrier_off(card->dev);
5171 } 5170 }
5172 5171
5173 card->options.ipa4.supported_funcs = 0; 5172 card->options.ipa4.supported_funcs = 0;
@@ -5201,8 +5200,8 @@ retriable:
5201out: 5200out:
5202 dev_warn(&card->gdev->dev, "The qeth device driver failed to recover " 5201 dev_warn(&card->gdev->dev, "The qeth device driver failed to recover "
5203 "an error on the device\n"); 5202 "an error on the device\n");
5204 QETH_DBF_MESSAGE(2, "%s Initialization in hardsetup failed! rc=%d\n", 5203 QETH_DBF_MESSAGE(2, "Initialization for device %x failed in hardsetup! rc=%d\n",
5205 dev_name(&card->gdev->dev), rc); 5204 CARD_DEVID(card), rc);
5206 return rc; 5205 return rc;
5207} 5206}
5208EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card); 5207EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card);
@@ -5481,11 +5480,12 @@ struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *card,
5481} 5480}
5482EXPORT_SYMBOL_GPL(qeth_get_setassparms_cmd); 5481EXPORT_SYMBOL_GPL(qeth_get_setassparms_cmd);
5483 5482
5484int qeth_send_setassparms(struct qeth_card *card, 5483static int qeth_send_setassparms(struct qeth_card *card,
5485 struct qeth_cmd_buffer *iob, __u16 len, long data, 5484 struct qeth_cmd_buffer *iob, u16 len,
5486 int (*reply_cb)(struct qeth_card *, 5485 long data, int (*reply_cb)(struct qeth_card *,
5487 struct qeth_reply *, unsigned long), 5486 struct qeth_reply *,
5488 void *reply_param) 5487 unsigned long),
5488 void *reply_param)
5489{ 5489{
5490 int rc; 5490 int rc;
5491 struct qeth_ipa_cmd *cmd; 5491 struct qeth_ipa_cmd *cmd;
@@ -5501,7 +5501,6 @@ int qeth_send_setassparms(struct qeth_card *card,
5501 rc = qeth_send_ipa_cmd(card, iob, reply_cb, reply_param); 5501 rc = qeth_send_ipa_cmd(card, iob, reply_cb, reply_param);
5502 return rc; 5502 return rc;
5503} 5503}
5504EXPORT_SYMBOL_GPL(qeth_send_setassparms);
5505 5504
5506int qeth_send_simple_setassparms_prot(struct qeth_card *card, 5505int qeth_send_simple_setassparms_prot(struct qeth_card *card,
5507 enum qeth_ipa_funcs ipa_func, 5506 enum qeth_ipa_funcs ipa_func,
@@ -6170,8 +6169,14 @@ static void qeth_set_cmd_adv_sup(struct ethtool_link_ksettings *cmd,
6170 WARN_ON_ONCE(1); 6169 WARN_ON_ONCE(1);
6171 } 6170 }
6172 6171
6173 /* fallthrough from high to low, to select all legal speeds: */ 6172 /* partially does fall through, to also select lower speeds */
6174 switch (maxspeed) { 6173 switch (maxspeed) {
6174 case SPEED_25000:
6175 ethtool_link_ksettings_add_link_mode(cmd, supported,
6176 25000baseSR_Full);
6177 ethtool_link_ksettings_add_link_mode(cmd, advertising,
6178 25000baseSR_Full);
6179 break;
6175 case SPEED_10000: 6180 case SPEED_10000:
6176 ethtool_link_ksettings_add_link_mode(cmd, supported, 6181 ethtool_link_ksettings_add_link_mode(cmd, supported,
6177 10000baseT_Full); 6182 10000baseT_Full);
@@ -6254,6 +6259,10 @@ int qeth_core_ethtool_get_link_ksettings(struct net_device *netdev,
6254 cmd->base.speed = SPEED_10000; 6259 cmd->base.speed = SPEED_10000;
6255 cmd->base.port = PORT_FIBRE; 6260 cmd->base.port = PORT_FIBRE;
6256 break; 6261 break;
6262 case QETH_LINK_TYPE_25GBIT_ETH:
6263 cmd->base.speed = SPEED_25000;
6264 cmd->base.port = PORT_FIBRE;
6265 break;
6257 default: 6266 default:
6258 cmd->base.speed = SPEED_10; 6267 cmd->base.speed = SPEED_10;
6259 cmd->base.port = PORT_TP; 6268 cmd->base.port = PORT_TP;
@@ -6320,6 +6329,9 @@ int qeth_core_ethtool_get_link_ksettings(struct net_device *netdev,
6320 case CARD_INFO_PORTS_10G: 6329 case CARD_INFO_PORTS_10G:
6321 cmd->base.speed = SPEED_10000; 6330 cmd->base.speed = SPEED_10000;
6322 break; 6331 break;
6332 case CARD_INFO_PORTS_25G:
6333 cmd->base.speed = SPEED_25000;
6334 break;
6323 } 6335 }
6324 6336
6325 return 0; 6337 return 0;
diff --git a/drivers/s390/net/qeth_core_mpc.h b/drivers/s390/net/qeth_core_mpc.h
index e85090467afe..3e54be201b27 100644
--- a/drivers/s390/net/qeth_core_mpc.h
+++ b/drivers/s390/net/qeth_core_mpc.h
@@ -90,6 +90,7 @@ enum qeth_link_types {
90 QETH_LINK_TYPE_GBIT_ETH = 0x03, 90 QETH_LINK_TYPE_GBIT_ETH = 0x03,
91 QETH_LINK_TYPE_OSN = 0x04, 91 QETH_LINK_TYPE_OSN = 0x04,
92 QETH_LINK_TYPE_10GBIT_ETH = 0x10, 92 QETH_LINK_TYPE_10GBIT_ETH = 0x10,
93 QETH_LINK_TYPE_25GBIT_ETH = 0x12,
93 QETH_LINK_TYPE_LANE_ETH100 = 0x81, 94 QETH_LINK_TYPE_LANE_ETH100 = 0x81,
94 QETH_LINK_TYPE_LANE_TR = 0x82, 95 QETH_LINK_TYPE_LANE_TR = 0x82,
95 QETH_LINK_TYPE_LANE_ETH1000 = 0x83, 96 QETH_LINK_TYPE_LANE_ETH1000 = 0x83,
@@ -347,6 +348,7 @@ enum qeth_card_info_port_speed {
347 CARD_INFO_PORTS_100M = 0x00000006, 348 CARD_INFO_PORTS_100M = 0x00000006,
348 CARD_INFO_PORTS_1G = 0x00000007, 349 CARD_INFO_PORTS_1G = 0x00000007,
349 CARD_INFO_PORTS_10G = 0x00000008, 350 CARD_INFO_PORTS_10G = 0x00000008,
351 CARD_INFO_PORTS_25G = 0x0000000A,
350}; 352};
351 353
352/* (SET)DELIP(M) IPA stuff ***************************************************/ 354/* (SET)DELIP(M) IPA stuff ***************************************************/
@@ -436,7 +438,7 @@ struct qeth_ipacmd_setassparms {
436 __u32 flags_32bit; 438 __u32 flags_32bit;
437 struct qeth_ipa_caps caps; 439 struct qeth_ipa_caps caps;
438 struct qeth_checksum_cmd chksum; 440 struct qeth_checksum_cmd chksum;
439 struct qeth_arp_cache_entry add_arp_entry; 441 struct qeth_arp_cache_entry arp_entry;
440 struct qeth_arp_query_data query_arp; 442 struct qeth_arp_query_data query_arp;
441 struct qeth_tso_start_data tso; 443 struct qeth_tso_start_data tso;
442 __u8 ip[16]; 444 __u8 ip[16];
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index 23aaf373f631..2914a1a69f83 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -146,11 +146,11 @@ static int qeth_l2_write_mac(struct qeth_card *card, u8 *mac)
146 QETH_CARD_TEXT(card, 2, "L2Wmac"); 146 QETH_CARD_TEXT(card, 2, "L2Wmac");
147 rc = qeth_l2_send_setdelmac(card, mac, cmd); 147 rc = qeth_l2_send_setdelmac(card, mac, cmd);
148 if (rc == -EEXIST) 148 if (rc == -EEXIST)
149 QETH_DBF_MESSAGE(2, "MAC %pM already registered on %s\n", 149 QETH_DBF_MESSAGE(2, "MAC already registered on device %x\n",
150 mac, QETH_CARD_IFNAME(card)); 150 CARD_DEVID(card));
151 else if (rc) 151 else if (rc)
152 QETH_DBF_MESSAGE(2, "Failed to register MAC %pM on %s: %d\n", 152 QETH_DBF_MESSAGE(2, "Failed to register MAC on device %x: %d\n",
153 mac, QETH_CARD_IFNAME(card), rc); 153 CARD_DEVID(card), rc);
154 return rc; 154 return rc;
155} 155}
156 156
@@ -163,8 +163,8 @@ static int qeth_l2_remove_mac(struct qeth_card *card, u8 *mac)
163 QETH_CARD_TEXT(card, 2, "L2Rmac"); 163 QETH_CARD_TEXT(card, 2, "L2Rmac");
164 rc = qeth_l2_send_setdelmac(card, mac, cmd); 164 rc = qeth_l2_send_setdelmac(card, mac, cmd);
165 if (rc) 165 if (rc)
166 QETH_DBF_MESSAGE(2, "Failed to delete MAC %pM on %s: %d\n", 166 QETH_DBF_MESSAGE(2, "Failed to delete MAC on device %u: %d\n",
167 mac, QETH_CARD_IFNAME(card), rc); 167 CARD_DEVID(card), rc);
168 return rc; 168 return rc;
169} 169}
170 170
@@ -260,9 +260,9 @@ static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card,
260 260
261 QETH_CARD_TEXT(card, 2, "L2sdvcb"); 261 QETH_CARD_TEXT(card, 2, "L2sdvcb");
262 if (cmd->hdr.return_code) { 262 if (cmd->hdr.return_code) {
263 QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x.\n", 263 QETH_DBF_MESSAGE(2, "Error in processing VLAN %u on device %x: %#x.\n",
264 cmd->data.setdelvlan.vlan_id, 264 cmd->data.setdelvlan.vlan_id,
265 QETH_CARD_IFNAME(card), cmd->hdr.return_code); 265 CARD_DEVID(card), cmd->hdr.return_code);
266 QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command); 266 QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command);
267 QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code); 267 QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);
268 } 268 }
@@ -455,8 +455,8 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card)
455 rc = qeth_vm_request_mac(card); 455 rc = qeth_vm_request_mac(card);
456 if (!rc) 456 if (!rc)
457 goto out; 457 goto out;
458 QETH_DBF_MESSAGE(2, "z/VM MAC Service failed on device %s: x%x\n", 458 QETH_DBF_MESSAGE(2, "z/VM MAC Service failed on device %x: %#x\n",
459 CARD_BUS_ID(card), rc); 459 CARD_DEVID(card), rc);
460 QETH_DBF_TEXT_(SETUP, 2, "err%04x", rc); 460 QETH_DBF_TEXT_(SETUP, 2, "err%04x", rc);
461 /* fall back to alternative mechanism: */ 461 /* fall back to alternative mechanism: */
462 } 462 }
@@ -468,8 +468,8 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card)
468 rc = qeth_setadpparms_change_macaddr(card); 468 rc = qeth_setadpparms_change_macaddr(card);
469 if (!rc) 469 if (!rc)
470 goto out; 470 goto out;
471 QETH_DBF_MESSAGE(2, "READ_MAC Assist failed on device %s: x%x\n", 471 QETH_DBF_MESSAGE(2, "READ_MAC Assist failed on device %x: %#x\n",
472 CARD_BUS_ID(card), rc); 472 CARD_DEVID(card), rc);
473 QETH_DBF_TEXT_(SETUP, 2, "1err%04x", rc); 473 QETH_DBF_TEXT_(SETUP, 2, "1err%04x", rc);
474 /* fall back once more: */ 474 /* fall back once more: */
475 } 475 }
@@ -826,7 +826,8 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)
826 826
827 if (cgdev->state == CCWGROUP_ONLINE) 827 if (cgdev->state == CCWGROUP_ONLINE)
828 qeth_l2_set_offline(cgdev); 828 qeth_l2_set_offline(cgdev);
829 unregister_netdev(card->dev); 829 if (qeth_netdev_is_registered(card->dev))
830 unregister_netdev(card->dev);
830} 831}
831 832
832static const struct ethtool_ops qeth_l2_ethtool_ops = { 833static const struct ethtool_ops qeth_l2_ethtool_ops = {
@@ -862,11 +863,11 @@ static const struct net_device_ops qeth_l2_netdev_ops = {
862 .ndo_set_features = qeth_set_features 863 .ndo_set_features = qeth_set_features
863}; 864};
864 865
865static int qeth_l2_setup_netdev(struct qeth_card *card) 866static int qeth_l2_setup_netdev(struct qeth_card *card, bool carrier_ok)
866{ 867{
867 int rc; 868 int rc;
868 869
869 if (card->dev->netdev_ops) 870 if (qeth_netdev_is_registered(card->dev))
870 return 0; 871 return 0;
871 872
872 card->dev->priv_flags |= IFF_UNICAST_FLT; 873 card->dev->priv_flags |= IFF_UNICAST_FLT;
@@ -919,6 +920,9 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)
919 qeth_l2_request_initial_mac(card); 920 qeth_l2_request_initial_mac(card);
920 netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); 921 netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT);
921 rc = register_netdev(card->dev); 922 rc = register_netdev(card->dev);
923 if (!rc && carrier_ok)
924 netif_carrier_on(card->dev);
925
922 if (rc) 926 if (rc)
923 card->dev->netdev_ops = NULL; 927 card->dev->netdev_ops = NULL;
924 return rc; 928 return rc;
@@ -949,6 +953,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
949 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 953 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
950 int rc = 0; 954 int rc = 0;
951 enum qeth_card_states recover_flag; 955 enum qeth_card_states recover_flag;
956 bool carrier_ok;
952 957
953 mutex_lock(&card->discipline_mutex); 958 mutex_lock(&card->discipline_mutex);
954 mutex_lock(&card->conf_mutex); 959 mutex_lock(&card->conf_mutex);
@@ -956,7 +961,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
956 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); 961 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
957 962
958 recover_flag = card->state; 963 recover_flag = card->state;
959 rc = qeth_core_hardsetup_card(card); 964 rc = qeth_core_hardsetup_card(card, &carrier_ok);
960 if (rc) { 965 if (rc) {
961 QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); 966 QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc);
962 rc = -ENODEV; 967 rc = -ENODEV;
@@ -967,7 +972,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)
967 dev_info(&card->gdev->dev, 972 dev_info(&card->gdev->dev,
968 "The device represents a Bridge Capable Port\n"); 973 "The device represents a Bridge Capable Port\n");
969 974
970 rc = qeth_l2_setup_netdev(card); 975 rc = qeth_l2_setup_netdev(card, carrier_ok);
971 if (rc) 976 if (rc)
972 goto out_remove; 977 goto out_remove;
973 978
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index 0b161cc1fd2e..f08b745c2007 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -278,9 +278,6 @@ static void qeth_l3_clear_ip_htable(struct qeth_card *card, int recover)
278 278
279 QETH_CARD_TEXT(card, 4, "clearip"); 279 QETH_CARD_TEXT(card, 4, "clearip");
280 280
281 if (recover && card->options.sniffer)
282 return;
283
284 spin_lock_bh(&card->ip_lock); 281 spin_lock_bh(&card->ip_lock);
285 282
286 hash_for_each_safe(card->ip_htable, i, tmp, addr, hnode) { 283 hash_for_each_safe(card->ip_htable, i, tmp, addr, hnode) {
@@ -494,9 +491,8 @@ int qeth_l3_setrouting_v4(struct qeth_card *card)
494 QETH_PROT_IPV4); 491 QETH_PROT_IPV4);
495 if (rc) { 492 if (rc) {
496 card->options.route4.type = NO_ROUTER; 493 card->options.route4.type = NO_ROUTER;
497 QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type" 494 QETH_DBF_MESSAGE(2, "Error (%#06x) while setting routing type on device %x. Type set to 'no router'.\n",
498 " on %s. Type set to 'no router'.\n", rc, 495 rc, CARD_DEVID(card));
499 QETH_CARD_IFNAME(card));
500 } 496 }
501 return rc; 497 return rc;
502} 498}
@@ -518,9 +514,8 @@ int qeth_l3_setrouting_v6(struct qeth_card *card)
518 QETH_PROT_IPV6); 514 QETH_PROT_IPV6);
519 if (rc) { 515 if (rc) {
520 card->options.route6.type = NO_ROUTER; 516 card->options.route6.type = NO_ROUTER;
521 QETH_DBF_MESSAGE(2, "Error (0x%04x) while setting routing type" 517 QETH_DBF_MESSAGE(2, "Error (%#06x) while setting routing type on device %x. Type set to 'no router'.\n",
522 " on %s. Type set to 'no router'.\n", rc, 518 rc, CARD_DEVID(card));
523 QETH_CARD_IFNAME(card));
524 } 519 }
525 return rc; 520 return rc;
526} 521}
@@ -663,6 +658,8 @@ static int qeth_l3_register_addr_entry(struct qeth_card *card,
663 int rc = 0; 658 int rc = 0;
664 int cnt = 3; 659 int cnt = 3;
665 660
661 if (card->options.sniffer)
662 return 0;
666 663
667 if (addr->proto == QETH_PROT_IPV4) { 664 if (addr->proto == QETH_PROT_IPV4) {
668 QETH_CARD_TEXT(card, 2, "setaddr4"); 665 QETH_CARD_TEXT(card, 2, "setaddr4");
@@ -697,6 +694,9 @@ static int qeth_l3_deregister_addr_entry(struct qeth_card *card,
697{ 694{
698 int rc = 0; 695 int rc = 0;
699 696
697 if (card->options.sniffer)
698 return 0;
699
700 if (addr->proto == QETH_PROT_IPV4) { 700 if (addr->proto == QETH_PROT_IPV4) {
701 QETH_CARD_TEXT(card, 2, "deladdr4"); 701 QETH_CARD_TEXT(card, 2, "deladdr4");
702 QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int)); 702 QETH_CARD_HEX(card, 3, &addr->u.a4.addr, sizeof(int));
@@ -1070,8 +1070,8 @@ qeth_diags_trace_cb(struct qeth_card *card, struct qeth_reply *reply,
1070 } 1070 }
1071 break; 1071 break;
1072 default: 1072 default:
1073 QETH_DBF_MESSAGE(2, "Unknown sniffer action (0x%04x) on %s\n", 1073 QETH_DBF_MESSAGE(2, "Unknown sniffer action (%#06x) on device %x\n",
1074 cmd->data.diagass.action, QETH_CARD_IFNAME(card)); 1074 cmd->data.diagass.action, CARD_DEVID(card));
1075 } 1075 }
1076 1076
1077 return 0; 1077 return 0;
@@ -1517,32 +1517,25 @@ static void qeth_l3_set_rx_mode(struct net_device *dev)
1517 qeth_l3_handle_promisc_mode(card); 1517 qeth_l3_handle_promisc_mode(card);
1518} 1518}
1519 1519
1520static const char *qeth_l3_arp_get_error_cause(int *rc) 1520static int qeth_l3_arp_makerc(int rc)
1521{ 1521{
1522 switch (*rc) { 1522 switch (rc) {
1523 case QETH_IPA_ARP_RC_FAILED: 1523 case IPA_RC_SUCCESS:
1524 *rc = -EIO; 1524 return 0;
1525 return "operation failed";
1526 case QETH_IPA_ARP_RC_NOTSUPP: 1525 case QETH_IPA_ARP_RC_NOTSUPP:
1527 *rc = -EOPNOTSUPP;
1528 return "operation not supported";
1529 case QETH_IPA_ARP_RC_OUT_OF_RANGE:
1530 *rc = -EINVAL;
1531 return "argument out of range";
1532 case QETH_IPA_ARP_RC_Q_NOTSUPP: 1526 case QETH_IPA_ARP_RC_Q_NOTSUPP:
1533 *rc = -EOPNOTSUPP; 1527 return -EOPNOTSUPP;
1534 return "query operation not supported"; 1528 case QETH_IPA_ARP_RC_OUT_OF_RANGE:
1529 return -EINVAL;
1535 case QETH_IPA_ARP_RC_Q_NO_DATA: 1530 case QETH_IPA_ARP_RC_Q_NO_DATA:
1536 *rc = -ENOENT; 1531 return -ENOENT;
1537 return "no query data available";
1538 default: 1532 default:
1539 return "unknown error"; 1533 return -EIO;
1540 } 1534 }
1541} 1535}
1542 1536
1543static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries) 1537static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries)
1544{ 1538{
1545 int tmp;
1546 int rc; 1539 int rc;
1547 1540
1548 QETH_CARD_TEXT(card, 3, "arpstnoe"); 1541 QETH_CARD_TEXT(card, 3, "arpstnoe");
@@ -1560,13 +1553,10 @@ static int qeth_l3_arp_set_no_entries(struct qeth_card *card, int no_entries)
1560 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, 1553 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
1561 IPA_CMD_ASS_ARP_SET_NO_ENTRIES, 1554 IPA_CMD_ASS_ARP_SET_NO_ENTRIES,
1562 no_entries); 1555 no_entries);
1563 if (rc) { 1556 if (rc)
1564 tmp = rc; 1557 QETH_DBF_MESSAGE(2, "Could not set number of ARP entries on device %x: %#x\n",
1565 QETH_DBF_MESSAGE(2, "Could not set number of ARP entries on " 1558 CARD_DEVID(card), rc);
1566 "%s: %s (0x%x/%d)\n", QETH_CARD_IFNAME(card), 1559 return qeth_l3_arp_makerc(rc);
1567 qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
1568 }
1569 return rc;
1570} 1560}
1571 1561
1572static __u32 get_arp_entry_size(struct qeth_card *card, 1562static __u32 get_arp_entry_size(struct qeth_card *card,
@@ -1716,7 +1706,6 @@ static int qeth_l3_query_arp_cache_info(struct qeth_card *card,
1716{ 1706{
1717 struct qeth_cmd_buffer *iob; 1707 struct qeth_cmd_buffer *iob;
1718 struct qeth_ipa_cmd *cmd; 1708 struct qeth_ipa_cmd *cmd;
1719 int tmp;
1720 int rc; 1709 int rc;
1721 1710
1722 QETH_CARD_TEXT_(card, 3, "qarpipv%i", prot); 1711 QETH_CARD_TEXT_(card, 3, "qarpipv%i", prot);
@@ -1735,15 +1724,10 @@ static int qeth_l3_query_arp_cache_info(struct qeth_card *card,
1735 rc = qeth_l3_send_ipa_arp_cmd(card, iob, 1724 rc = qeth_l3_send_ipa_arp_cmd(card, iob,
1736 QETH_SETASS_BASE_LEN+QETH_ARP_CMD_LEN, 1725 QETH_SETASS_BASE_LEN+QETH_ARP_CMD_LEN,
1737 qeth_l3_arp_query_cb, (void *)qinfo); 1726 qeth_l3_arp_query_cb, (void *)qinfo);
1738 if (rc) { 1727 if (rc)
1739 tmp = rc; 1728 QETH_DBF_MESSAGE(2, "Error while querying ARP cache on device %x: %#x\n",
1740 QETH_DBF_MESSAGE(2, 1729 CARD_DEVID(card), rc);
1741 "Error while querying ARP cache on %s: %s " 1730 return qeth_l3_arp_makerc(rc);
1742 "(0x%x/%d)\n", QETH_CARD_IFNAME(card),
1743 qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
1744 }
1745
1746 return rc;
1747} 1731}
1748 1732
1749static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata) 1733static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata)
@@ -1793,15 +1777,18 @@ out:
1793 return rc; 1777 return rc;
1794} 1778}
1795 1779
1796static int qeth_l3_arp_add_entry(struct qeth_card *card, 1780static int qeth_l3_arp_modify_entry(struct qeth_card *card,
1797 struct qeth_arp_cache_entry *entry) 1781 struct qeth_arp_cache_entry *entry,
1782 enum qeth_arp_process_subcmds arp_cmd)
1798{ 1783{
1784 struct qeth_arp_cache_entry *cmd_entry;
1799 struct qeth_cmd_buffer *iob; 1785 struct qeth_cmd_buffer *iob;
1800 char buf[16];
1801 int tmp;
1802 int rc; 1786 int rc;
1803 1787
1804 QETH_CARD_TEXT(card, 3, "arpadent"); 1788 if (arp_cmd == IPA_CMD_ASS_ARP_ADD_ENTRY)
1789 QETH_CARD_TEXT(card, 3, "arpadd");
1790 else
1791 QETH_CARD_TEXT(card, 3, "arpdel");
1805 1792
1806 /* 1793 /*
1807 * currently GuestLAN only supports the ARP assist function 1794 * currently GuestLAN only supports the ARP assist function
@@ -1814,71 +1801,25 @@ static int qeth_l3_arp_add_entry(struct qeth_card *card,
1814 return -EOPNOTSUPP; 1801 return -EOPNOTSUPP;
1815 } 1802 }
1816 1803
1817 iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING, 1804 iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING, arp_cmd,
1818 IPA_CMD_ASS_ARP_ADD_ENTRY, 1805 sizeof(*cmd_entry), QETH_PROT_IPV4);
1819 sizeof(struct qeth_arp_cache_entry),
1820 QETH_PROT_IPV4);
1821 if (!iob) 1806 if (!iob)
1822 return -ENOMEM; 1807 return -ENOMEM;
1823 rc = qeth_send_setassparms(card, iob,
1824 sizeof(struct qeth_arp_cache_entry),
1825 (unsigned long) entry,
1826 qeth_setassparms_cb, NULL);
1827 if (rc) {
1828 tmp = rc;
1829 qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
1830 QETH_DBF_MESSAGE(2, "Could not add ARP entry for address %s "
1831 "on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card),
1832 qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
1833 }
1834 return rc;
1835}
1836
1837static int qeth_l3_arp_remove_entry(struct qeth_card *card,
1838 struct qeth_arp_cache_entry *entry)
1839{
1840 struct qeth_cmd_buffer *iob;
1841 char buf[16] = {0, };
1842 int tmp;
1843 int rc;
1844 1808
1845 QETH_CARD_TEXT(card, 3, "arprment"); 1809 cmd_entry = &__ipa_cmd(iob)->data.setassparms.data.arp_entry;
1810 ether_addr_copy(cmd_entry->macaddr, entry->macaddr);
1811 memcpy(cmd_entry->ipaddr, entry->ipaddr, 4);
1812 rc = qeth_send_ipa_cmd(card, iob, qeth_setassparms_cb, NULL);
1813 if (rc)
1814 QETH_DBF_MESSAGE(2, "Could not modify (cmd: %#x) ARP entry on device %x: %#x\n",
1815 arp_cmd, CARD_DEVID(card), rc);
1846 1816
1847 /* 1817 return qeth_l3_arp_makerc(rc);
1848 * currently GuestLAN only supports the ARP assist function
1849 * IPA_CMD_ASS_ARP_QUERY_INFO, but not IPA_CMD_ASS_ARP_REMOVE_ENTRY;
1850 * thus we say EOPNOTSUPP for this ARP function
1851 */
1852 if (card->info.guestlan)
1853 return -EOPNOTSUPP;
1854 if (!qeth_is_supported(card, IPA_ARP_PROCESSING)) {
1855 return -EOPNOTSUPP;
1856 }
1857 memcpy(buf, entry, 12);
1858 iob = qeth_get_setassparms_cmd(card, IPA_ARP_PROCESSING,
1859 IPA_CMD_ASS_ARP_REMOVE_ENTRY,
1860 12,
1861 QETH_PROT_IPV4);
1862 if (!iob)
1863 return -ENOMEM;
1864 rc = qeth_send_setassparms(card, iob,
1865 12, (unsigned long)buf,
1866 qeth_setassparms_cb, NULL);
1867 if (rc) {
1868 tmp = rc;
1869 memset(buf, 0, 16);
1870 qeth_l3_ipaddr4_to_string((u8 *)entry->ipaddr, buf);
1871 QETH_DBF_MESSAGE(2, "Could not delete ARP entry for address %s"
1872 " on %s: %s (0x%x/%d)\n", buf, QETH_CARD_IFNAME(card),
1873 qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
1874 }
1875 return rc;
1876} 1818}
1877 1819
1878static int qeth_l3_arp_flush_cache(struct qeth_card *card) 1820static int qeth_l3_arp_flush_cache(struct qeth_card *card)
1879{ 1821{
1880 int rc; 1822 int rc;
1881 int tmp;
1882 1823
1883 QETH_CARD_TEXT(card, 3, "arpflush"); 1824 QETH_CARD_TEXT(card, 3, "arpflush");
1884 1825
@@ -1894,19 +1835,17 @@ static int qeth_l3_arp_flush_cache(struct qeth_card *card)
1894 } 1835 }
1895 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING, 1836 rc = qeth_send_simple_setassparms(card, IPA_ARP_PROCESSING,
1896 IPA_CMD_ASS_ARP_FLUSH_CACHE, 0); 1837 IPA_CMD_ASS_ARP_FLUSH_CACHE, 0);
1897 if (rc) { 1838 if (rc)
1898 tmp = rc; 1839 QETH_DBF_MESSAGE(2, "Could not flush ARP cache on device %x: %#x\n",
1899 QETH_DBF_MESSAGE(2, "Could not flush ARP cache on %s: %s " 1840 CARD_DEVID(card), rc);
1900 "(0x%x/%d)\n", QETH_CARD_IFNAME(card), 1841 return qeth_l3_arp_makerc(rc);
1901 qeth_l3_arp_get_error_cause(&rc), tmp, tmp);
1902 }
1903 return rc;
1904} 1842}
1905 1843
1906static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 1844static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1907{ 1845{
1908 struct qeth_card *card = dev->ml_priv; 1846 struct qeth_card *card = dev->ml_priv;
1909 struct qeth_arp_cache_entry arp_entry; 1847 struct qeth_arp_cache_entry arp_entry;
1848 enum qeth_arp_process_subcmds arp_cmd;
1910 int rc = 0; 1849 int rc = 0;
1911 1850
1912 switch (cmd) { 1851 switch (cmd) {
@@ -1925,27 +1864,16 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1925 rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data); 1864 rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data);
1926 break; 1865 break;
1927 case SIOC_QETH_ARP_ADD_ENTRY: 1866 case SIOC_QETH_ARP_ADD_ENTRY:
1928 if (!capable(CAP_NET_ADMIN)) {
1929 rc = -EPERM;
1930 break;
1931 }
1932 if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data,
1933 sizeof(struct qeth_arp_cache_entry)))
1934 rc = -EFAULT;
1935 else
1936 rc = qeth_l3_arp_add_entry(card, &arp_entry);
1937 break;
1938 case SIOC_QETH_ARP_REMOVE_ENTRY: 1867 case SIOC_QETH_ARP_REMOVE_ENTRY:
1939 if (!capable(CAP_NET_ADMIN)) { 1868 if (!capable(CAP_NET_ADMIN))
1940 rc = -EPERM; 1869 return -EPERM;
1941 break; 1870 if (copy_from_user(&arp_entry, rq->ifr_data, sizeof(arp_entry)))
1942 } 1871 return -EFAULT;
1943 if (copy_from_user(&arp_entry, rq->ifr_ifru.ifru_data, 1872
1944 sizeof(struct qeth_arp_cache_entry))) 1873 arp_cmd = (cmd == SIOC_QETH_ARP_ADD_ENTRY) ?
1945 rc = -EFAULT; 1874 IPA_CMD_ASS_ARP_ADD_ENTRY :
1946 else 1875 IPA_CMD_ASS_ARP_REMOVE_ENTRY;
1947 rc = qeth_l3_arp_remove_entry(card, &arp_entry); 1876 return qeth_l3_arp_modify_entry(card, &arp_entry, arp_cmd);
1948 break;
1949 case SIOC_QETH_ARP_FLUSH_CACHE: 1877 case SIOC_QETH_ARP_FLUSH_CACHE:
1950 if (!capable(CAP_NET_ADMIN)) { 1878 if (!capable(CAP_NET_ADMIN)) {
1951 rc = -EPERM; 1879 rc = -EPERM;
@@ -2383,12 +2311,12 @@ static const struct net_device_ops qeth_l3_osa_netdev_ops = {
2383 .ndo_neigh_setup = qeth_l3_neigh_setup, 2311 .ndo_neigh_setup = qeth_l3_neigh_setup,
2384}; 2312};
2385 2313
2386static int qeth_l3_setup_netdev(struct qeth_card *card) 2314static int qeth_l3_setup_netdev(struct qeth_card *card, bool carrier_ok)
2387{ 2315{
2388 unsigned int headroom; 2316 unsigned int headroom;
2389 int rc; 2317 int rc;
2390 2318
2391 if (card->dev->netdev_ops) 2319 if (qeth_netdev_is_registered(card->dev))
2392 return 0; 2320 return 0;
2393 2321
2394 if (card->info.type == QETH_CARD_TYPE_OSD || 2322 if (card->info.type == QETH_CARD_TYPE_OSD ||
@@ -2457,6 +2385,9 @@ static int qeth_l3_setup_netdev(struct qeth_card *card)
2457 2385
2458 netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT); 2386 netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT);
2459 rc = register_netdev(card->dev); 2387 rc = register_netdev(card->dev);
2388 if (!rc && carrier_ok)
2389 netif_carrier_on(card->dev);
2390
2460out: 2391out:
2461 if (rc) 2392 if (rc)
2462 card->dev->netdev_ops = NULL; 2393 card->dev->netdev_ops = NULL;
@@ -2497,7 +2428,8 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev)
2497 if (cgdev->state == CCWGROUP_ONLINE) 2428 if (cgdev->state == CCWGROUP_ONLINE)
2498 qeth_l3_set_offline(cgdev); 2429 qeth_l3_set_offline(cgdev);
2499 2430
2500 unregister_netdev(card->dev); 2431 if (qeth_netdev_is_registered(card->dev))
2432 unregister_netdev(card->dev);
2501 qeth_l3_clear_ip_htable(card, 0); 2433 qeth_l3_clear_ip_htable(card, 0);
2502 qeth_l3_clear_ipato_list(card); 2434 qeth_l3_clear_ipato_list(card);
2503} 2435}
@@ -2507,6 +2439,7 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
2507 struct qeth_card *card = dev_get_drvdata(&gdev->dev); 2439 struct qeth_card *card = dev_get_drvdata(&gdev->dev);
2508 int rc = 0; 2440 int rc = 0;
2509 enum qeth_card_states recover_flag; 2441 enum qeth_card_states recover_flag;
2442 bool carrier_ok;
2510 2443
2511 mutex_lock(&card->discipline_mutex); 2444 mutex_lock(&card->discipline_mutex);
2512 mutex_lock(&card->conf_mutex); 2445 mutex_lock(&card->conf_mutex);
@@ -2514,14 +2447,14 @@ static int __qeth_l3_set_online(struct ccwgroup_device *gdev, int recovery_mode)
2514 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); 2447 QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *));
2515 2448
2516 recover_flag = card->state; 2449 recover_flag = card->state;
2517 rc = qeth_core_hardsetup_card(card); 2450 rc = qeth_core_hardsetup_card(card, &carrier_ok);
2518 if (rc) { 2451 if (rc) {
2519 QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc); 2452 QETH_DBF_TEXT_(SETUP, 2, "2err%04x", rc);
2520 rc = -ENODEV; 2453 rc = -ENODEV;
2521 goto out_remove; 2454 goto out_remove;
2522 } 2455 }
2523 2456
2524 rc = qeth_l3_setup_netdev(card); 2457 rc = qeth_l3_setup_netdev(card, carrier_ok);
2525 if (rc) 2458 if (rc)
2526 goto out_remove; 2459 goto out_remove;
2527 2460
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
index f07444d30b21..640cd1b31a18 100644
--- a/drivers/scsi/Kconfig
+++ b/drivers/scsi/Kconfig
@@ -578,6 +578,7 @@ config SCSI_MYRB
578config SCSI_MYRS 578config SCSI_MYRS
579 tristate "Mylex DAC960/DAC1100 PCI RAID Controller (SCSI Interface)" 579 tristate "Mylex DAC960/DAC1100 PCI RAID Controller (SCSI Interface)"
580 depends on PCI 580 depends on PCI
581 depends on !CPU_BIG_ENDIAN || COMPILE_TEST
581 select RAID_ATTRS 582 select RAID_ATTRS
582 help 583 help
583 This driver adds support for the Mylex DAC960, AcceleRAID, and 584 This driver adds support for the Mylex DAC960, AcceleRAID, and
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c
index 8429c855701f..01c23d27f290 100644
--- a/drivers/scsi/NCR5380.c
+++ b/drivers/scsi/NCR5380.c
@@ -1198,7 +1198,7 @@ static bool NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
1198 1198
1199out: 1199out:
1200 if (!hostdata->selecting) 1200 if (!hostdata->selecting)
1201 return NULL; 1201 return false;
1202 hostdata->selecting = NULL; 1202 hostdata->selecting = NULL;
1203 return ret; 1203 return ret;
1204} 1204}
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
index f0e457e6884e..8df822a4a1bd 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
@@ -904,11 +904,9 @@ static void start_delivery_v1_hw(struct hisi_sas_dq *dq)
904{ 904{
905 struct hisi_hba *hisi_hba = dq->hisi_hba; 905 struct hisi_hba *hisi_hba = dq->hisi_hba;
906 struct hisi_sas_slot *s, *s1, *s2 = NULL; 906 struct hisi_sas_slot *s, *s1, *s2 = NULL;
907 struct list_head *dq_list;
908 int dlvry_queue = dq->id; 907 int dlvry_queue = dq->id;
909 int wp; 908 int wp;
910 909
911 dq_list = &dq->list;
912 list_for_each_entry_safe(s, s1, &dq->list, delivery) { 910 list_for_each_entry_safe(s, s1, &dq->list, delivery) {
913 if (!s->ready) 911 if (!s->ready)
914 break; 912 break;
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
index cc36b6473e98..77a85ead483e 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
@@ -1670,11 +1670,9 @@ static void start_delivery_v2_hw(struct hisi_sas_dq *dq)
1670{ 1670{
1671 struct hisi_hba *hisi_hba = dq->hisi_hba; 1671 struct hisi_hba *hisi_hba = dq->hisi_hba;
1672 struct hisi_sas_slot *s, *s1, *s2 = NULL; 1672 struct hisi_sas_slot *s, *s1, *s2 = NULL;
1673 struct list_head *dq_list;
1674 int dlvry_queue = dq->id; 1673 int dlvry_queue = dq->id;
1675 int wp; 1674 int wp;
1676 1675
1677 dq_list = &dq->list;
1678 list_for_each_entry_safe(s, s1, &dq->list, delivery) { 1676 list_for_each_entry_safe(s, s1, &dq->list, delivery) {
1679 if (!s->ready) 1677 if (!s->ready)
1680 break; 1678 break;
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
index bd4ce38b98d2..a369450a1fa7 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
@@ -886,11 +886,9 @@ static void start_delivery_v3_hw(struct hisi_sas_dq *dq)
886{ 886{
887 struct hisi_hba *hisi_hba = dq->hisi_hba; 887 struct hisi_hba *hisi_hba = dq->hisi_hba;
888 struct hisi_sas_slot *s, *s1, *s2 = NULL; 888 struct hisi_sas_slot *s, *s1, *s2 = NULL;
889 struct list_head *dq_list;
890 int dlvry_queue = dq->id; 889 int dlvry_queue = dq->id;
891 int wp; 890 int wp;
892 891
893 dq_list = &dq->list;
894 list_for_each_entry_safe(s, s1, &dq->list, delivery) { 892 list_for_each_entry_safe(s, s1, &dq->list, delivery) {
895 if (!s->ready) 893 if (!s->ready)
896 break; 894 break;
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c
index 0c8005bb0f53..34d311a7dbef 100644
--- a/drivers/scsi/lpfc/lpfc_debugfs.c
+++ b/drivers/scsi/lpfc/lpfc_debugfs.c
@@ -698,6 +698,8 @@ lpfc_debugfs_nodelist_data(struct lpfc_vport *vport, char *buf, int size)
698 rport = lpfc_ndlp_get_nrport(ndlp); 698 rport = lpfc_ndlp_get_nrport(ndlp);
699 if (rport) 699 if (rport)
700 nrport = rport->remoteport; 700 nrport = rport->remoteport;
701 else
702 nrport = NULL;
701 spin_unlock(&phba->hbalock); 703 spin_unlock(&phba->hbalock);
702 if (!nrport) 704 if (!nrport)
703 continue; 705 continue;
diff --git a/drivers/scsi/myrb.c b/drivers/scsi/myrb.c
index aeb282f617c5..0642f2d0a3bb 100644
--- a/drivers/scsi/myrb.c
+++ b/drivers/scsi/myrb.c
@@ -1049,7 +1049,8 @@ static int myrb_get_hba_config(struct myrb_hba *cb)
1049 enquiry2->fw.firmware_type = '0'; 1049 enquiry2->fw.firmware_type = '0';
1050 enquiry2->fw.turn_id = 0; 1050 enquiry2->fw.turn_id = 0;
1051 } 1051 }
1052 sprintf(cb->fw_version, "%d.%02d-%c-%02d", 1052 snprintf(cb->fw_version, sizeof(cb->fw_version),
1053 "%d.%02d-%c-%02d",
1053 enquiry2->fw.major_version, 1054 enquiry2->fw.major_version,
1054 enquiry2->fw.minor_version, 1055 enquiry2->fw.minor_version,
1055 enquiry2->fw.firmware_type, 1056 enquiry2->fw.firmware_type,
diff --git a/drivers/scsi/myrs.c b/drivers/scsi/myrs.c
index 0264a2e2bc19..b8d54ef8cf6d 100644
--- a/drivers/scsi/myrs.c
+++ b/drivers/scsi/myrs.c
@@ -163,9 +163,12 @@ static unsigned char myrs_get_ctlr_info(struct myrs_hba *cs)
163 dma_addr_t ctlr_info_addr; 163 dma_addr_t ctlr_info_addr;
164 union myrs_sgl *sgl; 164 union myrs_sgl *sgl;
165 unsigned char status; 165 unsigned char status;
166 struct myrs_ctlr_info old; 166 unsigned short ldev_present, ldev_critical, ldev_offline;
167
168 ldev_present = cs->ctlr_info->ldev_present;
169 ldev_critical = cs->ctlr_info->ldev_critical;
170 ldev_offline = cs->ctlr_info->ldev_offline;
167 171
168 memcpy(&old, cs->ctlr_info, sizeof(struct myrs_ctlr_info));
169 ctlr_info_addr = dma_map_single(&cs->pdev->dev, cs->ctlr_info, 172 ctlr_info_addr = dma_map_single(&cs->pdev->dev, cs->ctlr_info,
170 sizeof(struct myrs_ctlr_info), 173 sizeof(struct myrs_ctlr_info),
171 DMA_FROM_DEVICE); 174 DMA_FROM_DEVICE);
@@ -198,9 +201,9 @@ static unsigned char myrs_get_ctlr_info(struct myrs_hba *cs)
198 cs->ctlr_info->rbld_active + 201 cs->ctlr_info->rbld_active +
199 cs->ctlr_info->exp_active != 0) 202 cs->ctlr_info->exp_active != 0)
200 cs->needs_update = true; 203 cs->needs_update = true;
201 if (cs->ctlr_info->ldev_present != old.ldev_present || 204 if (cs->ctlr_info->ldev_present != ldev_present ||
202 cs->ctlr_info->ldev_critical != old.ldev_critical || 205 cs->ctlr_info->ldev_critical != ldev_critical ||
203 cs->ctlr_info->ldev_offline != old.ldev_offline) 206 cs->ctlr_info->ldev_offline != ldev_offline)
204 shost_printk(KERN_INFO, cs->host, 207 shost_printk(KERN_INFO, cs->host,
205 "Logical drive count changes (%d/%d/%d)\n", 208 "Logical drive count changes (%d/%d/%d)\n",
206 cs->ctlr_info->ldev_critical, 209 cs->ctlr_info->ldev_critical,
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 6fe20c27acc1..eb59c796a795 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -4763,6 +4763,7 @@ qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags)
4763 fcport->loop_id = FC_NO_LOOP_ID; 4763 fcport->loop_id = FC_NO_LOOP_ID;
4764 qla2x00_set_fcport_state(fcport, FCS_UNCONFIGURED); 4764 qla2x00_set_fcport_state(fcport, FCS_UNCONFIGURED);
4765 fcport->supported_classes = FC_COS_UNSPECIFIED; 4765 fcport->supported_classes = FC_COS_UNSPECIFIED;
4766 fcport->fp_speed = PORT_SPEED_UNKNOWN;
4766 4767
4767 fcport->ct_desc.ct_sns = dma_alloc_coherent(&vha->hw->pdev->dev, 4768 fcport->ct_desc.ct_sns = dma_alloc_coherent(&vha->hw->pdev->dev,
4768 sizeof(struct ct_sns_pkt), &fcport->ct_desc.ct_sns_dma, 4769 sizeof(struct ct_sns_pkt), &fcport->ct_desc.ct_sns_dma,
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 518f15141170..20c85eed1a75 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -67,7 +67,7 @@ module_param(ql2xplogiabsentdevice, int, S_IRUGO|S_IWUSR);
67MODULE_PARM_DESC(ql2xplogiabsentdevice, 67MODULE_PARM_DESC(ql2xplogiabsentdevice,
68 "Option to enable PLOGI to devices that are not present after " 68 "Option to enable PLOGI to devices that are not present after "
69 "a Fabric scan. This is needed for several broken switches. " 69 "a Fabric scan. This is needed for several broken switches. "
70 "Default is 0 - no PLOGI. 1 - perfom PLOGI."); 70 "Default is 0 - no PLOGI. 1 - perform PLOGI.");
71 71
72int ql2xloginretrycount = 0; 72int ql2xloginretrycount = 0;
73module_param(ql2xloginretrycount, int, S_IRUGO); 73module_param(ql2xloginretrycount, int, S_IRUGO);
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index c7fccbb8f554..fa6e0c3b3aa6 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -697,6 +697,12 @@ static bool scsi_end_request(struct request *req, blk_status_t error,
697 */ 697 */
698 scsi_mq_uninit_cmd(cmd); 698 scsi_mq_uninit_cmd(cmd);
699 699
700 /*
701 * queue is still alive, so grab the ref for preventing it
702 * from being cleaned up during running queue.
703 */
704 percpu_ref_get(&q->q_usage_counter);
705
700 __blk_mq_end_request(req, error); 706 __blk_mq_end_request(req, error);
701 707
702 if (scsi_target(sdev)->single_lun || 708 if (scsi_target(sdev)->single_lun ||
@@ -704,6 +710,8 @@ static bool scsi_end_request(struct request *req, blk_status_t error,
704 kblockd_schedule_work(&sdev->requeue_work); 710 kblockd_schedule_work(&sdev->requeue_work);
705 else 711 else
706 blk_mq_run_hw_queues(q, true); 712 blk_mq_run_hw_queues(q, true);
713
714 percpu_ref_put(&q->q_usage_counter);
707 } else { 715 } else {
708 unsigned long flags; 716 unsigned long flags;
709 717
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 23d7cca36ff0..27db55b0ca7f 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -8099,13 +8099,6 @@ int ufshcd_alloc_host(struct device *dev, struct ufs_hba **hba_handle)
8099 err = -ENOMEM; 8099 err = -ENOMEM;
8100 goto out_error; 8100 goto out_error;
8101 } 8101 }
8102
8103 /*
8104 * Do not use blk-mq at this time because blk-mq does not support
8105 * runtime pm.
8106 */
8107 host->use_blk_mq = false;
8108
8109 hba = shost_priv(host); 8102 hba = shost_priv(host);
8110 hba->host = host; 8103 hba->host = host;
8111 hba->dev = dev; 8104 hba->dev = dev;
diff --git a/drivers/staging/vboxvideo/vbox_drv.h b/drivers/staging/vboxvideo/vbox_drv.h
index 73395a7536c5..fa933d422951 100644
--- a/drivers/staging/vboxvideo/vbox_drv.h
+++ b/drivers/staging/vboxvideo/vbox_drv.h
@@ -99,8 +99,6 @@ struct vbox_private {
99 int fb_mtrr; 99 int fb_mtrr;
100 100
101 struct { 101 struct {
102 struct drm_global_reference mem_global_ref;
103 struct ttm_bo_global_ref bo_global_ref;
104 struct ttm_bo_device bdev; 102 struct ttm_bo_device bdev;
105 } ttm; 103 } ttm;
106 104
diff --git a/drivers/staging/vboxvideo/vbox_ttm.c b/drivers/staging/vboxvideo/vbox_ttm.c
index 5ecfa7629173..b36ec019c332 100644
--- a/drivers/staging/vboxvideo/vbox_ttm.c
+++ b/drivers/staging/vboxvideo/vbox_ttm.c
@@ -35,61 +35,6 @@ static inline struct vbox_private *vbox_bdev(struct ttm_bo_device *bd)
35 return container_of(bd, struct vbox_private, ttm.bdev); 35 return container_of(bd, struct vbox_private, ttm.bdev);
36} 36}
37 37
38static int vbox_ttm_mem_global_init(struct drm_global_reference *ref)
39{
40 return ttm_mem_global_init(ref->object);
41}
42
43static void vbox_ttm_mem_global_release(struct drm_global_reference *ref)
44{
45 ttm_mem_global_release(ref->object);
46}
47
48/**
49 * Adds the vbox memory manager object/structures to the global memory manager.
50 */
51static int vbox_ttm_global_init(struct vbox_private *vbox)
52{
53 struct drm_global_reference *global_ref;
54 int ret;
55
56 global_ref = &vbox->ttm.mem_global_ref;
57 global_ref->global_type = DRM_GLOBAL_TTM_MEM;
58 global_ref->size = sizeof(struct ttm_mem_global);
59 global_ref->init = &vbox_ttm_mem_global_init;
60 global_ref->release = &vbox_ttm_mem_global_release;
61 ret = drm_global_item_ref(global_ref);
62 if (ret) {
63 DRM_ERROR("Failed setting up TTM memory subsystem.\n");
64 return ret;
65 }
66
67 vbox->ttm.bo_global_ref.mem_glob = vbox->ttm.mem_global_ref.object;
68 global_ref = &vbox->ttm.bo_global_ref.ref;
69 global_ref->global_type = DRM_GLOBAL_TTM_BO;
70 global_ref->size = sizeof(struct ttm_bo_global);
71 global_ref->init = &ttm_bo_global_init;
72 global_ref->release = &ttm_bo_global_release;
73
74 ret = drm_global_item_ref(global_ref);
75 if (ret) {
76 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
77 drm_global_item_unref(&vbox->ttm.mem_global_ref);
78 return ret;
79 }
80
81 return 0;
82}
83
84/**
85 * Removes the vbox memory manager object from the global memory manager.
86 */
87static void vbox_ttm_global_release(struct vbox_private *vbox)
88{
89 drm_global_item_unref(&vbox->ttm.bo_global_ref.ref);
90 drm_global_item_unref(&vbox->ttm.mem_global_ref);
91}
92
93static void vbox_bo_ttm_destroy(struct ttm_buffer_object *tbo) 38static void vbox_bo_ttm_destroy(struct ttm_buffer_object *tbo)
94{ 39{
95 struct vbox_bo *bo; 40 struct vbox_bo *bo;
@@ -227,18 +172,13 @@ int vbox_mm_init(struct vbox_private *vbox)
227 struct drm_device *dev = &vbox->ddev; 172 struct drm_device *dev = &vbox->ddev;
228 struct ttm_bo_device *bdev = &vbox->ttm.bdev; 173 struct ttm_bo_device *bdev = &vbox->ttm.bdev;
229 174
230 ret = vbox_ttm_global_init(vbox);
231 if (ret)
232 return ret;
233
234 ret = ttm_bo_device_init(&vbox->ttm.bdev, 175 ret = ttm_bo_device_init(&vbox->ttm.bdev,
235 vbox->ttm.bo_global_ref.ref.object,
236 &vbox_bo_driver, 176 &vbox_bo_driver,
237 dev->anon_inode->i_mapping, 177 dev->anon_inode->i_mapping,
238 DRM_FILE_PAGE_OFFSET, true); 178 DRM_FILE_PAGE_OFFSET, true);
239 if (ret) { 179 if (ret) {
240 DRM_ERROR("Error initialising bo driver; %d\n", ret); 180 DRM_ERROR("Error initialising bo driver; %d\n", ret);
241 goto err_ttm_global_release; 181 return ret;
242 } 182 }
243 183
244 ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM, 184 ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM,
@@ -260,8 +200,6 @@ int vbox_mm_init(struct vbox_private *vbox)
260 200
261err_device_release: 201err_device_release:
262 ttm_bo_device_release(&vbox->ttm.bdev); 202 ttm_bo_device_release(&vbox->ttm.bdev);
263err_ttm_global_release:
264 vbox_ttm_global_release(vbox);
265 return ret; 203 return ret;
266} 204}
267 205
@@ -275,7 +213,6 @@ void vbox_mm_fini(struct vbox_private *vbox)
275 arch_phys_wc_del(vbox->fb_mtrr); 213 arch_phys_wc_del(vbox->fb_mtrr);
276#endif 214#endif
277 ttm_bo_device_release(&vbox->ttm.bdev); 215 ttm_bo_device_release(&vbox->ttm.bdev);
278 vbox_ttm_global_release(vbox);
279} 216}
280 217
281void vbox_ttm_placement(struct vbox_bo *bo, int domain) 218void vbox_ttm_placement(struct vbox_bo *bo, int domain)
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index e31e4fc31aa1..2cfd61d62e97 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -1778,7 +1778,7 @@ EXPORT_SYMBOL(target_submit_tmr);
1778void transport_generic_request_failure(struct se_cmd *cmd, 1778void transport_generic_request_failure(struct se_cmd *cmd,
1779 sense_reason_t sense_reason) 1779 sense_reason_t sense_reason)
1780{ 1780{
1781 int ret = 0; 1781 int ret = 0, post_ret;
1782 1782
1783 pr_debug("-----[ Storage Engine Exception; sense_reason %d\n", 1783 pr_debug("-----[ Storage Engine Exception; sense_reason %d\n",
1784 sense_reason); 1784 sense_reason);
@@ -1790,7 +1790,7 @@ void transport_generic_request_failure(struct se_cmd *cmd,
1790 transport_complete_task_attr(cmd); 1790 transport_complete_task_attr(cmd);
1791 1791
1792 if (cmd->transport_complete_callback) 1792 if (cmd->transport_complete_callback)
1793 cmd->transport_complete_callback(cmd, false, NULL); 1793 cmd->transport_complete_callback(cmd, false, &post_ret);
1794 1794
1795 if (transport_check_aborted_status(cmd, 1)) 1795 if (transport_check_aborted_status(cmd, 1))
1796 return; 1796 return;
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index ff6ba6d86cd8..cc56cb3b3eca 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -1614,10 +1614,10 @@ static void sci_request_dma(struct uart_port *port)
1614 hrtimer_init(&s->rx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); 1614 hrtimer_init(&s->rx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
1615 s->rx_timer.function = rx_timer_fn; 1615 s->rx_timer.function = rx_timer_fn;
1616 1616
1617 s->chan_rx_saved = s->chan_rx = chan;
1618
1617 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) 1619 if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
1618 sci_submit_rx(s); 1620 sci_submit_rx(s);
1619
1620 s->chan_rx_saved = s->chan_rx = chan;
1621 } 1621 }
1622} 1622}
1623 1623
@@ -3102,6 +3102,7 @@ static struct uart_driver sci_uart_driver = {
3102static int sci_remove(struct platform_device *dev) 3102static int sci_remove(struct platform_device *dev)
3103{ 3103{
3104 struct sci_port *port = platform_get_drvdata(dev); 3104 struct sci_port *port = platform_get_drvdata(dev);
3105 unsigned int type = port->port.type; /* uart_remove_... clears it */
3105 3106
3106 sci_ports_in_use &= ~BIT(port->port.line); 3107 sci_ports_in_use &= ~BIT(port->port.line);
3107 uart_remove_one_port(&sci_uart_driver, &port->port); 3108 uart_remove_one_port(&sci_uart_driver, &port->port);
@@ -3112,8 +3113,7 @@ static int sci_remove(struct platform_device *dev)
3112 sysfs_remove_file(&dev->dev.kobj, 3113 sysfs_remove_file(&dev->dev.kobj,
3113 &dev_attr_rx_fifo_trigger.attr); 3114 &dev_attr_rx_fifo_trigger.attr);
3114 } 3115 }
3115 if (port->port.type == PORT_SCIFA || port->port.type == PORT_SCIFB || 3116 if (type == PORT_SCIFA || type == PORT_SCIFB || type == PORT_HSCIF) {
3116 port->port.type == PORT_HSCIF) {
3117 sysfs_remove_file(&dev->dev.kobj, 3117 sysfs_remove_file(&dev->dev.kobj,
3118 &dev_attr_rx_fifo_timeout.attr); 3118 &dev_attr_rx_fifo_timeout.attr);
3119 } 3119 }
diff --git a/drivers/tty/tty_baudrate.c b/drivers/tty/tty_baudrate.c
index 7576ceace571..f438eaa68246 100644
--- a/drivers/tty/tty_baudrate.c
+++ b/drivers/tty/tty_baudrate.c
@@ -77,7 +77,7 @@ speed_t tty_termios_baud_rate(struct ktermios *termios)
77 else 77 else
78 cbaud += 15; 78 cbaud += 15;
79 } 79 }
80 return baud_table[cbaud]; 80 return cbaud >= n_baud_table ? 0 : baud_table[cbaud];
81} 81}
82EXPORT_SYMBOL(tty_termios_baud_rate); 82EXPORT_SYMBOL(tty_termios_baud_rate);
83 83
@@ -113,7 +113,7 @@ speed_t tty_termios_input_baud_rate(struct ktermios *termios)
113 else 113 else
114 cbaud += 15; 114 cbaud += 15;
115 } 115 }
116 return baud_table[cbaud]; 116 return cbaud >= n_baud_table ? 0 : baud_table[cbaud];
117#else /* IBSHIFT */ 117#else /* IBSHIFT */
118 return tty_termios_baud_rate(termios); 118 return tty_termios_baud_rate(termios);
119#endif /* IBSHIFT */ 119#endif /* IBSHIFT */
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
index 55370e651db3..41ec8e5010f3 100644
--- a/drivers/tty/vt/vt.c
+++ b/drivers/tty/vt/vt.c
@@ -1548,7 +1548,7 @@ static void csi_K(struct vc_data *vc, int vpar)
1548 scr_memsetw(start + offset, vc->vc_video_erase_char, 2 * count); 1548 scr_memsetw(start + offset, vc->vc_video_erase_char, 2 * count);
1549 vc->vc_need_wrap = 0; 1549 vc->vc_need_wrap = 0;
1550 if (con_should_update(vc)) 1550 if (con_should_update(vc))
1551 do_update_region(vc, (unsigned long) start, count); 1551 do_update_region(vc, (unsigned long)(start + offset), count);
1552} 1552}
1553 1553
1554static void csi_X(struct vc_data *vc, int vpar) /* erase the following vpar positions */ 1554static void csi_X(struct vc_data *vc, int vpar) /* erase the following vpar positions */
diff --git a/drivers/usb/typec/ucsi/Kconfig b/drivers/usb/typec/ucsi/Kconfig
index e36d6c73c4a4..78118883f96c 100644
--- a/drivers/usb/typec/ucsi/Kconfig
+++ b/drivers/usb/typec/ucsi/Kconfig
@@ -23,6 +23,16 @@ config TYPEC_UCSI
23 23
24if TYPEC_UCSI 24if TYPEC_UCSI
25 25
26config UCSI_CCG
27 tristate "UCSI Interface Driver for Cypress CCGx"
28 depends on I2C
29 help
30 This driver enables UCSI support on platforms that expose a
31 Cypress CCGx Type-C controller over I2C interface.
32
33 To compile the driver as a module, choose M here: the module will be
34 called ucsi_ccg.
35
26config UCSI_ACPI 36config UCSI_ACPI
27 tristate "UCSI ACPI Interface Driver" 37 tristate "UCSI ACPI Interface Driver"
28 depends on ACPI 38 depends on ACPI
diff --git a/drivers/usb/typec/ucsi/Makefile b/drivers/usb/typec/ucsi/Makefile
index 7afbea512207..2f4900b26210 100644
--- a/drivers/usb/typec/ucsi/Makefile
+++ b/drivers/usb/typec/ucsi/Makefile
@@ -8,3 +8,5 @@ typec_ucsi-y := ucsi.o
8typec_ucsi-$(CONFIG_TRACING) += trace.o 8typec_ucsi-$(CONFIG_TRACING) += trace.o
9 9
10obj-$(CONFIG_UCSI_ACPI) += ucsi_acpi.o 10obj-$(CONFIG_UCSI_ACPI) += ucsi_acpi.o
11
12obj-$(CONFIG_UCSI_CCG) += ucsi_ccg.o
diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c b/drivers/usb/typec/ucsi/ucsi_ccg.c
new file mode 100644
index 000000000000..de8a43bdff68
--- /dev/null
+++ b/drivers/usb/typec/ucsi/ucsi_ccg.c
@@ -0,0 +1,307 @@
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * UCSI driver for Cypress CCGx Type-C controller
4 *
5 * Copyright (C) 2017-2018 NVIDIA Corporation. All rights reserved.
6 * Author: Ajay Gupta <ajayg@nvidia.com>
7 *
8 * Some code borrowed from drivers/usb/typec/ucsi/ucsi_acpi.c
9 */
10#include <linux/acpi.h>
11#include <linux/delay.h>
12#include <linux/i2c.h>
13#include <linux/module.h>
14#include <linux/pci.h>
15#include <linux/platform_device.h>
16
17#include <asm/unaligned.h>
18#include "ucsi.h"
19
20struct ucsi_ccg {
21 struct device *dev;
22 struct ucsi *ucsi;
23 struct ucsi_ppm ppm;
24 struct i2c_client *client;
25};
26
27#define CCGX_RAB_INTR_REG 0x06
28#define CCGX_RAB_UCSI_CONTROL 0x39
29#define CCGX_RAB_UCSI_CONTROL_START BIT(0)
30#define CCGX_RAB_UCSI_CONTROL_STOP BIT(1)
31#define CCGX_RAB_UCSI_DATA_BLOCK(offset) (0xf000 | ((offset) & 0xff))
32
33static int ccg_read(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len)
34{
35 struct i2c_client *client = uc->client;
36 const struct i2c_adapter_quirks *quirks = client->adapter->quirks;
37 unsigned char buf[2];
38 struct i2c_msg msgs[] = {
39 {
40 .addr = client->addr,
41 .flags = 0x0,
42 .len = sizeof(buf),
43 .buf = buf,
44 },
45 {
46 .addr = client->addr,
47 .flags = I2C_M_RD,
48 .buf = data,
49 },
50 };
51 u32 rlen, rem_len = len, max_read_len = len;
52 int status;
53
54 /* check any max_read_len limitation on i2c adapter */
55 if (quirks && quirks->max_read_len)
56 max_read_len = quirks->max_read_len;
57
58 while (rem_len > 0) {
59 msgs[1].buf = &data[len - rem_len];
60 rlen = min_t(u16, rem_len, max_read_len);
61 msgs[1].len = rlen;
62 put_unaligned_le16(rab, buf);
63 status = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
64 if (status < 0) {
65 dev_err(uc->dev, "i2c_transfer failed %d\n", status);
66 return status;
67 }
68 rab += rlen;
69 rem_len -= rlen;
70 }
71
72 return 0;
73}
74
75static int ccg_write(struct ucsi_ccg *uc, u16 rab, u8 *data, u32 len)
76{
77 struct i2c_client *client = uc->client;
78 unsigned char *buf;
79 struct i2c_msg msgs[] = {
80 {
81 .addr = client->addr,
82 .flags = 0x0,
83 }
84 };
85 int status;
86
87 buf = kzalloc(len + sizeof(rab), GFP_KERNEL);
88 if (!buf)
89 return -ENOMEM;
90
91 put_unaligned_le16(rab, buf);
92 memcpy(buf + sizeof(rab), data, len);
93
94 msgs[0].len = len + sizeof(rab);
95 msgs[0].buf = buf;
96
97 status = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
98 if (status < 0) {
99 dev_err(uc->dev, "i2c_transfer failed %d\n", status);
100 kfree(buf);
101 return status;
102 }
103
104 kfree(buf);
105 return 0;
106}
107
108static int ucsi_ccg_init(struct ucsi_ccg *uc)
109{
110 unsigned int count = 10;
111 u8 data;
112 int status;
113
114 data = CCGX_RAB_UCSI_CONTROL_STOP;
115 status = ccg_write(uc, CCGX_RAB_UCSI_CONTROL, &data, sizeof(data));
116 if (status < 0)
117 return status;
118
119 data = CCGX_RAB_UCSI_CONTROL_START;
120 status = ccg_write(uc, CCGX_RAB_UCSI_CONTROL, &data, sizeof(data));
121 if (status < 0)
122 return status;
123
124 /*
125 * Flush CCGx RESPONSE queue by acking interrupts. Above ucsi control
126 * register write will push response which must be cleared.
127 */
128 do {
129 status = ccg_read(uc, CCGX_RAB_INTR_REG, &data, sizeof(data));
130 if (status < 0)
131 return status;
132
133 if (!data)
134 return 0;
135
136 status = ccg_write(uc, CCGX_RAB_INTR_REG, &data, sizeof(data));
137 if (status < 0)
138 return status;
139
140 usleep_range(10000, 11000);
141 } while (--count);
142
143 return -ETIMEDOUT;
144}
145
146static int ucsi_ccg_send_data(struct ucsi_ccg *uc)
147{
148 u8 *ppm = (u8 *)uc->ppm.data;
149 int status;
150 u16 rab;
151
152 rab = CCGX_RAB_UCSI_DATA_BLOCK(offsetof(struct ucsi_data, message_out));
153 status = ccg_write(uc, rab, ppm +
154 offsetof(struct ucsi_data, message_out),
155 sizeof(uc->ppm.data->message_out));
156 if (status < 0)
157 return status;
158
159 rab = CCGX_RAB_UCSI_DATA_BLOCK(offsetof(struct ucsi_data, ctrl));
160 return ccg_write(uc, rab, ppm + offsetof(struct ucsi_data, ctrl),
161 sizeof(uc->ppm.data->ctrl));
162}
163
164static int ucsi_ccg_recv_data(struct ucsi_ccg *uc)
165{
166 u8 *ppm = (u8 *)uc->ppm.data;
167 int status;
168 u16 rab;
169
170 rab = CCGX_RAB_UCSI_DATA_BLOCK(offsetof(struct ucsi_data, cci));
171 status = ccg_read(uc, rab, ppm + offsetof(struct ucsi_data, cci),
172 sizeof(uc->ppm.data->cci));
173 if (status < 0)
174 return status;
175
176 rab = CCGX_RAB_UCSI_DATA_BLOCK(offsetof(struct ucsi_data, message_in));
177 return ccg_read(uc, rab, ppm + offsetof(struct ucsi_data, message_in),
178 sizeof(uc->ppm.data->message_in));
179}
180
181static int ucsi_ccg_ack_interrupt(struct ucsi_ccg *uc)
182{
183 int status;
184 unsigned char data;
185
186 status = ccg_read(uc, CCGX_RAB_INTR_REG, &data, sizeof(data));
187 if (status < 0)
188 return status;
189
190 return ccg_write(uc, CCGX_RAB_INTR_REG, &data, sizeof(data));
191}
192
193static int ucsi_ccg_sync(struct ucsi_ppm *ppm)
194{
195 struct ucsi_ccg *uc = container_of(ppm, struct ucsi_ccg, ppm);
196 int status;
197
198 status = ucsi_ccg_recv_data(uc);
199 if (status < 0)
200 return status;
201
202 /* ack interrupt to allow next command to run */
203 return ucsi_ccg_ack_interrupt(uc);
204}
205
206static int ucsi_ccg_cmd(struct ucsi_ppm *ppm, struct ucsi_control *ctrl)
207{
208 struct ucsi_ccg *uc = container_of(ppm, struct ucsi_ccg, ppm);
209
210 ppm->data->ctrl.raw_cmd = ctrl->raw_cmd;
211 return ucsi_ccg_send_data(uc);
212}
213
214static irqreturn_t ccg_irq_handler(int irq, void *data)
215{
216 struct ucsi_ccg *uc = data;
217
218 ucsi_notify(uc->ucsi);
219
220 return IRQ_HANDLED;
221}
222
223static int ucsi_ccg_probe(struct i2c_client *client,
224 const struct i2c_device_id *id)
225{
226 struct device *dev = &client->dev;
227 struct ucsi_ccg *uc;
228 int status;
229 u16 rab;
230
231 uc = devm_kzalloc(dev, sizeof(*uc), GFP_KERNEL);
232 if (!uc)
233 return -ENOMEM;
234
235 uc->ppm.data = devm_kzalloc(dev, sizeof(struct ucsi_data), GFP_KERNEL);
236 if (!uc->ppm.data)
237 return -ENOMEM;
238
239 uc->ppm.cmd = ucsi_ccg_cmd;
240 uc->ppm.sync = ucsi_ccg_sync;
241 uc->dev = dev;
242 uc->client = client;
243
244 /* reset ccg device and initialize ucsi */
245 status = ucsi_ccg_init(uc);
246 if (status < 0) {
247 dev_err(uc->dev, "ucsi_ccg_init failed - %d\n", status);
248 return status;
249 }
250
251 status = devm_request_threaded_irq(dev, client->irq, NULL,
252 ccg_irq_handler,
253 IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
254 dev_name(dev), uc);
255 if (status < 0) {
256 dev_err(uc->dev, "request_threaded_irq failed - %d\n", status);
257 return status;
258 }
259
260 uc->ucsi = ucsi_register_ppm(dev, &uc->ppm);
261 if (IS_ERR(uc->ucsi)) {
262 dev_err(uc->dev, "ucsi_register_ppm failed\n");
263 return PTR_ERR(uc->ucsi);
264 }
265
266 rab = CCGX_RAB_UCSI_DATA_BLOCK(offsetof(struct ucsi_data, version));
267 status = ccg_read(uc, rab, (u8 *)(uc->ppm.data) +
268 offsetof(struct ucsi_data, version),
269 sizeof(uc->ppm.data->version));
270 if (status < 0) {
271 ucsi_unregister_ppm(uc->ucsi);
272 return status;
273 }
274
275 i2c_set_clientdata(client, uc);
276 return 0;
277}
278
279static int ucsi_ccg_remove(struct i2c_client *client)
280{
281 struct ucsi_ccg *uc = i2c_get_clientdata(client);
282
283 ucsi_unregister_ppm(uc->ucsi);
284
285 return 0;
286}
287
288static const struct i2c_device_id ucsi_ccg_device_id[] = {
289 {"ccgx-ucsi", 0},
290 {}
291};
292MODULE_DEVICE_TABLE(i2c, ucsi_ccg_device_id);
293
294static struct i2c_driver ucsi_ccg_driver = {
295 .driver = {
296 .name = "ucsi_ccg",
297 },
298 .probe = ucsi_ccg_probe,
299 .remove = ucsi_ccg_remove,
300 .id_table = ucsi_ccg_device_id,
301};
302
303module_i2c_driver(ucsi_ccg_driver);
304
305MODULE_AUTHOR("Ajay Gupta <ajayg@nvidia.com>");
306MODULE_DESCRIPTION("UCSI driver for Cypress CCGx Type-C controller");
307MODULE_LICENSE("GPL v2");
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index f15f89df1f36..7ea6fb6a2e5d 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -914,7 +914,7 @@ int gnttab_dma_free_pages(struct gnttab_dma_alloc_args *args)
914 914
915 ret = xenmem_reservation_increase(args->nr_pages, args->frames); 915 ret = xenmem_reservation_increase(args->nr_pages, args->frames);
916 if (ret != args->nr_pages) { 916 if (ret != args->nr_pages) {
917 pr_debug("Failed to decrease reservation for DMA buffer\n"); 917 pr_debug("Failed to increase reservation for DMA buffer\n");
918 ret = -EFAULT; 918 ret = -EFAULT;
919 } else { 919 } else {
920 ret = 0; 920 ret = 0;
diff --git a/drivers/xen/privcmd-buf.c b/drivers/xen/privcmd-buf.c
index df1ed37c3269..de01a6d0059d 100644
--- a/drivers/xen/privcmd-buf.c
+++ b/drivers/xen/privcmd-buf.c
@@ -21,15 +21,9 @@
21 21
22MODULE_LICENSE("GPL"); 22MODULE_LICENSE("GPL");
23 23
24static unsigned int limit = 64;
25module_param(limit, uint, 0644);
26MODULE_PARM_DESC(limit, "Maximum number of pages that may be allocated by "
27 "the privcmd-buf device per open file");
28
29struct privcmd_buf_private { 24struct privcmd_buf_private {
30 struct mutex lock; 25 struct mutex lock;
31 struct list_head list; 26 struct list_head list;
32 unsigned int allocated;
33}; 27};
34 28
35struct privcmd_buf_vma_private { 29struct privcmd_buf_vma_private {
@@ -60,13 +54,10 @@ static void privcmd_buf_vmapriv_free(struct privcmd_buf_vma_private *vma_priv)
60{ 54{
61 unsigned int i; 55 unsigned int i;
62 56
63 vma_priv->file_priv->allocated -= vma_priv->n_pages;
64
65 list_del(&vma_priv->list); 57 list_del(&vma_priv->list);
66 58
67 for (i = 0; i < vma_priv->n_pages; i++) 59 for (i = 0; i < vma_priv->n_pages; i++)
68 if (vma_priv->pages[i]) 60 __free_page(vma_priv->pages[i]);
69 __free_page(vma_priv->pages[i]);
70 61
71 kfree(vma_priv); 62 kfree(vma_priv);
72} 63}
@@ -146,8 +137,7 @@ static int privcmd_buf_mmap(struct file *file, struct vm_area_struct *vma)
146 unsigned int i; 137 unsigned int i;
147 int ret = 0; 138 int ret = 0;
148 139
149 if (!(vma->vm_flags & VM_SHARED) || count > limit || 140 if (!(vma->vm_flags & VM_SHARED))
150 file_priv->allocated + count > limit)
151 return -EINVAL; 141 return -EINVAL;
152 142
153 vma_priv = kzalloc(sizeof(*vma_priv) + count * sizeof(void *), 143 vma_priv = kzalloc(sizeof(*vma_priv) + count * sizeof(void *),
@@ -155,19 +145,15 @@ static int privcmd_buf_mmap(struct file *file, struct vm_area_struct *vma)
155 if (!vma_priv) 145 if (!vma_priv)
156 return -ENOMEM; 146 return -ENOMEM;
157 147
158 vma_priv->n_pages = count; 148 for (i = 0; i < count; i++) {
159 count = 0;
160 for (i = 0; i < vma_priv->n_pages; i++) {
161 vma_priv->pages[i] = alloc_page(GFP_KERNEL | __GFP_ZERO); 149 vma_priv->pages[i] = alloc_page(GFP_KERNEL | __GFP_ZERO);
162 if (!vma_priv->pages[i]) 150 if (!vma_priv->pages[i])
163 break; 151 break;
164 count++; 152 vma_priv->n_pages++;
165 } 153 }
166 154
167 mutex_lock(&file_priv->lock); 155 mutex_lock(&file_priv->lock);
168 156
169 file_priv->allocated += count;
170
171 vma_priv->file_priv = file_priv; 157 vma_priv->file_priv = file_priv;
172 vma_priv->users = 1; 158 vma_priv->users = 1;
173 159