aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2013-09-01 19:31:40 -0400
committerDave Airlie <airlied@redhat.com>2013-09-01 19:31:40 -0400
commit9c725e5bcdae59d5383d4aec33a34c822582dda5 (patch)
tree3d55827f5f44f16cb0aada2713029f7490f557d4 /drivers
parentefa27f9cec09518c9b574e3ab4a0a41717237429 (diff)
parent679fe80fbe964ea7f9f71781c2ca65b630949da3 (diff)
Merge branch 'drm-next-3.12' of git://people.freedesktop.org/~agd5f/linux into drm-next
Alex writes: This is the radeon drm-next request. Big changes include: - support for dpm on CIK parts - support for ASPM on CIK parts - support for berlin GPUs - major ring handling cleanup - remove the old 3D blit code for bo moves in favor of CP DMA or sDMA - lots of bug fixes [airlied: fix up a bunch of conflicts from drm_order removal] * 'drm-next-3.12' of git://people.freedesktop.org/~agd5f/linux: (898 commits) drm/radeon/dpm: make sure dc performance level limits are valid (CI) drm/radeon/dpm: make sure dc performance level limits are valid (BTC-SI) (v2) drm/radeon: gcc fixes for extended dpm tables drm/radeon: gcc fixes for kb/kv dpm drm/radeon: gcc fixes for ci dpm drm/radeon: gcc fixes for si dpm drm/radeon: gcc fixes for ni dpm drm/radeon: gcc fixes for trinity dpm drm/radeon: gcc fixes for sumo dpm drm/radeonn: gcc fixes for rv7xx/eg/btc dpm drm/radeon: gcc fixes for rv6xx dpm drm/radeon: gcc fixes for radeon_atombios.c drm/radeon: enable UVD interrupts on CIK drm/radeon: fix init ordering for r600+ drm/radeon/dpm: only need to reprogram uvd if uvd pg is enabled drm/radeon: check the return value of uvd_v1_0_start in uvd_v1_0_init drm/radeon: split out radeon_uvd_resume from uvd_v4_2_resume radeon kms: fix uninitialised hotplug work usage in r100_irq_process() drm/radeon/audio: set up the sads on DCE3.2 asics drm/radeon: fix handling of variable sized arrays for router objects ... Conflicts: drivers/gpu/drm/i915/i915_dma.c drivers/gpu/drm/i915/i915_gem_dmabuf.c drivers/gpu/drm/i915/intel_pm.c drivers/gpu/drm/radeon/cik.c drivers/gpu/drm/radeon/ni.c drivers/gpu/drm/radeon/r600.c
Diffstat (limited to 'drivers')
-rw-r--r--drivers/accessibility/braille/braille_console.c9
-rw-r--r--drivers/acpi/acpi_processor.c3
-rw-r--r--drivers/acpi/battery.c2
-rw-r--r--drivers/acpi/glue.c133
-rw-r--r--drivers/acpi/proc.c8
-rw-r--r--drivers/acpi/video.c13
-rw-r--r--drivers/ata/libata-pmp.c12
-rw-r--r--drivers/ata/pata_imx.c1
-rw-r--r--drivers/ata/sata_fsl.c5
-rw-r--r--drivers/ata/sata_highbank.c4
-rw-r--r--drivers/base/regmap/regcache.c3
-rw-r--r--drivers/block/aoe/aoecmd.c17
-rw-r--r--drivers/bluetooth/ath3k.c46
-rw-r--r--drivers/bluetooth/btusb.c18
-rw-r--r--drivers/char/agp/parisc-agp.c6
-rw-r--r--drivers/char/virtio_console.c70
-rw-r--r--drivers/clk/samsung/clk-exynos4.c64
-rw-r--r--drivers/clk/zynq/clkc.c13
-rw-r--r--drivers/cpufreq/cpufreq.c19
-rw-r--r--drivers/cpufreq/cpufreq_conservative.c20
-rw-r--r--drivers/cpufreq/cpufreq_governor.c8
-rw-r--r--drivers/cpufreq/cpufreq_governor.h4
-rw-r--r--drivers/cpufreq/cpufreq_ondemand.c20
-rw-r--r--drivers/cpufreq/loongson2_cpufreq.c11
-rw-r--r--drivers/cpuidle/governors/menu.c106
-rw-r--r--drivers/dma/pch_dma.c1
-rw-r--r--drivers/dma/pl330.c93
-rw-r--r--drivers/dma/sh/shdma.c4
-rw-r--r--drivers/firewire/core-cdev.c3
-rw-r--r--drivers/firewire/ohci.c10
-rw-r--r--drivers/firmware/dmi_scan.c14
-rw-r--r--drivers/gpio/gpio-msm-v1.c1
-rw-r--r--drivers/gpio/gpio-omap.c84
-rw-r--r--drivers/gpu/drm/ast/ast_ttm.c1
-rw-r--r--drivers/gpu/drm/cirrus/cirrus_ttm.c1
-rw-r--r--drivers/gpu/drm/drm_edid.c55
-rw-r--r--drivers/gpu/drm/drm_irq.c5
-rw-r--r--drivers/gpu/drm/exynos/exynos_ddc.c1
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fimc.c1
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fimd.c3
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_g2d.c19
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_gsc.c1
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_hdmi.c1
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_ipp.c13
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_rotator.c1
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_vidi.c1
-rw-r--r--drivers/gpu/drm/exynos/exynos_hdmi.c1
-rw-r--r--drivers/gpu/drm/exynos/exynos_hdmiphy.c1
-rw-r--r--drivers/gpu/drm/exynos/exynos_mixer.c1
-rw-r--r--drivers/gpu/drm/gma500/psb_intel_sdvo.c3
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h1
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h16
-rw-r--r--drivers/gpu/drm/i915/intel_display.c90
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c18
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c18
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c12
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_mode.c46
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_ttm.c2
-rw-r--r--drivers/gpu/drm/nouveau/core/core/mm.c4
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c2
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c2
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c8
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/mpeg/nv31.c9
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/mpeg/nv40.c1
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/xtensa.c8
-rw-r--r--drivers/gpu/drm/nouveau/core/include/subdev/mc.h7
-rw-r--r--drivers/gpu/drm/nouveau/core/include/subdev/vm.h2
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/fb/priv.h2
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/fb/ramnv49.c12
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/fb/ramnv4e.c4
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/fb/ramnv50.c22
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/fb/ramnvc0.c14
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/gpio/nv50.c10
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/ltcg/nvc0.c34
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/mc/base.c6
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/mc/nv04.c3
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/mc/nv44.c3
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/mc/nv50.c5
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c3
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/mc/nvc0.c3
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/vm/base.c27
-rw-r--r--drivers/gpu/drm/nouveau/dispnv04/crtc.c58
-rw-r--r--drivers/gpu/drm/nouveau/dispnv04/disp.h1
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bo.c7
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_display.c3
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fbcon.c3
-rw-r--r--drivers/gpu/drm/nouveau/nv17_fence.c2
-rw-r--r--drivers/gpu/drm/nouveau/nv40_pm.c2
-rw-r--r--drivers/gpu/drm/nouveau/nv50_fence.c14
-rw-r--r--drivers/gpu/drm/radeon/Makefile24
-rw-r--r--drivers/gpu/drm/radeon/atom.c5
-rw-r--r--drivers/gpu/drm/radeon/atombios.h615
-rw-r--r--drivers/gpu/drm/radeon/atombios_crtc.c6
-rw-r--r--drivers/gpu/drm/radeon/atombios_dp.c6
-rw-r--r--drivers/gpu/drm/radeon/atombios_encoders.c11
-rw-r--r--drivers/gpu/drm/radeon/atombios_i2c.c16
-rw-r--r--drivers/gpu/drm/radeon/btc_dpm.c23
-rw-r--r--drivers/gpu/drm/radeon/cayman_blit_shaders.c54
-rw-r--r--drivers/gpu/drm/radeon/ci_dpm.c5239
-rw-r--r--drivers/gpu/drm/radeon/ci_dpm.h332
-rw-r--r--drivers/gpu/drm/radeon/ci_smc.c262
-rw-r--r--drivers/gpu/drm/radeon/cik.c3127
-rw-r--r--drivers/gpu/drm/radeon/cik_reg.h3
-rw-r--r--drivers/gpu/drm/radeon/cik_sdma.c785
-rw-r--r--drivers/gpu/drm/radeon/cikd.h594
-rw-r--r--drivers/gpu/drm/radeon/clearstate_cayman.h2
-rw-r--r--drivers/gpu/drm/radeon/clearstate_ci.h944
-rw-r--r--drivers/gpu/drm/radeon/clearstate_evergreen.h2
-rw-r--r--drivers/gpu/drm/radeon/cypress_dpm.c20
-rw-r--r--drivers/gpu/drm/radeon/dce6_afmt.c278
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c534
-rw-r--r--drivers/gpu/drm/radeon/evergreen_blit_kms.c729
-rw-r--r--drivers/gpu/drm/radeon/evergreen_blit_shaders.c54
-rw-r--r--drivers/gpu/drm/radeon/evergreen_dma.c190
-rw-r--r--drivers/gpu/drm/radeon/evergreen_hdmi.c98
-rw-r--r--drivers/gpu/drm/radeon/evergreend.h14
-rw-r--r--drivers/gpu/drm/radeon/kv_dpm.c2645
-rw-r--r--drivers/gpu/drm/radeon/kv_dpm.h199
-rw-r--r--drivers/gpu/drm/radeon/kv_smc.c207
-rw-r--r--drivers/gpu/drm/radeon/ni.c381
-rw-r--r--drivers/gpu/drm/radeon/ni_dma.c338
-rw-r--r--drivers/gpu/drm/radeon/ni_dpm.c38
-rw-r--r--drivers/gpu/drm/radeon/ppsmc.h57
-rw-r--r--drivers/gpu/drm/radeon/pptable.h682
-rw-r--r--drivers/gpu/drm/radeon/r100.c2
-rw-r--r--drivers/gpu/drm/radeon/r600.c796
-rw-r--r--drivers/gpu/drm/radeon/r600_audio.c60
-rw-r--r--drivers/gpu/drm/radeon/r600_blit.c31
-rw-r--r--drivers/gpu/drm/radeon/r600_blit_kms.c785
-rw-r--r--drivers/gpu/drm/radeon/r600_blit_shaders.h1
-rw-r--r--drivers/gpu/drm/radeon/r600_dma.c497
-rw-r--r--drivers/gpu/drm/radeon/r600_dpm.c300
-rw-r--r--drivers/gpu/drm/radeon/r600_dpm.h6
-rw-r--r--drivers/gpu/drm/radeon/r600_hdmi.c150
-rw-r--r--drivers/gpu/drm/radeon/r600d.h39
-rw-r--r--drivers/gpu/drm/radeon/radeon.h278
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.c1262
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h119
-rw-r--r--drivers/gpu/drm/radeon/radeon_atombios.c188
-rw-r--r--drivers/gpu/drm/radeon/radeon_blit_common.h44
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c13
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c25
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c64
-rw-r--r--drivers/gpu/drm/radeon/radeon_drv.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_fence.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_gart.c1
-rw-r--r--drivers/gpu/drm/radeon/radeon_irq_kms.c10
-rw-r--r--drivers/gpu/drm/radeon/radeon_kms.c3
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h3
-rw-r--r--drivers/gpu/drm/radeon/radeon_pm.c97
-rw-r--r--drivers/gpu/drm/radeon/radeon_ring.c13
-rw-r--r--drivers/gpu/drm/radeon/radeon_ucode.h17
-rw-r--r--drivers/gpu/drm/radeon/radeon_uvd.c159
-rw-r--r--drivers/gpu/drm/radeon/rs400.c9
-rw-r--r--drivers/gpu/drm/radeon/rv6xx_dpm.c27
-rw-r--r--drivers/gpu/drm/radeon/rv770.c217
-rw-r--r--drivers/gpu/drm/radeon/rv770_dma.c101
-rw-r--r--drivers/gpu/drm/radeon/rv770_dpm.c48
-rw-r--r--drivers/gpu/drm/radeon/rv770_dpm.h1
-rw-r--r--drivers/gpu/drm/radeon/rv770d.h16
-rw-r--r--drivers/gpu/drm/radeon/si.c843
-rw-r--r--drivers/gpu/drm/radeon/si_dma.c235
-rw-r--r--drivers/gpu/drm/radeon/si_dpm.c180
-rw-r--r--drivers/gpu/drm/radeon/sid.h71
-rw-r--r--drivers/gpu/drm/radeon/smu7.h170
-rw-r--r--drivers/gpu/drm/radeon/smu7_discrete.h486
-rw-r--r--drivers/gpu/drm/radeon/smu7_fusion.h300
-rw-r--r--drivers/gpu/drm/radeon/sumo_dpm.c22
-rw-r--r--drivers/gpu/drm/radeon/sumo_dpm.h3
-rw-r--r--drivers/gpu/drm/radeon/trinity_dpm.c7
-rw-r--r--drivers/gpu/drm/radeon/uvd_v1_0.c436
-rw-r--r--drivers/gpu/drm/radeon/uvd_v2_2.c165
-rw-r--r--drivers/gpu/drm/radeon/uvd_v3_1.c55
-rw-r--r--drivers/gpu/drm/radeon/uvd_v4_2.c68
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c58
-rw-r--r--drivers/hid/hid-logitech-dj.c45
-rw-r--r--drivers/hid/hid-logitech-dj.h1
-rw-r--r--drivers/hid/hid-sony.c3
-rw-r--r--drivers/hid/hidraw.c2
-rw-r--r--drivers/hwmon/adt7470.c2
-rw-r--r--drivers/hwmon/max6697.c4
-rw-r--r--drivers/i2c/busses/i2c-kempld.c4
-rw-r--r--drivers/i2c/busses/i2c-mxs.c2
-rw-r--r--drivers/iio/adc/ti_am335x_adc.c30
-rw-r--r--drivers/iio/industrialio-trigger.c34
-rw-r--r--drivers/iio/light/adjd_s311.c3
-rw-r--r--drivers/infiniband/core/cma.c29
-rw-r--r--drivers/infiniband/core/mad.c8
-rw-r--r--drivers/infiniband/hw/cxgb3/iwch_provider.c1
-rw-r--r--drivers/infiniband/hw/cxgb4/qp.c2
-rw-r--r--drivers/infiniband/hw/mlx4/mad.c10
-rw-r--r--drivers/infiniband/hw/mlx5/main.c11
-rw-r--r--drivers/infiniband/hw/mlx5/qp.c2
-rw-r--r--drivers/infiniband/hw/nes/nes_hw.c4
-rw-r--r--drivers/infiniband/hw/nes/nes_verbs.c3
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_ah.c1
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_verbs.c5
-rw-r--r--drivers/infiniband/hw/qib/qib_iba7322.c2
-rw-r--r--drivers/infiniband/hw/qib/qib_sdma.c2
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_ib.c76
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_main.c2
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_netlink.c9
-rw-r--r--drivers/macintosh/windfarm_rm31.c18
-rw-r--r--drivers/md/dm-cache-policy-mq.c16
-rw-r--r--drivers/media/i2c/ml86v7667.c4
-rw-r--r--drivers/media/platform/coda.c2
-rw-r--r--drivers/media/platform/s5p-g2d/g2d.c1
-rw-r--r--drivers/media/platform/s5p-mfc/s5p_mfc_dec.c79
-rw-r--r--drivers/media/platform/s5p-mfc/s5p_mfc_enc.c46
-rw-r--r--drivers/media/usb/em28xx/em28xx-i2c.c2
-rw-r--r--drivers/media/usb/hdpvr/hdpvr-core.c11
-rw-r--r--drivers/media/usb/usbtv/Kconfig2
-rw-r--r--drivers/media/usb/usbtv/usbtv.c51
-rw-r--r--drivers/net/arcnet/arcnet.c2
-rw-r--r--drivers/net/bonding/bond_main.c8
-rw-r--r--drivers/net/can/usb/esd_usb2.c10
-rw-r--r--drivers/net/can/usb/peak_usb/pcan_usb.c2
-rw-r--r--drivers/net/can/usb/usb_8dev.c1
-rw-r--r--drivers/net/ethernet/allwinner/Kconfig26
-rw-r--r--drivers/net/ethernet/arc/emac_main.c2
-rw-r--r--drivers/net/ethernet/atheros/atl1c/atl1c.h3
-rw-r--r--drivers/net/ethernet/atheros/atl1c/atl1c_main.c40
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x.h15
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c2
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c53
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h3
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h5
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c90
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c58
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c66
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c19
-rw-r--r--drivers/net/ethernet/chelsio/cxgb3/sge.c107
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c3
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.h6
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c2
-rw-r--r--drivers/net/ethernet/freescale/fec.h1
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c38
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c3
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe.h12
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c3
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c6
-rw-r--r--drivers/net/ethernet/marvell/mvneta.c31
-rw-r--r--drivers/net/ethernet/marvell/skge.c68
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_ethtool.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/fw.c11
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4_en.h10
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/cmd.c19
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/eq.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fw.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/health.c29
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/main.c69
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c52
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/uar.c1
-rw-r--r--drivers/net/ethernet/oki-semi/pch_gbe/Kconfig2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic.h15
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c135
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c98
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c16
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c85
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c62
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c27
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c101
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c29
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c4
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c46
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c6
-rw-r--r--drivers/net/ethernet/realtek/8139cp.c49
-rw-r--r--drivers/net/ethernet/realtek/r8169.c8
-rw-r--r--drivers/net/ethernet/sfc/filter.c6
-rw-r--r--drivers/net/ethernet/sis/sis900.c12
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/ring_mode.c13
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_main.c111
-rw-r--r--drivers/net/ethernet/ti/cpsw.c2
-rw-r--r--drivers/net/ethernet/ti/davinci_emac.c3
-rw-r--r--drivers/net/ethernet/via/via-velocity.c4
-rw-r--r--drivers/net/irda/via-ircc.c6
-rw-r--r--drivers/net/macvlan.c27
-rw-r--r--drivers/net/macvtap.c30
-rw-r--r--drivers/net/phy/mdio-sun4i.c14
-rw-r--r--drivers/net/phy/realtek.c4
-rw-r--r--drivers/net/tun.c6
-rw-r--r--drivers/net/usb/ax88179_178a.c9
-rw-r--r--drivers/net/usb/hso.c15
-rw-r--r--drivers/net/usb/r8152.c126
-rw-r--r--drivers/net/usb/r815x.c62
-rw-r--r--drivers/net/usb/smsc75xx.c12
-rw-r--r--drivers/net/veth.c1
-rw-r--r--drivers/net/vxlan.c59
-rw-r--r--drivers/net/wireless/ath/ath10k/Kconfig2
-rw-r--r--drivers/net/wireless/ath/ath5k/mac80211-ops.c2
-rw-r--r--drivers/net/wireless/ath/ath9k/ar5008_phy.c10
-rw-r--r--drivers/net/wireless/ath/ath9k/hif_usb.c13
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_init.c1
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c44
-rw-r--r--drivers/net/wireless/ath/wil6210/debugfs.c4
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c8
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c5
-rw-r--r--drivers/net/wireless/cw1200/sta.c7
-rw-r--r--drivers/net/wireless/cw1200/txrx.c2
-rw-r--r--drivers/net/wireless/hostap/hostap_ioctl.c4
-rw-r--r--drivers/net/wireless/iwlegacy/4965-mac.c16
-rw-r--r--drivers/net/wireless/iwlegacy/common.c1
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/mac80211.c5
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/main.c2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/d3.c15
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/debugfs.c6
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h1
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c65
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h1
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/scan.c19
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/sta.c34
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/time-event.c33
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/drv.c1
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/trans.c15
-rw-r--r--drivers/net/wireless/mwifiex/cfg80211.c4
-rw-r--r--drivers/net/wireless/mwifiex/cfp.c3
-rw-r--r--drivers/net/wireless/mwifiex/init.c10
-rw-r--r--drivers/net/wireless/mwifiex/join.c6
-rw-r--r--drivers/net/wireless/mwifiex/main.c13
-rw-r--r--drivers/net/wireless/mwifiex/main.h1
-rw-r--r--drivers/net/wireless/mwifiex/sdio.c95
-rw-r--r--drivers/net/wireless/mwifiex/sdio.h3
-rw-r--r--drivers/net/wireless/mwifiex/sta_ioctl.c4
-rw-r--r--drivers/net/wireless/rt2x00/Kconfig2
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00queue.c18
-rw-r--r--drivers/net/wireless/rtlwifi/Kconfig72
-rw-r--r--drivers/net/wireless/rtlwifi/Makefile10
-rw-r--r--drivers/net/wireless/rtlwifi/base.c19
-rw-r--r--drivers/net/wireless/rtlwifi/base.h2
-rw-r--r--drivers/net/wireless/rtlwifi/core.c1
-rw-r--r--drivers/net/wireless/rtlwifi/debug.c1
-rw-r--r--drivers/net/wireless/rtlwifi/efuse.c1
-rw-r--r--drivers/net/wireless/rtlwifi/pci.c22
-rw-r--r--drivers/net/wireless/rtlwifi/ps.c16
-rw-r--r--drivers/net/wireless/rtlwifi/ps.h1
-rw-r--r--drivers/net/wireless/rtlwifi/usb.c9
-rw-r--r--drivers/net/wireless/zd1201.c4
-rw-r--r--drivers/of/fdt.c2
-rw-r--r--drivers/parisc/iosapic.c38
-rw-r--r--drivers/pci/host/pci-mvebu.c27
-rw-r--r--drivers/pci/hotplug/Kconfig5
-rw-r--r--drivers/pci/hotplug/pciehp_pci.c9
-rw-r--r--drivers/pci/pci-acpi.c15
-rw-r--r--drivers/pci/pcie/Kconfig5
-rw-r--r--drivers/pci/setup-bus.c69
-rw-r--r--drivers/pinctrl/pinctrl-sunxi.c66
-rw-r--r--drivers/pinctrl/pinctrl-sunxi.h2
-rw-r--r--drivers/platform/olpc/olpc-ec.c2
-rw-r--r--drivers/platform/x86/hp-wmi.c16
-rw-r--r--drivers/platform/x86/sony-laptop.c8
-rw-r--r--drivers/rapidio/rio.c4
-rw-r--r--drivers/rtc/rtc-stmp3xxx.c35
-rw-r--r--drivers/rtc/rtc-twl.c3
-rw-r--r--drivers/s390/block/dasd.c6
-rw-r--r--drivers/s390/scsi/zfcp_erp.c29
-rw-r--r--drivers/s390/scsi/zfcp_qdio.c8
-rw-r--r--drivers/s390/scsi/zfcp_sysfs.c14
-rw-r--r--drivers/scsi/Kconfig1
-rw-r--r--drivers/scsi/fnic/fnic.h2
-rw-r--r--drivers/scsi/fnic/fnic_main.c22
-rw-r--r--drivers/scsi/megaraid/megaraid_sas_base.c20
-rw-r--r--drivers/scsi/scsi.c3
-rw-r--r--drivers/scsi/virtio_scsi.c2
-rw-r--r--drivers/spi/spi-davinci.c2
-rw-r--r--drivers/staging/comedi/drivers.c2
-rw-r--r--drivers/staging/zcache/zcache-main.c6
-rw-r--r--drivers/tty/serial/8250/8250_gsc.c3
-rw-r--r--drivers/tty/serial/arc_uart.c2
-rw-r--r--drivers/tty/serial/mxs-auart.c38
-rw-r--r--drivers/tty/tty_port.c5
-rw-r--r--drivers/usb/chipidea/Kconfig4
-rw-r--r--drivers/usb/chipidea/bits.h4
-rw-r--r--drivers/usb/class/usbtmc.c8
-rw-r--r--drivers/usb/core/hub.c5
-rw-r--r--drivers/usb/core/quirks.c6
-rw-r--r--drivers/usb/gadget/ether.c14
-rw-r--r--drivers/usb/gadget/f_phonet.c2
-rw-r--r--drivers/usb/gadget/multi.c10
-rw-r--r--drivers/usb/gadget/udc-core.c2
-rw-r--r--drivers/usb/host/ehci-sched.c13
-rw-r--r--drivers/usb/host/ohci-pci.c5
-rw-r--r--drivers/usb/host/xhci-mem.c1
-rw-r--r--drivers/usb/host/xhci.c1
-rw-r--r--drivers/usb/misc/adutux.c2
-rw-r--r--drivers/usb/musb/omap2430.c7
-rw-r--r--drivers/usb/musb/tusb6010.c7
-rw-r--r--drivers/usb/phy/phy-fsl-usb.h2
-rw-r--r--drivers/usb/phy/phy-fsm-usb.c2
-rw-r--r--drivers/usb/serial/Kconfig7
-rw-r--r--drivers/usb/serial/Makefile1
-rw-r--r--drivers/usb/serial/ftdi_sio.c31
-rw-r--r--drivers/usb/serial/ftdi_sio_ids.h34
-rw-r--r--drivers/usb/serial/keyspan.c2
-rw-r--r--drivers/usb/serial/mos7720.c21
-rw-r--r--drivers/usb/serial/mos7840.c150
-rw-r--r--drivers/usb/serial/suunto.c41
-rw-r--r--drivers/usb/serial/ti_usb_3410_5052.c9
-rw-r--r--drivers/usb/serial/usb_wwan.c20
-rw-r--r--drivers/usb/wusbcore/wa-xfer.c9
-rw-r--r--drivers/vfio/pci/vfio_pci.c23
-rw-r--r--drivers/vfio/vfio.c37
-rw-r--r--drivers/video/aty/atyfb_base.c4
-rw-r--r--drivers/video/mxsfb.c26
-rw-r--r--drivers/video/nuc900fb.c3
-rw-r--r--drivers/video/omap2/displays-new/connector-analog-tv.c18
-rw-r--r--drivers/video/sgivwfb.c2
-rw-r--r--drivers/video/sh7760fb.c2
-rw-r--r--drivers/video/vga16fb.c1
-rw-r--r--drivers/video/xilinxfb.c4
-rw-r--r--drivers/xen/Kconfig2
-rw-r--r--drivers/xen/Makefile5
-rw-r--r--drivers/xen/events.c13
-rw-r--r--drivers/xen/evtchn.c21
-rw-r--r--drivers/xen/xenbus/xenbus_probe_frontend.c19
420 files changed, 24182 insertions, 8577 deletions
diff --git a/drivers/accessibility/braille/braille_console.c b/drivers/accessibility/braille/braille_console.c
index d21167bfc865..dc34a5b8bcee 100644
--- a/drivers/accessibility/braille/braille_console.c
+++ b/drivers/accessibility/braille/braille_console.c
@@ -359,6 +359,9 @@ int braille_register_console(struct console *console, int index,
359 char *console_options, char *braille_options) 359 char *console_options, char *braille_options)
360{ 360{
361 int ret; 361 int ret;
362
363 if (!(console->flags & CON_BRL))
364 return 0;
362 if (!console_options) 365 if (!console_options)
363 /* Only support VisioBraille for now */ 366 /* Only support VisioBraille for now */
364 console_options = "57600o8"; 367 console_options = "57600o8";
@@ -374,15 +377,17 @@ int braille_register_console(struct console *console, int index,
374 braille_co = console; 377 braille_co = console;
375 register_keyboard_notifier(&keyboard_notifier_block); 378 register_keyboard_notifier(&keyboard_notifier_block);
376 register_vt_notifier(&vt_notifier_block); 379 register_vt_notifier(&vt_notifier_block);
377 return 0; 380 return 1;
378} 381}
379 382
380int braille_unregister_console(struct console *console) 383int braille_unregister_console(struct console *console)
381{ 384{
382 if (braille_co != console) 385 if (braille_co != console)
383 return -EINVAL; 386 return -EINVAL;
387 if (!(console->flags & CON_BRL))
388 return 0;
384 unregister_keyboard_notifier(&keyboard_notifier_block); 389 unregister_keyboard_notifier(&keyboard_notifier_block);
385 unregister_vt_notifier(&vt_notifier_block); 390 unregister_vt_notifier(&vt_notifier_block);
386 braille_co = NULL; 391 braille_co = NULL;
387 return 0; 392 return 1;
388} 393}
diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c
index fd6c51cc3acb..5a74a9c1e42c 100644
--- a/drivers/acpi/acpi_processor.c
+++ b/drivers/acpi/acpi_processor.c
@@ -451,7 +451,6 @@ static void acpi_processor_remove(struct acpi_device *device)
451 /* Clean up. */ 451 /* Clean up. */
452 per_cpu(processor_device_array, pr->id) = NULL; 452 per_cpu(processor_device_array, pr->id) = NULL;
453 per_cpu(processors, pr->id) = NULL; 453 per_cpu(processors, pr->id) = NULL;
454 try_offline_node(cpu_to_node(pr->id));
455 454
456 /* Remove the CPU. */ 455 /* Remove the CPU. */
457 get_online_cpus(); 456 get_online_cpus();
@@ -459,6 +458,8 @@ static void acpi_processor_remove(struct acpi_device *device)
459 acpi_unmap_lsapic(pr->id); 458 acpi_unmap_lsapic(pr->id);
460 put_online_cpus(); 459 put_online_cpus();
461 460
461 try_offline_node(cpu_to_node(pr->id));
462
462 out: 463 out:
463 free_cpumask_var(pr->throttling.shared_cpu_map); 464 free_cpumask_var(pr->throttling.shared_cpu_map);
464 kfree(pr); 465 kfree(pr);
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index 082b4dd252a8..d405fbad406a 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -117,6 +117,7 @@ struct acpi_battery {
117 struct acpi_device *device; 117 struct acpi_device *device;
118 struct notifier_block pm_nb; 118 struct notifier_block pm_nb;
119 unsigned long update_time; 119 unsigned long update_time;
120 int revision;
120 int rate_now; 121 int rate_now;
121 int capacity_now; 122 int capacity_now;
122 int voltage_now; 123 int voltage_now;
@@ -359,6 +360,7 @@ static struct acpi_offsets info_offsets[] = {
359}; 360};
360 361
361static struct acpi_offsets extended_info_offsets[] = { 362static struct acpi_offsets extended_info_offsets[] = {
363 {offsetof(struct acpi_battery, revision), 0},
362 {offsetof(struct acpi_battery, power_unit), 0}, 364 {offsetof(struct acpi_battery, power_unit), 0},
363 {offsetof(struct acpi_battery, design_capacity), 0}, 365 {offsetof(struct acpi_battery, design_capacity), 0},
364 {offsetof(struct acpi_battery, full_charge_capacity), 0}, 366 {offsetof(struct acpi_battery, full_charge_capacity), 0},
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c
index f68095756fb7..408f6b2a5fa8 100644
--- a/drivers/acpi/glue.c
+++ b/drivers/acpi/glue.c
@@ -31,6 +31,7 @@ static LIST_HEAD(bus_type_list);
31static DECLARE_RWSEM(bus_type_sem); 31static DECLARE_RWSEM(bus_type_sem);
32 32
33#define PHYSICAL_NODE_STRING "physical_node" 33#define PHYSICAL_NODE_STRING "physical_node"
34#define PHYSICAL_NODE_NAME_SIZE (sizeof(PHYSICAL_NODE_STRING) + 10)
34 35
35int register_acpi_bus_type(struct acpi_bus_type *type) 36int register_acpi_bus_type(struct acpi_bus_type *type)
36{ 37{
@@ -78,41 +79,108 @@ static struct acpi_bus_type *acpi_get_bus_type(struct device *dev)
78 return ret; 79 return ret;
79} 80}
80 81
81static acpi_status do_acpi_find_child(acpi_handle handle, u32 lvl_not_used, 82static acpi_status acpi_dev_present(acpi_handle handle, u32 lvl_not_used,
82 void *addr_p, void **ret_p) 83 void *not_used, void **ret_p)
83{ 84{
84 unsigned long long addr, sta; 85 struct acpi_device *adev = NULL;
85 acpi_status status;
86 86
87 status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &addr); 87 acpi_bus_get_device(handle, &adev);
88 if (ACPI_SUCCESS(status) && addr == *((u64 *)addr_p)) { 88 if (adev) {
89 *ret_p = handle; 89 *ret_p = handle;
90 status = acpi_bus_get_status_handle(handle, &sta); 90 return AE_CTRL_TERMINATE;
91 if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_ENABLED))
92 return AE_CTRL_TERMINATE;
93 } 91 }
94 return AE_OK; 92 return AE_OK;
95} 93}
96 94
97acpi_handle acpi_get_child(acpi_handle parent, u64 address) 95static bool acpi_extra_checks_passed(acpi_handle handle, bool is_bridge)
98{ 96{
99 void *ret = NULL; 97 unsigned long long sta;
98 acpi_status status;
99
100 status = acpi_bus_get_status_handle(handle, &sta);
101 if (ACPI_FAILURE(status) || !(sta & ACPI_STA_DEVICE_ENABLED))
102 return false;
103
104 if (is_bridge) {
105 void *test = NULL;
106
107 /* Check if this object has at least one child device. */
108 acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
109 acpi_dev_present, NULL, NULL, &test);
110 return !!test;
111 }
112 return true;
113}
114
115struct find_child_context {
116 u64 addr;
117 bool is_bridge;
118 acpi_handle ret;
119 bool ret_checked;
120};
121
122static acpi_status do_find_child(acpi_handle handle, u32 lvl_not_used,
123 void *data, void **not_used)
124{
125 struct find_child_context *context = data;
126 unsigned long long addr;
127 acpi_status status;
100 128
101 if (!parent) 129 status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &addr);
102 return NULL; 130 if (ACPI_FAILURE(status) || addr != context->addr)
131 return AE_OK;
103 132
104 acpi_walk_namespace(ACPI_TYPE_DEVICE, parent, 1, NULL, 133 if (!context->ret) {
105 do_acpi_find_child, &address, &ret); 134 /* This is the first matching object. Save its handle. */
106 return (acpi_handle)ret; 135 context->ret = handle;
136 return AE_OK;
137 }
138 /*
139 * There is more than one matching object with the same _ADR value.
140 * That really is unexpected, so we are kind of beyond the scope of the
141 * spec here. We have to choose which one to return, though.
142 *
143 * First, check if the previously found object is good enough and return
144 * its handle if so. Second, check the same for the object that we've
145 * just found.
146 */
147 if (!context->ret_checked) {
148 if (acpi_extra_checks_passed(context->ret, context->is_bridge))
149 return AE_CTRL_TERMINATE;
150 else
151 context->ret_checked = true;
152 }
153 if (acpi_extra_checks_passed(handle, context->is_bridge)) {
154 context->ret = handle;
155 return AE_CTRL_TERMINATE;
156 }
157 return AE_OK;
107} 158}
108EXPORT_SYMBOL(acpi_get_child); 159
160acpi_handle acpi_find_child(acpi_handle parent, u64 addr, bool is_bridge)
161{
162 if (parent) {
163 struct find_child_context context = {
164 .addr = addr,
165 .is_bridge = is_bridge,
166 };
167
168 acpi_walk_namespace(ACPI_TYPE_DEVICE, parent, 1, do_find_child,
169 NULL, &context, NULL);
170 return context.ret;
171 }
172 return NULL;
173}
174EXPORT_SYMBOL_GPL(acpi_find_child);
109 175
110int acpi_bind_one(struct device *dev, acpi_handle handle) 176int acpi_bind_one(struct device *dev, acpi_handle handle)
111{ 177{
112 struct acpi_device *acpi_dev; 178 struct acpi_device *acpi_dev;
113 acpi_status status; 179 acpi_status status;
114 struct acpi_device_physical_node *physical_node, *pn; 180 struct acpi_device_physical_node *physical_node, *pn;
115 char physical_node_name[sizeof(PHYSICAL_NODE_STRING) + 2]; 181 char physical_node_name[PHYSICAL_NODE_NAME_SIZE];
182 struct list_head *physnode_list;
183 unsigned int node_id;
116 int retval = -EINVAL; 184 int retval = -EINVAL;
117 185
118 if (ACPI_HANDLE(dev)) { 186 if (ACPI_HANDLE(dev)) {
@@ -139,25 +207,27 @@ int acpi_bind_one(struct device *dev, acpi_handle handle)
139 207
140 mutex_lock(&acpi_dev->physical_node_lock); 208 mutex_lock(&acpi_dev->physical_node_lock);
141 209
142 /* Sanity check. */ 210 /*
143 list_for_each_entry(pn, &acpi_dev->physical_node_list, node) 211 * Keep the list sorted by node_id so that the IDs of removed nodes can
212 * be recycled easily.
213 */
214 physnode_list = &acpi_dev->physical_node_list;
215 node_id = 0;
216 list_for_each_entry(pn, &acpi_dev->physical_node_list, node) {
217 /* Sanity check. */
144 if (pn->dev == dev) { 218 if (pn->dev == dev) {
145 dev_warn(dev, "Already associated with ACPI node\n"); 219 dev_warn(dev, "Already associated with ACPI node\n");
146 goto err_free; 220 goto err_free;
147 } 221 }
148 222 if (pn->node_id == node_id) {
149 /* allocate physical node id according to physical_node_id_bitmap */ 223 physnode_list = &pn->node;
150 physical_node->node_id = 224 node_id++;
151 find_first_zero_bit(acpi_dev->physical_node_id_bitmap, 225 }
152 ACPI_MAX_PHYSICAL_NODE);
153 if (physical_node->node_id >= ACPI_MAX_PHYSICAL_NODE) {
154 retval = -ENOSPC;
155 goto err_free;
156 } 226 }
157 227
158 set_bit(physical_node->node_id, acpi_dev->physical_node_id_bitmap); 228 physical_node->node_id = node_id;
159 physical_node->dev = dev; 229 physical_node->dev = dev;
160 list_add_tail(&physical_node->node, &acpi_dev->physical_node_list); 230 list_add(&physical_node->node, physnode_list);
161 acpi_dev->physical_node_count++; 231 acpi_dev->physical_node_count++;
162 232
163 mutex_unlock(&acpi_dev->physical_node_lock); 233 mutex_unlock(&acpi_dev->physical_node_lock);
@@ -208,7 +278,7 @@ int acpi_unbind_one(struct device *dev)
208 278
209 mutex_lock(&acpi_dev->physical_node_lock); 279 mutex_lock(&acpi_dev->physical_node_lock);
210 list_for_each_safe(node, next, &acpi_dev->physical_node_list) { 280 list_for_each_safe(node, next, &acpi_dev->physical_node_list) {
211 char physical_node_name[sizeof(PHYSICAL_NODE_STRING) + 2]; 281 char physical_node_name[PHYSICAL_NODE_NAME_SIZE];
212 282
213 entry = list_entry(node, struct acpi_device_physical_node, 283 entry = list_entry(node, struct acpi_device_physical_node,
214 node); 284 node);
@@ -216,7 +286,6 @@ int acpi_unbind_one(struct device *dev)
216 continue; 286 continue;
217 287
218 list_del(node); 288 list_del(node);
219 clear_bit(entry->node_id, acpi_dev->physical_node_id_bitmap);
220 289
221 acpi_dev->physical_node_count--; 290 acpi_dev->physical_node_count--;
222 291
diff --git a/drivers/acpi/proc.c b/drivers/acpi/proc.c
index aa1227a7e3f2..04a13784dd20 100644
--- a/drivers/acpi/proc.c
+++ b/drivers/acpi/proc.c
@@ -311,6 +311,8 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
311 dev->pnp.bus_id, 311 dev->pnp.bus_id,
312 (u32) dev->wakeup.sleep_state); 312 (u32) dev->wakeup.sleep_state);
313 313
314 mutex_lock(&dev->physical_node_lock);
315
314 if (!dev->physical_node_count) { 316 if (!dev->physical_node_count) {
315 seq_printf(seq, "%c%-8s\n", 317 seq_printf(seq, "%c%-8s\n",
316 dev->wakeup.flags.run_wake ? '*' : ' ', 318 dev->wakeup.flags.run_wake ? '*' : ' ',
@@ -338,6 +340,8 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
338 put_device(ldev); 340 put_device(ldev);
339 } 341 }
340 } 342 }
343
344 mutex_unlock(&dev->physical_node_lock);
341 } 345 }
342 mutex_unlock(&acpi_device_lock); 346 mutex_unlock(&acpi_device_lock);
343 return 0; 347 return 0;
@@ -347,12 +351,16 @@ static void physical_device_enable_wakeup(struct acpi_device *adev)
347{ 351{
348 struct acpi_device_physical_node *entry; 352 struct acpi_device_physical_node *entry;
349 353
354 mutex_lock(&adev->physical_node_lock);
355
350 list_for_each_entry(entry, 356 list_for_each_entry(entry,
351 &adev->physical_node_list, node) 357 &adev->physical_node_list, node)
352 if (entry->dev && device_can_wakeup(entry->dev)) { 358 if (entry->dev && device_can_wakeup(entry->dev)) {
353 bool enable = !device_may_wakeup(entry->dev); 359 bool enable = !device_may_wakeup(entry->dev);
354 device_set_wakeup_enable(entry->dev, enable); 360 device_set_wakeup_enable(entry->dev, enable);
355 } 361 }
362
363 mutex_unlock(&adev->physical_node_lock);
356} 364}
357 365
358static ssize_t 366static ssize_t
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
index 0ec434d2586d..3270d3c8ba4e 100644
--- a/drivers/acpi/video.c
+++ b/drivers/acpi/video.c
@@ -689,7 +689,7 @@ static int acpi_video_bqc_quirk(struct acpi_video_device *device,
689 * Some systems always report current brightness level as maximum 689 * Some systems always report current brightness level as maximum
690 * through _BQC, we need to test another value for them. 690 * through _BQC, we need to test another value for them.
691 */ 691 */
692 test_level = current_level == max_level ? br->levels[2] : max_level; 692 test_level = current_level == max_level ? br->levels[3] : max_level;
693 693
694 result = acpi_video_device_lcd_set_level(device, test_level); 694 result = acpi_video_device_lcd_set_level(device, test_level);
695 if (result) 695 if (result)
@@ -908,9 +908,6 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
908 device->cap._DDC = 1; 908 device->cap._DDC = 1;
909 } 909 }
910 910
911 if (acpi_video_init_brightness(device))
912 return;
913
914 if (acpi_video_backlight_support()) { 911 if (acpi_video_backlight_support()) {
915 struct backlight_properties props; 912 struct backlight_properties props;
916 struct pci_dev *pdev; 913 struct pci_dev *pdev;
@@ -920,6 +917,9 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
920 static int count = 0; 917 static int count = 0;
921 char *name; 918 char *name;
922 919
920 result = acpi_video_init_brightness(device);
921 if (result)
922 return;
923 name = kasprintf(GFP_KERNEL, "acpi_video%d", count); 923 name = kasprintf(GFP_KERNEL, "acpi_video%d", count);
924 if (!name) 924 if (!name)
925 return; 925 return;
@@ -979,11 +979,6 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
979 if (result) 979 if (result)
980 printk(KERN_ERR PREFIX "Create sysfs link\n"); 980 printk(KERN_ERR PREFIX "Create sysfs link\n");
981 981
982 } else {
983 /* Remove the brightness object. */
984 kfree(device->brightness->levels);
985 kfree(device->brightness);
986 device->brightness = NULL;
987 } 982 }
988} 983}
989 984
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
index 1c41722bb7e2..20fd337a5731 100644
--- a/drivers/ata/libata-pmp.c
+++ b/drivers/ata/libata-pmp.c
@@ -289,24 +289,24 @@ static int sata_pmp_configure(struct ata_device *dev, int print_info)
289 289
290 /* Disable sending Early R_OK. 290 /* Disable sending Early R_OK.
291 * With "cached read" HDD testing and multiple ports busy on a SATA 291 * With "cached read" HDD testing and multiple ports busy on a SATA
292 * host controller, 3726 PMP will very rarely drop a deferred 292 * host controller, 3x26 PMP will very rarely drop a deferred
293 * R_OK that was intended for the host. Symptom will be all 293 * R_OK that was intended for the host. Symptom will be all
294 * 5 drives under test will timeout, get reset, and recover. 294 * 5 drives under test will timeout, get reset, and recover.
295 */ 295 */
296 if (vendor == 0x1095 && devid == 0x3726) { 296 if (vendor == 0x1095 && (devid == 0x3726 || devid == 0x3826)) {
297 u32 reg; 297 u32 reg;
298 298
299 err_mask = sata_pmp_read(&ap->link, PMP_GSCR_SII_POL, &reg); 299 err_mask = sata_pmp_read(&ap->link, PMP_GSCR_SII_POL, &reg);
300 if (err_mask) { 300 if (err_mask) {
301 rc = -EIO; 301 rc = -EIO;
302 reason = "failed to read Sil3726 Private Register"; 302 reason = "failed to read Sil3x26 Private Register";
303 goto fail; 303 goto fail;
304 } 304 }
305 reg &= ~0x1; 305 reg &= ~0x1;
306 err_mask = sata_pmp_write(&ap->link, PMP_GSCR_SII_POL, reg); 306 err_mask = sata_pmp_write(&ap->link, PMP_GSCR_SII_POL, reg);
307 if (err_mask) { 307 if (err_mask) {
308 rc = -EIO; 308 rc = -EIO;
309 reason = "failed to write Sil3726 Private Register"; 309 reason = "failed to write Sil3x26 Private Register";
310 goto fail; 310 goto fail;
311 } 311 }
312 } 312 }
@@ -383,8 +383,8 @@ static void sata_pmp_quirks(struct ata_port *ap)
383 u16 devid = sata_pmp_gscr_devid(gscr); 383 u16 devid = sata_pmp_gscr_devid(gscr);
384 struct ata_link *link; 384 struct ata_link *link;
385 385
386 if (vendor == 0x1095 && devid == 0x3726) { 386 if (vendor == 0x1095 && (devid == 0x3726 || devid == 0x3826)) {
387 /* sil3726 quirks */ 387 /* sil3x26 quirks */
388 ata_for_each_link(link, ap, EDGE) { 388 ata_for_each_link(link, ap, EDGE) {
389 /* link reports offline after LPM */ 389 /* link reports offline after LPM */
390 link->flags |= ATA_LFLAG_NO_LPM; 390 link->flags |= ATA_LFLAG_NO_LPM;
diff --git a/drivers/ata/pata_imx.c b/drivers/ata/pata_imx.c
index 4ec7c04b3f82..26386f0b89a8 100644
--- a/drivers/ata/pata_imx.c
+++ b/drivers/ata/pata_imx.c
@@ -237,6 +237,7 @@ static const struct of_device_id imx_pata_dt_ids[] = {
237 /* sentinel */ 237 /* sentinel */
238 } 238 }
239}; 239};
240MODULE_DEVICE_TABLE(of, imx_pata_dt_ids);
240 241
241static struct platform_driver pata_imx_driver = { 242static struct platform_driver pata_imx_driver = {
242 .probe = pata_imx_probe, 243 .probe = pata_imx_probe,
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c
index 19720a0a4a65..851bd3f43ac6 100644
--- a/drivers/ata/sata_fsl.c
+++ b/drivers/ata/sata_fsl.c
@@ -293,6 +293,7 @@ static void fsl_sata_set_irq_coalescing(struct ata_host *host,
293{ 293{
294 struct sata_fsl_host_priv *host_priv = host->private_data; 294 struct sata_fsl_host_priv *host_priv = host->private_data;
295 void __iomem *hcr_base = host_priv->hcr_base; 295 void __iomem *hcr_base = host_priv->hcr_base;
296 unsigned long flags;
296 297
297 if (count > ICC_MAX_INT_COUNT_THRESHOLD) 298 if (count > ICC_MAX_INT_COUNT_THRESHOLD)
298 count = ICC_MAX_INT_COUNT_THRESHOLD; 299 count = ICC_MAX_INT_COUNT_THRESHOLD;
@@ -305,12 +306,12 @@ static void fsl_sata_set_irq_coalescing(struct ata_host *host,
305 (count > ICC_MIN_INT_COUNT_THRESHOLD)) 306 (count > ICC_MIN_INT_COUNT_THRESHOLD))
306 ticks = ICC_SAFE_INT_TICKS; 307 ticks = ICC_SAFE_INT_TICKS;
307 308
308 spin_lock(&host->lock); 309 spin_lock_irqsave(&host->lock, flags);
309 iowrite32((count << 24 | ticks), hcr_base + ICC); 310 iowrite32((count << 24 | ticks), hcr_base + ICC);
310 311
311 intr_coalescing_count = count; 312 intr_coalescing_count = count;
312 intr_coalescing_ticks = ticks; 313 intr_coalescing_ticks = ticks;
313 spin_unlock(&host->lock); 314 spin_unlock_irqrestore(&host->lock, flags);
314 315
315 DPRINTK("interrupt coalescing, count = 0x%x, ticks = %x\n", 316 DPRINTK("interrupt coalescing, count = 0x%x, ticks = %x\n",
316 intr_coalescing_count, intr_coalescing_ticks); 317 intr_coalescing_count, intr_coalescing_ticks);
diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c
index d047d92a456f..e9a4f46d962e 100644
--- a/drivers/ata/sata_highbank.c
+++ b/drivers/ata/sata_highbank.c
@@ -86,11 +86,11 @@ struct ecx_plat_data {
86 86
87#define SGPIO_SIGNALS 3 87#define SGPIO_SIGNALS 3
88#define ECX_ACTIVITY_BITS 0x300000 88#define ECX_ACTIVITY_BITS 0x300000
89#define ECX_ACTIVITY_SHIFT 2 89#define ECX_ACTIVITY_SHIFT 0
90#define ECX_LOCATE_BITS 0x80000 90#define ECX_LOCATE_BITS 0x80000
91#define ECX_LOCATE_SHIFT 1 91#define ECX_LOCATE_SHIFT 1
92#define ECX_FAULT_BITS 0x400000 92#define ECX_FAULT_BITS 0x400000
93#define ECX_FAULT_SHIFT 0 93#define ECX_FAULT_SHIFT 2
94static inline int sgpio_bit_shift(struct ecx_plat_data *pdata, u32 port, 94static inline int sgpio_bit_shift(struct ecx_plat_data *pdata, u32 port,
95 u32 shift) 95 u32 shift)
96{ 96{
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c
index e69102696533..3455f833e473 100644
--- a/drivers/base/regmap/regcache.c
+++ b/drivers/base/regmap/regcache.c
@@ -719,7 +719,8 @@ static int regcache_sync_block_raw(struct regmap *map, void *block,
719 } 719 }
720 } 720 }
721 721
722 return regcache_sync_block_raw_flush(map, &data, base, regtmp); 722 return regcache_sync_block_raw_flush(map, &data, base, regtmp +
723 map->reg_stride);
723} 724}
724 725
725int regcache_sync_block(struct regmap *map, void *block, 726int regcache_sync_block(struct regmap *map, void *block,
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c
index 99cb944a002d..4d45dba7fb8f 100644
--- a/drivers/block/aoe/aoecmd.c
+++ b/drivers/block/aoe/aoecmd.c
@@ -906,16 +906,10 @@ bio_pageinc(struct bio *bio)
906 int i; 906 int i;
907 907
908 bio_for_each_segment(bv, bio, i) { 908 bio_for_each_segment(bv, bio, i) {
909 page = bv->bv_page;
910 /* Non-zero page count for non-head members of 909 /* Non-zero page count for non-head members of
911 * compound pages is no longer allowed by the kernel, 910 * compound pages is no longer allowed by the kernel.
912 * but this has never been seen here.
913 */ 911 */
914 if (unlikely(PageCompound(page))) 912 page = compound_trans_head(bv->bv_page);
915 if (compound_trans_head(page) != page) {
916 pr_crit("page tail used for block I/O\n");
917 BUG();
918 }
919 atomic_inc(&page->_count); 913 atomic_inc(&page->_count);
920 } 914 }
921} 915}
@@ -924,10 +918,13 @@ static void
924bio_pagedec(struct bio *bio) 918bio_pagedec(struct bio *bio)
925{ 919{
926 struct bio_vec *bv; 920 struct bio_vec *bv;
921 struct page *page;
927 int i; 922 int i;
928 923
929 bio_for_each_segment(bv, bio, i) 924 bio_for_each_segment(bv, bio, i) {
930 atomic_dec(&bv->bv_page->_count); 925 page = compound_trans_head(bv->bv_page);
926 atomic_dec(&page->_count);
927 }
931} 928}
932 929
933static void 930static void
diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c
index 11f467c00d0a..a12b923bbaca 100644
--- a/drivers/bluetooth/ath3k.c
+++ b/drivers/bluetooth/ath3k.c
@@ -91,6 +91,10 @@ static struct usb_device_id ath3k_table[] = {
91 { USB_DEVICE(0x0489, 0xe04e) }, 91 { USB_DEVICE(0x0489, 0xe04e) },
92 { USB_DEVICE(0x0489, 0xe056) }, 92 { USB_DEVICE(0x0489, 0xe056) },
93 { USB_DEVICE(0x0489, 0xe04d) }, 93 { USB_DEVICE(0x0489, 0xe04d) },
94 { USB_DEVICE(0x04c5, 0x1330) },
95 { USB_DEVICE(0x13d3, 0x3402) },
96 { USB_DEVICE(0x0cf3, 0x3121) },
97 { USB_DEVICE(0x0cf3, 0xe003) },
94 98
95 /* Atheros AR5BBU12 with sflash firmware */ 99 /* Atheros AR5BBU12 with sflash firmware */
96 { USB_DEVICE(0x0489, 0xE02C) }, 100 { USB_DEVICE(0x0489, 0xE02C) },
@@ -128,6 +132,10 @@ static struct usb_device_id ath3k_blist_tbl[] = {
128 { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 }, 132 { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
129 { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, 133 { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
130 { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 }, 134 { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
135 { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
136 { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
137 { USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 },
138 { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 },
131 139
132 /* Atheros AR5BBU22 with sflash firmware */ 140 /* Atheros AR5BBU22 with sflash firmware */
133 { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 }, 141 { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
@@ -193,24 +201,44 @@ error:
193 201
194static int ath3k_get_state(struct usb_device *udev, unsigned char *state) 202static int ath3k_get_state(struct usb_device *udev, unsigned char *state)
195{ 203{
196 int pipe = 0; 204 int ret, pipe = 0;
205 char *buf;
206
207 buf = kmalloc(sizeof(*buf), GFP_KERNEL);
208 if (!buf)
209 return -ENOMEM;
197 210
198 pipe = usb_rcvctrlpipe(udev, 0); 211 pipe = usb_rcvctrlpipe(udev, 0);
199 return usb_control_msg(udev, pipe, ATH3K_GETSTATE, 212 ret = usb_control_msg(udev, pipe, ATH3K_GETSTATE,
200 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, 213 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
201 state, 0x01, USB_CTRL_SET_TIMEOUT); 214 buf, sizeof(*buf), USB_CTRL_SET_TIMEOUT);
215
216 *state = *buf;
217 kfree(buf);
218
219 return ret;
202} 220}
203 221
204static int ath3k_get_version(struct usb_device *udev, 222static int ath3k_get_version(struct usb_device *udev,
205 struct ath3k_version *version) 223 struct ath3k_version *version)
206{ 224{
207 int pipe = 0; 225 int ret, pipe = 0;
226 struct ath3k_version *buf;
227 const int size = sizeof(*buf);
228
229 buf = kmalloc(size, GFP_KERNEL);
230 if (!buf)
231 return -ENOMEM;
208 232
209 pipe = usb_rcvctrlpipe(udev, 0); 233 pipe = usb_rcvctrlpipe(udev, 0);
210 return usb_control_msg(udev, pipe, ATH3K_GETVERSION, 234 ret = usb_control_msg(udev, pipe, ATH3K_GETVERSION,
211 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, version, 235 USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
212 sizeof(struct ath3k_version), 236 buf, size, USB_CTRL_SET_TIMEOUT);
213 USB_CTRL_SET_TIMEOUT); 237
238 memcpy(version, buf, size);
239 kfree(buf);
240
241 return ret;
214} 242}
215 243
216static int ath3k_load_fwfile(struct usb_device *udev, 244static int ath3k_load_fwfile(struct usb_device *udev,
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index de4cf4daa2f4..8e16f0af6358 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -154,6 +154,10 @@ static struct usb_device_id blacklist_table[] = {
154 { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 }, 154 { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
155 { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 }, 155 { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
156 { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 }, 156 { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
157 { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
158 { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
159 { USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 },
160 { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 },
157 161
158 /* Atheros AR5BBU12 with sflash firmware */ 162 /* Atheros AR5BBU12 with sflash firmware */
159 { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, 163 { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
@@ -1095,7 +1099,7 @@ static int btusb_setup_intel_patching(struct hci_dev *hdev,
1095 if (IS_ERR(skb)) { 1099 if (IS_ERR(skb)) {
1096 BT_ERR("%s sending Intel patch command (0x%4.4x) failed (%ld)", 1100 BT_ERR("%s sending Intel patch command (0x%4.4x) failed (%ld)",
1097 hdev->name, cmd->opcode, PTR_ERR(skb)); 1101 hdev->name, cmd->opcode, PTR_ERR(skb));
1098 return -PTR_ERR(skb); 1102 return PTR_ERR(skb);
1099 } 1103 }
1100 1104
1101 /* It ensures that the returned event matches the event data read from 1105 /* It ensures that the returned event matches the event data read from
@@ -1147,7 +1151,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
1147 if (IS_ERR(skb)) { 1151 if (IS_ERR(skb)) {
1148 BT_ERR("%s sending initial HCI reset command failed (%ld)", 1152 BT_ERR("%s sending initial HCI reset command failed (%ld)",
1149 hdev->name, PTR_ERR(skb)); 1153 hdev->name, PTR_ERR(skb));
1150 return -PTR_ERR(skb); 1154 return PTR_ERR(skb);
1151 } 1155 }
1152 kfree_skb(skb); 1156 kfree_skb(skb);
1153 1157
@@ -1161,7 +1165,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
1161 if (IS_ERR(skb)) { 1165 if (IS_ERR(skb)) {
1162 BT_ERR("%s reading Intel fw version command failed (%ld)", 1166 BT_ERR("%s reading Intel fw version command failed (%ld)",
1163 hdev->name, PTR_ERR(skb)); 1167 hdev->name, PTR_ERR(skb));
1164 return -PTR_ERR(skb); 1168 return PTR_ERR(skb);
1165 } 1169 }
1166 1170
1167 if (skb->len != sizeof(*ver)) { 1171 if (skb->len != sizeof(*ver)) {
@@ -1219,7 +1223,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
1219 BT_ERR("%s entering Intel manufacturer mode failed (%ld)", 1223 BT_ERR("%s entering Intel manufacturer mode failed (%ld)",
1220 hdev->name, PTR_ERR(skb)); 1224 hdev->name, PTR_ERR(skb));
1221 release_firmware(fw); 1225 release_firmware(fw);
1222 return -PTR_ERR(skb); 1226 return PTR_ERR(skb);
1223 } 1227 }
1224 1228
1225 if (skb->data[0]) { 1229 if (skb->data[0]) {
@@ -1276,7 +1280,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
1276 if (IS_ERR(skb)) { 1280 if (IS_ERR(skb)) {
1277 BT_ERR("%s exiting Intel manufacturer mode failed (%ld)", 1281 BT_ERR("%s exiting Intel manufacturer mode failed (%ld)",
1278 hdev->name, PTR_ERR(skb)); 1282 hdev->name, PTR_ERR(skb));
1279 return -PTR_ERR(skb); 1283 return PTR_ERR(skb);
1280 } 1284 }
1281 kfree_skb(skb); 1285 kfree_skb(skb);
1282 1286
@@ -1292,7 +1296,7 @@ exit_mfg_disable:
1292 if (IS_ERR(skb)) { 1296 if (IS_ERR(skb)) {
1293 BT_ERR("%s exiting Intel manufacturer mode failed (%ld)", 1297 BT_ERR("%s exiting Intel manufacturer mode failed (%ld)",
1294 hdev->name, PTR_ERR(skb)); 1298 hdev->name, PTR_ERR(skb));
1295 return -PTR_ERR(skb); 1299 return PTR_ERR(skb);
1296 } 1300 }
1297 kfree_skb(skb); 1301 kfree_skb(skb);
1298 1302
@@ -1310,7 +1314,7 @@ exit_mfg_deactivate:
1310 if (IS_ERR(skb)) { 1314 if (IS_ERR(skb)) {
1311 BT_ERR("%s exiting Intel manufacturer mode failed (%ld)", 1315 BT_ERR("%s exiting Intel manufacturer mode failed (%ld)",
1312 hdev->name, PTR_ERR(skb)); 1316 hdev->name, PTR_ERR(skb));
1313 return -PTR_ERR(skb); 1317 return PTR_ERR(skb);
1314 } 1318 }
1315 kfree_skb(skb); 1319 kfree_skb(skb);
1316 1320
diff --git a/drivers/char/agp/parisc-agp.c b/drivers/char/agp/parisc-agp.c
index bf5d2477cb77..15f2e7025b78 100644
--- a/drivers/char/agp/parisc-agp.c
+++ b/drivers/char/agp/parisc-agp.c
@@ -129,7 +129,8 @@ parisc_agp_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
129 off_t j, io_pg_start; 129 off_t j, io_pg_start;
130 int io_pg_count; 130 int io_pg_count;
131 131
132 if (type != 0 || mem->type != 0) { 132 if (type != mem->type ||
133 agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type)) {
133 return -EINVAL; 134 return -EINVAL;
134 } 135 }
135 136
@@ -175,7 +176,8 @@ parisc_agp_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
175 struct _parisc_agp_info *info = &parisc_agp_info; 176 struct _parisc_agp_info *info = &parisc_agp_info;
176 int i, io_pg_start, io_pg_count; 177 int i, io_pg_start, io_pg_count;
177 178
178 if (type != 0 || mem->type != 0) { 179 if (type != mem->type ||
180 agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type)) {
179 return -EINVAL; 181 return -EINVAL;
180 } 182 }
181 183
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 1b456fe9b87a..fc45567ad3ac 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -272,9 +272,12 @@ static struct port *find_port_by_devt_in_portdev(struct ports_device *portdev,
272 unsigned long flags; 272 unsigned long flags;
273 273
274 spin_lock_irqsave(&portdev->ports_lock, flags); 274 spin_lock_irqsave(&portdev->ports_lock, flags);
275 list_for_each_entry(port, &portdev->ports, list) 275 list_for_each_entry(port, &portdev->ports, list) {
276 if (port->cdev->dev == dev) 276 if (port->cdev->dev == dev) {
277 kref_get(&port->kref);
277 goto out; 278 goto out;
279 }
280 }
278 port = NULL; 281 port = NULL;
279out: 282out:
280 spin_unlock_irqrestore(&portdev->ports_lock, flags); 283 spin_unlock_irqrestore(&portdev->ports_lock, flags);
@@ -746,6 +749,10 @@ static ssize_t port_fops_read(struct file *filp, char __user *ubuf,
746 749
747 port = filp->private_data; 750 port = filp->private_data;
748 751
752 /* Port is hot-unplugged. */
753 if (!port->guest_connected)
754 return -ENODEV;
755
749 if (!port_has_data(port)) { 756 if (!port_has_data(port)) {
750 /* 757 /*
751 * If nothing's connected on the host just return 0 in 758 * If nothing's connected on the host just return 0 in
@@ -762,7 +769,7 @@ static ssize_t port_fops_read(struct file *filp, char __user *ubuf,
762 if (ret < 0) 769 if (ret < 0)
763 return ret; 770 return ret;
764 } 771 }
765 /* Port got hot-unplugged. */ 772 /* Port got hot-unplugged while we were waiting above. */
766 if (!port->guest_connected) 773 if (!port->guest_connected)
767 return -ENODEV; 774 return -ENODEV;
768 /* 775 /*
@@ -932,13 +939,25 @@ static ssize_t port_fops_splice_write(struct pipe_inode_info *pipe,
932 if (is_rproc_serial(port->out_vq->vdev)) 939 if (is_rproc_serial(port->out_vq->vdev))
933 return -EINVAL; 940 return -EINVAL;
934 941
942 /*
943 * pipe->nrbufs == 0 means there are no data to transfer,
944 * so this returns just 0 for no data.
945 */
946 pipe_lock(pipe);
947 if (!pipe->nrbufs) {
948 ret = 0;
949 goto error_out;
950 }
951
935 ret = wait_port_writable(port, filp->f_flags & O_NONBLOCK); 952 ret = wait_port_writable(port, filp->f_flags & O_NONBLOCK);
936 if (ret < 0) 953 if (ret < 0)
937 return ret; 954 goto error_out;
938 955
939 buf = alloc_buf(port->out_vq, 0, pipe->nrbufs); 956 buf = alloc_buf(port->out_vq, 0, pipe->nrbufs);
940 if (!buf) 957 if (!buf) {
941 return -ENOMEM; 958 ret = -ENOMEM;
959 goto error_out;
960 }
942 961
943 sgl.n = 0; 962 sgl.n = 0;
944 sgl.len = 0; 963 sgl.len = 0;
@@ -946,12 +965,17 @@ static ssize_t port_fops_splice_write(struct pipe_inode_info *pipe,
946 sgl.sg = buf->sg; 965 sgl.sg = buf->sg;
947 sg_init_table(sgl.sg, sgl.size); 966 sg_init_table(sgl.sg, sgl.size);
948 ret = __splice_from_pipe(pipe, &sd, pipe_to_sg); 967 ret = __splice_from_pipe(pipe, &sd, pipe_to_sg);
968 pipe_unlock(pipe);
949 if (likely(ret > 0)) 969 if (likely(ret > 0))
950 ret = __send_to_port(port, buf->sg, sgl.n, sgl.len, buf, true); 970 ret = __send_to_port(port, buf->sg, sgl.n, sgl.len, buf, true);
951 971
952 if (unlikely(ret <= 0)) 972 if (unlikely(ret <= 0))
953 free_buf(buf, true); 973 free_buf(buf, true);
954 return ret; 974 return ret;
975
976error_out:
977 pipe_unlock(pipe);
978 return ret;
955} 979}
956 980
957static unsigned int port_fops_poll(struct file *filp, poll_table *wait) 981static unsigned int port_fops_poll(struct file *filp, poll_table *wait)
@@ -1019,14 +1043,14 @@ static int port_fops_open(struct inode *inode, struct file *filp)
1019 struct port *port; 1043 struct port *port;
1020 int ret; 1044 int ret;
1021 1045
1046 /* We get the port with a kref here */
1022 port = find_port_by_devt(cdev->dev); 1047 port = find_port_by_devt(cdev->dev);
1048 if (!port) {
1049 /* Port was unplugged before we could proceed */
1050 return -ENXIO;
1051 }
1023 filp->private_data = port; 1052 filp->private_data = port;
1024 1053
1025 /* Prevent against a port getting hot-unplugged at the same time */
1026 spin_lock_irq(&port->portdev->ports_lock);
1027 kref_get(&port->kref);
1028 spin_unlock_irq(&port->portdev->ports_lock);
1029
1030 /* 1054 /*
1031 * Don't allow opening of console port devices -- that's done 1055 * Don't allow opening of console port devices -- that's done
1032 * via /dev/hvc 1056 * via /dev/hvc
@@ -1498,14 +1522,6 @@ static void remove_port(struct kref *kref)
1498 1522
1499 port = container_of(kref, struct port, kref); 1523 port = container_of(kref, struct port, kref);
1500 1524
1501 sysfs_remove_group(&port->dev->kobj, &port_attribute_group);
1502 device_destroy(pdrvdata.class, port->dev->devt);
1503 cdev_del(port->cdev);
1504
1505 kfree(port->name);
1506
1507 debugfs_remove(port->debugfs_file);
1508
1509 kfree(port); 1525 kfree(port);
1510} 1526}
1511 1527
@@ -1539,12 +1555,14 @@ static void unplug_port(struct port *port)
1539 spin_unlock_irq(&port->portdev->ports_lock); 1555 spin_unlock_irq(&port->portdev->ports_lock);
1540 1556
1541 if (port->guest_connected) { 1557 if (port->guest_connected) {
1558 /* Let the app know the port is going down. */
1559 send_sigio_to_port(port);
1560
1561 /* Do this after sigio is actually sent */
1542 port->guest_connected = false; 1562 port->guest_connected = false;
1543 port->host_connected = false; 1563 port->host_connected = false;
1544 wake_up_interruptible(&port->waitqueue);
1545 1564
1546 /* Let the app know the port is going down. */ 1565 wake_up_interruptible(&port->waitqueue);
1547 send_sigio_to_port(port);
1548 } 1566 }
1549 1567
1550 if (is_console_port(port)) { 1568 if (is_console_port(port)) {
@@ -1563,6 +1581,14 @@ static void unplug_port(struct port *port)
1563 */ 1581 */
1564 port->portdev = NULL; 1582 port->portdev = NULL;
1565 1583
1584 sysfs_remove_group(&port->dev->kobj, &port_attribute_group);
1585 device_destroy(pdrvdata.class, port->dev->devt);
1586 cdev_del(port->cdev);
1587
1588 kfree(port->name);
1589
1590 debugfs_remove(port->debugfs_file);
1591
1566 /* 1592 /*
1567 * Locks around here are not necessary - a port can't be 1593 * Locks around here are not necessary - a port can't be
1568 * opened after we removed the port struct from ports_list 1594 * opened after we removed the port struct from ports_list
diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c
index 1bdb882c845b..4e5739773c33 100644
--- a/drivers/clk/samsung/clk-exynos4.c
+++ b/drivers/clk/samsung/clk-exynos4.c
@@ -581,11 +581,15 @@ struct samsung_div_clock exynos4x12_div_clks[] __initdata = {
581 DIV(none, "div_spi1_isp", "mout_spi1_isp", E4X12_DIV_ISP, 16, 4), 581 DIV(none, "div_spi1_isp", "mout_spi1_isp", E4X12_DIV_ISP, 16, 4),
582 DIV(none, "div_spi1_isp_pre", "div_spi1_isp", E4X12_DIV_ISP, 20, 8), 582 DIV(none, "div_spi1_isp_pre", "div_spi1_isp", E4X12_DIV_ISP, 20, 8),
583 DIV(none, "div_uart_isp", "mout_uart_isp", E4X12_DIV_ISP, 28, 4), 583 DIV(none, "div_uart_isp", "mout_uart_isp", E4X12_DIV_ISP, 28, 4),
584 DIV(div_isp0, "div_isp0", "aclk200", E4X12_DIV_ISP0, 0, 3), 584 DIV_F(div_isp0, "div_isp0", "aclk200", E4X12_DIV_ISP0, 0, 3,
585 DIV(div_isp1, "div_isp1", "aclk200", E4X12_DIV_ISP0, 4, 3), 585 CLK_GET_RATE_NOCACHE, 0),
586 DIV_F(div_isp1, "div_isp1", "aclk200", E4X12_DIV_ISP0, 4, 3,
587 CLK_GET_RATE_NOCACHE, 0),
586 DIV(none, "div_mpwm", "div_isp1", E4X12_DIV_ISP1, 0, 3), 588 DIV(none, "div_mpwm", "div_isp1", E4X12_DIV_ISP1, 0, 3),
587 DIV(div_mcuisp0, "div_mcuisp0", "aclk400_mcuisp", E4X12_DIV_ISP1, 4, 3), 589 DIV_F(div_mcuisp0, "div_mcuisp0", "aclk400_mcuisp", E4X12_DIV_ISP1,
588 DIV(div_mcuisp1, "div_mcuisp1", "div_mcuisp0", E4X12_DIV_ISP1, 8, 3), 590 4, 3, CLK_GET_RATE_NOCACHE, 0),
591 DIV_F(div_mcuisp1, "div_mcuisp1", "div_mcuisp0", E4X12_DIV_ISP1,
592 8, 3, CLK_GET_RATE_NOCACHE, 0),
589 DIV(sclk_fimg2d, "sclk_fimg2d", "mout_g2d", DIV_DMC1, 0, 4), 593 DIV(sclk_fimg2d, "sclk_fimg2d", "mout_g2d", DIV_DMC1, 0, 4),
590}; 594};
591 595
@@ -863,57 +867,57 @@ struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = {
863 GATE_DA(i2s0, "samsung-i2s.0", "i2s0", "aclk100", 867 GATE_DA(i2s0, "samsung-i2s.0", "i2s0", "aclk100",
864 E4X12_GATE_IP_MAUDIO, 3, 0, 0, "iis"), 868 E4X12_GATE_IP_MAUDIO, 3, 0, 0, "iis"),
865 GATE(fimc_isp, "isp", "aclk200", E4X12_GATE_ISP0, 0, 869 GATE(fimc_isp, "isp", "aclk200", E4X12_GATE_ISP0, 0,
866 CLK_IGNORE_UNUSED, 0), 870 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
867 GATE(fimc_drc, "drc", "aclk200", E4X12_GATE_ISP0, 1, 871 GATE(fimc_drc, "drc", "aclk200", E4X12_GATE_ISP0, 1,
868 CLK_IGNORE_UNUSED, 0), 872 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
869 GATE(fimc_fd, "fd", "aclk200", E4X12_GATE_ISP0, 2, 873 GATE(fimc_fd, "fd", "aclk200", E4X12_GATE_ISP0, 2,
870 CLK_IGNORE_UNUSED, 0), 874 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
871 GATE(fimc_lite0, "lite0", "aclk200", E4X12_GATE_ISP0, 3, 875 GATE(fimc_lite0, "lite0", "aclk200", E4X12_GATE_ISP0, 3,
872 CLK_IGNORE_UNUSED, 0), 876 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
873 GATE(fimc_lite1, "lite1", "aclk200", E4X12_GATE_ISP0, 4, 877 GATE(fimc_lite1, "lite1", "aclk200", E4X12_GATE_ISP0, 4,
874 CLK_IGNORE_UNUSED, 0), 878 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
875 GATE(mcuisp, "mcuisp", "aclk200", E4X12_GATE_ISP0, 5, 879 GATE(mcuisp, "mcuisp", "aclk200", E4X12_GATE_ISP0, 5,
876 CLK_IGNORE_UNUSED, 0), 880 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
877 GATE(gicisp, "gicisp", "aclk200", E4X12_GATE_ISP0, 7, 881 GATE(gicisp, "gicisp", "aclk200", E4X12_GATE_ISP0, 7,
878 CLK_IGNORE_UNUSED, 0), 882 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
879 GATE(smmu_isp, "smmu_isp", "aclk200", E4X12_GATE_ISP0, 8, 883 GATE(smmu_isp, "smmu_isp", "aclk200", E4X12_GATE_ISP0, 8,
880 CLK_IGNORE_UNUSED, 0), 884 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
881 GATE(smmu_drc, "smmu_drc", "aclk200", E4X12_GATE_ISP0, 9, 885 GATE(smmu_drc, "smmu_drc", "aclk200", E4X12_GATE_ISP0, 9,
882 CLK_IGNORE_UNUSED, 0), 886 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
883 GATE(smmu_fd, "smmu_fd", "aclk200", E4X12_GATE_ISP0, 10, 887 GATE(smmu_fd, "smmu_fd", "aclk200", E4X12_GATE_ISP0, 10,
884 CLK_IGNORE_UNUSED, 0), 888 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
885 GATE(smmu_lite0, "smmu_lite0", "aclk200", E4X12_GATE_ISP0, 11, 889 GATE(smmu_lite0, "smmu_lite0", "aclk200", E4X12_GATE_ISP0, 11,
886 CLK_IGNORE_UNUSED, 0), 890 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
887 GATE(smmu_lite1, "smmu_lite1", "aclk200", E4X12_GATE_ISP0, 12, 891 GATE(smmu_lite1, "smmu_lite1", "aclk200", E4X12_GATE_ISP0, 12,
888 CLK_IGNORE_UNUSED, 0), 892 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
889 GATE(ppmuispmx, "ppmuispmx", "aclk200", E4X12_GATE_ISP0, 20, 893 GATE(ppmuispmx, "ppmuispmx", "aclk200", E4X12_GATE_ISP0, 20,
890 CLK_IGNORE_UNUSED, 0), 894 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
891 GATE(ppmuispx, "ppmuispx", "aclk200", E4X12_GATE_ISP0, 21, 895 GATE(ppmuispx, "ppmuispx", "aclk200", E4X12_GATE_ISP0, 21,
892 CLK_IGNORE_UNUSED, 0), 896 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
893 GATE(mcuctl_isp, "mcuctl_isp", "aclk200", E4X12_GATE_ISP0, 23, 897 GATE(mcuctl_isp, "mcuctl_isp", "aclk200", E4X12_GATE_ISP0, 23,
894 CLK_IGNORE_UNUSED, 0), 898 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
895 GATE(mpwm_isp, "mpwm_isp", "aclk200", E4X12_GATE_ISP0, 24, 899 GATE(mpwm_isp, "mpwm_isp", "aclk200", E4X12_GATE_ISP0, 24,
896 CLK_IGNORE_UNUSED, 0), 900 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
897 GATE(i2c0_isp, "i2c0_isp", "aclk200", E4X12_GATE_ISP0, 25, 901 GATE(i2c0_isp, "i2c0_isp", "aclk200", E4X12_GATE_ISP0, 25,
898 CLK_IGNORE_UNUSED, 0), 902 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
899 GATE(i2c1_isp, "i2c1_isp", "aclk200", E4X12_GATE_ISP0, 26, 903 GATE(i2c1_isp, "i2c1_isp", "aclk200", E4X12_GATE_ISP0, 26,
900 CLK_IGNORE_UNUSED, 0), 904 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
901 GATE(mtcadc_isp, "mtcadc_isp", "aclk200", E4X12_GATE_ISP0, 27, 905 GATE(mtcadc_isp, "mtcadc_isp", "aclk200", E4X12_GATE_ISP0, 27,
902 CLK_IGNORE_UNUSED, 0), 906 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
903 GATE(pwm_isp, "pwm_isp", "aclk200", E4X12_GATE_ISP0, 28, 907 GATE(pwm_isp, "pwm_isp", "aclk200", E4X12_GATE_ISP0, 28,
904 CLK_IGNORE_UNUSED, 0), 908 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
905 GATE(wdt_isp, "wdt_isp", "aclk200", E4X12_GATE_ISP0, 30, 909 GATE(wdt_isp, "wdt_isp", "aclk200", E4X12_GATE_ISP0, 30,
906 CLK_IGNORE_UNUSED, 0), 910 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
907 GATE(uart_isp, "uart_isp", "aclk200", E4X12_GATE_ISP0, 31, 911 GATE(uart_isp, "uart_isp", "aclk200", E4X12_GATE_ISP0, 31,
908 CLK_IGNORE_UNUSED, 0), 912 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
909 GATE(asyncaxim, "asyncaxim", "aclk200", E4X12_GATE_ISP1, 0, 913 GATE(asyncaxim, "asyncaxim", "aclk200", E4X12_GATE_ISP1, 0,
910 CLK_IGNORE_UNUSED, 0), 914 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
911 GATE(smmu_ispcx, "smmu_ispcx", "aclk200", E4X12_GATE_ISP1, 4, 915 GATE(smmu_ispcx, "smmu_ispcx", "aclk200", E4X12_GATE_ISP1, 4,
912 CLK_IGNORE_UNUSED, 0), 916 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
913 GATE(spi0_isp, "spi0_isp", "aclk200", E4X12_GATE_ISP1, 12, 917 GATE(spi0_isp, "spi0_isp", "aclk200", E4X12_GATE_ISP1, 12,
914 CLK_IGNORE_UNUSED, 0), 918 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
915 GATE(spi1_isp, "spi1_isp", "aclk200", E4X12_GATE_ISP1, 13, 919 GATE(spi1_isp, "spi1_isp", "aclk200", E4X12_GATE_ISP1, 13,
916 CLK_IGNORE_UNUSED, 0), 920 CLK_IGNORE_UNUSED | CLK_GET_RATE_NOCACHE, 0),
917 GATE(g2d, "g2d", "aclk200", GATE_IP_DMC, 23, 0, 0), 921 GATE(g2d, "g2d", "aclk200", GATE_IP_DMC, 23, 0, 0),
918}; 922};
919 923
diff --git a/drivers/clk/zynq/clkc.c b/drivers/clk/zynq/clkc.c
index 5c205b60a82a..089d3e30e221 100644
--- a/drivers/clk/zynq/clkc.c
+++ b/drivers/clk/zynq/clkc.c
@@ -71,6 +71,7 @@ static DEFINE_SPINLOCK(armpll_lock);
71static DEFINE_SPINLOCK(ddrpll_lock); 71static DEFINE_SPINLOCK(ddrpll_lock);
72static DEFINE_SPINLOCK(iopll_lock); 72static DEFINE_SPINLOCK(iopll_lock);
73static DEFINE_SPINLOCK(armclk_lock); 73static DEFINE_SPINLOCK(armclk_lock);
74static DEFINE_SPINLOCK(swdtclk_lock);
74static DEFINE_SPINLOCK(ddrclk_lock); 75static DEFINE_SPINLOCK(ddrclk_lock);
75static DEFINE_SPINLOCK(dciclk_lock); 76static DEFINE_SPINLOCK(dciclk_lock);
76static DEFINE_SPINLOCK(gem0clk_lock); 77static DEFINE_SPINLOCK(gem0clk_lock);
@@ -293,7 +294,7 @@ static void __init zynq_clk_setup(struct device_node *np)
293 } 294 }
294 clks[swdt] = clk_register_mux(NULL, clk_output_name[swdt], 295 clks[swdt] = clk_register_mux(NULL, clk_output_name[swdt],
295 swdt_ext_clk_mux_parents, 2, CLK_SET_RATE_PARENT, 296 swdt_ext_clk_mux_parents, 2, CLK_SET_RATE_PARENT,
296 SLCR_SWDT_CLK_SEL, 0, 1, 0, &gem0clk_lock); 297 SLCR_SWDT_CLK_SEL, 0, 1, 0, &swdtclk_lock);
297 298
298 /* DDR clocks */ 299 /* DDR clocks */
299 clk = clk_register_divider(NULL, "ddr2x_div", "ddrpll", 0, 300 clk = clk_register_divider(NULL, "ddr2x_div", "ddrpll", 0,
@@ -364,8 +365,9 @@ static void __init zynq_clk_setup(struct device_node *np)
364 CLK_SET_RATE_PARENT, SLCR_GEM0_CLK_CTRL, 20, 6, 365 CLK_SET_RATE_PARENT, SLCR_GEM0_CLK_CTRL, 20, 6,
365 CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 366 CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
366 &gem0clk_lock); 367 &gem0clk_lock);
367 clk = clk_register_mux(NULL, "gem0_emio_mux", gem0_mux_parents, 2, 0, 368 clk = clk_register_mux(NULL, "gem0_emio_mux", gem0_mux_parents, 2,
368 SLCR_GEM0_CLK_CTRL, 6, 1, 0, &gem0clk_lock); 369 CLK_SET_RATE_PARENT, SLCR_GEM0_CLK_CTRL, 6, 1, 0,
370 &gem0clk_lock);
369 clks[gem0] = clk_register_gate(NULL, clk_output_name[gem0], 371 clks[gem0] = clk_register_gate(NULL, clk_output_name[gem0],
370 "gem0_emio_mux", CLK_SET_RATE_PARENT, 372 "gem0_emio_mux", CLK_SET_RATE_PARENT,
371 SLCR_GEM0_CLK_CTRL, 0, 0, &gem0clk_lock); 373 SLCR_GEM0_CLK_CTRL, 0, 0, &gem0clk_lock);
@@ -386,8 +388,9 @@ static void __init zynq_clk_setup(struct device_node *np)
386 CLK_SET_RATE_PARENT, SLCR_GEM1_CLK_CTRL, 20, 6, 388 CLK_SET_RATE_PARENT, SLCR_GEM1_CLK_CTRL, 20, 6,
387 CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, 389 CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
388 &gem1clk_lock); 390 &gem1clk_lock);
389 clk = clk_register_mux(NULL, "gem1_emio_mux", gem1_mux_parents, 2, 0, 391 clk = clk_register_mux(NULL, "gem1_emio_mux", gem1_mux_parents, 2,
390 SLCR_GEM1_CLK_CTRL, 6, 1, 0, &gem1clk_lock); 392 CLK_SET_RATE_PARENT, SLCR_GEM1_CLK_CTRL, 6, 1, 0,
393 &gem1clk_lock);
391 clks[gem1] = clk_register_gate(NULL, clk_output_name[gem1], 394 clks[gem1] = clk_register_gate(NULL, clk_output_name[gem1],
392 "gem1_emio_mux", CLK_SET_RATE_PARENT, 395 "gem1_emio_mux", CLK_SET_RATE_PARENT,
393 SLCR_GEM1_CLK_CTRL, 0, 0, &gem1clk_lock); 396 SLCR_GEM1_CLK_CTRL, 0, 0, &gem1clk_lock);
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index a4ad7339588d..f0a5e2b0eb8a 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -1177,14 +1177,11 @@ static int __cpufreq_remove_dev(struct device *dev,
1177 __func__, cpu_dev->id, cpu); 1177 __func__, cpu_dev->id, cpu);
1178 } 1178 }
1179 1179
1180 if ((cpus == 1) && (cpufreq_driver->target))
1181 __cpufreq_governor(data, CPUFREQ_GOV_POLICY_EXIT);
1182
1183 pr_debug("%s: removing link, cpu: %d\n", __func__, cpu);
1184 cpufreq_cpu_put(data);
1185
1186 /* If cpu is last user of policy, free policy */ 1180 /* If cpu is last user of policy, free policy */
1187 if (cpus == 1) { 1181 if (cpus == 1) {
1182 if (cpufreq_driver->target)
1183 __cpufreq_governor(data, CPUFREQ_GOV_POLICY_EXIT);
1184
1188 lock_policy_rwsem_read(cpu); 1185 lock_policy_rwsem_read(cpu);
1189 kobj = &data->kobj; 1186 kobj = &data->kobj;
1190 cmp = &data->kobj_unregister; 1187 cmp = &data->kobj_unregister;
@@ -1205,9 +1202,13 @@ static int __cpufreq_remove_dev(struct device *dev,
1205 free_cpumask_var(data->related_cpus); 1202 free_cpumask_var(data->related_cpus);
1206 free_cpumask_var(data->cpus); 1203 free_cpumask_var(data->cpus);
1207 kfree(data); 1204 kfree(data);
1208 } else if (cpufreq_driver->target) { 1205 } else {
1209 __cpufreq_governor(data, CPUFREQ_GOV_START); 1206 pr_debug("%s: removing link, cpu: %d\n", __func__, cpu);
1210 __cpufreq_governor(data, CPUFREQ_GOV_LIMITS); 1207 cpufreq_cpu_put(data);
1208 if (cpufreq_driver->target) {
1209 __cpufreq_governor(data, CPUFREQ_GOV_START);
1210 __cpufreq_governor(data, CPUFREQ_GOV_LIMITS);
1211 }
1211 } 1212 }
1212 1213
1213 per_cpu(cpufreq_policy_cpu, cpu) = -1; 1214 per_cpu(cpufreq_policy_cpu, cpu) = -1;
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c
index 0ceb2eff5a7e..f97cb3d8c5a2 100644
--- a/drivers/cpufreq/cpufreq_conservative.c
+++ b/drivers/cpufreq/cpufreq_conservative.c
@@ -221,8 +221,8 @@ static ssize_t store_down_threshold(struct dbs_data *dbs_data, const char *buf,
221 return count; 221 return count;
222} 222}
223 223
224static ssize_t store_ignore_nice(struct dbs_data *dbs_data, const char *buf, 224static ssize_t store_ignore_nice_load(struct dbs_data *dbs_data,
225 size_t count) 225 const char *buf, size_t count)
226{ 226{
227 struct cs_dbs_tuners *cs_tuners = dbs_data->tuners; 227 struct cs_dbs_tuners *cs_tuners = dbs_data->tuners;
228 unsigned int input, j; 228 unsigned int input, j;
@@ -235,10 +235,10 @@ static ssize_t store_ignore_nice(struct dbs_data *dbs_data, const char *buf,
235 if (input > 1) 235 if (input > 1)
236 input = 1; 236 input = 1;
237 237
238 if (input == cs_tuners->ignore_nice) /* nothing to do */ 238 if (input == cs_tuners->ignore_nice_load) /* nothing to do */
239 return count; 239 return count;
240 240
241 cs_tuners->ignore_nice = input; 241 cs_tuners->ignore_nice_load = input;
242 242
243 /* we need to re-evaluate prev_cpu_idle */ 243 /* we need to re-evaluate prev_cpu_idle */
244 for_each_online_cpu(j) { 244 for_each_online_cpu(j) {
@@ -246,7 +246,7 @@ static ssize_t store_ignore_nice(struct dbs_data *dbs_data, const char *buf,
246 dbs_info = &per_cpu(cs_cpu_dbs_info, j); 246 dbs_info = &per_cpu(cs_cpu_dbs_info, j);
247 dbs_info->cdbs.prev_cpu_idle = get_cpu_idle_time(j, 247 dbs_info->cdbs.prev_cpu_idle = get_cpu_idle_time(j,
248 &dbs_info->cdbs.prev_cpu_wall, 0); 248 &dbs_info->cdbs.prev_cpu_wall, 0);
249 if (cs_tuners->ignore_nice) 249 if (cs_tuners->ignore_nice_load)
250 dbs_info->cdbs.prev_cpu_nice = 250 dbs_info->cdbs.prev_cpu_nice =
251 kcpustat_cpu(j).cpustat[CPUTIME_NICE]; 251 kcpustat_cpu(j).cpustat[CPUTIME_NICE];
252 } 252 }
@@ -279,7 +279,7 @@ show_store_one(cs, sampling_rate);
279show_store_one(cs, sampling_down_factor); 279show_store_one(cs, sampling_down_factor);
280show_store_one(cs, up_threshold); 280show_store_one(cs, up_threshold);
281show_store_one(cs, down_threshold); 281show_store_one(cs, down_threshold);
282show_store_one(cs, ignore_nice); 282show_store_one(cs, ignore_nice_load);
283show_store_one(cs, freq_step); 283show_store_one(cs, freq_step);
284declare_show_sampling_rate_min(cs); 284declare_show_sampling_rate_min(cs);
285 285
@@ -287,7 +287,7 @@ gov_sys_pol_attr_rw(sampling_rate);
287gov_sys_pol_attr_rw(sampling_down_factor); 287gov_sys_pol_attr_rw(sampling_down_factor);
288gov_sys_pol_attr_rw(up_threshold); 288gov_sys_pol_attr_rw(up_threshold);
289gov_sys_pol_attr_rw(down_threshold); 289gov_sys_pol_attr_rw(down_threshold);
290gov_sys_pol_attr_rw(ignore_nice); 290gov_sys_pol_attr_rw(ignore_nice_load);
291gov_sys_pol_attr_rw(freq_step); 291gov_sys_pol_attr_rw(freq_step);
292gov_sys_pol_attr_ro(sampling_rate_min); 292gov_sys_pol_attr_ro(sampling_rate_min);
293 293
@@ -297,7 +297,7 @@ static struct attribute *dbs_attributes_gov_sys[] = {
297 &sampling_down_factor_gov_sys.attr, 297 &sampling_down_factor_gov_sys.attr,
298 &up_threshold_gov_sys.attr, 298 &up_threshold_gov_sys.attr,
299 &down_threshold_gov_sys.attr, 299 &down_threshold_gov_sys.attr,
300 &ignore_nice_gov_sys.attr, 300 &ignore_nice_load_gov_sys.attr,
301 &freq_step_gov_sys.attr, 301 &freq_step_gov_sys.attr,
302 NULL 302 NULL
303}; 303};
@@ -313,7 +313,7 @@ static struct attribute *dbs_attributes_gov_pol[] = {
313 &sampling_down_factor_gov_pol.attr, 313 &sampling_down_factor_gov_pol.attr,
314 &up_threshold_gov_pol.attr, 314 &up_threshold_gov_pol.attr,
315 &down_threshold_gov_pol.attr, 315 &down_threshold_gov_pol.attr,
316 &ignore_nice_gov_pol.attr, 316 &ignore_nice_load_gov_pol.attr,
317 &freq_step_gov_pol.attr, 317 &freq_step_gov_pol.attr,
318 NULL 318 NULL
319}; 319};
@@ -338,7 +338,7 @@ static int cs_init(struct dbs_data *dbs_data)
338 tuners->up_threshold = DEF_FREQUENCY_UP_THRESHOLD; 338 tuners->up_threshold = DEF_FREQUENCY_UP_THRESHOLD;
339 tuners->down_threshold = DEF_FREQUENCY_DOWN_THRESHOLD; 339 tuners->down_threshold = DEF_FREQUENCY_DOWN_THRESHOLD;
340 tuners->sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR; 340 tuners->sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR;
341 tuners->ignore_nice = 0; 341 tuners->ignore_nice_load = 0;
342 tuners->freq_step = DEF_FREQUENCY_STEP; 342 tuners->freq_step = DEF_FREQUENCY_STEP;
343 343
344 dbs_data->tuners = tuners; 344 dbs_data->tuners = tuners;
diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c
index 7b839a8db2a7..e59afaa9da23 100644
--- a/drivers/cpufreq/cpufreq_governor.c
+++ b/drivers/cpufreq/cpufreq_governor.c
@@ -47,9 +47,9 @@ void dbs_check_cpu(struct dbs_data *dbs_data, int cpu)
47 unsigned int j; 47 unsigned int j;
48 48
49 if (dbs_data->cdata->governor == GOV_ONDEMAND) 49 if (dbs_data->cdata->governor == GOV_ONDEMAND)
50 ignore_nice = od_tuners->ignore_nice; 50 ignore_nice = od_tuners->ignore_nice_load;
51 else 51 else
52 ignore_nice = cs_tuners->ignore_nice; 52 ignore_nice = cs_tuners->ignore_nice_load;
53 53
54 policy = cdbs->cur_policy; 54 policy = cdbs->cur_policy;
55 55
@@ -298,12 +298,12 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy,
298 cs_tuners = dbs_data->tuners; 298 cs_tuners = dbs_data->tuners;
299 cs_dbs_info = dbs_data->cdata->get_cpu_dbs_info_s(cpu); 299 cs_dbs_info = dbs_data->cdata->get_cpu_dbs_info_s(cpu);
300 sampling_rate = cs_tuners->sampling_rate; 300 sampling_rate = cs_tuners->sampling_rate;
301 ignore_nice = cs_tuners->ignore_nice; 301 ignore_nice = cs_tuners->ignore_nice_load;
302 } else { 302 } else {
303 od_tuners = dbs_data->tuners; 303 od_tuners = dbs_data->tuners;
304 od_dbs_info = dbs_data->cdata->get_cpu_dbs_info_s(cpu); 304 od_dbs_info = dbs_data->cdata->get_cpu_dbs_info_s(cpu);
305 sampling_rate = od_tuners->sampling_rate; 305 sampling_rate = od_tuners->sampling_rate;
306 ignore_nice = od_tuners->ignore_nice; 306 ignore_nice = od_tuners->ignore_nice_load;
307 od_ops = dbs_data->cdata->gov_ops; 307 od_ops = dbs_data->cdata->gov_ops;
308 io_busy = od_tuners->io_is_busy; 308 io_busy = od_tuners->io_is_busy;
309 } 309 }
diff --git a/drivers/cpufreq/cpufreq_governor.h b/drivers/cpufreq/cpufreq_governor.h
index 6663ec3b3056..d5f12b4b11b8 100644
--- a/drivers/cpufreq/cpufreq_governor.h
+++ b/drivers/cpufreq/cpufreq_governor.h
@@ -165,7 +165,7 @@ struct cs_cpu_dbs_info_s {
165 165
166/* Per policy Governers sysfs tunables */ 166/* Per policy Governers sysfs tunables */
167struct od_dbs_tuners { 167struct od_dbs_tuners {
168 unsigned int ignore_nice; 168 unsigned int ignore_nice_load;
169 unsigned int sampling_rate; 169 unsigned int sampling_rate;
170 unsigned int sampling_down_factor; 170 unsigned int sampling_down_factor;
171 unsigned int up_threshold; 171 unsigned int up_threshold;
@@ -175,7 +175,7 @@ struct od_dbs_tuners {
175}; 175};
176 176
177struct cs_dbs_tuners { 177struct cs_dbs_tuners {
178 unsigned int ignore_nice; 178 unsigned int ignore_nice_load;
179 unsigned int sampling_rate; 179 unsigned int sampling_rate;
180 unsigned int sampling_down_factor; 180 unsigned int sampling_down_factor;
181 unsigned int up_threshold; 181 unsigned int up_threshold;
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
index 93eb5cbcc1f6..c087347d6688 100644
--- a/drivers/cpufreq/cpufreq_ondemand.c
+++ b/drivers/cpufreq/cpufreq_ondemand.c
@@ -403,8 +403,8 @@ static ssize_t store_sampling_down_factor(struct dbs_data *dbs_data,
403 return count; 403 return count;
404} 404}
405 405
406static ssize_t store_ignore_nice(struct dbs_data *dbs_data, const char *buf, 406static ssize_t store_ignore_nice_load(struct dbs_data *dbs_data,
407 size_t count) 407 const char *buf, size_t count)
408{ 408{
409 struct od_dbs_tuners *od_tuners = dbs_data->tuners; 409 struct od_dbs_tuners *od_tuners = dbs_data->tuners;
410 unsigned int input; 410 unsigned int input;
@@ -419,10 +419,10 @@ static ssize_t store_ignore_nice(struct dbs_data *dbs_data, const char *buf,
419 if (input > 1) 419 if (input > 1)
420 input = 1; 420 input = 1;
421 421
422 if (input == od_tuners->ignore_nice) { /* nothing to do */ 422 if (input == od_tuners->ignore_nice_load) { /* nothing to do */
423 return count; 423 return count;
424 } 424 }
425 od_tuners->ignore_nice = input; 425 od_tuners->ignore_nice_load = input;
426 426
427 /* we need to re-evaluate prev_cpu_idle */ 427 /* we need to re-evaluate prev_cpu_idle */
428 for_each_online_cpu(j) { 428 for_each_online_cpu(j) {
@@ -430,7 +430,7 @@ static ssize_t store_ignore_nice(struct dbs_data *dbs_data, const char *buf,
430 dbs_info = &per_cpu(od_cpu_dbs_info, j); 430 dbs_info = &per_cpu(od_cpu_dbs_info, j);
431 dbs_info->cdbs.prev_cpu_idle = get_cpu_idle_time(j, 431 dbs_info->cdbs.prev_cpu_idle = get_cpu_idle_time(j,
432 &dbs_info->cdbs.prev_cpu_wall, od_tuners->io_is_busy); 432 &dbs_info->cdbs.prev_cpu_wall, od_tuners->io_is_busy);
433 if (od_tuners->ignore_nice) 433 if (od_tuners->ignore_nice_load)
434 dbs_info->cdbs.prev_cpu_nice = 434 dbs_info->cdbs.prev_cpu_nice =
435 kcpustat_cpu(j).cpustat[CPUTIME_NICE]; 435 kcpustat_cpu(j).cpustat[CPUTIME_NICE];
436 436
@@ -461,7 +461,7 @@ show_store_one(od, sampling_rate);
461show_store_one(od, io_is_busy); 461show_store_one(od, io_is_busy);
462show_store_one(od, up_threshold); 462show_store_one(od, up_threshold);
463show_store_one(od, sampling_down_factor); 463show_store_one(od, sampling_down_factor);
464show_store_one(od, ignore_nice); 464show_store_one(od, ignore_nice_load);
465show_store_one(od, powersave_bias); 465show_store_one(od, powersave_bias);
466declare_show_sampling_rate_min(od); 466declare_show_sampling_rate_min(od);
467 467
@@ -469,7 +469,7 @@ gov_sys_pol_attr_rw(sampling_rate);
469gov_sys_pol_attr_rw(io_is_busy); 469gov_sys_pol_attr_rw(io_is_busy);
470gov_sys_pol_attr_rw(up_threshold); 470gov_sys_pol_attr_rw(up_threshold);
471gov_sys_pol_attr_rw(sampling_down_factor); 471gov_sys_pol_attr_rw(sampling_down_factor);
472gov_sys_pol_attr_rw(ignore_nice); 472gov_sys_pol_attr_rw(ignore_nice_load);
473gov_sys_pol_attr_rw(powersave_bias); 473gov_sys_pol_attr_rw(powersave_bias);
474gov_sys_pol_attr_ro(sampling_rate_min); 474gov_sys_pol_attr_ro(sampling_rate_min);
475 475
@@ -478,7 +478,7 @@ static struct attribute *dbs_attributes_gov_sys[] = {
478 &sampling_rate_gov_sys.attr, 478 &sampling_rate_gov_sys.attr,
479 &up_threshold_gov_sys.attr, 479 &up_threshold_gov_sys.attr,
480 &sampling_down_factor_gov_sys.attr, 480 &sampling_down_factor_gov_sys.attr,
481 &ignore_nice_gov_sys.attr, 481 &ignore_nice_load_gov_sys.attr,
482 &powersave_bias_gov_sys.attr, 482 &powersave_bias_gov_sys.attr,
483 &io_is_busy_gov_sys.attr, 483 &io_is_busy_gov_sys.attr,
484 NULL 484 NULL
@@ -494,7 +494,7 @@ static struct attribute *dbs_attributes_gov_pol[] = {
494 &sampling_rate_gov_pol.attr, 494 &sampling_rate_gov_pol.attr,
495 &up_threshold_gov_pol.attr, 495 &up_threshold_gov_pol.attr,
496 &sampling_down_factor_gov_pol.attr, 496 &sampling_down_factor_gov_pol.attr,
497 &ignore_nice_gov_pol.attr, 497 &ignore_nice_load_gov_pol.attr,
498 &powersave_bias_gov_pol.attr, 498 &powersave_bias_gov_pol.attr,
499 &io_is_busy_gov_pol.attr, 499 &io_is_busy_gov_pol.attr,
500 NULL 500 NULL
@@ -544,7 +544,7 @@ static int od_init(struct dbs_data *dbs_data)
544 } 544 }
545 545
546 tuners->sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR; 546 tuners->sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR;
547 tuners->ignore_nice = 0; 547 tuners->ignore_nice_load = 0;
548 tuners->powersave_bias = default_powersave_bias; 548 tuners->powersave_bias = default_powersave_bias;
549 tuners->io_is_busy = should_io_be_busy(); 549 tuners->io_is_busy = should_io_be_busy();
550 550
diff --git a/drivers/cpufreq/loongson2_cpufreq.c b/drivers/cpufreq/loongson2_cpufreq.c
index bb838b985077..9536852c504a 100644
--- a/drivers/cpufreq/loongson2_cpufreq.c
+++ b/drivers/cpufreq/loongson2_cpufreq.c
@@ -118,11 +118,6 @@ static int loongson2_cpufreq_cpu_init(struct cpufreq_policy *policy)
118 clk_put(cpuclk); 118 clk_put(cpuclk);
119 return -EINVAL; 119 return -EINVAL;
120 } 120 }
121 ret = clk_set_rate(cpuclk, rate);
122 if (ret) {
123 clk_put(cpuclk);
124 return ret;
125 }
126 121
127 /* clock table init */ 122 /* clock table init */
128 for (i = 2; 123 for (i = 2;
@@ -130,6 +125,12 @@ static int loongson2_cpufreq_cpu_init(struct cpufreq_policy *policy)
130 i++) 125 i++)
131 loongson2_clockmod_table[i].frequency = (rate * i) / 8; 126 loongson2_clockmod_table[i].frequency = (rate * i) / 8;
132 127
128 ret = clk_set_rate(cpuclk, rate);
129 if (ret) {
130 clk_put(cpuclk);
131 return ret;
132 }
133
133 policy->cur = loongson2_cpufreq_get(policy->cpu); 134 policy->cur = loongson2_cpufreq_get(policy->cpu);
134 135
135 cpufreq_frequency_table_get_attr(&loongson2_clockmod_table[0], 136 cpufreq_frequency_table_get_attr(&loongson2_clockmod_table[0],
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c
index fe343a06b7da..bc580b67a652 100644
--- a/drivers/cpuidle/governors/menu.c
+++ b/drivers/cpuidle/governors/menu.c
@@ -28,13 +28,6 @@
28#define MAX_INTERESTING 50000 28#define MAX_INTERESTING 50000
29#define STDDEV_THRESH 400 29#define STDDEV_THRESH 400
30 30
31/* 60 * 60 > STDDEV_THRESH * INTERVALS = 400 * 8 */
32#define MAX_DEVIATION 60
33
34static DEFINE_PER_CPU(struct hrtimer, menu_hrtimer);
35static DEFINE_PER_CPU(int, hrtimer_status);
36/* menu hrtimer mode */
37enum {MENU_HRTIMER_STOP, MENU_HRTIMER_REPEAT, MENU_HRTIMER_GENERAL};
38 31
39/* 32/*
40 * Concepts and ideas behind the menu governor 33 * Concepts and ideas behind the menu governor
@@ -116,13 +109,6 @@ enum {MENU_HRTIMER_STOP, MENU_HRTIMER_REPEAT, MENU_HRTIMER_GENERAL};
116 * 109 *
117 */ 110 */
118 111
119/*
120 * The C-state residency is so long that is is worthwhile to exit
121 * from the shallow C-state and re-enter into a deeper C-state.
122 */
123static unsigned int perfect_cstate_ms __read_mostly = 30;
124module_param(perfect_cstate_ms, uint, 0000);
125
126struct menu_device { 112struct menu_device {
127 int last_state_idx; 113 int last_state_idx;
128 int needs_update; 114 int needs_update;
@@ -205,52 +191,17 @@ static u64 div_round64(u64 dividend, u32 divisor)
205 return div_u64(dividend + (divisor / 2), divisor); 191 return div_u64(dividend + (divisor / 2), divisor);
206} 192}
207 193
208/* Cancel the hrtimer if it is not triggered yet */
209void menu_hrtimer_cancel(void)
210{
211 int cpu = smp_processor_id();
212 struct hrtimer *hrtmr = &per_cpu(menu_hrtimer, cpu);
213
214 /* The timer is still not time out*/
215 if (per_cpu(hrtimer_status, cpu)) {
216 hrtimer_cancel(hrtmr);
217 per_cpu(hrtimer_status, cpu) = MENU_HRTIMER_STOP;
218 }
219}
220EXPORT_SYMBOL_GPL(menu_hrtimer_cancel);
221
222/* Call back for hrtimer is triggered */
223static enum hrtimer_restart menu_hrtimer_notify(struct hrtimer *hrtimer)
224{
225 int cpu = smp_processor_id();
226 struct menu_device *data = &per_cpu(menu_devices, cpu);
227
228 /* In general case, the expected residency is much larger than
229 * deepest C-state target residency, but prediction logic still
230 * predicts a small predicted residency, so the prediction
231 * history is totally broken if the timer is triggered.
232 * So reset the correction factor.
233 */
234 if (per_cpu(hrtimer_status, cpu) == MENU_HRTIMER_GENERAL)
235 data->correction_factor[data->bucket] = RESOLUTION * DECAY;
236
237 per_cpu(hrtimer_status, cpu) = MENU_HRTIMER_STOP;
238
239 return HRTIMER_NORESTART;
240}
241
242/* 194/*
243 * Try detecting repeating patterns by keeping track of the last 8 195 * Try detecting repeating patterns by keeping track of the last 8
244 * intervals, and checking if the standard deviation of that set 196 * intervals, and checking if the standard deviation of that set
245 * of points is below a threshold. If it is... then use the 197 * of points is below a threshold. If it is... then use the
246 * average of these 8 points as the estimated value. 198 * average of these 8 points as the estimated value.
247 */ 199 */
248static u32 get_typical_interval(struct menu_device *data) 200static void get_typical_interval(struct menu_device *data)
249{ 201{
250 int i = 0, divisor = 0; 202 int i = 0, divisor = 0;
251 uint64_t max = 0, avg = 0, stddev = 0; 203 uint64_t max = 0, avg = 0, stddev = 0;
252 int64_t thresh = LLONG_MAX; /* Discard outliers above this value. */ 204 int64_t thresh = LLONG_MAX; /* Discard outliers above this value. */
253 unsigned int ret = 0;
254 205
255again: 206again:
256 207
@@ -291,16 +242,13 @@ again:
291 if (((avg > stddev * 6) && (divisor * 4 >= INTERVALS * 3)) 242 if (((avg > stddev * 6) && (divisor * 4 >= INTERVALS * 3))
292 || stddev <= 20) { 243 || stddev <= 20) {
293 data->predicted_us = avg; 244 data->predicted_us = avg;
294 ret = 1; 245 return;
295 return ret;
296 246
297 } else if ((divisor * 4) > INTERVALS * 3) { 247 } else if ((divisor * 4) > INTERVALS * 3) {
298 /* Exclude the max interval */ 248 /* Exclude the max interval */
299 thresh = max - 1; 249 thresh = max - 1;
300 goto again; 250 goto again;
301 } 251 }
302
303 return ret;
304} 252}
305 253
306/** 254/**
@@ -315,9 +263,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
315 int i; 263 int i;
316 int multiplier; 264 int multiplier;
317 struct timespec t; 265 struct timespec t;
318 int repeat = 0, low_predicted = 0;
319 int cpu = smp_processor_id();
320 struct hrtimer *hrtmr = &per_cpu(menu_hrtimer, cpu);
321 266
322 if (data->needs_update) { 267 if (data->needs_update) {
323 menu_update(drv, dev); 268 menu_update(drv, dev);
@@ -352,7 +297,7 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
352 data->predicted_us = div_round64(data->expected_us * data->correction_factor[data->bucket], 297 data->predicted_us = div_round64(data->expected_us * data->correction_factor[data->bucket],
353 RESOLUTION * DECAY); 298 RESOLUTION * DECAY);
354 299
355 repeat = get_typical_interval(data); 300 get_typical_interval(data);
356 301
357 /* 302 /*
358 * We want to default to C1 (hlt), not to busy polling 303 * We want to default to C1 (hlt), not to busy polling
@@ -373,10 +318,8 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
373 318
374 if (s->disabled || su->disable) 319 if (s->disabled || su->disable)
375 continue; 320 continue;
376 if (s->target_residency > data->predicted_us) { 321 if (s->target_residency > data->predicted_us)
377 low_predicted = 1;
378 continue; 322 continue;
379 }
380 if (s->exit_latency > latency_req) 323 if (s->exit_latency > latency_req)
381 continue; 324 continue;
382 if (s->exit_latency * multiplier > data->predicted_us) 325 if (s->exit_latency * multiplier > data->predicted_us)
@@ -386,44 +329,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
386 data->exit_us = s->exit_latency; 329 data->exit_us = s->exit_latency;
387 } 330 }
388 331
389 /* not deepest C-state chosen for low predicted residency */
390 if (low_predicted) {
391 unsigned int timer_us = 0;
392 unsigned int perfect_us = 0;
393
394 /*
395 * Set a timer to detect whether this sleep is much
396 * longer than repeat mode predicted. If the timer
397 * triggers, the code will evaluate whether to put
398 * the CPU into a deeper C-state.
399 * The timer is cancelled on CPU wakeup.
400 */
401 timer_us = 2 * (data->predicted_us + MAX_DEVIATION);
402
403 perfect_us = perfect_cstate_ms * 1000;
404
405 if (repeat && (4 * timer_us < data->expected_us)) {
406 RCU_NONIDLE(hrtimer_start(hrtmr,
407 ns_to_ktime(1000 * timer_us),
408 HRTIMER_MODE_REL_PINNED));
409 /* In repeat case, menu hrtimer is started */
410 per_cpu(hrtimer_status, cpu) = MENU_HRTIMER_REPEAT;
411 } else if (perfect_us < data->expected_us) {
412 /*
413 * The next timer is long. This could be because
414 * we did not make a useful prediction.
415 * In that case, it makes sense to re-enter
416 * into a deeper C-state after some time.
417 */
418 RCU_NONIDLE(hrtimer_start(hrtmr,
419 ns_to_ktime(1000 * timer_us),
420 HRTIMER_MODE_REL_PINNED));
421 /* In general case, menu hrtimer is started */
422 per_cpu(hrtimer_status, cpu) = MENU_HRTIMER_GENERAL;
423 }
424
425 }
426
427 return data->last_state_idx; 332 return data->last_state_idx;
428} 333}
429 334
@@ -514,9 +419,6 @@ static int menu_enable_device(struct cpuidle_driver *drv,
514 struct cpuidle_device *dev) 419 struct cpuidle_device *dev)
515{ 420{
516 struct menu_device *data = &per_cpu(menu_devices, dev->cpu); 421 struct menu_device *data = &per_cpu(menu_devices, dev->cpu);
517 struct hrtimer *t = &per_cpu(menu_hrtimer, dev->cpu);
518 hrtimer_init(t, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
519 t->function = menu_hrtimer_notify;
520 422
521 memset(data, 0, sizeof(struct menu_device)); 423 memset(data, 0, sizeof(struct menu_device));
522 424
diff --git a/drivers/dma/pch_dma.c b/drivers/dma/pch_dma.c
index ce3dc3e9688c..0bbdea5059f3 100644
--- a/drivers/dma/pch_dma.c
+++ b/drivers/dma/pch_dma.c
@@ -867,6 +867,7 @@ static int pch_dma_probe(struct pci_dev *pdev,
867 867
868 if (!(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) { 868 if (!(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) {
869 dev_err(&pdev->dev, "Cannot find proper base address\n"); 869 dev_err(&pdev->dev, "Cannot find proper base address\n");
870 err = -ENODEV;
870 goto err_disable_pdev; 871 goto err_disable_pdev;
871 } 872 }
872 873
diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
index 593827b3fdd4..fa645d825009 100644
--- a/drivers/dma/pl330.c
+++ b/drivers/dma/pl330.c
@@ -2505,6 +2505,10 @@ static dma_cookie_t pl330_tx_submit(struct dma_async_tx_descriptor *tx)
2505 /* Assign cookies to all nodes */ 2505 /* Assign cookies to all nodes */
2506 while (!list_empty(&last->node)) { 2506 while (!list_empty(&last->node)) {
2507 desc = list_entry(last->node.next, struct dma_pl330_desc, node); 2507 desc = list_entry(last->node.next, struct dma_pl330_desc, node);
2508 if (pch->cyclic) {
2509 desc->txd.callback = last->txd.callback;
2510 desc->txd.callback_param = last->txd.callback_param;
2511 }
2508 2512
2509 dma_cookie_assign(&desc->txd); 2513 dma_cookie_assign(&desc->txd);
2510 2514
@@ -2688,45 +2692,82 @@ static struct dma_async_tx_descriptor *pl330_prep_dma_cyclic(
2688 size_t period_len, enum dma_transfer_direction direction, 2692 size_t period_len, enum dma_transfer_direction direction,
2689 unsigned long flags, void *context) 2693 unsigned long flags, void *context)
2690{ 2694{
2691 struct dma_pl330_desc *desc; 2695 struct dma_pl330_desc *desc = NULL, *first = NULL;
2692 struct dma_pl330_chan *pch = to_pchan(chan); 2696 struct dma_pl330_chan *pch = to_pchan(chan);
2697 struct dma_pl330_dmac *pdmac = pch->dmac;
2698 unsigned int i;
2693 dma_addr_t dst; 2699 dma_addr_t dst;
2694 dma_addr_t src; 2700 dma_addr_t src;
2695 2701
2696 desc = pl330_get_desc(pch); 2702 if (len % period_len != 0)
2697 if (!desc) {
2698 dev_err(pch->dmac->pif.dev, "%s:%d Unable to fetch desc\n",
2699 __func__, __LINE__);
2700 return NULL; 2703 return NULL;
2701 }
2702 2704
2703 switch (direction) { 2705 if (!is_slave_direction(direction)) {
2704 case DMA_MEM_TO_DEV:
2705 desc->rqcfg.src_inc = 1;
2706 desc->rqcfg.dst_inc = 0;
2707 desc->req.rqtype = MEMTODEV;
2708 src = dma_addr;
2709 dst = pch->fifo_addr;
2710 break;
2711 case DMA_DEV_TO_MEM:
2712 desc->rqcfg.src_inc = 0;
2713 desc->rqcfg.dst_inc = 1;
2714 desc->req.rqtype = DEVTOMEM;
2715 src = pch->fifo_addr;
2716 dst = dma_addr;
2717 break;
2718 default:
2719 dev_err(pch->dmac->pif.dev, "%s:%d Invalid dma direction\n", 2706 dev_err(pch->dmac->pif.dev, "%s:%d Invalid dma direction\n",
2720 __func__, __LINE__); 2707 __func__, __LINE__);
2721 return NULL; 2708 return NULL;
2722 } 2709 }
2723 2710
2724 desc->rqcfg.brst_size = pch->burst_sz; 2711 for (i = 0; i < len / period_len; i++) {
2725 desc->rqcfg.brst_len = 1; 2712 desc = pl330_get_desc(pch);
2713 if (!desc) {
2714 dev_err(pch->dmac->pif.dev, "%s:%d Unable to fetch desc\n",
2715 __func__, __LINE__);
2726 2716
2727 pch->cyclic = true; 2717 if (!first)
2718 return NULL;
2719
2720 spin_lock_irqsave(&pdmac->pool_lock, flags);
2721
2722 while (!list_empty(&first->node)) {
2723 desc = list_entry(first->node.next,
2724 struct dma_pl330_desc, node);
2725 list_move_tail(&desc->node, &pdmac->desc_pool);
2726 }
2727
2728 list_move_tail(&first->node, &pdmac->desc_pool);
2728 2729
2729 fill_px(&desc->px, dst, src, period_len); 2730 spin_unlock_irqrestore(&pdmac->pool_lock, flags);
2731
2732 return NULL;
2733 }
2734
2735 switch (direction) {
2736 case DMA_MEM_TO_DEV:
2737 desc->rqcfg.src_inc = 1;
2738 desc->rqcfg.dst_inc = 0;
2739 desc->req.rqtype = MEMTODEV;
2740 src = dma_addr;
2741 dst = pch->fifo_addr;
2742 break;
2743 case DMA_DEV_TO_MEM:
2744 desc->rqcfg.src_inc = 0;
2745 desc->rqcfg.dst_inc = 1;
2746 desc->req.rqtype = DEVTOMEM;
2747 src = pch->fifo_addr;
2748 dst = dma_addr;
2749 break;
2750 default:
2751 break;
2752 }
2753
2754 desc->rqcfg.brst_size = pch->burst_sz;
2755 desc->rqcfg.brst_len = 1;
2756 fill_px(&desc->px, dst, src, period_len);
2757
2758 if (!first)
2759 first = desc;
2760 else
2761 list_add_tail(&desc->node, &first->node);
2762
2763 dma_addr += period_len;
2764 }
2765
2766 if (!desc)
2767 return NULL;
2768
2769 pch->cyclic = true;
2770 desc->txd.flags = flags;
2730 2771
2731 return &desc->txd; 2772 return &desc->txd;
2732} 2773}
diff --git a/drivers/dma/sh/shdma.c b/drivers/dma/sh/shdma.c
index b67f45f5c271..5039fbc88254 100644
--- a/drivers/dma/sh/shdma.c
+++ b/drivers/dma/sh/shdma.c
@@ -400,8 +400,8 @@ static size_t sh_dmae_get_partial(struct shdma_chan *schan,
400 shdma_chan); 400 shdma_chan);
401 struct sh_dmae_desc *sh_desc = container_of(sdesc, 401 struct sh_dmae_desc *sh_desc = container_of(sdesc,
402 struct sh_dmae_desc, shdma_desc); 402 struct sh_dmae_desc, shdma_desc);
403 return (sh_desc->hw.tcr - sh_dmae_readl(sh_chan, TCR)) << 403 return sh_desc->hw.tcr -
404 sh_chan->xmit_shift; 404 (sh_dmae_readl(sh_chan, TCR) << sh_chan->xmit_shift);
405} 405}
406 406
407/* Called from error IRQ or NMI */ 407/* Called from error IRQ or NMI */
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
index 7ef316fdc4d9..ac1b43a04285 100644
--- a/drivers/firewire/core-cdev.c
+++ b/drivers/firewire/core-cdev.c
@@ -54,6 +54,7 @@
54#define FW_CDEV_KERNEL_VERSION 5 54#define FW_CDEV_KERNEL_VERSION 5
55#define FW_CDEV_VERSION_EVENT_REQUEST2 4 55#define FW_CDEV_VERSION_EVENT_REQUEST2 4
56#define FW_CDEV_VERSION_ALLOCATE_REGION_END 4 56#define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
57#define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
57 58
58struct client { 59struct client {
59 u32 version; 60 u32 version;
@@ -1005,6 +1006,8 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg)
1005 a->channel, a->speed, a->header_size, cb, client); 1006 a->channel, a->speed, a->header_size, cb, client);
1006 if (IS_ERR(context)) 1007 if (IS_ERR(context))
1007 return PTR_ERR(context); 1008 return PTR_ERR(context);
1009 if (client->version < FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW)
1010 context->drop_overflow_headers = true;
1008 1011
1009 /* We only support one context at this time. */ 1012 /* We only support one context at this time. */
1010 spin_lock_irq(&client->lock); 1013 spin_lock_irq(&client->lock);
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
index 9e1db6490b9a..afb701ec90ca 100644
--- a/drivers/firewire/ohci.c
+++ b/drivers/firewire/ohci.c
@@ -2749,8 +2749,11 @@ static void copy_iso_headers(struct iso_context *ctx, const u32 *dma_hdr)
2749{ 2749{
2750 u32 *ctx_hdr; 2750 u32 *ctx_hdr;
2751 2751
2752 if (ctx->header_length + ctx->base.header_size > PAGE_SIZE) 2752 if (ctx->header_length + ctx->base.header_size > PAGE_SIZE) {
2753 if (ctx->base.drop_overflow_headers)
2754 return;
2753 flush_iso_completions(ctx); 2755 flush_iso_completions(ctx);
2756 }
2754 2757
2755 ctx_hdr = ctx->header + ctx->header_length; 2758 ctx_hdr = ctx->header + ctx->header_length;
2756 ctx->last_timestamp = (u16)le32_to_cpu((__force __le32)dma_hdr[0]); 2759 ctx->last_timestamp = (u16)le32_to_cpu((__force __le32)dma_hdr[0]);
@@ -2910,8 +2913,11 @@ static int handle_it_packet(struct context *context,
2910 2913
2911 sync_it_packet_for_cpu(context, d); 2914 sync_it_packet_for_cpu(context, d);
2912 2915
2913 if (ctx->header_length + 4 > PAGE_SIZE) 2916 if (ctx->header_length + 4 > PAGE_SIZE) {
2917 if (ctx->base.drop_overflow_headers)
2918 return 1;
2914 flush_iso_completions(ctx); 2919 flush_iso_completions(ctx);
2920 }
2915 2921
2916 ctx_hdr = ctx->header + ctx->header_length; 2922 ctx_hdr = ctx->header + ctx->header_length;
2917 ctx->last_timestamp = le16_to_cpu(last->res_count); 2923 ctx->last_timestamp = le16_to_cpu(last->res_count);
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
index eb760a218da4..232fa8fce26a 100644
--- a/drivers/firmware/dmi_scan.c
+++ b/drivers/firmware/dmi_scan.c
@@ -419,6 +419,13 @@ static void __init dmi_format_ids(char *buf, size_t len)
419 dmi_get_system_info(DMI_BIOS_DATE)); 419 dmi_get_system_info(DMI_BIOS_DATE));
420} 420}
421 421
422/*
423 * Check for DMI/SMBIOS headers in the system firmware image. Any
424 * SMBIOS header must start 16 bytes before the DMI header, so take a
425 * 32 byte buffer and check for DMI at offset 16 and SMBIOS at offset
426 * 0. If the DMI header is present, set dmi_ver accordingly (SMBIOS
427 * takes precedence) and return 0. Otherwise return 1.
428 */
422static int __init dmi_present(const u8 *buf) 429static int __init dmi_present(const u8 *buf)
423{ 430{
424 int smbios_ver; 431 int smbios_ver;
@@ -506,6 +513,13 @@ void __init dmi_scan_machine(void)
506 if (p == NULL) 513 if (p == NULL)
507 goto error; 514 goto error;
508 515
516 /*
517 * Iterate over all possible DMI header addresses q.
518 * Maintain the 32 bytes around q in buf. On the
519 * first iteration, substitute zero for the
520 * out-of-range bytes so there is no chance of falsely
521 * detecting an SMBIOS header.
522 */
509 memset(buf, 0, 16); 523 memset(buf, 0, 16);
510 for (q = p; q < p + 0x10000; q += 16) { 524 for (q = p; q < p + 0x10000; q += 16) {
511 memcpy_fromio(buf + 16, q, 16); 525 memcpy_fromio(buf + 16, q, 16);
diff --git a/drivers/gpio/gpio-msm-v1.c b/drivers/gpio/gpio-msm-v1.c
index e3ceaacde45c..73b73969d361 100644
--- a/drivers/gpio/gpio-msm-v1.c
+++ b/drivers/gpio/gpio-msm-v1.c
@@ -21,6 +21,7 @@
21#include <linux/module.h> 21#include <linux/module.h>
22#include <linux/device.h> 22#include <linux/device.h>
23#include <linux/platform_device.h> 23#include <linux/platform_device.h>
24#include <linux/err.h>
24 25
25#include <mach/msm_gpiomux.h> 26#include <mach/msm_gpiomux.h>
26 27
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index c57244ef428b..dfeb3a3a8f20 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -1037,18 +1037,6 @@ omap_mpuio_alloc_gc(struct gpio_bank *bank, unsigned int irq_start,
1037 IRQ_NOREQUEST | IRQ_NOPROBE, 0); 1037 IRQ_NOREQUEST | IRQ_NOPROBE, 0);
1038} 1038}
1039 1039
1040#if defined(CONFIG_OF_GPIO)
1041static inline bool omap_gpio_chip_boot_dt(struct gpio_chip *chip)
1042{
1043 return chip->of_node != NULL;
1044}
1045#else
1046static inline bool omap_gpio_chip_boot_dt(struct gpio_chip *chip)
1047{
1048 return false;
1049}
1050#endif
1051
1052static void omap_gpio_chip_init(struct gpio_bank *bank) 1040static void omap_gpio_chip_init(struct gpio_bank *bank)
1053{ 1041{
1054 int j; 1042 int j;
@@ -1080,68 +1068,24 @@ static void omap_gpio_chip_init(struct gpio_bank *bank)
1080 1068
1081 gpiochip_add(&bank->chip); 1069 gpiochip_add(&bank->chip);
1082 1070
1083 /* 1071 for (j = 0; j < bank->width; j++) {
1084 * REVISIT these explicit calls to irq_create_mapping() 1072 int irq = irq_create_mapping(bank->domain, j);
1085 * to do the GPIO to IRQ domain mapping for each GPIO in 1073 irq_set_lockdep_class(irq, &gpio_lock_class);
1086 * the bank can be removed once all OMAP platforms have 1074 irq_set_chip_data(irq, bank);
1087 * been migrated to Device Tree boot only. 1075 if (bank->is_mpuio) {
1088 * Since in DT boot irq_create_mapping() is called from 1076 omap_mpuio_alloc_gc(bank, irq, bank->width);
1089 * irq_create_of_mapping() only for the GPIO lines that 1077 } else {
1090 * are used as interrupts. 1078 irq_set_chip_and_handler(irq, &gpio_irq_chip,
1091 */ 1079 handle_simple_irq);
1092 if (!omap_gpio_chip_boot_dt(&bank->chip)) 1080 set_irq_flags(irq, IRQF_VALID);
1093 for (j = 0; j < bank->width; j++) 1081 }
1094 irq_create_mapping(bank->domain, j); 1082 }
1095 irq_set_chained_handler(bank->irq, gpio_irq_handler); 1083 irq_set_chained_handler(bank->irq, gpio_irq_handler);
1096 irq_set_handler_data(bank->irq, bank); 1084 irq_set_handler_data(bank->irq, bank);
1097} 1085}
1098 1086
1099static const struct of_device_id omap_gpio_match[]; 1087static const struct of_device_id omap_gpio_match[];
1100 1088
1101static int omap_gpio_irq_map(struct irq_domain *d, unsigned int virq,
1102 irq_hw_number_t hwirq)
1103{
1104 struct gpio_bank *bank = d->host_data;
1105 int gpio;
1106 int ret;
1107
1108 if (!bank)
1109 return -EINVAL;
1110
1111 irq_set_lockdep_class(virq, &gpio_lock_class);
1112 irq_set_chip_data(virq, bank);
1113 if (bank->is_mpuio) {
1114 omap_mpuio_alloc_gc(bank, virq, bank->width);
1115 } else {
1116 irq_set_chip_and_handler(virq, &gpio_irq_chip,
1117 handle_simple_irq);
1118 set_irq_flags(virq, IRQF_VALID);
1119 }
1120
1121 /*
1122 * REVISIT most GPIO IRQ chip drivers need to call
1123 * gpio_request() before a GPIO line can be used as an
1124 * IRQ. Ideally this should be handled by the IRQ core
1125 * but until then this has to be done on a per driver
1126 * basis. Remove this once this is managed by the core.
1127 */
1128 if (omap_gpio_chip_boot_dt(&bank->chip)) {
1129 gpio = irq_to_gpio(bank, hwirq);
1130 ret = gpio_request_one(gpio, GPIOF_IN, NULL);
1131 if (ret) {
1132 dev_err(bank->dev, "Could not request GPIO%d\n", gpio);
1133 return ret;
1134 }
1135 }
1136
1137 return 0;
1138}
1139
1140static struct irq_domain_ops omap_gpio_irq_ops = {
1141 .xlate = irq_domain_xlate_onetwocell,
1142 .map = omap_gpio_irq_map,
1143};
1144
1145static int omap_gpio_probe(struct platform_device *pdev) 1089static int omap_gpio_probe(struct platform_device *pdev)
1146{ 1090{
1147 struct device *dev = &pdev->dev; 1091 struct device *dev = &pdev->dev;
@@ -1207,10 +1151,10 @@ static int omap_gpio_probe(struct platform_device *pdev)
1207 } 1151 }
1208 1152
1209 bank->domain = irq_domain_add_legacy(node, bank->width, irq_base, 1153 bank->domain = irq_domain_add_legacy(node, bank->width, irq_base,
1210 0, &omap_gpio_irq_ops, bank); 1154 0, &irq_domain_simple_ops, NULL);
1211#else 1155#else
1212 bank->domain = irq_domain_add_linear(node, bank->width, 1156 bank->domain = irq_domain_add_linear(node, bank->width,
1213 &omap_gpio_irq_ops, bank); 1157 &irq_domain_simple_ops, NULL);
1214#endif 1158#endif
1215 if (!bank->domain) { 1159 if (!bank->domain) {
1216 dev_err(dev, "Couldn't register an IRQ domain\n"); 1160 dev_err(dev, "Couldn't register an IRQ domain\n");
diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
index 20fcf4ee3af0..32aecb34dbce 100644
--- a/drivers/gpu/drm/ast/ast_ttm.c
+++ b/drivers/gpu/drm/ast/ast_ttm.c
@@ -324,6 +324,7 @@ int ast_bo_create(struct drm_device *dev, int size, int align,
324 } 324 }
325 325
326 astbo->bo.bdev = &ast->ttm.bdev; 326 astbo->bo.bdev = &ast->ttm.bdev;
327 astbo->bo.bdev->dev_mapping = dev->dev_mapping;
327 328
328 ast_ttm_placement(astbo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM); 329 ast_ttm_placement(astbo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM);
329 330
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
index ae2385cc71cb..75becdeac07d 100644
--- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
+++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
@@ -329,6 +329,7 @@ int cirrus_bo_create(struct drm_device *dev, int size, int align,
329 } 329 }
330 330
331 cirrusbo->bo.bdev = &cirrus->ttm.bdev; 331 cirrusbo->bo.bdev = &cirrus->ttm.bdev;
332 cirrusbo->bo.bdev->dev_mapping = dev->dev_mapping;
332 333
333 cirrus_ttm_placement(cirrusbo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM); 334 cirrus_ttm_placement(cirrusbo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM);
334 335
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index a207cc3f2c57..1688ff500513 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -125,6 +125,9 @@ static struct edid_quirk {
125 125
126 /* ViewSonic VA2026w */ 126 /* ViewSonic VA2026w */
127 { "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING }, 127 { "VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING },
128
129 /* Medion MD 30217 PG */
130 { "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 },
128}; 131};
129 132
130/* 133/*
@@ -2882,6 +2885,58 @@ int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads)
2882EXPORT_SYMBOL(drm_edid_to_sad); 2885EXPORT_SYMBOL(drm_edid_to_sad);
2883 2886
2884/** 2887/**
2888 * drm_edid_to_speaker_allocation - extracts Speaker Allocation Data Blocks from EDID
2889 * @edid: EDID to parse
2890 * @sadb: pointer to the speaker block
2891 *
2892 * Looks for CEA EDID block and extracts the Speaker Allocation Data Block from it.
2893 * Note: returned pointer needs to be kfreed
2894 *
2895 * Return number of found Speaker Allocation Blocks or negative number on error.
2896 */
2897int drm_edid_to_speaker_allocation(struct edid *edid, u8 **sadb)
2898{
2899 int count = 0;
2900 int i, start, end, dbl;
2901 const u8 *cea;
2902
2903 cea = drm_find_cea_extension(edid);
2904 if (!cea) {
2905 DRM_DEBUG_KMS("SAD: no CEA Extension found\n");
2906 return -ENOENT;
2907 }
2908
2909 if (cea_revision(cea) < 3) {
2910 DRM_DEBUG_KMS("SAD: wrong CEA revision\n");
2911 return -ENOTSUPP;
2912 }
2913
2914 if (cea_db_offsets(cea, &start, &end)) {
2915 DRM_DEBUG_KMS("SAD: invalid data block offsets\n");
2916 return -EPROTO;
2917 }
2918
2919 for_each_cea_db(cea, i, start, end) {
2920 const u8 *db = &cea[i];
2921
2922 if (cea_db_tag(db) == SPEAKER_BLOCK) {
2923 dbl = cea_db_payload_len(db);
2924
2925 /* Speaker Allocation Data Block */
2926 if (dbl == 3) {
2927 *sadb = kmalloc(dbl, GFP_KERNEL);
2928 memcpy(*sadb, &db[1], dbl);
2929 count = dbl;
2930 break;
2931 }
2932 }
2933 }
2934
2935 return count;
2936}
2937EXPORT_SYMBOL(drm_edid_to_speaker_allocation);
2938
2939/**
2885 * drm_av_sync_delay - HDMI/DP sink audio-video sync delay in millisecond 2940 * drm_av_sync_delay - HDMI/DP sink audio-video sync delay in millisecond
2886 * @connector: connector associated with the HDMI/DP sink 2941 * @connector: connector associated with the HDMI/DP sink
2887 * @mode: the display mode 2942 * @mode: the display mode
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 8bcce7866d36..f92da0a32f0d 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -708,7 +708,10 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, int crtc,
708 /* Subtract time delta from raw timestamp to get final 708 /* Subtract time delta from raw timestamp to get final
709 * vblank_time timestamp for end of vblank. 709 * vblank_time timestamp for end of vblank.
710 */ 710 */
711 etime = ktime_sub_ns(etime, delta_ns); 711 if (delta_ns < 0)
712 etime = ktime_add_ns(etime, -delta_ns);
713 else
714 etime = ktime_sub_ns(etime, delta_ns);
712 *vblank_time = ktime_to_timeval(etime); 715 *vblank_time = ktime_to_timeval(etime);
713 716
714 DRM_DEBUG("crtc %d : v %d p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d rep]\n", 717 DRM_DEBUG("crtc %d : v %d p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d rep]\n",
diff --git a/drivers/gpu/drm/exynos/exynos_ddc.c b/drivers/gpu/drm/exynos/exynos_ddc.c
index 95c75edef01a..30ef41bcd7b8 100644
--- a/drivers/gpu/drm/exynos/exynos_ddc.c
+++ b/drivers/gpu/drm/exynos/exynos_ddc.c
@@ -15,7 +15,6 @@
15 15
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/i2c.h> 17#include <linux/i2c.h>
18#include <linux/module.h>
19 18
20 19
21#include "exynos_drm_drv.h" 20#include "exynos_drm_drv.h"
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimc.c b/drivers/gpu/drm/exynos/exynos_drm_fimc.c
index 61b094f689a7..6e047bd53e2f 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimc.c
@@ -12,7 +12,6 @@
12 * 12 *
13 */ 13 */
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15#include <linux/module.h>
16#include <linux/platform_device.h> 15#include <linux/platform_device.h>
17#include <linux/mfd/syscon.h> 16#include <linux/mfd/syscon.h>
18#include <linux/regmap.h> 17#include <linux/regmap.h>
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index 3e106beca5b6..1c263dac3c1c 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -14,7 +14,6 @@
14#include <drm/drmP.h> 14#include <drm/drmP.h>
15 15
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/module.h>
18#include <linux/platform_device.h> 17#include <linux/platform_device.h>
19#include <linux/clk.h> 18#include <linux/clk.h>
20#include <linux/of_device.h> 19#include <linux/of_device.h>
@@ -130,7 +129,6 @@ static const struct of_device_id fimd_driver_dt_match[] = {
130 .data = &exynos5_fimd_driver_data }, 129 .data = &exynos5_fimd_driver_data },
131 {}, 130 {},
132}; 131};
133MODULE_DEVICE_TABLE(of, fimd_driver_dt_match);
134#endif 132#endif
135 133
136static inline struct fimd_driver_data *drm_fimd_get_driver_data( 134static inline struct fimd_driver_data *drm_fimd_get_driver_data(
@@ -1082,7 +1080,6 @@ static struct platform_device_id fimd_driver_ids[] = {
1082 }, 1080 },
1083 {}, 1081 {},
1084}; 1082};
1085MODULE_DEVICE_TABLE(platform, fimd_driver_ids);
1086 1083
1087static const struct dev_pm_ops fimd_pm_ops = { 1084static const struct dev_pm_ops fimd_pm_ops = {
1088 SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume) 1085 SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
index 42a5a5466075..eddea4941483 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c
@@ -8,7 +8,6 @@
8 */ 8 */
9 9
10#include <linux/kernel.h> 10#include <linux/kernel.h>
11#include <linux/module.h>
12#include <linux/clk.h> 11#include <linux/clk.h>
13#include <linux/err.h> 12#include <linux/err.h>
14#include <linux/interrupt.h> 13#include <linux/interrupt.h>
@@ -806,9 +805,20 @@ static void g2d_dma_start(struct g2d_data *g2d,
806 struct g2d_cmdlist_node *node = 805 struct g2d_cmdlist_node *node =
807 list_first_entry(&runqueue_node->run_cmdlist, 806 list_first_entry(&runqueue_node->run_cmdlist,
808 struct g2d_cmdlist_node, list); 807 struct g2d_cmdlist_node, list);
808 int ret;
809
810 ret = pm_runtime_get_sync(g2d->dev);
811 if (ret < 0) {
812 dev_warn(g2d->dev, "failed pm power on.\n");
813 return;
814 }
809 815
810 pm_runtime_get_sync(g2d->dev); 816 ret = clk_prepare_enable(g2d->gate_clk);
811 clk_enable(g2d->gate_clk); 817 if (ret < 0) {
818 dev_warn(g2d->dev, "failed to enable clock.\n");
819 pm_runtime_put_sync(g2d->dev);
820 return;
821 }
812 822
813 writel_relaxed(node->dma_addr, g2d->regs + G2D_DMA_SFR_BASE_ADDR); 823 writel_relaxed(node->dma_addr, g2d->regs + G2D_DMA_SFR_BASE_ADDR);
814 writel_relaxed(G2D_DMA_START, g2d->regs + G2D_DMA_COMMAND); 824 writel_relaxed(G2D_DMA_START, g2d->regs + G2D_DMA_COMMAND);
@@ -861,7 +871,7 @@ static void g2d_runqueue_worker(struct work_struct *work)
861 runqueue_work); 871 runqueue_work);
862 872
863 mutex_lock(&g2d->runqueue_mutex); 873 mutex_lock(&g2d->runqueue_mutex);
864 clk_disable(g2d->gate_clk); 874 clk_disable_unprepare(g2d->gate_clk);
865 pm_runtime_put_sync(g2d->dev); 875 pm_runtime_put_sync(g2d->dev);
866 876
867 complete(&g2d->runqueue_node->complete); 877 complete(&g2d->runqueue_node->complete);
@@ -1521,7 +1531,6 @@ static const struct of_device_id exynos_g2d_match[] = {
1521 { .compatible = "samsung,exynos5250-g2d" }, 1531 { .compatible = "samsung,exynos5250-g2d" },
1522 {}, 1532 {},
1523}; 1533};
1524MODULE_DEVICE_TABLE(of, exynos_g2d_match);
1525#endif 1534#endif
1526 1535
1527struct platform_driver g2d_driver = { 1536struct platform_driver g2d_driver = {
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.c b/drivers/gpu/drm/exynos/exynos_drm_gsc.c
index 472e3b25e7f2..90b8a1a5344c 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gsc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.c
@@ -12,7 +12,6 @@
12 * 12 *
13 */ 13 */
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15#include <linux/module.h>
16#include <linux/platform_device.h> 15#include <linux/platform_device.h>
17#include <linux/clk.h> 16#include <linux/clk.h>
18#include <linux/pm_runtime.h> 17#include <linux/pm_runtime.h>
diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c
index aaa550d622f0..8d3bc01d6834 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c
@@ -15,7 +15,6 @@
15 15
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/wait.h> 17#include <linux/wait.h>
18#include <linux/module.h>
19#include <linux/platform_device.h> 18#include <linux/platform_device.h>
20#include <linux/pm_runtime.h> 19#include <linux/pm_runtime.h>
21 20
diff --git a/drivers/gpu/drm/exynos/exynos_drm_ipp.c b/drivers/gpu/drm/exynos/exynos_drm_ipp.c
index b1ef8e7ff9c9..d2b6ab4def93 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_ipp.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_ipp.c
@@ -12,7 +12,6 @@
12 * 12 *
13 */ 13 */
14#include <linux/kernel.h> 14#include <linux/kernel.h>
15#include <linux/module.h>
16#include <linux/platform_device.h> 15#include <linux/platform_device.h>
17#include <linux/types.h> 16#include <linux/types.h>
18#include <linux/clk.h> 17#include <linux/clk.h>
@@ -342,10 +341,10 @@ int exynos_drm_ipp_get_property(struct drm_device *drm_dev, void *data,
342 */ 341 */
343 ippdrv = ipp_find_obj(&ctx->ipp_idr, &ctx->ipp_lock, 342 ippdrv = ipp_find_obj(&ctx->ipp_idr, &ctx->ipp_lock,
344 prop_list->ipp_id); 343 prop_list->ipp_id);
345 if (!ippdrv) { 344 if (IS_ERR(ippdrv)) {
346 DRM_ERROR("not found ipp%d driver.\n", 345 DRM_ERROR("not found ipp%d driver.\n",
347 prop_list->ipp_id); 346 prop_list->ipp_id);
348 return -EINVAL; 347 return PTR_ERR(ippdrv);
349 } 348 }
350 349
351 prop_list = ippdrv->prop_list; 350 prop_list = ippdrv->prop_list;
@@ -970,9 +969,9 @@ int exynos_drm_ipp_queue_buf(struct drm_device *drm_dev, void *data,
970 /* find command node */ 969 /* find command node */
971 c_node = ipp_find_obj(&ctx->prop_idr, &ctx->prop_lock, 970 c_node = ipp_find_obj(&ctx->prop_idr, &ctx->prop_lock,
972 qbuf->prop_id); 971 qbuf->prop_id);
973 if (!c_node) { 972 if (IS_ERR(c_node)) {
974 DRM_ERROR("failed to get command node.\n"); 973 DRM_ERROR("failed to get command node.\n");
975 return -EFAULT; 974 return PTR_ERR(c_node);
976 } 975 }
977 976
978 /* buffer control */ 977 /* buffer control */
@@ -1106,9 +1105,9 @@ int exynos_drm_ipp_cmd_ctrl(struct drm_device *drm_dev, void *data,
1106 1105
1107 c_node = ipp_find_obj(&ctx->prop_idr, &ctx->prop_lock, 1106 c_node = ipp_find_obj(&ctx->prop_idr, &ctx->prop_lock,
1108 cmd_ctrl->prop_id); 1107 cmd_ctrl->prop_id);
1109 if (!c_node) { 1108 if (IS_ERR(c_node)) {
1110 DRM_ERROR("invalid command node list.\n"); 1109 DRM_ERROR("invalid command node list.\n");
1111 return -EINVAL; 1110 return PTR_ERR(c_node);
1112 } 1111 }
1113 1112
1114 if (!exynos_drm_ipp_check_valid(ippdrv->dev, cmd_ctrl->ctrl, 1113 if (!exynos_drm_ipp_check_valid(ippdrv->dev, cmd_ctrl->ctrl,
diff --git a/drivers/gpu/drm/exynos/exynos_drm_rotator.c b/drivers/gpu/drm/exynos/exynos_drm_rotator.c
index 427640aa5148..49669aa24c45 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_rotator.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_rotator.c
@@ -10,7 +10,6 @@
10 */ 10 */
11 11
12#include <linux/kernel.h> 12#include <linux/kernel.h>
13#include <linux/module.h>
14#include <linux/err.h> 13#include <linux/err.h>
15#include <linux/interrupt.h> 14#include <linux/interrupt.h>
16#include <linux/io.h> 15#include <linux/io.h>
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
index 41cc74d83e4e..c57c56519add 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
@@ -13,7 +13,6 @@
13#include <drm/drmP.h> 13#include <drm/drmP.h>
14 14
15#include <linux/kernel.h> 15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/platform_device.h> 16#include <linux/platform_device.h>
18 17
19#include <drm/exynos_drm.h> 18#include <drm/exynos_drm.h>
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 62ef5971ac3c..2f5c6942c968 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -24,7 +24,6 @@
24#include <linux/spinlock.h> 24#include <linux/spinlock.h>
25#include <linux/wait.h> 25#include <linux/wait.h>
26#include <linux/i2c.h> 26#include <linux/i2c.h>
27#include <linux/module.h>
28#include <linux/platform_device.h> 27#include <linux/platform_device.h>
29#include <linux/interrupt.h> 28#include <linux/interrupt.h>
30#include <linux/irq.h> 29#include <linux/irq.h>
diff --git a/drivers/gpu/drm/exynos/exynos_hdmiphy.c b/drivers/gpu/drm/exynos/exynos_hdmiphy.c
index ef04255076c7..6e320ae9afed 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmiphy.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmiphy.c
@@ -15,7 +15,6 @@
15 15
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/i2c.h> 17#include <linux/i2c.h>
18#include <linux/module.h>
19 18
20#include "exynos_drm_drv.h" 19#include "exynos_drm_drv.h"
21#include "exynos_hdmi.h" 20#include "exynos_hdmi.h"
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c
index 42ffb71c63bc..c9a137caea41 100644
--- a/drivers/gpu/drm/exynos/exynos_mixer.c
+++ b/drivers/gpu/drm/exynos/exynos_mixer.c
@@ -23,7 +23,6 @@
23#include <linux/spinlock.h> 23#include <linux/spinlock.h>
24#include <linux/wait.h> 24#include <linux/wait.h>
25#include <linux/i2c.h> 25#include <linux/i2c.h>
26#include <linux/module.h>
27#include <linux/platform_device.h> 26#include <linux/platform_device.h>
28#include <linux/interrupt.h> 27#include <linux/interrupt.h>
29#include <linux/irq.h> 28#include <linux/irq.h>
diff --git a/drivers/gpu/drm/gma500/psb_intel_sdvo.c b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
index 77841a113617..6f01cdf5e125 100644
--- a/drivers/gpu/drm/gma500/psb_intel_sdvo.c
+++ b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
@@ -500,7 +500,8 @@ static bool psb_intel_sdvo_read_response(struct psb_intel_sdvo *psb_intel_sdvo,
500 &status)) 500 &status))
501 goto log_fail; 501 goto log_fail;
502 502
503 while (status == SDVO_CMD_STATUS_PENDING && retry--) { 503 while ((status == SDVO_CMD_STATUS_PENDING ||
504 status == SDVO_CMD_STATUS_TARGET_NOT_SPECIFIED) && retry--) {
504 udelay(15); 505 udelay(15);
505 if (!psb_intel_sdvo_read_byte(psb_intel_sdvo, 506 if (!psb_intel_sdvo_read_byte(psb_intel_sdvo,
506 SDVO_I2C_CMD_STATUS, 507 SDVO_I2C_CMD_STATUS,
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index f22c81d040c0..52a3785a3fdf 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1749,6 +1749,7 @@ void i915_queue_hangcheck(struct drm_device *dev);
1749void i915_handle_error(struct drm_device *dev, bool wedged); 1749void i915_handle_error(struct drm_device *dev, bool wedged);
1750 1750
1751extern void intel_irq_init(struct drm_device *dev); 1751extern void intel_irq_init(struct drm_device *dev);
1752extern void intel_pm_init(struct drm_device *dev);
1752extern void intel_hpd_init(struct drm_device *dev); 1753extern void intel_hpd_init(struct drm_device *dev);
1753extern void intel_pm_init(struct drm_device *dev); 1754extern void intel_pm_init(struct drm_device *dev);
1754 1755
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 56708c64e68f..b6a58f720f9a 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -760,6 +760,8 @@
760 will not assert AGPBUSY# and will only 760 will not assert AGPBUSY# and will only
761 be delivered when out of C3. */ 761 be delivered when out of C3. */
762#define INSTPM_FORCE_ORDERING (1<<7) /* GEN6+ */ 762#define INSTPM_FORCE_ORDERING (1<<7) /* GEN6+ */
763#define INSTPM_TLB_INVALIDATE (1<<9)
764#define INSTPM_SYNC_FLUSH (1<<5)
763#define ACTHD 0x020c8 765#define ACTHD 0x020c8
764#define FW_BLC 0x020d8 766#define FW_BLC 0x020d8
765#define FW_BLC2 0x020dc 767#define FW_BLC2 0x020dc
@@ -1939,10 +1941,16 @@
1939#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2) 1941#define CRT_HOTPLUG_DETECT_VOLTAGE_475MV (1 << 2)
1940 1942
1941#define PORT_HOTPLUG_STAT (dev_priv->info->display_mmio_offset + 0x61114) 1943#define PORT_HOTPLUG_STAT (dev_priv->info->display_mmio_offset + 0x61114)
1942/* HDMI/DP bits are gen4+ */ 1944/*
1943#define PORTB_HOTPLUG_LIVE_STATUS (1 << 29) 1945 * HDMI/DP bits are gen4+
1946 *
1947 * WARNING: Bspec for hpd status bits on gen4 seems to be completely confused.
1948 * Please check the detailed lore in the commit message for for experimental
1949 * evidence.
1950 */
1951#define PORTD_HOTPLUG_LIVE_STATUS (1 << 29)
1944#define PORTC_HOTPLUG_LIVE_STATUS (1 << 28) 1952#define PORTC_HOTPLUG_LIVE_STATUS (1 << 28)
1945#define PORTD_HOTPLUG_LIVE_STATUS (1 << 27) 1953#define PORTB_HOTPLUG_LIVE_STATUS (1 << 27)
1946#define PORTD_HOTPLUG_INT_STATUS (3 << 21) 1954#define PORTD_HOTPLUG_INT_STATUS (3 << 21)
1947#define PORTC_HOTPLUG_INT_STATUS (3 << 19) 1955#define PORTC_HOTPLUG_INT_STATUS (3 << 19)
1948#define PORTB_HOTPLUG_INT_STATUS (3 << 17) 1956#define PORTB_HOTPLUG_INT_STATUS (3 << 17)
@@ -4528,7 +4536,7 @@
4528#define EDP_LINK_TRAIN_600MV_0DB_IVB (0x30 <<22) 4536#define EDP_LINK_TRAIN_600MV_0DB_IVB (0x30 <<22)
4529#define EDP_LINK_TRAIN_600MV_3_5DB_IVB (0x36 <<22) 4537#define EDP_LINK_TRAIN_600MV_3_5DB_IVB (0x36 <<22)
4530#define EDP_LINK_TRAIN_800MV_0DB_IVB (0x38 <<22) 4538#define EDP_LINK_TRAIN_800MV_0DB_IVB (0x38 <<22)
4531#define EDP_LINK_TRAIN_800MV_3_5DB_IVB (0x33 <<22) 4539#define EDP_LINK_TRAIN_800MV_3_5DB_IVB (0x3e <<22)
4532 4540
4533/* legacy values */ 4541/* legacy values */
4534#define EDP_LINK_TRAIN_500MV_0DB_IVB (0x00 <<22) 4542#define EDP_LINK_TRAIN_500MV_0DB_IVB (0x00 <<22)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 10c1db596387..38452d82ac7d 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -8726,9 +8726,11 @@ check_crtc_state(struct drm_device *dev)
8726 8726
8727 list_for_each_entry(encoder, &dev->mode_config.encoder_list, 8727 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
8728 base.head) { 8728 base.head) {
8729 enum pipe pipe;
8729 if (encoder->base.crtc != &crtc->base) 8730 if (encoder->base.crtc != &crtc->base)
8730 continue; 8731 continue;
8731 if (encoder->get_config) 8732 if (encoder->get_config &&
8733 encoder->get_hw_state(encoder, &pipe))
8732 encoder->get_config(encoder, &pipe_config); 8734 encoder->get_config(encoder, &pipe_config);
8733 } 8735 }
8734 8736
@@ -10565,6 +10567,8 @@ struct intel_display_error_state {
10565 10567
10566 u32 power_well_driver; 10568 u32 power_well_driver;
10567 10569
10570 int num_transcoders;
10571
10568 struct intel_cursor_error_state { 10572 struct intel_cursor_error_state {
10569 u32 control; 10573 u32 control;
10570 u32 position; 10574 u32 position;
@@ -10573,16 +10577,7 @@ struct intel_display_error_state {
10573 } cursor[I915_MAX_PIPES]; 10577 } cursor[I915_MAX_PIPES];
10574 10578
10575 struct intel_pipe_error_state { 10579 struct intel_pipe_error_state {
10576 enum transcoder cpu_transcoder;
10577 u32 conf;
10578 u32 source; 10580 u32 source;
10579
10580 u32 htotal;
10581 u32 hblank;
10582 u32 hsync;
10583 u32 vtotal;
10584 u32 vblank;
10585 u32 vsync;
10586 } pipe[I915_MAX_PIPES]; 10581 } pipe[I915_MAX_PIPES];
10587 10582
10588 struct intel_plane_error_state { 10583 struct intel_plane_error_state {
@@ -10594,6 +10589,19 @@ struct intel_display_error_state {
10594 u32 surface; 10589 u32 surface;
10595 u32 tile_offset; 10590 u32 tile_offset;
10596 } plane[I915_MAX_PIPES]; 10591 } plane[I915_MAX_PIPES];
10592
10593 struct intel_transcoder_error_state {
10594 enum transcoder cpu_transcoder;
10595
10596 u32 conf;
10597
10598 u32 htotal;
10599 u32 hblank;
10600 u32 hsync;
10601 u32 vtotal;
10602 u32 vblank;
10603 u32 vsync;
10604 } transcoder[4];
10597}; 10605};
10598 10606
10599struct intel_display_error_state * 10607struct intel_display_error_state *
@@ -10601,9 +10609,17 @@ intel_display_capture_error_state(struct drm_device *dev)
10601{ 10609{
10602 drm_i915_private_t *dev_priv = dev->dev_private; 10610 drm_i915_private_t *dev_priv = dev->dev_private;
10603 struct intel_display_error_state *error; 10611 struct intel_display_error_state *error;
10604 enum transcoder cpu_transcoder; 10612 int transcoders[] = {
10613 TRANSCODER_A,
10614 TRANSCODER_B,
10615 TRANSCODER_C,
10616 TRANSCODER_EDP,
10617 };
10605 int i; 10618 int i;
10606 10619
10620 if (INTEL_INFO(dev)->num_pipes == 0)
10621 return NULL;
10622
10607 error = kmalloc(sizeof(*error), GFP_ATOMIC); 10623 error = kmalloc(sizeof(*error), GFP_ATOMIC);
10608 if (error == NULL) 10624 if (error == NULL)
10609 return NULL; 10625 return NULL;
@@ -10612,9 +10628,6 @@ intel_display_capture_error_state(struct drm_device *dev)
10612 error->power_well_driver = I915_READ(HSW_PWR_WELL_DRIVER); 10628 error->power_well_driver = I915_READ(HSW_PWR_WELL_DRIVER);
10613 10629
10614 for_each_pipe(i) { 10630 for_each_pipe(i) {
10615 cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv, i);
10616 error->pipe[i].cpu_transcoder = cpu_transcoder;
10617
10618 if (INTEL_INFO(dev)->gen <= 6 || IS_VALLEYVIEW(dev)) { 10631 if (INTEL_INFO(dev)->gen <= 6 || IS_VALLEYVIEW(dev)) {
10619 error->cursor[i].control = I915_READ(CURCNTR(i)); 10632 error->cursor[i].control = I915_READ(CURCNTR(i));
10620 error->cursor[i].position = I915_READ(CURPOS(i)); 10633 error->cursor[i].position = I915_READ(CURPOS(i));
@@ -10638,14 +10651,25 @@ intel_display_capture_error_state(struct drm_device *dev)
10638 error->plane[i].tile_offset = I915_READ(DSPTILEOFF(i)); 10651 error->plane[i].tile_offset = I915_READ(DSPTILEOFF(i));
10639 } 10652 }
10640 10653
10641 error->pipe[i].conf = I915_READ(PIPECONF(cpu_transcoder));
10642 error->pipe[i].source = I915_READ(PIPESRC(i)); 10654 error->pipe[i].source = I915_READ(PIPESRC(i));
10643 error->pipe[i].htotal = I915_READ(HTOTAL(cpu_transcoder)); 10655 }
10644 error->pipe[i].hblank = I915_READ(HBLANK(cpu_transcoder)); 10656
10645 error->pipe[i].hsync = I915_READ(HSYNC(cpu_transcoder)); 10657 error->num_transcoders = INTEL_INFO(dev)->num_pipes;
10646 error->pipe[i].vtotal = I915_READ(VTOTAL(cpu_transcoder)); 10658 if (HAS_DDI(dev_priv->dev))
10647 error->pipe[i].vblank = I915_READ(VBLANK(cpu_transcoder)); 10659 error->num_transcoders++; /* Account for eDP. */
10648 error->pipe[i].vsync = I915_READ(VSYNC(cpu_transcoder)); 10660
10661 for (i = 0; i < error->num_transcoders; i++) {
10662 enum transcoder cpu_transcoder = transcoders[i];
10663
10664 error->transcoder[i].cpu_transcoder = cpu_transcoder;
10665
10666 error->transcoder[i].conf = I915_READ(PIPECONF(cpu_transcoder));
10667 error->transcoder[i].htotal = I915_READ(HTOTAL(cpu_transcoder));
10668 error->transcoder[i].hblank = I915_READ(HBLANK(cpu_transcoder));
10669 error->transcoder[i].hsync = I915_READ(HSYNC(cpu_transcoder));
10670 error->transcoder[i].vtotal = I915_READ(VTOTAL(cpu_transcoder));
10671 error->transcoder[i].vblank = I915_READ(VBLANK(cpu_transcoder));
10672 error->transcoder[i].vsync = I915_READ(VSYNC(cpu_transcoder));
10649 } 10673 }
10650 10674
10651 /* In the code above we read the registers without checking if the power 10675 /* In the code above we read the registers without checking if the power
@@ -10666,22 +10690,16 @@ intel_display_print_error_state(struct drm_i915_error_state_buf *m,
10666{ 10690{
10667 int i; 10691 int i;
10668 10692
10693 if (!error)
10694 return;
10695
10669 err_printf(m, "Num Pipes: %d\n", INTEL_INFO(dev)->num_pipes); 10696 err_printf(m, "Num Pipes: %d\n", INTEL_INFO(dev)->num_pipes);
10670 if (HAS_POWER_WELL(dev)) 10697 if (HAS_POWER_WELL(dev))
10671 err_printf(m, "PWR_WELL_CTL2: %08x\n", 10698 err_printf(m, "PWR_WELL_CTL2: %08x\n",
10672 error->power_well_driver); 10699 error->power_well_driver);
10673 for_each_pipe(i) { 10700 for_each_pipe(i) {
10674 err_printf(m, "Pipe [%d]:\n", i); 10701 err_printf(m, "Pipe [%d]:\n", i);
10675 err_printf(m, " CPU transcoder: %c\n",
10676 transcoder_name(error->pipe[i].cpu_transcoder));
10677 err_printf(m, " CONF: %08x\n", error->pipe[i].conf);
10678 err_printf(m, " SRC: %08x\n", error->pipe[i].source); 10702 err_printf(m, " SRC: %08x\n", error->pipe[i].source);
10679 err_printf(m, " HTOTAL: %08x\n", error->pipe[i].htotal);
10680 err_printf(m, " HBLANK: %08x\n", error->pipe[i].hblank);
10681 err_printf(m, " HSYNC: %08x\n", error->pipe[i].hsync);
10682 err_printf(m, " VTOTAL: %08x\n", error->pipe[i].vtotal);
10683 err_printf(m, " VBLANK: %08x\n", error->pipe[i].vblank);
10684 err_printf(m, " VSYNC: %08x\n", error->pipe[i].vsync);
10685 10703
10686 err_printf(m, "Plane [%d]:\n", i); 10704 err_printf(m, "Plane [%d]:\n", i);
10687 err_printf(m, " CNTR: %08x\n", error->plane[i].control); 10705 err_printf(m, " CNTR: %08x\n", error->plane[i].control);
@@ -10702,4 +10720,16 @@ intel_display_print_error_state(struct drm_i915_error_state_buf *m,
10702 err_printf(m, " POS: %08x\n", error->cursor[i].position); 10720 err_printf(m, " POS: %08x\n", error->cursor[i].position);
10703 err_printf(m, " BASE: %08x\n", error->cursor[i].base); 10721 err_printf(m, " BASE: %08x\n", error->cursor[i].base);
10704 } 10722 }
10723
10724 for (i = 0; i < error->num_transcoders; i++) {
10725 err_printf(m, " CPU transcoder: %c\n",
10726 transcoder_name(error->transcoder[i].cpu_transcoder));
10727 err_printf(m, " CONF: %08x\n", error->transcoder[i].conf);
10728 err_printf(m, " HTOTAL: %08x\n", error->transcoder[i].htotal);
10729 err_printf(m, " HBLANK: %08x\n", error->transcoder[i].hblank);
10730 err_printf(m, " HSYNC: %08x\n", error->transcoder[i].hsync);
10731 err_printf(m, " VTOTAL: %08x\n", error->transcoder[i].vtotal);
10732 err_printf(m, " VBLANK: %08x\n", error->transcoder[i].vblank);
10733 err_printf(m, " VSYNC: %08x\n", error->transcoder[i].vsync);
10734 }
10705} 10735}
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
index 01b5a519c43c..a43c33bc4a35 100644
--- a/drivers/gpu/drm/i915/intel_panel.c
+++ b/drivers/gpu/drm/i915/intel_panel.c
@@ -494,8 +494,11 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level, u32 max)
494 goto out; 494 goto out;
495 } 495 }
496 496
497 /* scale to hardware */ 497 /* scale to hardware, but be careful to not overflow */
498 level = level * freq / max; 498 if (freq < max)
499 level = level * freq / max;
500 else
501 level = freq / max * level;
499 502
500 dev_priv->backlight.level = level; 503 dev_priv->backlight.level = level;
501 if (dev_priv->backlight.device) 504 if (dev_priv->backlight.device)
@@ -512,6 +515,17 @@ void intel_panel_disable_backlight(struct drm_device *dev)
512 struct drm_i915_private *dev_priv = dev->dev_private; 515 struct drm_i915_private *dev_priv = dev->dev_private;
513 unsigned long flags; 516 unsigned long flags;
514 517
518 /*
519 * Do not disable backlight on the vgaswitcheroo path. When switching
520 * away from i915, the other client may depend on i915 to handle the
521 * backlight. This will leave the backlight on unnecessarily when
522 * another client is not activated.
523 */
524 if (dev->switch_power_state == DRM_SWITCH_POWER_CHANGING) {
525 DRM_DEBUG_DRIVER("Skipping backlight disable on vga switch\n");
526 return;
527 }
528
515 spin_lock_irqsave(&dev_priv->backlight.lock, flags); 529 spin_lock_irqsave(&dev_priv->backlight.lock, flags);
516 530
517 dev_priv->backlight.enabled = false; 531 dev_priv->backlight.enabled = false;
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 0150ba598bf0..46056820d1d2 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -5297,8 +5297,26 @@ static void __intel_set_power_well(struct drm_device *dev, bool enable)
5297 } 5297 }
5298 } else { 5298 } else {
5299 if (enable_requested) { 5299 if (enable_requested) {
5300 unsigned long irqflags;
5301 enum pipe p;
5302
5300 I915_WRITE(HSW_PWR_WELL_DRIVER, 0); 5303 I915_WRITE(HSW_PWR_WELL_DRIVER, 0);
5304 POSTING_READ(HSW_PWR_WELL_DRIVER);
5301 DRM_DEBUG_KMS("Requesting to disable the power well\n"); 5305 DRM_DEBUG_KMS("Requesting to disable the power well\n");
5306
5307 /*
5308 * After this, the registers on the pipes that are part
5309 * of the power well will become zero, so we have to
5310 * adjust our counters according to that.
5311 *
5312 * FIXME: Should we do this in general in
5313 * drm_vblank_post_modeset?
5314 */
5315 spin_lock_irqsave(&dev->vbl_lock, irqflags);
5316 for_each_pipe(p)
5317 if (p != PIPE_A)
5318 dev->last_vblank[p] = 0;
5319 spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
5302 } 5320 }
5303 } 5321 }
5304} 5322}
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 7de29d40d1ad..f05cceac5a52 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -962,6 +962,18 @@ void intel_ring_setup_status_page(struct intel_ring_buffer *ring)
962 962
963 I915_WRITE(mmio, (u32)ring->status_page.gfx_addr); 963 I915_WRITE(mmio, (u32)ring->status_page.gfx_addr);
964 POSTING_READ(mmio); 964 POSTING_READ(mmio);
965
966 /* Flush the TLB for this page */
967 if (INTEL_INFO(dev)->gen >= 6) {
968 u32 reg = RING_INSTPM(ring->mmio_base);
969 I915_WRITE(reg,
970 _MASKED_BIT_ENABLE(INSTPM_TLB_INVALIDATE |
971 INSTPM_SYNC_FLUSH));
972 if (wait_for((I915_READ(reg) & INSTPM_SYNC_FLUSH) == 0,
973 1000))
974 DRM_ERROR("%s: wait for SyncFlush to complete for TLB invalidation timed out\n",
975 ring->name);
976 }
965} 977}
966 978
967static int 979static int
diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
index 251784aa2225..503a414cbdad 100644
--- a/drivers/gpu/drm/mgag200/mgag200_mode.c
+++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
@@ -29,6 +29,7 @@ static void mga_crtc_load_lut(struct drm_crtc *crtc)
29 struct mga_crtc *mga_crtc = to_mga_crtc(crtc); 29 struct mga_crtc *mga_crtc = to_mga_crtc(crtc);
30 struct drm_device *dev = crtc->dev; 30 struct drm_device *dev = crtc->dev;
31 struct mga_device *mdev = dev->dev_private; 31 struct mga_device *mdev = dev->dev_private;
32 struct drm_framebuffer *fb = crtc->fb;
32 int i; 33 int i;
33 34
34 if (!crtc->enabled) 35 if (!crtc->enabled)
@@ -36,6 +37,28 @@ static void mga_crtc_load_lut(struct drm_crtc *crtc)
36 37
37 WREG8(DAC_INDEX + MGA1064_INDEX, 0); 38 WREG8(DAC_INDEX + MGA1064_INDEX, 0);
38 39
40 if (fb && fb->bits_per_pixel == 16) {
41 int inc = (fb->depth == 15) ? 8 : 4;
42 u8 r, b;
43 for (i = 0; i < MGAG200_LUT_SIZE; i += inc) {
44 if (fb->depth == 16) {
45 if (i > (MGAG200_LUT_SIZE >> 1)) {
46 r = b = 0;
47 } else {
48 r = mga_crtc->lut_r[i << 1];
49 b = mga_crtc->lut_b[i << 1];
50 }
51 } else {
52 r = mga_crtc->lut_r[i];
53 b = mga_crtc->lut_b[i];
54 }
55 /* VGA registers */
56 WREG8(DAC_INDEX + MGA1064_COL_PAL, r);
57 WREG8(DAC_INDEX + MGA1064_COL_PAL, mga_crtc->lut_g[i]);
58 WREG8(DAC_INDEX + MGA1064_COL_PAL, b);
59 }
60 return;
61 }
39 for (i = 0; i < MGAG200_LUT_SIZE; i++) { 62 for (i = 0; i < MGAG200_LUT_SIZE; i++) {
40 /* VGA registers */ 63 /* VGA registers */
41 WREG8(DAC_INDEX + MGA1064_COL_PAL, mga_crtc->lut_r[i]); 64 WREG8(DAC_INDEX + MGA1064_COL_PAL, mga_crtc->lut_r[i]);
@@ -877,7 +900,7 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,
877 900
878 pitch = crtc->fb->pitches[0] / (crtc->fb->bits_per_pixel / 8); 901 pitch = crtc->fb->pitches[0] / (crtc->fb->bits_per_pixel / 8);
879 if (crtc->fb->bits_per_pixel == 24) 902 if (crtc->fb->bits_per_pixel == 24)
880 pitch = pitch >> (4 - bppshift); 903 pitch = (pitch * 3) >> (4 - bppshift);
881 else 904 else
882 pitch = pitch >> (4 - bppshift); 905 pitch = pitch >> (4 - bppshift);
883 906
@@ -1251,6 +1274,24 @@ static void mga_crtc_destroy(struct drm_crtc *crtc)
1251 kfree(mga_crtc); 1274 kfree(mga_crtc);
1252} 1275}
1253 1276
1277static void mga_crtc_disable(struct drm_crtc *crtc)
1278{
1279 int ret;
1280 DRM_DEBUG_KMS("\n");
1281 mga_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1282 if (crtc->fb) {
1283 struct mga_framebuffer *mga_fb = to_mga_framebuffer(crtc->fb);
1284 struct drm_gem_object *obj = mga_fb->obj;
1285 struct mgag200_bo *bo = gem_to_mga_bo(obj);
1286 ret = mgag200_bo_reserve(bo, false);
1287 if (ret)
1288 return;
1289 mgag200_bo_push_sysram(bo);
1290 mgag200_bo_unreserve(bo);
1291 }
1292 crtc->fb = NULL;
1293}
1294
1254/* These provide the minimum set of functions required to handle a CRTC */ 1295/* These provide the minimum set of functions required to handle a CRTC */
1255static const struct drm_crtc_funcs mga_crtc_funcs = { 1296static const struct drm_crtc_funcs mga_crtc_funcs = {
1256 .cursor_set = mga_crtc_cursor_set, 1297 .cursor_set = mga_crtc_cursor_set,
@@ -1261,6 +1302,7 @@ static const struct drm_crtc_funcs mga_crtc_funcs = {
1261}; 1302};
1262 1303
1263static const struct drm_crtc_helper_funcs mga_helper_funcs = { 1304static const struct drm_crtc_helper_funcs mga_helper_funcs = {
1305 .disable = mga_crtc_disable,
1264 .dpms = mga_crtc_dpms, 1306 .dpms = mga_crtc_dpms,
1265 .mode_fixup = mga_crtc_mode_fixup, 1307 .mode_fixup = mga_crtc_mode_fixup,
1266 .mode_set = mga_crtc_mode_set, 1308 .mode_set = mga_crtc_mode_set,
@@ -1581,6 +1623,8 @@ static struct drm_connector *mga_vga_init(struct drm_device *dev)
1581 1623
1582 drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs); 1624 drm_connector_helper_add(connector, &mga_vga_connector_helper_funcs);
1583 1625
1626 drm_sysfs_connector_add(connector);
1627
1584 mga_connector->i2c = mgag200_i2c_create(dev); 1628 mga_connector->i2c = mgag200_i2c_create(dev);
1585 if (!mga_connector->i2c) 1629 if (!mga_connector->i2c)
1586 DRM_ERROR("failed to add ddc bus\n"); 1630 DRM_ERROR("failed to add ddc bus\n");
diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
index fd4539d9ad2c..07b192fe15c6 100644
--- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
+++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
@@ -324,6 +324,7 @@ int mgag200_bo_create(struct drm_device *dev, int size, int align,
324 } 324 }
325 325
326 mgabo->bo.bdev = &mdev->ttm.bdev; 326 mgabo->bo.bdev = &mdev->ttm.bdev;
327 mgabo->bo.bdev->dev_mapping = dev->dev_mapping;
327 328
328 mgag200_ttm_placement(mgabo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM); 329 mgag200_ttm_placement(mgabo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM);
329 330
@@ -354,6 +355,7 @@ int mgag200_bo_pin(struct mgag200_bo *bo, u32 pl_flag, u64 *gpu_addr)
354 bo->pin_count++; 355 bo->pin_count++;
355 if (gpu_addr) 356 if (gpu_addr)
356 *gpu_addr = mgag200_bo_gpu_offset(bo); 357 *gpu_addr = mgag200_bo_gpu_offset(bo);
358 return 0;
357 } 359 }
358 360
359 mgag200_ttm_placement(bo, pl_flag); 361 mgag200_ttm_placement(bo, pl_flag);
diff --git a/drivers/gpu/drm/nouveau/core/core/mm.c b/drivers/gpu/drm/nouveau/core/core/mm.c
index d8291724dbd4..7a4e0891c5f8 100644
--- a/drivers/gpu/drm/nouveau/core/core/mm.c
+++ b/drivers/gpu/drm/nouveau/core/core/mm.c
@@ -98,6 +98,8 @@ nouveau_mm_head(struct nouveau_mm *mm, u8 type, u32 size_max, u32 size_min,
98 u32 splitoff; 98 u32 splitoff;
99 u32 s, e; 99 u32 s, e;
100 100
101 BUG_ON(!type);
102
101 list_for_each_entry(this, &mm->free, fl_entry) { 103 list_for_each_entry(this, &mm->free, fl_entry) {
102 e = this->offset + this->length; 104 e = this->offset + this->length;
103 s = this->offset; 105 s = this->offset;
@@ -162,6 +164,8 @@ nouveau_mm_tail(struct nouveau_mm *mm, u8 type, u32 size_max, u32 size_min,
162 struct nouveau_mm_node *prev, *this, *next; 164 struct nouveau_mm_node *prev, *this, *next;
163 u32 mask = align - 1; 165 u32 mask = align - 1;
164 166
167 BUG_ON(!type);
168
165 list_for_each_entry_reverse(this, &mm->free, fl_entry) { 169 list_for_each_entry_reverse(this, &mm->free, fl_entry) {
166 u32 e = this->offset + this->length; 170 u32 e = this->offset + this->length;
167 u32 s = this->offset; 171 u32 s = this->offset;
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c b/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c
index 373dbcc523b2..a19e7d79b847 100644
--- a/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c
+++ b/drivers/gpu/drm/nouveau/core/engine/disp/hdanva3.c
@@ -36,6 +36,8 @@ nva3_hda_eld(struct nv50_disp_priv *priv, int or, u8 *data, u32 size)
36 if (data && data[0]) { 36 if (data && data[0]) {
37 for (i = 0; i < size; i++) 37 for (i = 0; i < size; i++)
38 nv_wr32(priv, 0x61c440 + soff, (i << 8) | data[i]); 38 nv_wr32(priv, 0x61c440 + soff, (i << 8) | data[i]);
39 for (; i < 0x60; i++)
40 nv_wr32(priv, 0x61c440 + soff, (i << 8));
39 nv_mask(priv, 0x61c448 + soff, 0x80000003, 0x80000003); 41 nv_mask(priv, 0x61c448 + soff, 0x80000003, 0x80000003);
40 } else 42 } else
41 if (data) { 43 if (data) {
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c b/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c
index dc57e24fc1df..717639386ced 100644
--- a/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c
+++ b/drivers/gpu/drm/nouveau/core/engine/disp/hdanvd0.c
@@ -41,6 +41,8 @@ nvd0_hda_eld(struct nv50_disp_priv *priv, int or, u8 *data, u32 size)
41 if (data && data[0]) { 41 if (data && data[0]) {
42 for (i = 0; i < size; i++) 42 for (i = 0; i < size; i++)
43 nv_wr32(priv, 0x10ec00 + soff, (i << 8) | data[i]); 43 nv_wr32(priv, 0x10ec00 + soff, (i << 8) | data[i]);
44 for (; i < 0x60; i++)
45 nv_wr32(priv, 0x10ec00 + soff, (i << 8));
44 nv_mask(priv, 0x10ec10 + soff, 0x80000003, 0x80000003); 46 nv_mask(priv, 0x10ec10 + soff, 0x80000003, 0x80000003);
45 } else 47 } else
46 if (data) { 48 if (data) {
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c
index ab1e918469a8..526b75242899 100644
--- a/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c
+++ b/drivers/gpu/drm/nouveau/core/engine/disp/sornv50.c
@@ -47,14 +47,8 @@ int
47nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size) 47nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size)
48{ 48{
49 struct nv50_disp_priv *priv = (void *)object->engine; 49 struct nv50_disp_priv *priv = (void *)object->engine;
50 struct nouveau_bios *bios = nouveau_bios(priv);
51 const u16 type = (mthd & NV50_DISP_SOR_MTHD_TYPE) >> 12;
52 const u8 head = (mthd & NV50_DISP_SOR_MTHD_HEAD) >> 3; 50 const u8 head = (mthd & NV50_DISP_SOR_MTHD_HEAD) >> 3;
53 const u8 link = (mthd & NV50_DISP_SOR_MTHD_LINK) >> 2;
54 const u8 or = (mthd & NV50_DISP_SOR_MTHD_OR); 51 const u8 or = (mthd & NV50_DISP_SOR_MTHD_OR);
55 const u16 mask = (0x0100 << head) | (0x0040 << link) | (0x0001 << or);
56 struct dcb_output outp;
57 u8 ver, hdr;
58 u32 data; 52 u32 data;
59 int ret = -EINVAL; 53 int ret = -EINVAL;
60 54
@@ -62,8 +56,6 @@ nv50_sor_mthd(struct nouveau_object *object, u32 mthd, void *args, u32 size)
62 return -EINVAL; 56 return -EINVAL;
63 data = *(u32 *)args; 57 data = *(u32 *)args;
64 58
65 if (type && !dcb_outp_match(bios, type, mask, &ver, &hdr, &outp))
66 return -ENODEV;
67 59
68 switch (mthd & ~0x3f) { 60 switch (mthd & ~0x3f) {
69 case NV50_DISP_SOR_PWR: 61 case NV50_DISP_SOR_PWR:
diff --git a/drivers/gpu/drm/nouveau/core/engine/mpeg/nv31.c b/drivers/gpu/drm/nouveau/core/engine/mpeg/nv31.c
index 49ecbb859b25..c19004301309 100644
--- a/drivers/gpu/drm/nouveau/core/engine/mpeg/nv31.c
+++ b/drivers/gpu/drm/nouveau/core/engine/mpeg/nv31.c
@@ -265,8 +265,8 @@ nv31_mpeg_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
265int 265int
266nv31_mpeg_init(struct nouveau_object *object) 266nv31_mpeg_init(struct nouveau_object *object)
267{ 267{
268 struct nouveau_engine *engine = nv_engine(object->engine); 268 struct nouveau_engine *engine = nv_engine(object);
269 struct nv31_mpeg_priv *priv = (void *)engine; 269 struct nv31_mpeg_priv *priv = (void *)object;
270 struct nouveau_fb *pfb = nouveau_fb(object); 270 struct nouveau_fb *pfb = nouveau_fb(object);
271 int ret, i; 271 int ret, i;
272 272
@@ -284,7 +284,10 @@ nv31_mpeg_init(struct nouveau_object *object)
284 /* PMPEG init */ 284 /* PMPEG init */
285 nv_wr32(priv, 0x00b32c, 0x00000000); 285 nv_wr32(priv, 0x00b32c, 0x00000000);
286 nv_wr32(priv, 0x00b314, 0x00000100); 286 nv_wr32(priv, 0x00b314, 0x00000100);
287 nv_wr32(priv, 0x00b220, nv44_graph_class(priv) ? 0x00000044 : 0x00000031); 287 if (nv_device(priv)->chipset >= 0x40 && nv44_graph_class(priv))
288 nv_wr32(priv, 0x00b220, 0x00000044);
289 else
290 nv_wr32(priv, 0x00b220, 0x00000031);
288 nv_wr32(priv, 0x00b300, 0x02001ec1); 291 nv_wr32(priv, 0x00b300, 0x02001ec1);
289 nv_mask(priv, 0x00b32c, 0x00000001, 0x00000001); 292 nv_mask(priv, 0x00b32c, 0x00000001, 0x00000001);
290 293
diff --git a/drivers/gpu/drm/nouveau/core/engine/mpeg/nv40.c b/drivers/gpu/drm/nouveau/core/engine/mpeg/nv40.c
index f7c581ad1991..dd6196072e9c 100644
--- a/drivers/gpu/drm/nouveau/core/engine/mpeg/nv40.c
+++ b/drivers/gpu/drm/nouveau/core/engine/mpeg/nv40.c
@@ -61,6 +61,7 @@ nv40_mpeg_context_ctor(struct nouveau_object *parent,
61 if (ret) 61 if (ret)
62 return ret; 62 return ret;
63 63
64 nv_wo32(&chan->base.base, 0x78, 0x02001ec1);
64 return 0; 65 return 0;
65} 66}
66 67
diff --git a/drivers/gpu/drm/nouveau/core/engine/xtensa.c b/drivers/gpu/drm/nouveau/core/engine/xtensa.c
index 0639bc59d0a5..5f6ede7c4892 100644
--- a/drivers/gpu/drm/nouveau/core/engine/xtensa.c
+++ b/drivers/gpu/drm/nouveau/core/engine/xtensa.c
@@ -118,7 +118,13 @@ _nouveau_xtensa_init(struct nouveau_object *object)
118 return ret; 118 return ret;
119 } 119 }
120 120
121 ret = nouveau_gpuobj_new(object, NULL, fw->size, 0x1000, 0, 121 if (fw->size > 0x40000) {
122 nv_warn(xtensa, "firmware %s too large\n", name);
123 release_firmware(fw);
124 return -EINVAL;
125 }
126
127 ret = nouveau_gpuobj_new(object, NULL, 0x40000, 0x1000, 0,
122 &xtensa->gpu_fw); 128 &xtensa->gpu_fw);
123 if (ret) { 129 if (ret) {
124 release_firmware(fw); 130 release_firmware(fw);
diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/mc.h b/drivers/gpu/drm/nouveau/core/include/subdev/mc.h
index d5502267c30f..9d2cd2006250 100644
--- a/drivers/gpu/drm/nouveau/core/include/subdev/mc.h
+++ b/drivers/gpu/drm/nouveau/core/include/subdev/mc.h
@@ -20,8 +20,8 @@ nouveau_mc(void *obj)
20 return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_MC]; 20 return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_MC];
21} 21}
22 22
23#define nouveau_mc_create(p,e,o,d) \ 23#define nouveau_mc_create(p,e,o,m,d) \
24 nouveau_mc_create_((p), (e), (o), sizeof(**d), (void **)d) 24 nouveau_mc_create_((p), (e), (o), (m), sizeof(**d), (void **)d)
25#define nouveau_mc_destroy(p) ({ \ 25#define nouveau_mc_destroy(p) ({ \
26 struct nouveau_mc *pmc = (p); _nouveau_mc_dtor(nv_object(pmc)); \ 26 struct nouveau_mc *pmc = (p); _nouveau_mc_dtor(nv_object(pmc)); \
27}) 27})
@@ -33,7 +33,8 @@ nouveau_mc(void *obj)
33}) 33})
34 34
35int nouveau_mc_create_(struct nouveau_object *, struct nouveau_object *, 35int nouveau_mc_create_(struct nouveau_object *, struct nouveau_object *,
36 struct nouveau_oclass *, int, void **); 36 struct nouveau_oclass *, const struct nouveau_mc_intr *,
37 int, void **);
37void _nouveau_mc_dtor(struct nouveau_object *); 38void _nouveau_mc_dtor(struct nouveau_object *);
38int _nouveau_mc_init(struct nouveau_object *); 39int _nouveau_mc_init(struct nouveau_object *);
39int _nouveau_mc_fini(struct nouveau_object *, bool); 40int _nouveau_mc_fini(struct nouveau_object *, bool);
diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/vm.h b/drivers/gpu/drm/nouveau/core/include/subdev/vm.h
index f2e87b105666..fcf57fa309bf 100644
--- a/drivers/gpu/drm/nouveau/core/include/subdev/vm.h
+++ b/drivers/gpu/drm/nouveau/core/include/subdev/vm.h
@@ -55,7 +55,7 @@ struct nouveau_vma {
55struct nouveau_vm { 55struct nouveau_vm {
56 struct nouveau_vmmgr *vmm; 56 struct nouveau_vmmgr *vmm;
57 struct nouveau_mm mm; 57 struct nouveau_mm mm;
58 int refcount; 58 struct kref refcount;
59 59
60 struct list_head pgd_list; 60 struct list_head pgd_list;
61 atomic_t engref[NVDEV_SUBDEV_NR]; 61 atomic_t engref[NVDEV_SUBDEV_NR];
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/priv.h b/drivers/gpu/drm/nouveau/core/subdev/fb/priv.h
index 6c974dd83e8b..db9d6ddde52c 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/fb/priv.h
+++ b/drivers/gpu/drm/nouveau/core/subdev/fb/priv.h
@@ -81,7 +81,7 @@ void nv44_fb_tile_prog(struct nouveau_fb *, int, struct nouveau_fb_tile *);
81void nv46_fb_tile_init(struct nouveau_fb *, int i, u32 addr, u32 size, 81void nv46_fb_tile_init(struct nouveau_fb *, int i, u32 addr, u32 size,
82 u32 pitch, u32 flags, struct nouveau_fb_tile *); 82 u32 pitch, u32 flags, struct nouveau_fb_tile *);
83 83
84void nv50_ram_put(struct nouveau_fb *, struct nouveau_mem **); 84void __nv50_ram_put(struct nouveau_fb *, struct nouveau_mem *);
85extern int nv50_fb_memtype[0x80]; 85extern int nv50_fb_memtype[0x80];
86 86
87#endif 87#endif
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv49.c b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv49.c
index 19e3a9a63a02..ab7ef0ac9e34 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv49.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv49.c
@@ -40,15 +40,15 @@ nv49_ram_create(struct nouveau_object *parent, struct nouveau_object *engine,
40 return ret; 40 return ret;
41 41
42 switch (pfb914 & 0x00000003) { 42 switch (pfb914 & 0x00000003) {
43 case 0x00000000: pfb->ram->type = NV_MEM_TYPE_DDR1; break; 43 case 0x00000000: ram->type = NV_MEM_TYPE_DDR1; break;
44 case 0x00000001: pfb->ram->type = NV_MEM_TYPE_DDR2; break; 44 case 0x00000001: ram->type = NV_MEM_TYPE_DDR2; break;
45 case 0x00000002: pfb->ram->type = NV_MEM_TYPE_GDDR3; break; 45 case 0x00000002: ram->type = NV_MEM_TYPE_GDDR3; break;
46 case 0x00000003: break; 46 case 0x00000003: break;
47 } 47 }
48 48
49 pfb->ram->size = nv_rd32(pfb, 0x10020c) & 0xff000000; 49 ram->size = nv_rd32(pfb, 0x10020c) & 0xff000000;
50 pfb->ram->parts = (nv_rd32(pfb, 0x100200) & 0x00000003) + 1; 50 ram->parts = (nv_rd32(pfb, 0x100200) & 0x00000003) + 1;
51 pfb->ram->tags = nv_rd32(pfb, 0x100320); 51 ram->tags = nv_rd32(pfb, 0x100320);
52 return 0; 52 return 0;
53} 53}
54 54
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv4e.c b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv4e.c
index 7192aa6e5577..63a6aab86028 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv4e.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv4e.c
@@ -38,8 +38,8 @@ nv4e_ram_create(struct nouveau_object *parent, struct nouveau_object *engine,
38 if (ret) 38 if (ret)
39 return ret; 39 return ret;
40 40
41 pfb->ram->size = nv_rd32(pfb, 0x10020c) & 0xff000000; 41 ram->size = nv_rd32(pfb, 0x10020c) & 0xff000000;
42 pfb->ram->type = NV_MEM_TYPE_STOLEN; 42 ram->type = NV_MEM_TYPE_STOLEN;
43 return 0; 43 return 0;
44} 44}
45 45
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv50.c b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv50.c
index af5aa7ee8ad9..903baff77fdd 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv50.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnv50.c
@@ -27,17 +27,10 @@
27#include "priv.h" 27#include "priv.h"
28 28
29void 29void
30nv50_ram_put(struct nouveau_fb *pfb, struct nouveau_mem **pmem) 30__nv50_ram_put(struct nouveau_fb *pfb, struct nouveau_mem *mem)
31{ 31{
32 struct nouveau_mm_node *this; 32 struct nouveau_mm_node *this;
33 struct nouveau_mem *mem;
34 33
35 mem = *pmem;
36 *pmem = NULL;
37 if (unlikely(mem == NULL))
38 return;
39
40 mutex_lock(&pfb->base.mutex);
41 while (!list_empty(&mem->regions)) { 34 while (!list_empty(&mem->regions)) {
42 this = list_first_entry(&mem->regions, typeof(*this), rl_entry); 35 this = list_first_entry(&mem->regions, typeof(*this), rl_entry);
43 36
@@ -46,6 +39,19 @@ nv50_ram_put(struct nouveau_fb *pfb, struct nouveau_mem **pmem)
46 } 39 }
47 40
48 nouveau_mm_free(&pfb->tags, &mem->tag); 41 nouveau_mm_free(&pfb->tags, &mem->tag);
42}
43
44void
45nv50_ram_put(struct nouveau_fb *pfb, struct nouveau_mem **pmem)
46{
47 struct nouveau_mem *mem = *pmem;
48
49 *pmem = NULL;
50 if (unlikely(mem == NULL))
51 return;
52
53 mutex_lock(&pfb->base.mutex);
54 __nv50_ram_put(pfb, mem);
49 mutex_unlock(&pfb->base.mutex); 55 mutex_unlock(&pfb->base.mutex);
50 56
51 kfree(mem); 57 kfree(mem);
diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnvc0.c b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnvc0.c
index 9c3634acbb9d..cf97c4de4a6b 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/fb/ramnvc0.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/fb/ramnvc0.c
@@ -33,11 +33,19 @@ void
33nvc0_ram_put(struct nouveau_fb *pfb, struct nouveau_mem **pmem) 33nvc0_ram_put(struct nouveau_fb *pfb, struct nouveau_mem **pmem)
34{ 34{
35 struct nouveau_ltcg *ltcg = nouveau_ltcg(pfb); 35 struct nouveau_ltcg *ltcg = nouveau_ltcg(pfb);
36 struct nouveau_mem *mem = *pmem;
36 37
37 if ((*pmem)->tag) 38 *pmem = NULL;
38 ltcg->tags_free(ltcg, &(*pmem)->tag); 39 if (unlikely(mem == NULL))
40 return;
39 41
40 nv50_ram_put(pfb, pmem); 42 mutex_lock(&pfb->base.mutex);
43 if (mem->tag)
44 ltcg->tags_free(ltcg, &mem->tag);
45 __nv50_ram_put(pfb, mem);
46 mutex_unlock(&pfb->base.mutex);
47
48 kfree(mem);
41} 49}
42 50
43int 51int
diff --git a/drivers/gpu/drm/nouveau/core/subdev/gpio/nv50.c b/drivers/gpu/drm/nouveau/core/subdev/gpio/nv50.c
index bf489dcf46e2..c4c1d415e7fe 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/gpio/nv50.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/gpio/nv50.c
@@ -103,7 +103,7 @@ nv50_gpio_intr(struct nouveau_subdev *subdev)
103 int i; 103 int i;
104 104
105 intr0 = nv_rd32(priv, 0xe054) & nv_rd32(priv, 0xe050); 105 intr0 = nv_rd32(priv, 0xe054) & nv_rd32(priv, 0xe050);
106 if (nv_device(priv)->chipset >= 0x90) 106 if (nv_device(priv)->chipset > 0x92)
107 intr1 = nv_rd32(priv, 0xe074) & nv_rd32(priv, 0xe070); 107 intr1 = nv_rd32(priv, 0xe074) & nv_rd32(priv, 0xe070);
108 108
109 hi = (intr0 & 0x0000ffff) | (intr1 << 16); 109 hi = (intr0 & 0x0000ffff) | (intr1 << 16);
@@ -115,7 +115,7 @@ nv50_gpio_intr(struct nouveau_subdev *subdev)
115 } 115 }
116 116
117 nv_wr32(priv, 0xe054, intr0); 117 nv_wr32(priv, 0xe054, intr0);
118 if (nv_device(priv)->chipset >= 0x90) 118 if (nv_device(priv)->chipset > 0x92)
119 nv_wr32(priv, 0xe074, intr1); 119 nv_wr32(priv, 0xe074, intr1);
120} 120}
121 121
@@ -146,7 +146,7 @@ nv50_gpio_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
146 int ret; 146 int ret;
147 147
148 ret = nouveau_gpio_create(parent, engine, oclass, 148 ret = nouveau_gpio_create(parent, engine, oclass,
149 nv_device(parent)->chipset >= 0x90 ? 32 : 16, 149 nv_device(parent)->chipset > 0x92 ? 32 : 16,
150 &priv); 150 &priv);
151 *pobject = nv_object(priv); 151 *pobject = nv_object(priv);
152 if (ret) 152 if (ret)
@@ -182,7 +182,7 @@ nv50_gpio_init(struct nouveau_object *object)
182 /* disable, and ack any pending gpio interrupts */ 182 /* disable, and ack any pending gpio interrupts */
183 nv_wr32(priv, 0xe050, 0x00000000); 183 nv_wr32(priv, 0xe050, 0x00000000);
184 nv_wr32(priv, 0xe054, 0xffffffff); 184 nv_wr32(priv, 0xe054, 0xffffffff);
185 if (nv_device(priv)->chipset >= 0x90) { 185 if (nv_device(priv)->chipset > 0x92) {
186 nv_wr32(priv, 0xe070, 0x00000000); 186 nv_wr32(priv, 0xe070, 0x00000000);
187 nv_wr32(priv, 0xe074, 0xffffffff); 187 nv_wr32(priv, 0xe074, 0xffffffff);
188 } 188 }
@@ -195,7 +195,7 @@ nv50_gpio_fini(struct nouveau_object *object, bool suspend)
195{ 195{
196 struct nv50_gpio_priv *priv = (void *)object; 196 struct nv50_gpio_priv *priv = (void *)object;
197 nv_wr32(priv, 0xe050, 0x00000000); 197 nv_wr32(priv, 0xe050, 0x00000000);
198 if (nv_device(priv)->chipset >= 0x90) 198 if (nv_device(priv)->chipset > 0x92)
199 nv_wr32(priv, 0xe070, 0x00000000); 199 nv_wr32(priv, 0xe070, 0x00000000);
200 return nouveau_gpio_fini(&priv->base, suspend); 200 return nouveau_gpio_fini(&priv->base, suspend);
201} 201}
diff --git a/drivers/gpu/drm/nouveau/core/subdev/ltcg/nvc0.c b/drivers/gpu/drm/nouveau/core/subdev/ltcg/nvc0.c
index bcca883018f4..cce65cc56514 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/ltcg/nvc0.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/ltcg/nvc0.c
@@ -30,8 +30,9 @@ struct nvc0_ltcg_priv {
30 struct nouveau_ltcg base; 30 struct nouveau_ltcg base;
31 u32 part_nr; 31 u32 part_nr;
32 u32 subp_nr; 32 u32 subp_nr;
33 struct nouveau_mm tags;
34 u32 num_tags; 33 u32 num_tags;
34 u32 tag_base;
35 struct nouveau_mm tags;
35 struct nouveau_mm_node *tag_ram; 36 struct nouveau_mm_node *tag_ram;
36}; 37};
37 38
@@ -117,10 +118,6 @@ nvc0_ltcg_init_tag_ram(struct nouveau_fb *pfb, struct nvc0_ltcg_priv *priv)
117 u32 tag_size, tag_margin, tag_align; 118 u32 tag_size, tag_margin, tag_align;
118 int ret; 119 int ret;
119 120
120 nv_wr32(priv, 0x17e8d8, priv->part_nr);
121 if (nv_device(pfb)->card_type >= NV_E0)
122 nv_wr32(priv, 0x17e000, priv->part_nr);
123
124 /* tags for 1/4 of VRAM should be enough (8192/4 per GiB of VRAM) */ 121 /* tags for 1/4 of VRAM should be enough (8192/4 per GiB of VRAM) */
125 priv->num_tags = (pfb->ram->size >> 17) / 4; 122 priv->num_tags = (pfb->ram->size >> 17) / 4;
126 if (priv->num_tags > (1 << 17)) 123 if (priv->num_tags > (1 << 17))
@@ -142,7 +139,7 @@ nvc0_ltcg_init_tag_ram(struct nouveau_fb *pfb, struct nvc0_ltcg_priv *priv)
142 tag_size += tag_align; 139 tag_size += tag_align;
143 tag_size = (tag_size + 0xfff) >> 12; /* round up */ 140 tag_size = (tag_size + 0xfff) >> 12; /* round up */
144 141
145 ret = nouveau_mm_tail(&pfb->vram, 0, tag_size, tag_size, 1, 142 ret = nouveau_mm_tail(&pfb->vram, 1, tag_size, tag_size, 1,
146 &priv->tag_ram); 143 &priv->tag_ram);
147 if (ret) { 144 if (ret) {
148 priv->num_tags = 0; 145 priv->num_tags = 0;
@@ -152,7 +149,7 @@ nvc0_ltcg_init_tag_ram(struct nouveau_fb *pfb, struct nvc0_ltcg_priv *priv)
152 tag_base += tag_align - 1; 149 tag_base += tag_align - 1;
153 ret = do_div(tag_base, tag_align); 150 ret = do_div(tag_base, tag_align);
154 151
155 nv_wr32(priv, 0x17e8d4, tag_base); 152 priv->tag_base = tag_base;
156 } 153 }
157 ret = nouveau_mm_init(&priv->tags, 0, priv->num_tags, 1); 154 ret = nouveau_mm_init(&priv->tags, 0, priv->num_tags, 1);
158 155
@@ -182,8 +179,6 @@ nvc0_ltcg_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
182 } 179 }
183 priv->subp_nr = nv_rd32(priv, 0x17e8dc) >> 28; 180 priv->subp_nr = nv_rd32(priv, 0x17e8dc) >> 28;
184 181
185 nv_mask(priv, 0x17e820, 0x00100000, 0x00000000); /* INTR_EN &= ~0x10 */
186
187 ret = nvc0_ltcg_init_tag_ram(pfb, priv); 182 ret = nvc0_ltcg_init_tag_ram(pfb, priv);
188 if (ret) 183 if (ret)
189 return ret; 184 return ret;
@@ -209,13 +204,32 @@ nvc0_ltcg_dtor(struct nouveau_object *object)
209 nouveau_ltcg_destroy(ltcg); 204 nouveau_ltcg_destroy(ltcg);
210} 205}
211 206
207static int
208nvc0_ltcg_init(struct nouveau_object *object)
209{
210 struct nouveau_ltcg *ltcg = (struct nouveau_ltcg *)object;
211 struct nvc0_ltcg_priv *priv = (struct nvc0_ltcg_priv *)ltcg;
212 int ret;
213
214 ret = nouveau_ltcg_init(ltcg);
215 if (ret)
216 return ret;
217
218 nv_mask(priv, 0x17e820, 0x00100000, 0x00000000); /* INTR_EN &= ~0x10 */
219 nv_wr32(priv, 0x17e8d8, priv->part_nr);
220 if (nv_device(ltcg)->card_type >= NV_E0)
221 nv_wr32(priv, 0x17e000, priv->part_nr);
222 nv_wr32(priv, 0x17e8d4, priv->tag_base);
223 return 0;
224}
225
212struct nouveau_oclass 226struct nouveau_oclass
213nvc0_ltcg_oclass = { 227nvc0_ltcg_oclass = {
214 .handle = NV_SUBDEV(LTCG, 0xc0), 228 .handle = NV_SUBDEV(LTCG, 0xc0),
215 .ofuncs = &(struct nouveau_ofuncs) { 229 .ofuncs = &(struct nouveau_ofuncs) {
216 .ctor = nvc0_ltcg_ctor, 230 .ctor = nvc0_ltcg_ctor,
217 .dtor = nvc0_ltcg_dtor, 231 .dtor = nvc0_ltcg_dtor,
218 .init = _nouveau_ltcg_init, 232 .init = nvc0_ltcg_init,
219 .fini = _nouveau_ltcg_fini, 233 .fini = _nouveau_ltcg_fini,
220 }, 234 },
221}; 235};
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/base.c b/drivers/gpu/drm/nouveau/core/subdev/mc/base.c
index 2e7c5fd3de3d..20f9a538746e 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/mc/base.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/mc/base.c
@@ -86,7 +86,9 @@ _nouveau_mc_dtor(struct nouveau_object *object)
86 86
87int 87int
88nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine, 88nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine,
89 struct nouveau_oclass *oclass, int length, void **pobject) 89 struct nouveau_oclass *oclass,
90 const struct nouveau_mc_intr *intr_map,
91 int length, void **pobject)
90{ 92{
91 struct nouveau_device *device = nv_device(parent); 93 struct nouveau_device *device = nv_device(parent);
92 struct nouveau_mc *pmc; 94 struct nouveau_mc *pmc;
@@ -98,6 +100,8 @@ nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine,
98 if (ret) 100 if (ret)
99 return ret; 101 return ret;
100 102
103 pmc->intr_map = intr_map;
104
101 ret = request_irq(device->pdev->irq, nouveau_mc_intr, 105 ret = request_irq(device->pdev->irq, nouveau_mc_intr,
102 IRQF_SHARED, "nouveau", pmc); 106 IRQF_SHARED, "nouveau", pmc);
103 if (ret < 0) 107 if (ret < 0)
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nv04.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nv04.c
index 8c769715227b..64aa4edb0d9d 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/mc/nv04.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nv04.c
@@ -50,12 +50,11 @@ nv04_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
50 struct nv04_mc_priv *priv; 50 struct nv04_mc_priv *priv;
51 int ret; 51 int ret;
52 52
53 ret = nouveau_mc_create(parent, engine, oclass, &priv); 53 ret = nouveau_mc_create(parent, engine, oclass, nv04_mc_intr, &priv);
54 *pobject = nv_object(priv); 54 *pobject = nv_object(priv);
55 if (ret) 55 if (ret)
56 return ret; 56 return ret;
57 57
58 priv->base.intr_map = nv04_mc_intr;
59 return 0; 58 return 0;
60} 59}
61 60
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nv44.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nv44.c
index 51919371810f..d9891782bf28 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/mc/nv44.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nv44.c
@@ -36,12 +36,11 @@ nv44_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
36 struct nv44_mc_priv *priv; 36 struct nv44_mc_priv *priv;
37 int ret; 37 int ret;
38 38
39 ret = nouveau_mc_create(parent, engine, oclass, &priv); 39 ret = nouveau_mc_create(parent, engine, oclass, nv04_mc_intr, &priv);
40 *pobject = nv_object(priv); 40 *pobject = nv_object(priv);
41 if (ret) 41 if (ret)
42 return ret; 42 return ret;
43 43
44 priv->base.intr_map = nv04_mc_intr;
45 return 0; 44 return 0;
46} 45}
47 46
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nv50.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nv50.c
index 0cb322a5e72c..2b1afe225db8 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/mc/nv50.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nv50.c
@@ -41,7 +41,7 @@ nv50_mc_intr[] = {
41 { 0x04000000, NVDEV_ENGINE_DISP }, 41 { 0x04000000, NVDEV_ENGINE_DISP },
42 { 0x10000000, NVDEV_SUBDEV_BUS }, 42 { 0x10000000, NVDEV_SUBDEV_BUS },
43 { 0x80000000, NVDEV_ENGINE_SW }, 43 { 0x80000000, NVDEV_ENGINE_SW },
44 { 0x0000d101, NVDEV_SUBDEV_FB }, 44 { 0x0002d101, NVDEV_SUBDEV_FB },
45 {}, 45 {},
46}; 46};
47 47
@@ -53,12 +53,11 @@ nv50_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
53 struct nv50_mc_priv *priv; 53 struct nv50_mc_priv *priv;
54 int ret; 54 int ret;
55 55
56 ret = nouveau_mc_create(parent, engine, oclass, &priv); 56 ret = nouveau_mc_create(parent, engine, oclass, nv50_mc_intr, &priv);
57 *pobject = nv_object(priv); 57 *pobject = nv_object(priv);
58 if (ret) 58 if (ret)
59 return ret; 59 return ret;
60 60
61 priv->base.intr_map = nv50_mc_intr;
62 return 0; 61 return 0;
63} 62}
64 63
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c
index e82fd21b5041..0d57b4d3e001 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c
@@ -54,12 +54,11 @@ nv98_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
54 struct nv98_mc_priv *priv; 54 struct nv98_mc_priv *priv;
55 int ret; 55 int ret;
56 56
57 ret = nouveau_mc_create(parent, engine, oclass, &priv); 57 ret = nouveau_mc_create(parent, engine, oclass, nv98_mc_intr, &priv);
58 *pobject = nv_object(priv); 58 *pobject = nv_object(priv);
59 if (ret) 59 if (ret)
60 return ret; 60 return ret;
61 61
62 priv->base.intr_map = nv98_mc_intr;
63 return 0; 62 return 0;
64} 63}
65 64
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nvc0.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nvc0.c
index c5da3babbc62..104175c5a2dd 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/mc/nvc0.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nvc0.c
@@ -57,12 +57,11 @@ nvc0_mc_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
57 struct nvc0_mc_priv *priv; 57 struct nvc0_mc_priv *priv;
58 int ret; 58 int ret;
59 59
60 ret = nouveau_mc_create(parent, engine, oclass, &priv); 60 ret = nouveau_mc_create(parent, engine, oclass, nvc0_mc_intr, &priv);
61 *pobject = nv_object(priv); 61 *pobject = nv_object(priv);
62 if (ret) 62 if (ret)
63 return ret; 63 return ret;
64 64
65 priv->base.intr_map = nvc0_mc_intr;
66 return 0; 65 return 0;
67} 66}
68 67
diff --git a/drivers/gpu/drm/nouveau/core/subdev/vm/base.c b/drivers/gpu/drm/nouveau/core/subdev/vm/base.c
index 67fcb6c852ac..ef3133e7575c 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/vm/base.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/vm/base.c
@@ -361,7 +361,7 @@ nouveau_vm_create(struct nouveau_vmmgr *vmm, u64 offset, u64 length,
361 361
362 INIT_LIST_HEAD(&vm->pgd_list); 362 INIT_LIST_HEAD(&vm->pgd_list);
363 vm->vmm = vmm; 363 vm->vmm = vmm;
364 vm->refcount = 1; 364 kref_init(&vm->refcount);
365 vm->fpde = offset >> (vmm->pgt_bits + 12); 365 vm->fpde = offset >> (vmm->pgt_bits + 12);
366 vm->lpde = (offset + length - 1) >> (vmm->pgt_bits + 12); 366 vm->lpde = (offset + length - 1) >> (vmm->pgt_bits + 12);
367 367
@@ -441,8 +441,9 @@ nouveau_vm_unlink(struct nouveau_vm *vm, struct nouveau_gpuobj *mpgd)
441} 441}
442 442
443static void 443static void
444nouveau_vm_del(struct nouveau_vm *vm) 444nouveau_vm_del(struct kref *kref)
445{ 445{
446 struct nouveau_vm *vm = container_of(kref, typeof(*vm), refcount);
446 struct nouveau_vm_pgd *vpgd, *tmp; 447 struct nouveau_vm_pgd *vpgd, *tmp;
447 448
448 list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) { 449 list_for_each_entry_safe(vpgd, tmp, &vm->pgd_list, head) {
@@ -458,27 +459,19 @@ int
458nouveau_vm_ref(struct nouveau_vm *ref, struct nouveau_vm **ptr, 459nouveau_vm_ref(struct nouveau_vm *ref, struct nouveau_vm **ptr,
459 struct nouveau_gpuobj *pgd) 460 struct nouveau_gpuobj *pgd)
460{ 461{
461 struct nouveau_vm *vm; 462 if (ref) {
462 int ret; 463 int ret = nouveau_vm_link(ref, pgd);
463
464 vm = ref;
465 if (vm) {
466 ret = nouveau_vm_link(vm, pgd);
467 if (ret) 464 if (ret)
468 return ret; 465 return ret;
469 466
470 vm->refcount++; 467 kref_get(&ref->refcount);
471 } 468 }
472 469
473 vm = *ptr; 470 if (*ptr) {
474 *ptr = ref; 471 nouveau_vm_unlink(*ptr, pgd);
475 472 kref_put(&(*ptr)->refcount, nouveau_vm_del);
476 if (vm) {
477 nouveau_vm_unlink(vm, pgd);
478
479 if (--vm->refcount == 0)
480 nouveau_vm_del(vm);
481 } 473 }
482 474
475 *ptr = ref;
483 return 0; 476 return 0;
484} 477}
diff --git a/drivers/gpu/drm/nouveau/dispnv04/crtc.c b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
index 6413552df21c..d4fbf11360fe 100644
--- a/drivers/gpu/drm/nouveau/dispnv04/crtc.c
+++ b/drivers/gpu/drm/nouveau/dispnv04/crtc.c
@@ -607,6 +607,24 @@ nv_crtc_mode_set_regs(struct drm_crtc *crtc, struct drm_display_mode * mode)
607 regp->ramdac_a34 = 0x1; 607 regp->ramdac_a34 = 0x1;
608} 608}
609 609
610static int
611nv_crtc_swap_fbs(struct drm_crtc *crtc, struct drm_framebuffer *old_fb)
612{
613 struct nv04_display *disp = nv04_display(crtc->dev);
614 struct nouveau_framebuffer *nvfb = nouveau_framebuffer(crtc->fb);
615 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
616 int ret;
617
618 ret = nouveau_bo_pin(nvfb->nvbo, TTM_PL_FLAG_VRAM);
619 if (ret == 0) {
620 if (disp->image[nv_crtc->index])
621 nouveau_bo_unpin(disp->image[nv_crtc->index]);
622 nouveau_bo_ref(nvfb->nvbo, &disp->image[nv_crtc->index]);
623 }
624
625 return ret;
626}
627
610/** 628/**
611 * Sets up registers for the given mode/adjusted_mode pair. 629 * Sets up registers for the given mode/adjusted_mode pair.
612 * 630 *
@@ -623,10 +641,15 @@ nv_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
623 struct drm_device *dev = crtc->dev; 641 struct drm_device *dev = crtc->dev;
624 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); 642 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
625 struct nouveau_drm *drm = nouveau_drm(dev); 643 struct nouveau_drm *drm = nouveau_drm(dev);
644 int ret;
626 645
627 NV_DEBUG(drm, "CTRC mode on CRTC %d:\n", nv_crtc->index); 646 NV_DEBUG(drm, "CTRC mode on CRTC %d:\n", nv_crtc->index);
628 drm_mode_debug_printmodeline(adjusted_mode); 647 drm_mode_debug_printmodeline(adjusted_mode);
629 648
649 ret = nv_crtc_swap_fbs(crtc, old_fb);
650 if (ret)
651 return ret;
652
630 /* unlock must come after turning off FP_TG_CONTROL in output_prepare */ 653 /* unlock must come after turning off FP_TG_CONTROL in output_prepare */
631 nv_lock_vga_crtc_shadow(dev, nv_crtc->index, -1); 654 nv_lock_vga_crtc_shadow(dev, nv_crtc->index, -1);
632 655
@@ -723,6 +746,7 @@ static void nv_crtc_commit(struct drm_crtc *crtc)
723 746
724static void nv_crtc_destroy(struct drm_crtc *crtc) 747static void nv_crtc_destroy(struct drm_crtc *crtc)
725{ 748{
749 struct nv04_display *disp = nv04_display(crtc->dev);
726 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc); 750 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
727 751
728 if (!nv_crtc) 752 if (!nv_crtc)
@@ -730,6 +754,10 @@ static void nv_crtc_destroy(struct drm_crtc *crtc)
730 754
731 drm_crtc_cleanup(crtc); 755 drm_crtc_cleanup(crtc);
732 756
757 if (disp->image[nv_crtc->index])
758 nouveau_bo_unpin(disp->image[nv_crtc->index]);
759 nouveau_bo_ref(NULL, &disp->image[nv_crtc->index]);
760
733 nouveau_bo_unmap(nv_crtc->cursor.nvbo); 761 nouveau_bo_unmap(nv_crtc->cursor.nvbo);
734 nouveau_bo_unpin(nv_crtc->cursor.nvbo); 762 nouveau_bo_unpin(nv_crtc->cursor.nvbo);
735 nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo); 763 nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo);
@@ -755,6 +783,16 @@ nv_crtc_gamma_load(struct drm_crtc *crtc)
755} 783}
756 784
757static void 785static void
786nv_crtc_disable(struct drm_crtc *crtc)
787{
788 struct nv04_display *disp = nv04_display(crtc->dev);
789 struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
790 if (disp->image[nv_crtc->index])
791 nouveau_bo_unpin(disp->image[nv_crtc->index]);
792 nouveau_bo_ref(NULL, &disp->image[nv_crtc->index]);
793}
794
795static void
758nv_crtc_gamma_set(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b, uint32_t start, 796nv_crtc_gamma_set(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b, uint32_t start,
759 uint32_t size) 797 uint32_t size)
760{ 798{
@@ -792,7 +830,6 @@ nv04_crtc_do_mode_set_base(struct drm_crtc *crtc,
792 struct drm_framebuffer *drm_fb; 830 struct drm_framebuffer *drm_fb;
793 struct nouveau_framebuffer *fb; 831 struct nouveau_framebuffer *fb;
794 int arb_burst, arb_lwm; 832 int arb_burst, arb_lwm;
795 int ret;
796 833
797 NV_DEBUG(drm, "index %d\n", nv_crtc->index); 834 NV_DEBUG(drm, "index %d\n", nv_crtc->index);
798 835
@@ -802,10 +839,8 @@ nv04_crtc_do_mode_set_base(struct drm_crtc *crtc,
802 return 0; 839 return 0;
803 } 840 }
804 841
805
806 /* If atomic, we want to switch to the fb we were passed, so 842 /* If atomic, we want to switch to the fb we were passed, so
807 * now we update pointers to do that. (We don't pin; just 843 * now we update pointers to do that.
808 * assume we're already pinned and update the base address.)
809 */ 844 */
810 if (atomic) { 845 if (atomic) {
811 drm_fb = passed_fb; 846 drm_fb = passed_fb;
@@ -813,17 +848,6 @@ nv04_crtc_do_mode_set_base(struct drm_crtc *crtc,
813 } else { 848 } else {
814 drm_fb = crtc->fb; 849 drm_fb = crtc->fb;
815 fb = nouveau_framebuffer(crtc->fb); 850 fb = nouveau_framebuffer(crtc->fb);
816 /* If not atomic, we can go ahead and pin, and unpin the
817 * old fb we were passed.
818 */
819 ret = nouveau_bo_pin(fb->nvbo, TTM_PL_FLAG_VRAM);
820 if (ret)
821 return ret;
822
823 if (passed_fb) {
824 struct nouveau_framebuffer *ofb = nouveau_framebuffer(passed_fb);
825 nouveau_bo_unpin(ofb->nvbo);
826 }
827 } 851 }
828 852
829 nv_crtc->fb.offset = fb->nvbo->bo.offset; 853 nv_crtc->fb.offset = fb->nvbo->bo.offset;
@@ -878,6 +902,9 @@ static int
878nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, 902nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
879 struct drm_framebuffer *old_fb) 903 struct drm_framebuffer *old_fb)
880{ 904{
905 int ret = nv_crtc_swap_fbs(crtc, old_fb);
906 if (ret)
907 return ret;
881 return nv04_crtc_do_mode_set_base(crtc, old_fb, x, y, false); 908 return nv04_crtc_do_mode_set_base(crtc, old_fb, x, y, false);
882} 909}
883 910
@@ -1074,6 +1101,7 @@ static const struct drm_crtc_helper_funcs nv04_crtc_helper_funcs = {
1074 .mode_set_base = nv04_crtc_mode_set_base, 1101 .mode_set_base = nv04_crtc_mode_set_base,
1075 .mode_set_base_atomic = nv04_crtc_mode_set_base_atomic, 1102 .mode_set_base_atomic = nv04_crtc_mode_set_base_atomic,
1076 .load_lut = nv_crtc_gamma_load, 1103 .load_lut = nv_crtc_gamma_load,
1104 .disable = nv_crtc_disable,
1077}; 1105};
1078 1106
1079int 1107int
diff --git a/drivers/gpu/drm/nouveau/dispnv04/disp.h b/drivers/gpu/drm/nouveau/dispnv04/disp.h
index a0a031dad13f..9928187f0a7d 100644
--- a/drivers/gpu/drm/nouveau/dispnv04/disp.h
+++ b/drivers/gpu/drm/nouveau/dispnv04/disp.h
@@ -81,6 +81,7 @@ struct nv04_display {
81 uint32_t saved_vga_font[4][16384]; 81 uint32_t saved_vga_font[4][16384];
82 uint32_t dac_users[4]; 82 uint32_t dac_users[4];
83 struct nouveau_object *core; 83 struct nouveau_object *core;
84 struct nouveau_bo *image[2];
84}; 85};
85 86
86static inline struct nv04_display * 87static inline struct nv04_display *
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index e4444bacd0b2..755c38d06271 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -198,7 +198,12 @@ nouveau_bo_new(struct drm_device *dev, int size, int align,
198 size_t acc_size; 198 size_t acc_size;
199 int ret; 199 int ret;
200 int type = ttm_bo_type_device; 200 int type = ttm_bo_type_device;
201 int max_size = INT_MAX & ~((1 << drm->client.base.vm->vmm->lpg_shift) - 1); 201 int lpg_shift = 12;
202 int max_size;
203
204 if (drm->client.base.vm)
205 lpg_shift = drm->client.base.vm->vmm->lpg_shift;
206 max_size = INT_MAX & ~((1 << lpg_shift) - 1);
202 207
203 if (size <= 0 || size > max_size) { 208 if (size <= 0 || size > max_size) {
204 nv_warn(drm, "skipped size %x\n", (u32)size); 209 nv_warn(drm, "skipped size %x\n", (u32)size);
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
index 44202bf7b819..77ffded68837 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -580,6 +580,9 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
580 ret = nv50_display_flip_next(crtc, fb, chan, 0); 580 ret = nv50_display_flip_next(crtc, fb, chan, 0);
581 if (ret) 581 if (ret)
582 goto fail_unreserve; 582 goto fail_unreserve;
583 } else {
584 struct nv04_display *dispnv04 = nv04_display(dev);
585 nouveau_bo_ref(new_bo, &dispnv04->image[nouveau_crtc(crtc)->index]);
583 } 586 }
584 587
585 ret = nouveau_page_flip_emit(chan, old_bo, new_bo, s, &fence); 588 ret = nouveau_page_flip_emit(chan, old_bo, new_bo, s, &fence);
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
index 4c1bc061fae2..8f6d63d7edd3 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
@@ -398,7 +398,8 @@ void
398nouveau_fbcon_output_poll_changed(struct drm_device *dev) 398nouveau_fbcon_output_poll_changed(struct drm_device *dev)
399{ 399{
400 struct nouveau_drm *drm = nouveau_drm(dev); 400 struct nouveau_drm *drm = nouveau_drm(dev);
401 drm_fb_helper_hotplug_event(&drm->fbcon->helper); 401 if (drm->fbcon)
402 drm_fb_helper_hotplug_event(&drm->fbcon->helper);
402} 403}
403 404
404static int 405static int
diff --git a/drivers/gpu/drm/nouveau/nv17_fence.c b/drivers/gpu/drm/nouveau/nv17_fence.c
index 8e47a9bae8c3..22aa9963ea6f 100644
--- a/drivers/gpu/drm/nouveau/nv17_fence.c
+++ b/drivers/gpu/drm/nouveau/nv17_fence.c
@@ -76,7 +76,7 @@ nv17_fence_context_new(struct nouveau_channel *chan)
76 struct ttm_mem_reg *mem = &priv->bo->bo.mem; 76 struct ttm_mem_reg *mem = &priv->bo->bo.mem;
77 struct nouveau_object *object; 77 struct nouveau_object *object;
78 u32 start = mem->start * PAGE_SIZE; 78 u32 start = mem->start * PAGE_SIZE;
79 u32 limit = mem->start + mem->size - 1; 79 u32 limit = start + mem->size - 1;
80 int ret = 0; 80 int ret = 0;
81 81
82 fctx = chan->fence = kzalloc(sizeof(*fctx), GFP_KERNEL); 82 fctx = chan->fence = kzalloc(sizeof(*fctx), GFP_KERNEL);
diff --git a/drivers/gpu/drm/nouveau/nv40_pm.c b/drivers/gpu/drm/nouveau/nv40_pm.c
index 3af5bcd0b203..625f80d53dc2 100644
--- a/drivers/gpu/drm/nouveau/nv40_pm.c
+++ b/drivers/gpu/drm/nouveau/nv40_pm.c
@@ -131,7 +131,7 @@ nv40_calc_pll(struct drm_device *dev, u32 reg, struct nvbios_pll *pll,
131 if (clk < pll->vco1.max_freq) 131 if (clk < pll->vco1.max_freq)
132 pll->vco2.max_freq = 0; 132 pll->vco2.max_freq = 0;
133 133
134 pclk->pll_calc(pclk, pll, clk, &coef); 134 ret = pclk->pll_calc(pclk, pll, clk, &coef);
135 if (ret == 0) 135 if (ret == 0)
136 return -ERANGE; 136 return -ERANGE;
137 137
diff --git a/drivers/gpu/drm/nouveau/nv50_fence.c b/drivers/gpu/drm/nouveau/nv50_fence.c
index f9701e567db8..0ee363840035 100644
--- a/drivers/gpu/drm/nouveau/nv50_fence.c
+++ b/drivers/gpu/drm/nouveau/nv50_fence.c
@@ -39,6 +39,8 @@ nv50_fence_context_new(struct nouveau_channel *chan)
39 struct nv10_fence_chan *fctx; 39 struct nv10_fence_chan *fctx;
40 struct ttm_mem_reg *mem = &priv->bo->bo.mem; 40 struct ttm_mem_reg *mem = &priv->bo->bo.mem;
41 struct nouveau_object *object; 41 struct nouveau_object *object;
42 u32 start = mem->start * PAGE_SIZE;
43 u32 limit = start + mem->size - 1;
42 int ret, i; 44 int ret, i;
43 45
44 fctx = chan->fence = kzalloc(sizeof(*fctx), GFP_KERNEL); 46 fctx = chan->fence = kzalloc(sizeof(*fctx), GFP_KERNEL);
@@ -51,26 +53,28 @@ nv50_fence_context_new(struct nouveau_channel *chan)
51 fctx->base.sync = nv17_fence_sync; 53 fctx->base.sync = nv17_fence_sync;
52 54
53 ret = nouveau_object_new(nv_object(chan->cli), chan->handle, 55 ret = nouveau_object_new(nv_object(chan->cli), chan->handle,
54 NvSema, 0x0002, 56 NvSema, 0x003d,
55 &(struct nv_dma_class) { 57 &(struct nv_dma_class) {
56 .flags = NV_DMA_TARGET_VRAM | 58 .flags = NV_DMA_TARGET_VRAM |
57 NV_DMA_ACCESS_RDWR, 59 NV_DMA_ACCESS_RDWR,
58 .start = mem->start * PAGE_SIZE, 60 .start = start,
59 .limit = mem->size - 1, 61 .limit = limit,
60 }, sizeof(struct nv_dma_class), 62 }, sizeof(struct nv_dma_class),
61 &object); 63 &object);
62 64
63 /* dma objects for display sync channel semaphore blocks */ 65 /* dma objects for display sync channel semaphore blocks */
64 for (i = 0; !ret && i < dev->mode_config.num_crtc; i++) { 66 for (i = 0; !ret && i < dev->mode_config.num_crtc; i++) {
65 struct nouveau_bo *bo = nv50_display_crtc_sema(dev, i); 67 struct nouveau_bo *bo = nv50_display_crtc_sema(dev, i);
68 u32 start = bo->bo.mem.start * PAGE_SIZE;
69 u32 limit = start + bo->bo.mem.size - 1;
66 70
67 ret = nouveau_object_new(nv_object(chan->cli), chan->handle, 71 ret = nouveau_object_new(nv_object(chan->cli), chan->handle,
68 NvEvoSema0 + i, 0x003d, 72 NvEvoSema0 + i, 0x003d,
69 &(struct nv_dma_class) { 73 &(struct nv_dma_class) {
70 .flags = NV_DMA_TARGET_VRAM | 74 .flags = NV_DMA_TARGET_VRAM |
71 NV_DMA_ACCESS_RDWR, 75 NV_DMA_ACCESS_RDWR,
72 .start = bo->bo.offset, 76 .start = start,
73 .limit = bo->bo.offset + 0xfff, 77 .limit = limit,
74 }, sizeof(struct nv_dma_class), 78 }, sizeof(struct nv_dma_class),
75 &object); 79 &object);
76 } 80 }
diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile
index c3df52c1a60c..306364a1ecda 100644
--- a/drivers/gpu/drm/radeon/Makefile
+++ b/drivers/gpu/drm/radeon/Makefile
@@ -72,14 +72,32 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \
72 radeon_cs.o radeon_bios.o radeon_benchmark.o r100.o r300.o r420.o \ 72 radeon_cs.o radeon_bios.o radeon_benchmark.o r100.o r300.o r420.o \
73 rs400.o rs600.o rs690.o rv515.o r520.o r600.o rv770.o radeon_test.o \ 73 rs400.o rs600.o rs690.o rv515.o r520.o r600.o rv770.o radeon_test.o \
74 r200.o radeon_legacy_tv.o r600_cs.o r600_blit_shaders.o \ 74 r200.o radeon_legacy_tv.o r600_cs.o r600_blit_shaders.o \
75 r600_blit_kms.o radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o \ 75 radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o \
76 evergreen.o evergreen_cs.o evergreen_blit_shaders.o evergreen_blit_kms.o \ 76 evergreen.o evergreen_cs.o evergreen_blit_shaders.o \
77 evergreen_hdmi.o radeon_trace_points.o ni.o cayman_blit_shaders.o \ 77 evergreen_hdmi.o radeon_trace_points.o ni.o cayman_blit_shaders.o \
78 atombios_encoders.o radeon_semaphore.o radeon_sa.o atombios_i2c.o si.o \ 78 atombios_encoders.o radeon_semaphore.o radeon_sa.o atombios_i2c.o si.o \
79 si_blit_shaders.o radeon_prime.o radeon_uvd.o cik.o cik_blit_shaders.o \ 79 si_blit_shaders.o radeon_prime.o radeon_uvd.o cik.o cik_blit_shaders.o \
80 r600_dpm.o rs780_dpm.o rv6xx_dpm.o rv770_dpm.o rv730_dpm.o rv740_dpm.o \ 80 r600_dpm.o rs780_dpm.o rv6xx_dpm.o rv770_dpm.o rv730_dpm.o rv740_dpm.o \
81 rv770_smc.o cypress_dpm.o btc_dpm.o sumo_dpm.o sumo_smc.o trinity_dpm.o \ 81 rv770_smc.o cypress_dpm.o btc_dpm.o sumo_dpm.o sumo_smc.o trinity_dpm.o \
82 trinity_smc.o ni_dpm.o si_smc.o si_dpm.o 82 trinity_smc.o ni_dpm.o si_smc.o si_dpm.o kv_smc.o kv_dpm.o ci_smc.o \
83 ci_dpm.o dce6_afmt.o
84
85# add async DMA block
86radeon-y += \
87 r600_dma.o \
88 rv770_dma.o \
89 evergreen_dma.o \
90 ni_dma.o \
91 si_dma.o \
92 cik_sdma.o \
93
94# add UVD block
95radeon-y += \
96 radeon_uvd.o \
97 uvd_v1_0.o \
98 uvd_v2_2.o \
99 uvd_v3_1.o \
100 uvd_v4_2.o
83 101
84radeon-$(CONFIG_COMPAT) += radeon_ioc32.o 102radeon-$(CONFIG_COMPAT) += radeon_ioc32.o
85radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o 103radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c
index fb441a790f3d..15da7ef344a4 100644
--- a/drivers/gpu/drm/radeon/atom.c
+++ b/drivers/gpu/drm/radeon/atom.c
@@ -1222,12 +1222,17 @@ int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params)
1222 int r; 1222 int r;
1223 1223
1224 mutex_lock(&ctx->mutex); 1224 mutex_lock(&ctx->mutex);
1225 /* reset data block */
1226 ctx->data_block = 0;
1225 /* reset reg block */ 1227 /* reset reg block */
1226 ctx->reg_block = 0; 1228 ctx->reg_block = 0;
1227 /* reset fb window */ 1229 /* reset fb window */
1228 ctx->fb_base = 0; 1230 ctx->fb_base = 0;
1229 /* reset io mode */ 1231 /* reset io mode */
1230 ctx->io_mode = ATOM_IO_MM; 1232 ctx->io_mode = ATOM_IO_MM;
1233 /* reset divmul */
1234 ctx->divmul[0] = 0;
1235 ctx->divmul[1] = 0;
1231 r = atom_execute_table_locked(ctx, index, params); 1236 r = atom_execute_table_locked(ctx, index, params);
1232 mutex_unlock(&ctx->mutex); 1237 mutex_unlock(&ctx->mutex);
1233 return r; 1238 return r;
diff --git a/drivers/gpu/drm/radeon/atombios.h b/drivers/gpu/drm/radeon/atombios.h
index 16b120c3f144..af10f8571d87 100644
--- a/drivers/gpu/drm/radeon/atombios.h
+++ b/drivers/gpu/drm/radeon/atombios.h
@@ -7661,618 +7661,6 @@ typedef struct _ATOM_POWERPLAY_INFO_V3
7661 ATOM_POWERMODE_INFO_V3 asPowerPlayInfo[ATOM_MAX_NUMBEROF_POWER_BLOCK]; 7661 ATOM_POWERMODE_INFO_V3 asPowerPlayInfo[ATOM_MAX_NUMBEROF_POWER_BLOCK];
7662}ATOM_POWERPLAY_INFO_V3; 7662}ATOM_POWERPLAY_INFO_V3;
7663 7663
7664/* New PPlib */
7665/**************************************************************************/
7666typedef struct _ATOM_PPLIB_THERMALCONTROLLER
7667
7668{
7669 UCHAR ucType; // one of ATOM_PP_THERMALCONTROLLER_*
7670 UCHAR ucI2cLine; // as interpreted by DAL I2C
7671 UCHAR ucI2cAddress;
7672 UCHAR ucFanParameters; // Fan Control Parameters.
7673 UCHAR ucFanMinRPM; // Fan Minimum RPM (hundreds) -- for display purposes only.
7674 UCHAR ucFanMaxRPM; // Fan Maximum RPM (hundreds) -- for display purposes only.
7675 UCHAR ucReserved; // ----
7676 UCHAR ucFlags; // to be defined
7677} ATOM_PPLIB_THERMALCONTROLLER;
7678
7679#define ATOM_PP_FANPARAMETERS_TACHOMETER_PULSES_PER_REVOLUTION_MASK 0x0f
7680#define ATOM_PP_FANPARAMETERS_NOFAN 0x80 // No fan is connected to this controller.
7681
7682#define ATOM_PP_THERMALCONTROLLER_NONE 0
7683#define ATOM_PP_THERMALCONTROLLER_LM63 1 // Not used by PPLib
7684#define ATOM_PP_THERMALCONTROLLER_ADM1032 2 // Not used by PPLib
7685#define ATOM_PP_THERMALCONTROLLER_ADM1030 3 // Not used by PPLib
7686#define ATOM_PP_THERMALCONTROLLER_MUA6649 4 // Not used by PPLib
7687#define ATOM_PP_THERMALCONTROLLER_LM64 5
7688#define ATOM_PP_THERMALCONTROLLER_F75375 6 // Not used by PPLib
7689#define ATOM_PP_THERMALCONTROLLER_RV6xx 7
7690#define ATOM_PP_THERMALCONTROLLER_RV770 8
7691#define ATOM_PP_THERMALCONTROLLER_ADT7473 9
7692#define ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO 11
7693#define ATOM_PP_THERMALCONTROLLER_EVERGREEN 12
7694#define ATOM_PP_THERMALCONTROLLER_EMC2103 13 /* 0x0D */ // Only fan control will be implemented, do NOT show this in PPGen.
7695#define ATOM_PP_THERMALCONTROLLER_SUMO 14 /* 0x0E */ // Sumo type, used internally
7696#define ATOM_PP_THERMALCONTROLLER_NISLANDS 15
7697#define ATOM_PP_THERMALCONTROLLER_SISLANDS 16
7698#define ATOM_PP_THERMALCONTROLLER_LM96163 17
7699#define ATOM_PP_THERMALCONTROLLER_CISLANDS 18
7700
7701// Thermal controller 'combo type' to use an external controller for Fan control and an internal controller for thermal.
7702// We probably should reserve the bit 0x80 for this use.
7703// To keep the number of these types low we should also use the same code for all ASICs (i.e. do not distinguish RV6xx and RV7xx Internal here).
7704// The driver can pick the correct internal controller based on the ASIC.
7705
7706#define ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL 0x89 // ADT7473 Fan Control + Internal Thermal Controller
7707#define ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL 0x8D // EMC2103 Fan Control + Internal Thermal Controller
7708
7709typedef struct _ATOM_PPLIB_STATE
7710{
7711 UCHAR ucNonClockStateIndex;
7712 UCHAR ucClockStateIndices[1]; // variable-sized
7713} ATOM_PPLIB_STATE;
7714
7715
7716typedef struct _ATOM_PPLIB_FANTABLE
7717{
7718 UCHAR ucFanTableFormat; // Change this if the table format changes or version changes so that the other fields are not the same.
7719 UCHAR ucTHyst; // Temperature hysteresis. Integer.
7720 USHORT usTMin; // The temperature, in 0.01 centigrades, below which we just run at a minimal PWM.
7721 USHORT usTMed; // The middle temperature where we change slopes.
7722 USHORT usTHigh; // The high point above TMed for adjusting the second slope.
7723 USHORT usPWMMin; // The minimum PWM value in percent (0.01% increments).
7724 USHORT usPWMMed; // The PWM value (in percent) at TMed.
7725 USHORT usPWMHigh; // The PWM value at THigh.
7726} ATOM_PPLIB_FANTABLE;
7727
7728typedef struct _ATOM_PPLIB_FANTABLE2
7729{
7730 ATOM_PPLIB_FANTABLE basicTable;
7731 USHORT usTMax; // The max temperature
7732} ATOM_PPLIB_FANTABLE2;
7733
7734typedef struct _ATOM_PPLIB_EXTENDEDHEADER
7735{
7736 USHORT usSize;
7737 ULONG ulMaxEngineClock; // For Overdrive.
7738 ULONG ulMaxMemoryClock; // For Overdrive.
7739 // Add extra system parameters here, always adjust size to include all fields.
7740 USHORT usVCETableOffset; //points to ATOM_PPLIB_VCE_Table
7741 USHORT usUVDTableOffset; //points to ATOM_PPLIB_UVD_Table
7742 USHORT usSAMUTableOffset; //points to ATOM_PPLIB_SAMU_Table
7743 USHORT usPPMTableOffset; //points to ATOM_PPLIB_PPM_Table
7744} ATOM_PPLIB_EXTENDEDHEADER;
7745
7746//// ATOM_PPLIB_POWERPLAYTABLE::ulPlatformCaps
7747#define ATOM_PP_PLATFORM_CAP_BACKBIAS 1
7748#define ATOM_PP_PLATFORM_CAP_POWERPLAY 2
7749#define ATOM_PP_PLATFORM_CAP_SBIOSPOWERSOURCE 4
7750#define ATOM_PP_PLATFORM_CAP_ASPM_L0s 8
7751#define ATOM_PP_PLATFORM_CAP_ASPM_L1 16
7752#define ATOM_PP_PLATFORM_CAP_HARDWAREDC 32
7753#define ATOM_PP_PLATFORM_CAP_GEMINIPRIMARY 64
7754#define ATOM_PP_PLATFORM_CAP_STEPVDDC 128
7755#define ATOM_PP_PLATFORM_CAP_VOLTAGECONTROL 256
7756#define ATOM_PP_PLATFORM_CAP_SIDEPORTCONTROL 512
7757#define ATOM_PP_PLATFORM_CAP_TURNOFFPLL_ASPML1 1024
7758#define ATOM_PP_PLATFORM_CAP_HTLINKCONTROL 2048
7759#define ATOM_PP_PLATFORM_CAP_MVDDCONTROL 4096
7760#define ATOM_PP_PLATFORM_CAP_GOTO_BOOT_ON_ALERT 0x2000 // Go to boot state on alerts, e.g. on an AC->DC transition.
7761#define ATOM_PP_PLATFORM_CAP_DONT_WAIT_FOR_VBLANK_ON_ALERT 0x4000 // Do NOT wait for VBLANK during an alert (e.g. AC->DC transition).
7762#define ATOM_PP_PLATFORM_CAP_VDDCI_CONTROL 0x8000 // Does the driver control VDDCI independently from VDDC.
7763#define ATOM_PP_PLATFORM_CAP_REGULATOR_HOT 0x00010000 // Enable the 'regulator hot' feature.
7764#define ATOM_PP_PLATFORM_CAP_BACO 0x00020000 // Does the driver supports BACO state.
7765#define ATOM_PP_PLATFORM_CAP_NEW_CAC_VOLTAGE 0x00040000 // Does the driver supports new CAC voltage table.
7766#define ATOM_PP_PLATFORM_CAP_REVERT_GPIO5_POLARITY 0x00080000 // Does the driver supports revert GPIO5 polarity.
7767#define ATOM_PP_PLATFORM_CAP_OUTPUT_THERMAL2GPIO17 0x00100000 // Does the driver supports thermal2GPIO17.
7768#define ATOM_PP_PLATFORM_CAP_VRHOT_GPIO_CONFIGURABLE 0x00200000 // Does the driver supports VR HOT GPIO Configurable.
7769
7770typedef struct _ATOM_PPLIB_POWERPLAYTABLE
7771{
7772 ATOM_COMMON_TABLE_HEADER sHeader;
7773
7774 UCHAR ucDataRevision;
7775
7776 UCHAR ucNumStates;
7777 UCHAR ucStateEntrySize;
7778 UCHAR ucClockInfoSize;
7779 UCHAR ucNonClockSize;
7780
7781 // offset from start of this table to array of ucNumStates ATOM_PPLIB_STATE structures
7782 USHORT usStateArrayOffset;
7783
7784 // offset from start of this table to array of ASIC-specific structures,
7785 // currently ATOM_PPLIB_CLOCK_INFO.
7786 USHORT usClockInfoArrayOffset;
7787
7788 // offset from start of this table to array of ATOM_PPLIB_NONCLOCK_INFO
7789 USHORT usNonClockInfoArrayOffset;
7790
7791 USHORT usBackbiasTime; // in microseconds
7792 USHORT usVoltageTime; // in microseconds
7793 USHORT usTableSize; //the size of this structure, or the extended structure
7794
7795 ULONG ulPlatformCaps; // See ATOM_PPLIB_CAPS_*
7796
7797 ATOM_PPLIB_THERMALCONTROLLER sThermalController;
7798
7799 USHORT usBootClockInfoOffset;
7800 USHORT usBootNonClockInfoOffset;
7801
7802} ATOM_PPLIB_POWERPLAYTABLE;
7803
7804typedef struct _ATOM_PPLIB_POWERPLAYTABLE2
7805{
7806 ATOM_PPLIB_POWERPLAYTABLE basicTable;
7807 UCHAR ucNumCustomThermalPolicy;
7808 USHORT usCustomThermalPolicyArrayOffset;
7809}ATOM_PPLIB_POWERPLAYTABLE2, *LPATOM_PPLIB_POWERPLAYTABLE2;
7810
7811typedef struct _ATOM_PPLIB_POWERPLAYTABLE3
7812{
7813 ATOM_PPLIB_POWERPLAYTABLE2 basicTable2;
7814 USHORT usFormatID; // To be used ONLY by PPGen.
7815 USHORT usFanTableOffset;
7816 USHORT usExtendendedHeaderOffset;
7817} ATOM_PPLIB_POWERPLAYTABLE3, *LPATOM_PPLIB_POWERPLAYTABLE3;
7818
7819typedef struct _ATOM_PPLIB_POWERPLAYTABLE4
7820{
7821 ATOM_PPLIB_POWERPLAYTABLE3 basicTable3;
7822 ULONG ulGoldenPPID; // PPGen use only
7823 ULONG ulGoldenRevision; // PPGen use only
7824 USHORT usVddcDependencyOnSCLKOffset;
7825 USHORT usVddciDependencyOnMCLKOffset;
7826 USHORT usVddcDependencyOnMCLKOffset;
7827 USHORT usMaxClockVoltageOnDCOffset;
7828 USHORT usVddcPhaseShedLimitsTableOffset; // Points to ATOM_PPLIB_PhaseSheddingLimits_Table
7829 USHORT usMvddDependencyOnMCLKOffset;
7830} ATOM_PPLIB_POWERPLAYTABLE4, *LPATOM_PPLIB_POWERPLAYTABLE4;
7831
7832typedef struct _ATOM_PPLIB_POWERPLAYTABLE5
7833{
7834 ATOM_PPLIB_POWERPLAYTABLE4 basicTable4;
7835 ULONG ulTDPLimit;
7836 ULONG ulNearTDPLimit;
7837 ULONG ulSQRampingThreshold;
7838 USHORT usCACLeakageTableOffset; // Points to ATOM_PPLIB_CAC_Leakage_Table
7839 ULONG ulCACLeakage; // The iLeakage for driver calculated CAC leakage table
7840 USHORT usTDPODLimit;
7841 USHORT usLoadLineSlope; // in milliOhms * 100
7842} ATOM_PPLIB_POWERPLAYTABLE5, *LPATOM_PPLIB_POWERPLAYTABLE5;
7843
7844//// ATOM_PPLIB_NONCLOCK_INFO::usClassification
7845#define ATOM_PPLIB_CLASSIFICATION_UI_MASK 0x0007
7846#define ATOM_PPLIB_CLASSIFICATION_UI_SHIFT 0
7847#define ATOM_PPLIB_CLASSIFICATION_UI_NONE 0
7848#define ATOM_PPLIB_CLASSIFICATION_UI_BATTERY 1
7849#define ATOM_PPLIB_CLASSIFICATION_UI_BALANCED 3
7850#define ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE 5
7851// 2, 4, 6, 7 are reserved
7852
7853#define ATOM_PPLIB_CLASSIFICATION_BOOT 0x0008
7854#define ATOM_PPLIB_CLASSIFICATION_THERMAL 0x0010
7855#define ATOM_PPLIB_CLASSIFICATION_LIMITEDPOWERSOURCE 0x0020
7856#define ATOM_PPLIB_CLASSIFICATION_REST 0x0040
7857#define ATOM_PPLIB_CLASSIFICATION_FORCED 0x0080
7858#define ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE 0x0100
7859#define ATOM_PPLIB_CLASSIFICATION_OVERDRIVETEMPLATE 0x0200
7860#define ATOM_PPLIB_CLASSIFICATION_UVDSTATE 0x0400
7861#define ATOM_PPLIB_CLASSIFICATION_3DLOW 0x0800
7862#define ATOM_PPLIB_CLASSIFICATION_ACPI 0x1000
7863#define ATOM_PPLIB_CLASSIFICATION_HD2STATE 0x2000
7864#define ATOM_PPLIB_CLASSIFICATION_HDSTATE 0x4000
7865#define ATOM_PPLIB_CLASSIFICATION_SDSTATE 0x8000
7866
7867//// ATOM_PPLIB_NONCLOCK_INFO::usClassification2
7868#define ATOM_PPLIB_CLASSIFICATION2_LIMITEDPOWERSOURCE_2 0x0001
7869#define ATOM_PPLIB_CLASSIFICATION2_ULV 0x0002
7870#define ATOM_PPLIB_CLASSIFICATION2_MVC 0x0004 //Multi-View Codec (BD-3D)
7871
7872//// ATOM_PPLIB_NONCLOCK_INFO::ulCapsAndSettings
7873#define ATOM_PPLIB_SINGLE_DISPLAY_ONLY 0x00000001
7874#define ATOM_PPLIB_SUPPORTS_VIDEO_PLAYBACK 0x00000002
7875
7876// 0 is 2.5Gb/s, 1 is 5Gb/s
7877#define ATOM_PPLIB_PCIE_LINK_SPEED_MASK 0x00000004
7878#define ATOM_PPLIB_PCIE_LINK_SPEED_SHIFT 2
7879
7880// lanes - 1: 1, 2, 4, 8, 12, 16 permitted by PCIE spec
7881#define ATOM_PPLIB_PCIE_LINK_WIDTH_MASK 0x000000F8
7882#define ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT 3
7883
7884// lookup into reduced refresh-rate table
7885#define ATOM_PPLIB_LIMITED_REFRESHRATE_VALUE_MASK 0x00000F00
7886#define ATOM_PPLIB_LIMITED_REFRESHRATE_VALUE_SHIFT 8
7887
7888#define ATOM_PPLIB_LIMITED_REFRESHRATE_UNLIMITED 0
7889#define ATOM_PPLIB_LIMITED_REFRESHRATE_50HZ 1
7890// 2-15 TBD as needed.
7891
7892#define ATOM_PPLIB_SOFTWARE_DISABLE_LOADBALANCING 0x00001000
7893#define ATOM_PPLIB_SOFTWARE_ENABLE_SLEEP_FOR_TIMESTAMPS 0x00002000
7894
7895#define ATOM_PPLIB_DISALLOW_ON_DC 0x00004000
7896
7897#define ATOM_PPLIB_ENABLE_VARIBRIGHT 0x00008000
7898
7899//memory related flags
7900#define ATOM_PPLIB_SWSTATE_MEMORY_DLL_OFF 0x000010000
7901
7902//M3 Arb //2bits, current 3 sets of parameters in total
7903#define ATOM_PPLIB_M3ARB_MASK 0x00060000
7904#define ATOM_PPLIB_M3ARB_SHIFT 17
7905
7906#define ATOM_PPLIB_ENABLE_DRR 0x00080000
7907
7908// remaining 16 bits are reserved
7909typedef struct _ATOM_PPLIB_THERMAL_STATE
7910{
7911 UCHAR ucMinTemperature;
7912 UCHAR ucMaxTemperature;
7913 UCHAR ucThermalAction;
7914}ATOM_PPLIB_THERMAL_STATE, *LPATOM_PPLIB_THERMAL_STATE;
7915
7916// Contained in an array starting at the offset
7917// in ATOM_PPLIB_POWERPLAYTABLE::usNonClockInfoArrayOffset.
7918// referenced from ATOM_PPLIB_STATE_INFO::ucNonClockStateIndex
7919#define ATOM_PPLIB_NONCLOCKINFO_VER1 12
7920#define ATOM_PPLIB_NONCLOCKINFO_VER2 24
7921typedef struct _ATOM_PPLIB_NONCLOCK_INFO
7922{
7923 USHORT usClassification;
7924 UCHAR ucMinTemperature;
7925 UCHAR ucMaxTemperature;
7926 ULONG ulCapsAndSettings;
7927 UCHAR ucRequiredPower;
7928 USHORT usClassification2;
7929 ULONG ulVCLK;
7930 ULONG ulDCLK;
7931 UCHAR ucUnused[5];
7932} ATOM_PPLIB_NONCLOCK_INFO;
7933
7934// Contained in an array starting at the offset
7935// in ATOM_PPLIB_POWERPLAYTABLE::usClockInfoArrayOffset.
7936// referenced from ATOM_PPLIB_STATE::ucClockStateIndices
7937typedef struct _ATOM_PPLIB_R600_CLOCK_INFO
7938{
7939 USHORT usEngineClockLow;
7940 UCHAR ucEngineClockHigh;
7941
7942 USHORT usMemoryClockLow;
7943 UCHAR ucMemoryClockHigh;
7944
7945 USHORT usVDDC;
7946 USHORT usUnused1;
7947 USHORT usUnused2;
7948
7949 ULONG ulFlags; // ATOM_PPLIB_R600_FLAGS_*
7950
7951} ATOM_PPLIB_R600_CLOCK_INFO;
7952
7953// ulFlags in ATOM_PPLIB_R600_CLOCK_INFO
7954#define ATOM_PPLIB_R600_FLAGS_PCIEGEN2 1
7955#define ATOM_PPLIB_R600_FLAGS_UVDSAFE 2
7956#define ATOM_PPLIB_R600_FLAGS_BACKBIASENABLE 4
7957#define ATOM_PPLIB_R600_FLAGS_MEMORY_ODT_OFF 8
7958#define ATOM_PPLIB_R600_FLAGS_MEMORY_DLL_OFF 16
7959#define ATOM_PPLIB_R600_FLAGS_LOWPOWER 32 // On the RV770 use 'low power' setting (sequencer S0).
7960
7961typedef struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO
7962{
7963 USHORT usEngineClockLow;
7964 UCHAR ucEngineClockHigh;
7965
7966 USHORT usMemoryClockLow;
7967 UCHAR ucMemoryClockHigh;
7968
7969 USHORT usVDDC;
7970 USHORT usVDDCI;
7971 USHORT usUnused;
7972
7973 ULONG ulFlags; // ATOM_PPLIB_R600_FLAGS_*
7974
7975} ATOM_PPLIB_EVERGREEN_CLOCK_INFO;
7976
7977typedef struct _ATOM_PPLIB_SI_CLOCK_INFO
7978{
7979 USHORT usEngineClockLow;
7980 UCHAR ucEngineClockHigh;
7981
7982 USHORT usMemoryClockLow;
7983 UCHAR ucMemoryClockHigh;
7984
7985 USHORT usVDDC;
7986 USHORT usVDDCI;
7987 UCHAR ucPCIEGen;
7988 UCHAR ucUnused1;
7989
7990 ULONG ulFlags; // ATOM_PPLIB_SI_FLAGS_*, no flag is necessary for now
7991
7992} ATOM_PPLIB_SI_CLOCK_INFO;
7993
7994typedef struct _ATOM_PPLIB_CI_CLOCK_INFO
7995{
7996 USHORT usEngineClockLow;
7997 UCHAR ucEngineClockHigh;
7998
7999 USHORT usMemoryClockLow;
8000 UCHAR ucMemoryClockHigh;
8001
8002 UCHAR ucPCIEGen;
8003 USHORT usPCIELane;
8004} ATOM_PPLIB_CI_CLOCK_INFO;
8005
8006typedef struct _ATOM_PPLIB_RS780_CLOCK_INFO
8007
8008{
8009 USHORT usLowEngineClockLow; // Low Engine clock in MHz (the same way as on the R600).
8010 UCHAR ucLowEngineClockHigh;
8011 USHORT usHighEngineClockLow; // High Engine clock in MHz.
8012 UCHAR ucHighEngineClockHigh;
8013 USHORT usMemoryClockLow; // For now one of the ATOM_PPLIB_RS780_SPMCLK_XXXX constants.
8014 UCHAR ucMemoryClockHigh; // Currentyl unused.
8015 UCHAR ucPadding; // For proper alignment and size.
8016 USHORT usVDDC; // For the 780, use: None, Low, High, Variable
8017 UCHAR ucMaxHTLinkWidth; // From SBIOS - {2, 4, 8, 16}
8018 UCHAR ucMinHTLinkWidth; // From SBIOS - {2, 4, 8, 16}. Effective only if CDLW enabled. Minimum down stream width could be bigger as display BW requriement.
8019 USHORT usHTLinkFreq; // See definition ATOM_PPLIB_RS780_HTLINKFREQ_xxx or in MHz(>=200).
8020 ULONG ulFlags;
8021} ATOM_PPLIB_RS780_CLOCK_INFO;
8022
8023#define ATOM_PPLIB_RS780_VOLTAGE_NONE 0
8024#define ATOM_PPLIB_RS780_VOLTAGE_LOW 1
8025#define ATOM_PPLIB_RS780_VOLTAGE_HIGH 2
8026#define ATOM_PPLIB_RS780_VOLTAGE_VARIABLE 3
8027
8028#define ATOM_PPLIB_RS780_SPMCLK_NONE 0 // We cannot change the side port memory clock, leave it as it is.
8029#define ATOM_PPLIB_RS780_SPMCLK_LOW 1
8030#define ATOM_PPLIB_RS780_SPMCLK_HIGH 2
8031
8032#define ATOM_PPLIB_RS780_HTLINKFREQ_NONE 0
8033#define ATOM_PPLIB_RS780_HTLINKFREQ_LOW 1
8034#define ATOM_PPLIB_RS780_HTLINKFREQ_HIGH 2
8035
8036typedef struct _ATOM_PPLIB_SUMO_CLOCK_INFO{
8037 USHORT usEngineClockLow; //clockfrequency & 0xFFFF. The unit is in 10khz
8038 UCHAR ucEngineClockHigh; //clockfrequency >> 16.
8039 UCHAR vddcIndex; //2-bit vddc index;
8040 USHORT tdpLimit;
8041 //please initalize to 0
8042 USHORT rsv1;
8043 //please initialize to 0s
8044 ULONG rsv2[2];
8045}ATOM_PPLIB_SUMO_CLOCK_INFO;
8046
8047
8048
8049typedef struct _ATOM_PPLIB_STATE_V2
8050{
8051 //number of valid dpm levels in this state; Driver uses it to calculate the whole
8052 //size of the state: sizeof(ATOM_PPLIB_STATE_V2) + (ucNumDPMLevels - 1) * sizeof(UCHAR)
8053 UCHAR ucNumDPMLevels;
8054
8055 //a index to the array of nonClockInfos
8056 UCHAR nonClockInfoIndex;
8057 /**
8058 * Driver will read the first ucNumDPMLevels in this array
8059 */
8060 UCHAR clockInfoIndex[1];
8061} ATOM_PPLIB_STATE_V2;
8062
8063typedef struct _StateArray{
8064 //how many states we have
8065 UCHAR ucNumEntries;
8066
8067 ATOM_PPLIB_STATE_V2 states[1];
8068}StateArray;
8069
8070
8071typedef struct _ClockInfoArray{
8072 //how many clock levels we have
8073 UCHAR ucNumEntries;
8074
8075 //sizeof(ATOM_PPLIB_CLOCK_INFO)
8076 UCHAR ucEntrySize;
8077
8078 UCHAR clockInfo[1];
8079}ClockInfoArray;
8080
8081typedef struct _NonClockInfoArray{
8082
8083 //how many non-clock levels we have. normally should be same as number of states
8084 UCHAR ucNumEntries;
8085 //sizeof(ATOM_PPLIB_NONCLOCK_INFO)
8086 UCHAR ucEntrySize;
8087
8088 ATOM_PPLIB_NONCLOCK_INFO nonClockInfo[1];
8089}NonClockInfoArray;
8090
8091typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Record
8092{
8093 USHORT usClockLow;
8094 UCHAR ucClockHigh;
8095 USHORT usVoltage;
8096}ATOM_PPLIB_Clock_Voltage_Dependency_Record;
8097
8098typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Table
8099{
8100 UCHAR ucNumEntries; // Number of entries.
8101 ATOM_PPLIB_Clock_Voltage_Dependency_Record entries[1]; // Dynamically allocate entries.
8102}ATOM_PPLIB_Clock_Voltage_Dependency_Table;
8103
8104typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Record
8105{
8106 USHORT usSclkLow;
8107 UCHAR ucSclkHigh;
8108 USHORT usMclkLow;
8109 UCHAR ucMclkHigh;
8110 USHORT usVddc;
8111 USHORT usVddci;
8112}ATOM_PPLIB_Clock_Voltage_Limit_Record;
8113
8114typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Table
8115{
8116 UCHAR ucNumEntries; // Number of entries.
8117 ATOM_PPLIB_Clock_Voltage_Limit_Record entries[1]; // Dynamically allocate entries.
8118}ATOM_PPLIB_Clock_Voltage_Limit_Table;
8119
8120typedef struct _ATOM_PPLIB_CAC_Leakage_Record
8121{
8122 USHORT usVddc; // We use this field for the "fake" standardized VDDC for power calculations; For CI and newer, we use this as the real VDDC value.
8123 ULONG ulLeakageValue; // For CI and newer we use this as the "fake" standar VDDC value.
8124}ATOM_PPLIB_CAC_Leakage_Record;
8125
8126typedef struct _ATOM_PPLIB_CAC_Leakage_Table
8127{
8128 UCHAR ucNumEntries; // Number of entries.
8129 ATOM_PPLIB_CAC_Leakage_Record entries[1]; // Dynamically allocate entries.
8130}ATOM_PPLIB_CAC_Leakage_Table;
8131
8132typedef struct _ATOM_PPLIB_PhaseSheddingLimits_Record
8133{
8134 USHORT usVoltage;
8135 USHORT usSclkLow;
8136 UCHAR ucSclkHigh;
8137 USHORT usMclkLow;
8138 UCHAR ucMclkHigh;
8139}ATOM_PPLIB_PhaseSheddingLimits_Record;
8140
8141typedef struct _ATOM_PPLIB_PhaseSheddingLimits_Table
8142{
8143 UCHAR ucNumEntries; // Number of entries.
8144 ATOM_PPLIB_PhaseSheddingLimits_Record entries[1]; // Dynamically allocate entries.
8145}ATOM_PPLIB_PhaseSheddingLimits_Table;
8146
8147typedef struct _VCEClockInfo{
8148 USHORT usEVClkLow;
8149 UCHAR ucEVClkHigh;
8150 USHORT usECClkLow;
8151 UCHAR ucECClkHigh;
8152}VCEClockInfo;
8153
8154typedef struct _VCEClockInfoArray{
8155 UCHAR ucNumEntries;
8156 VCEClockInfo entries[1];
8157}VCEClockInfoArray;
8158
8159typedef struct _ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record
8160{
8161 USHORT usVoltage;
8162 UCHAR ucVCEClockInfoIndex;
8163}ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record;
8164
8165typedef struct _ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table
8166{
8167 UCHAR numEntries;
8168 ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record entries[1];
8169}ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table;
8170
8171typedef struct _ATOM_PPLIB_VCE_State_Record
8172{
8173 UCHAR ucVCEClockInfoIndex;
8174 UCHAR ucClockInfoIndex; //highest 2 bits indicates memory p-states, lower 6bits indicates index to ClockInfoArrary
8175}ATOM_PPLIB_VCE_State_Record;
8176
8177typedef struct _ATOM_PPLIB_VCE_State_Table
8178{
8179 UCHAR numEntries;
8180 ATOM_PPLIB_VCE_State_Record entries[1];
8181}ATOM_PPLIB_VCE_State_Table;
8182
8183
8184typedef struct _ATOM_PPLIB_VCE_Table
8185{
8186 UCHAR revid;
8187// VCEClockInfoArray array;
8188// ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table limits;
8189// ATOM_PPLIB_VCE_State_Table states;
8190}ATOM_PPLIB_VCE_Table;
8191
8192
8193typedef struct _UVDClockInfo{
8194 USHORT usVClkLow;
8195 UCHAR ucVClkHigh;
8196 USHORT usDClkLow;
8197 UCHAR ucDClkHigh;
8198}UVDClockInfo;
8199
8200typedef struct _UVDClockInfoArray{
8201 UCHAR ucNumEntries;
8202 UVDClockInfo entries[1];
8203}UVDClockInfoArray;
8204
8205typedef struct _ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record
8206{
8207 USHORT usVoltage;
8208 UCHAR ucUVDClockInfoIndex;
8209}ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record;
8210
8211typedef struct _ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table
8212{
8213 UCHAR numEntries;
8214 ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record entries[1];
8215}ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table;
8216
8217typedef struct _ATOM_PPLIB_UVD_State_Record
8218{
8219 UCHAR ucUVDClockInfoIndex;
8220 UCHAR ucClockInfoIndex; //highest 2 bits indicates memory p-states, lower 6bits indicates index to ClockInfoArrary
8221}ATOM_PPLIB_UVD_State_Record;
8222
8223typedef struct _ATOM_PPLIB_UVD_State_Table
8224{
8225 UCHAR numEntries;
8226 ATOM_PPLIB_UVD_State_Record entries[1];
8227}ATOM_PPLIB_UVD_State_Table;
8228
8229
8230typedef struct _ATOM_PPLIB_UVD_Table
8231{
8232 UCHAR revid;
8233// UVDClockInfoArray array;
8234// ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table limits;
8235// ATOM_PPLIB_UVD_State_Table states;
8236}ATOM_PPLIB_UVD_Table;
8237
8238
8239typedef struct _ATOM_PPLIB_SAMClk_Voltage_Limit_Record
8240{
8241 USHORT usVoltage;
8242 USHORT usSAMClockLow;
8243 UCHAR ucSAMClockHigh;
8244}ATOM_PPLIB_SAMClk_Voltage_Limit_Record;
8245
8246typedef struct _ATOM_PPLIB_SAMClk_Voltage_Limit_Table{
8247 UCHAR numEntries;
8248 ATOM_PPLIB_SAMClk_Voltage_Limit_Record entries[1];
8249}ATOM_PPLIB_SAMClk_Voltage_Limit_Table;
8250
8251typedef struct _ATOM_PPLIB_SAMU_Table
8252{
8253 UCHAR revid;
8254 ATOM_PPLIB_SAMClk_Voltage_Limit_Table limits;
8255}ATOM_PPLIB_SAMU_Table;
8256
8257#define ATOM_PPM_A_A 1
8258#define ATOM_PPM_A_I 2
8259typedef struct _ATOM_PPLIB_PPM_Table
8260{
8261 UCHAR ucRevId;
8262 UCHAR ucPpmDesign; //A+I or A+A
8263 USHORT usCpuCoreNumber;
8264 ULONG ulPlatformTDP;
8265 ULONG ulSmallACPlatformTDP;
8266 ULONG ulPlatformTDC;
8267 ULONG ulSmallACPlatformTDC;
8268 ULONG ulApuTDP;
8269 ULONG ulDGpuTDP;
8270 ULONG ulDGpuUlvPower;
8271 ULONG ulTjmax;
8272} ATOM_PPLIB_PPM_Table;
8273
8274/**************************************************************************/
8275
8276 7664
8277// Following definitions are for compatibility issue in different SW components. 7665// Following definitions are for compatibility issue in different SW components.
8278#define ATOM_MASTER_DATA_TABLE_REVISION 0x01 7666#define ATOM_MASTER_DATA_TABLE_REVISION 0x01
@@ -8485,3 +7873,6 @@ typedef struct {
8485 7873
8486 7874
8487#endif /* _ATOMBIOS_H */ 7875#endif /* _ATOMBIOS_H */
7876
7877#include "pptable.h"
7878
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c
index b9d3b43f19c0..bf87f6d435f8 100644
--- a/drivers/gpu/drm/radeon/atombios_crtc.c
+++ b/drivers/gpu/drm/radeon/atombios_crtc.c
@@ -1910,6 +1910,12 @@ static void atombios_crtc_disable(struct drm_crtc *crtc)
1910 int i; 1910 int i;
1911 1911
1912 atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); 1912 atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1913 /* disable the GRPH */
1914 if (ASIC_IS_DCE4(rdev))
1915 WREG32(EVERGREEN_GRPH_ENABLE + radeon_crtc->crtc_offset, 0);
1916 else if (ASIC_IS_AVIVO(rdev))
1917 WREG32(AVIVO_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 0);
1918
1913 if (ASIC_IS_DCE6(rdev)) 1919 if (ASIC_IS_DCE6(rdev))
1914 atombios_powergate_crtc(crtc, ATOM_ENABLE); 1920 atombios_powergate_crtc(crtc, ATOM_ENABLE);
1915 1921
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c
index 3569d89b9e41..00885417ffff 100644
--- a/drivers/gpu/drm/radeon/atombios_dp.c
+++ b/drivers/gpu/drm/radeon/atombios_dp.c
@@ -50,7 +50,7 @@ static char *pre_emph_names[] = {
50 * or from atom. Note that atom operates on 50 * or from atom. Note that atom operates on
51 * dw units. 51 * dw units.
52 */ 52 */
53static void radeon_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le) 53void radeon_atom_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le)
54{ 54{
55#ifdef __BIG_ENDIAN 55#ifdef __BIG_ENDIAN
56 u8 src_tmp[20], dst_tmp[20]; /* used for byteswapping */ 56 u8 src_tmp[20], dst_tmp[20]; /* used for byteswapping */
@@ -100,7 +100,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan,
100 100
101 base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1); 101 base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1);
102 102
103 radeon_copy_swap(base, send, send_bytes, true); 103 radeon_atom_copy_swap(base, send, send_bytes, true);
104 104
105 args.v1.lpAuxRequest = cpu_to_le16((u16)(0 + 4)); 105 args.v1.lpAuxRequest = cpu_to_le16((u16)(0 + 4));
106 args.v1.lpDataOut = cpu_to_le16((u16)(16 + 4)); 106 args.v1.lpDataOut = cpu_to_le16((u16)(16 + 4));
@@ -137,7 +137,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan,
137 recv_bytes = recv_size; 137 recv_bytes = recv_size;
138 138
139 if (recv && recv_size) 139 if (recv && recv_size)
140 radeon_copy_swap(recv, base + 16, recv_bytes, false); 140 radeon_atom_copy_swap(recv, base + 16, recv_bytes, false);
141 141
142 return recv_bytes; 142 return recv_bytes;
143} 143}
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
index 092275d53d4a..dfac7965ea28 100644
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
@@ -682,8 +682,6 @@ atombios_digital_setup(struct drm_encoder *encoder, int action)
682int 682int
683atombios_get_encoder_mode(struct drm_encoder *encoder) 683atombios_get_encoder_mode(struct drm_encoder *encoder)
684{ 684{
685 struct drm_device *dev = encoder->dev;
686 struct radeon_device *rdev = dev->dev_private;
687 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 685 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
688 struct drm_connector *connector; 686 struct drm_connector *connector;
689 struct radeon_connector *radeon_connector; 687 struct radeon_connector *radeon_connector;
@@ -710,8 +708,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
710 case DRM_MODE_CONNECTOR_DVII: 708 case DRM_MODE_CONNECTOR_DVII:
711 case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ 709 case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */
712 if (drm_detect_hdmi_monitor(radeon_connector->edid) && 710 if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
713 radeon_audio && 711 radeon_audio)
714 !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
715 return ATOM_ENCODER_MODE_HDMI; 712 return ATOM_ENCODER_MODE_HDMI;
716 else if (radeon_connector->use_digital) 713 else if (radeon_connector->use_digital)
717 return ATOM_ENCODER_MODE_DVI; 714 return ATOM_ENCODER_MODE_DVI;
@@ -722,8 +719,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
722 case DRM_MODE_CONNECTOR_HDMIA: 719 case DRM_MODE_CONNECTOR_HDMIA:
723 default: 720 default:
724 if (drm_detect_hdmi_monitor(radeon_connector->edid) && 721 if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
725 radeon_audio && 722 radeon_audio)
726 !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
727 return ATOM_ENCODER_MODE_HDMI; 723 return ATOM_ENCODER_MODE_HDMI;
728 else 724 else
729 return ATOM_ENCODER_MODE_DVI; 725 return ATOM_ENCODER_MODE_DVI;
@@ -737,8 +733,7 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
737 (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) 733 (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
738 return ATOM_ENCODER_MODE_DP; 734 return ATOM_ENCODER_MODE_DP;
739 else if (drm_detect_hdmi_monitor(radeon_connector->edid) && 735 else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
740 radeon_audio && 736 radeon_audio)
741 !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
742 return ATOM_ENCODER_MODE_HDMI; 737 return ATOM_ENCODER_MODE_HDMI;
743 else 738 else
744 return ATOM_ENCODER_MODE_DVI; 739 return ATOM_ENCODER_MODE_DVI;
diff --git a/drivers/gpu/drm/radeon/atombios_i2c.c b/drivers/gpu/drm/radeon/atombios_i2c.c
index 082338df708a..deaf98cdca3a 100644
--- a/drivers/gpu/drm/radeon/atombios_i2c.c
+++ b/drivers/gpu/drm/radeon/atombios_i2c.c
@@ -27,10 +27,12 @@
27#include "radeon.h" 27#include "radeon.h"
28#include "atom.h" 28#include "atom.h"
29 29
30extern void radeon_atom_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le);
31
30#define TARGET_HW_I2C_CLOCK 50 32#define TARGET_HW_I2C_CLOCK 50
31 33
32/* these are a limitation of ProcessI2cChannelTransaction not the hw */ 34/* these are a limitation of ProcessI2cChannelTransaction not the hw */
33#define ATOM_MAX_HW_I2C_WRITE 2 35#define ATOM_MAX_HW_I2C_WRITE 3
34#define ATOM_MAX_HW_I2C_READ 255 36#define ATOM_MAX_HW_I2C_READ 255
35 37
36static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan, 38static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan,
@@ -50,20 +52,24 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan,
50 52
51 if (flags & HW_I2C_WRITE) { 53 if (flags & HW_I2C_WRITE) {
52 if (num > ATOM_MAX_HW_I2C_WRITE) { 54 if (num > ATOM_MAX_HW_I2C_WRITE) {
53 DRM_ERROR("hw i2c: tried to write too many bytes (%d vs 2)\n", num); 55 DRM_ERROR("hw i2c: tried to write too many bytes (%d vs 3)\n", num);
54 return -EINVAL; 56 return -EINVAL;
55 } 57 }
56 memcpy(&out, buf, num); 58 args.ucRegIndex = buf[0];
59 if (num > 1)
60 memcpy(&out, &buf[1], num - 1);
57 args.lpI2CDataOut = cpu_to_le16(out); 61 args.lpI2CDataOut = cpu_to_le16(out);
58 } else { 62 } else {
59 if (num > ATOM_MAX_HW_I2C_READ) { 63 if (num > ATOM_MAX_HW_I2C_READ) {
60 DRM_ERROR("hw i2c: tried to read too many bytes (%d vs 255)\n", num); 64 DRM_ERROR("hw i2c: tried to read too many bytes (%d vs 255)\n", num);
61 return -EINVAL; 65 return -EINVAL;
62 } 66 }
67 args.ucRegIndex = 0;
68 args.lpI2CDataOut = 0;
63 } 69 }
64 70
71 args.ucFlag = flags;
65 args.ucI2CSpeed = TARGET_HW_I2C_CLOCK; 72 args.ucI2CSpeed = TARGET_HW_I2C_CLOCK;
66 args.ucRegIndex = 0;
67 args.ucTransBytes = num; 73 args.ucTransBytes = num;
68 args.ucSlaveAddr = slave_addr << 1; 74 args.ucSlaveAddr = slave_addr << 1;
69 args.ucLineNumber = chan->rec.i2c_id; 75 args.ucLineNumber = chan->rec.i2c_id;
@@ -77,7 +83,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan,
77 } 83 }
78 84
79 if (!(flags & HW_I2C_WRITE)) 85 if (!(flags & HW_I2C_WRITE))
80 memcpy(buf, base, num); 86 radeon_atom_copy_swap(buf, base, num, false);
81 87
82 return 0; 88 return 0;
83} 89}
diff --git a/drivers/gpu/drm/radeon/btc_dpm.c b/drivers/gpu/drm/radeon/btc_dpm.c
index 0bfd55e08820..084e69414fd1 100644
--- a/drivers/gpu/drm/radeon/btc_dpm.c
+++ b/drivers/gpu/drm/radeon/btc_dpm.c
@@ -2548,9 +2548,6 @@ int btc_dpm_init(struct radeon_device *rdev)
2548{ 2548{
2549 struct rv7xx_power_info *pi; 2549 struct rv7xx_power_info *pi;
2550 struct evergreen_power_info *eg_pi; 2550 struct evergreen_power_info *eg_pi;
2551 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
2552 u16 data_offset, size;
2553 u8 frev, crev;
2554 struct atom_clock_dividers dividers; 2551 struct atom_clock_dividers dividers;
2555 int ret; 2552 int ret;
2556 2553
@@ -2633,16 +2630,7 @@ int btc_dpm_init(struct radeon_device *rdev)
2633 eg_pi->vddci_control = 2630 eg_pi->vddci_control =
2634 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0); 2631 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0);
2635 2632
2636 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 2633 rv770_get_engine_memory_ss(rdev);
2637 &frev, &crev, &data_offset)) {
2638 pi->sclk_ss = true;
2639 pi->mclk_ss = true;
2640 pi->dynamic_ss = true;
2641 } else {
2642 pi->sclk_ss = false;
2643 pi->mclk_ss = false;
2644 pi->dynamic_ss = true;
2645 }
2646 2634
2647 pi->asi = RV770_ASI_DFLT; 2635 pi->asi = RV770_ASI_DFLT;
2648 pi->pasi = CYPRESS_HASI_DFLT; 2636 pi->pasi = CYPRESS_HASI_DFLT;
@@ -2659,8 +2647,7 @@ int btc_dpm_init(struct radeon_device *rdev)
2659 2647
2660 pi->dynamic_pcie_gen2 = true; 2648 pi->dynamic_pcie_gen2 = true;
2661 2649
2662 if (pi->gfx_clock_gating && 2650 if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
2663 (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE))
2664 pi->thermal_protection = true; 2651 pi->thermal_protection = true;
2665 else 2652 else
2666 pi->thermal_protection = false; 2653 pi->thermal_protection = false;
@@ -2712,6 +2699,12 @@ int btc_dpm_init(struct radeon_device *rdev)
2712 else 2699 else
2713 rdev->pm.dpm.dyn_state.sclk_mclk_delta = 10000; 2700 rdev->pm.dpm.dyn_state.sclk_mclk_delta = 10000;
2714 2701
2702 /* make sure dc limits are valid */
2703 if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
2704 (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
2705 rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
2706 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
2707
2715 return 0; 2708 return 0;
2716} 2709}
2717 2710
diff --git a/drivers/gpu/drm/radeon/cayman_blit_shaders.c b/drivers/gpu/drm/radeon/cayman_blit_shaders.c
index 19a0114d2e3b..98d009e154bf 100644
--- a/drivers/gpu/drm/radeon/cayman_blit_shaders.c
+++ b/drivers/gpu/drm/radeon/cayman_blit_shaders.c
@@ -317,58 +317,4 @@ const u32 cayman_default_state[] =
317 0x00000010, /* */ 317 0x00000010, /* */
318}; 318};
319 319
320const u32 cayman_vs[] =
321{
322 0x00000004,
323 0x80400400,
324 0x0000a03c,
325 0x95000688,
326 0x00004000,
327 0x15000688,
328 0x00000000,
329 0x88000000,
330 0x04000000,
331 0x67961001,
332#ifdef __BIG_ENDIAN
333 0x00020000,
334#else
335 0x00000000,
336#endif
337 0x00000000,
338 0x04000000,
339 0x67961000,
340#ifdef __BIG_ENDIAN
341 0x00020008,
342#else
343 0x00000008,
344#endif
345 0x00000000,
346};
347
348const u32 cayman_ps[] =
349{
350 0x00000004,
351 0xa00c0000,
352 0x00000008,
353 0x80400000,
354 0x00000000,
355 0x95000688,
356 0x00000000,
357 0x88000000,
358 0x00380400,
359 0x00146b10,
360 0x00380000,
361 0x20146b10,
362 0x00380400,
363 0x40146b00,
364 0x80380000,
365 0x60146b00,
366 0x00000010,
367 0x000d1000,
368 0xb0800000,
369 0x00000000,
370};
371
372const u32 cayman_ps_size = ARRAY_SIZE(cayman_ps);
373const u32 cayman_vs_size = ARRAY_SIZE(cayman_vs);
374const u32 cayman_default_size = ARRAY_SIZE(cayman_default_state); 320const u32 cayman_default_size = ARRAY_SIZE(cayman_default_state);
diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c
new file mode 100644
index 000000000000..916630fdc796
--- /dev/null
+++ b/drivers/gpu/drm/radeon/ci_dpm.c
@@ -0,0 +1,5239 @@
1/*
2 * Copyright 2013 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#include "drmP.h"
25#include "radeon.h"
26#include "cikd.h"
27#include "r600_dpm.h"
28#include "ci_dpm.h"
29#include "atom.h"
30#include <linux/seq_file.h>
31
32#define MC_CG_ARB_FREQ_F0 0x0a
33#define MC_CG_ARB_FREQ_F1 0x0b
34#define MC_CG_ARB_FREQ_F2 0x0c
35#define MC_CG_ARB_FREQ_F3 0x0d
36
37#define SMC_RAM_END 0x40000
38
39#define VOLTAGE_SCALE 4
40#define VOLTAGE_VID_OFFSET_SCALE1 625
41#define VOLTAGE_VID_OFFSET_SCALE2 100
42
43static const struct ci_pt_defaults defaults_bonaire_xt =
44{
45 1, 0xF, 0xFD, 0x19, 5, 45, 0, 0xB0000,
46 { 0x79, 0x253, 0x25D, 0xAE, 0x72, 0x80, 0x83, 0x86, 0x6F, 0xC8, 0xC9, 0xC9, 0x2F, 0x4D, 0x61 },
47 { 0x17C, 0x172, 0x180, 0x1BC, 0x1B3, 0x1BD, 0x206, 0x200, 0x203, 0x25D, 0x25A, 0x255, 0x2C3, 0x2C5, 0x2B4 }
48};
49
50static const struct ci_pt_defaults defaults_bonaire_pro =
51{
52 1, 0xF, 0xFD, 0x19, 5, 45, 0, 0x65062,
53 { 0x8C, 0x23F, 0x244, 0xA6, 0x83, 0x85, 0x86, 0x86, 0x83, 0xDB, 0xDB, 0xDA, 0x67, 0x60, 0x5F },
54 { 0x187, 0x193, 0x193, 0x1C7, 0x1D1, 0x1D1, 0x210, 0x219, 0x219, 0x266, 0x26C, 0x26C, 0x2C9, 0x2CB, 0x2CB }
55};
56
57static const struct ci_pt_defaults defaults_saturn_xt =
58{
59 1, 0xF, 0xFD, 0x19, 5, 55, 0, 0x70000,
60 { 0x8C, 0x247, 0x249, 0xA6, 0x80, 0x81, 0x8B, 0x89, 0x86, 0xC9, 0xCA, 0xC9, 0x4D, 0x4D, 0x4D },
61 { 0x187, 0x187, 0x187, 0x1C7, 0x1C7, 0x1C7, 0x210, 0x210, 0x210, 0x266, 0x266, 0x266, 0x2C9, 0x2C9, 0x2C9 }
62};
63
64static const struct ci_pt_defaults defaults_saturn_pro =
65{
66 1, 0xF, 0xFD, 0x19, 5, 55, 0, 0x30000,
67 { 0x96, 0x21D, 0x23B, 0xA1, 0x85, 0x87, 0x83, 0x84, 0x81, 0xE6, 0xE6, 0xE6, 0x71, 0x6A, 0x6A },
68 { 0x193, 0x19E, 0x19E, 0x1D2, 0x1DC, 0x1DC, 0x21A, 0x223, 0x223, 0x26E, 0x27E, 0x274, 0x2CF, 0x2D2, 0x2D2 }
69};
70
71static const struct ci_pt_config_reg didt_config_ci[] =
72{
73 { 0x10, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
74 { 0x10, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
75 { 0x10, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
76 { 0x10, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
77 { 0x11, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
78 { 0x11, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
79 { 0x11, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
80 { 0x11, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
81 { 0x12, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
82 { 0x12, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
83 { 0x12, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
84 { 0x12, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
85 { 0x2, 0x00003fff, 0, 0x4, CISLANDS_CONFIGREG_DIDT_IND },
86 { 0x2, 0x03ff0000, 16, 0x80, CISLANDS_CONFIGREG_DIDT_IND },
87 { 0x2, 0x78000000, 27, 0x3, CISLANDS_CONFIGREG_DIDT_IND },
88 { 0x1, 0x0000ffff, 0, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
89 { 0x1, 0xffff0000, 16, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
90 { 0x0, 0x00000001, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
91 { 0x30, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
92 { 0x30, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
93 { 0x30, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
94 { 0x30, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
95 { 0x31, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
96 { 0x31, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
97 { 0x31, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
98 { 0x31, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
99 { 0x32, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
100 { 0x32, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
101 { 0x32, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
102 { 0x32, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
103 { 0x22, 0x00003fff, 0, 0x4, CISLANDS_CONFIGREG_DIDT_IND },
104 { 0x22, 0x03ff0000, 16, 0x80, CISLANDS_CONFIGREG_DIDT_IND },
105 { 0x22, 0x78000000, 27, 0x3, CISLANDS_CONFIGREG_DIDT_IND },
106 { 0x21, 0x0000ffff, 0, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
107 { 0x21, 0xffff0000, 16, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
108 { 0x20, 0x00000001, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
109 { 0x50, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
110 { 0x50, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
111 { 0x50, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
112 { 0x50, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
113 { 0x51, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
114 { 0x51, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
115 { 0x51, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
116 { 0x51, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
117 { 0x52, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
118 { 0x52, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
119 { 0x52, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
120 { 0x52, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
121 { 0x42, 0x00003fff, 0, 0x4, CISLANDS_CONFIGREG_DIDT_IND },
122 { 0x42, 0x03ff0000, 16, 0x80, CISLANDS_CONFIGREG_DIDT_IND },
123 { 0x42, 0x78000000, 27, 0x3, CISLANDS_CONFIGREG_DIDT_IND },
124 { 0x41, 0x0000ffff, 0, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
125 { 0x41, 0xffff0000, 16, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
126 { 0x40, 0x00000001, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
127 { 0x70, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
128 { 0x70, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
129 { 0x70, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
130 { 0x70, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
131 { 0x71, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
132 { 0x71, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
133 { 0x71, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
134 { 0x71, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
135 { 0x72, 0x000000ff, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
136 { 0x72, 0x0000ff00, 8, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
137 { 0x72, 0x00ff0000, 16, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
138 { 0x72, 0xff000000, 24, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
139 { 0x62, 0x00003fff, 0, 0x4, CISLANDS_CONFIGREG_DIDT_IND },
140 { 0x62, 0x03ff0000, 16, 0x80, CISLANDS_CONFIGREG_DIDT_IND },
141 { 0x62, 0x78000000, 27, 0x3, CISLANDS_CONFIGREG_DIDT_IND },
142 { 0x61, 0x0000ffff, 0, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
143 { 0x61, 0xffff0000, 16, 0x3FFF, CISLANDS_CONFIGREG_DIDT_IND },
144 { 0x60, 0x00000001, 0, 0x0, CISLANDS_CONFIGREG_DIDT_IND },
145 { 0xFFFFFFFF }
146};
147
148extern u8 rv770_get_memory_module_index(struct radeon_device *rdev);
149extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev,
150 u32 arb_freq_src, u32 arb_freq_dest);
151extern u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock);
152extern u8 si_get_mclk_frequency_ratio(u32 memory_clock, bool strobe_mode);
153extern void si_trim_voltage_table_to_fit_state_table(struct radeon_device *rdev,
154 u32 max_voltage_steps,
155 struct atom_voltage_table *voltage_table);
156extern void cik_enter_rlc_safe_mode(struct radeon_device *rdev);
157extern void cik_exit_rlc_safe_mode(struct radeon_device *rdev);
158extern void cik_update_cg(struct radeon_device *rdev,
159 u32 block, bool enable);
160
161static int ci_get_std_voltage_value_sidd(struct radeon_device *rdev,
162 struct atom_voltage_table_entry *voltage_table,
163 u16 *std_voltage_hi_sidd, u16 *std_voltage_lo_sidd);
164static int ci_set_power_limit(struct radeon_device *rdev, u32 n);
165static int ci_set_overdrive_target_tdp(struct radeon_device *rdev,
166 u32 target_tdp);
167static int ci_update_uvd_dpm(struct radeon_device *rdev, bool gate);
168
169static struct ci_power_info *ci_get_pi(struct radeon_device *rdev)
170{
171 struct ci_power_info *pi = rdev->pm.dpm.priv;
172
173 return pi;
174}
175
176static struct ci_ps *ci_get_ps(struct radeon_ps *rps)
177{
178 struct ci_ps *ps = rps->ps_priv;
179
180 return ps;
181}
182
183static void ci_initialize_powertune_defaults(struct radeon_device *rdev)
184{
185 struct ci_power_info *pi = ci_get_pi(rdev);
186
187 switch (rdev->pdev->device) {
188 case 0x6650:
189 case 0x6658:
190 case 0x665C:
191 default:
192 pi->powertune_defaults = &defaults_bonaire_xt;
193 break;
194 case 0x6651:
195 case 0x665D:
196 pi->powertune_defaults = &defaults_bonaire_pro;
197 break;
198 case 0x6640:
199 pi->powertune_defaults = &defaults_saturn_xt;
200 break;
201 case 0x6641:
202 pi->powertune_defaults = &defaults_saturn_pro;
203 break;
204 }
205
206 pi->dte_tj_offset = 0;
207
208 pi->caps_power_containment = true;
209 pi->caps_cac = false;
210 pi->caps_sq_ramping = false;
211 pi->caps_db_ramping = false;
212 pi->caps_td_ramping = false;
213 pi->caps_tcp_ramping = false;
214
215 if (pi->caps_power_containment) {
216 pi->caps_cac = true;
217 pi->enable_bapm_feature = true;
218 pi->enable_tdc_limit_feature = true;
219 pi->enable_pkg_pwr_tracking_feature = true;
220 }
221}
222
223static u8 ci_convert_to_vid(u16 vddc)
224{
225 return (6200 - (vddc * VOLTAGE_SCALE)) / 25;
226}
227
228static int ci_populate_bapm_vddc_vid_sidd(struct radeon_device *rdev)
229{
230 struct ci_power_info *pi = ci_get_pi(rdev);
231 u8 *hi_vid = pi->smc_powertune_table.BapmVddCVidHiSidd;
232 u8 *lo_vid = pi->smc_powertune_table.BapmVddCVidLoSidd;
233 u8 *hi2_vid = pi->smc_powertune_table.BapmVddCVidHiSidd2;
234 u32 i;
235
236 if (rdev->pm.dpm.dyn_state.cac_leakage_table.entries == NULL)
237 return -EINVAL;
238 if (rdev->pm.dpm.dyn_state.cac_leakage_table.count > 8)
239 return -EINVAL;
240 if (rdev->pm.dpm.dyn_state.cac_leakage_table.count !=
241 rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count)
242 return -EINVAL;
243
244 for (i = 0; i < rdev->pm.dpm.dyn_state.cac_leakage_table.count; i++) {
245 if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_EVV) {
246 lo_vid[i] = ci_convert_to_vid(rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc1);
247 hi_vid[i] = ci_convert_to_vid(rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc2);
248 hi2_vid[i] = ci_convert_to_vid(rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc3);
249 } else {
250 lo_vid[i] = ci_convert_to_vid(rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc);
251 hi_vid[i] = ci_convert_to_vid((u16)rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].leakage);
252 }
253 }
254 return 0;
255}
256
257static int ci_populate_vddc_vid(struct radeon_device *rdev)
258{
259 struct ci_power_info *pi = ci_get_pi(rdev);
260 u8 *vid = pi->smc_powertune_table.VddCVid;
261 u32 i;
262
263 if (pi->vddc_voltage_table.count > 8)
264 return -EINVAL;
265
266 for (i = 0; i < pi->vddc_voltage_table.count; i++)
267 vid[i] = ci_convert_to_vid(pi->vddc_voltage_table.entries[i].value);
268
269 return 0;
270}
271
272static int ci_populate_svi_load_line(struct radeon_device *rdev)
273{
274 struct ci_power_info *pi = ci_get_pi(rdev);
275 const struct ci_pt_defaults *pt_defaults = pi->powertune_defaults;
276
277 pi->smc_powertune_table.SviLoadLineEn = pt_defaults->svi_load_line_en;
278 pi->smc_powertune_table.SviLoadLineVddC = pt_defaults->svi_load_line_vddc;
279 pi->smc_powertune_table.SviLoadLineTrimVddC = 3;
280 pi->smc_powertune_table.SviLoadLineOffsetVddC = 0;
281
282 return 0;
283}
284
285static int ci_populate_tdc_limit(struct radeon_device *rdev)
286{
287 struct ci_power_info *pi = ci_get_pi(rdev);
288 const struct ci_pt_defaults *pt_defaults = pi->powertune_defaults;
289 u16 tdc_limit;
290
291 tdc_limit = rdev->pm.dpm.dyn_state.cac_tdp_table->tdc * 256;
292 pi->smc_powertune_table.TDC_VDDC_PkgLimit = cpu_to_be16(tdc_limit);
293 pi->smc_powertune_table.TDC_VDDC_ThrottleReleaseLimitPerc =
294 pt_defaults->tdc_vddc_throttle_release_limit_perc;
295 pi->smc_powertune_table.TDC_MAWt = pt_defaults->tdc_mawt;
296
297 return 0;
298}
299
300static int ci_populate_dw8(struct radeon_device *rdev)
301{
302 struct ci_power_info *pi = ci_get_pi(rdev);
303 const struct ci_pt_defaults *pt_defaults = pi->powertune_defaults;
304 int ret;
305
306 ret = ci_read_smc_sram_dword(rdev,
307 SMU7_FIRMWARE_HEADER_LOCATION +
308 offsetof(SMU7_Firmware_Header, PmFuseTable) +
309 offsetof(SMU7_Discrete_PmFuses, TdcWaterfallCtl),
310 (u32 *)&pi->smc_powertune_table.TdcWaterfallCtl,
311 pi->sram_end);
312 if (ret)
313 return -EINVAL;
314 else
315 pi->smc_powertune_table.TdcWaterfallCtl = pt_defaults->tdc_waterfall_ctl;
316
317 return 0;
318}
319
320static int ci_min_max_v_gnbl_pm_lid_from_bapm_vddc(struct radeon_device *rdev)
321{
322 struct ci_power_info *pi = ci_get_pi(rdev);
323 u8 *hi_vid = pi->smc_powertune_table.BapmVddCVidHiSidd;
324 u8 *lo_vid = pi->smc_powertune_table.BapmVddCVidLoSidd;
325 int i, min, max;
326
327 min = max = hi_vid[0];
328 for (i = 0; i < 8; i++) {
329 if (0 != hi_vid[i]) {
330 if (min > hi_vid[i])
331 min = hi_vid[i];
332 if (max < hi_vid[i])
333 max = hi_vid[i];
334 }
335
336 if (0 != lo_vid[i]) {
337 if (min > lo_vid[i])
338 min = lo_vid[i];
339 if (max < lo_vid[i])
340 max = lo_vid[i];
341 }
342 }
343
344 if ((min == 0) || (max == 0))
345 return -EINVAL;
346 pi->smc_powertune_table.GnbLPMLMaxVid = (u8)max;
347 pi->smc_powertune_table.GnbLPMLMinVid = (u8)min;
348
349 return 0;
350}
351
352static int ci_populate_bapm_vddc_base_leakage_sidd(struct radeon_device *rdev)
353{
354 struct ci_power_info *pi = ci_get_pi(rdev);
355 u16 hi_sidd = pi->smc_powertune_table.BapmVddCBaseLeakageHiSidd;
356 u16 lo_sidd = pi->smc_powertune_table.BapmVddCBaseLeakageLoSidd;
357 struct radeon_cac_tdp_table *cac_tdp_table =
358 rdev->pm.dpm.dyn_state.cac_tdp_table;
359
360 hi_sidd = cac_tdp_table->high_cac_leakage / 100 * 256;
361 lo_sidd = cac_tdp_table->low_cac_leakage / 100 * 256;
362
363 pi->smc_powertune_table.BapmVddCBaseLeakageHiSidd = cpu_to_be16(hi_sidd);
364 pi->smc_powertune_table.BapmVddCBaseLeakageLoSidd = cpu_to_be16(lo_sidd);
365
366 return 0;
367}
368
369static int ci_populate_bapm_parameters_in_dpm_table(struct radeon_device *rdev)
370{
371 struct ci_power_info *pi = ci_get_pi(rdev);
372 const struct ci_pt_defaults *pt_defaults = pi->powertune_defaults;
373 SMU7_Discrete_DpmTable *dpm_table = &pi->smc_state_table;
374 struct radeon_cac_tdp_table *cac_tdp_table =
375 rdev->pm.dpm.dyn_state.cac_tdp_table;
376 struct radeon_ppm_table *ppm = rdev->pm.dpm.dyn_state.ppm_table;
377 int i, j, k;
378 const u16 *def1;
379 const u16 *def2;
380
381 dpm_table->DefaultTdp = cac_tdp_table->tdp * 256;
382 dpm_table->TargetTdp = cac_tdp_table->configurable_tdp * 256;
383
384 dpm_table->DTETjOffset = (u8)pi->dte_tj_offset;
385 dpm_table->GpuTjMax =
386 (u8)(pi->thermal_temp_setting.temperature_high / 1000);
387 dpm_table->GpuTjHyst = 8;
388
389 dpm_table->DTEAmbientTempBase = pt_defaults->dte_ambient_temp_base;
390
391 if (ppm) {
392 dpm_table->PPM_PkgPwrLimit = cpu_to_be16((u16)ppm->dgpu_tdp * 256 / 1000);
393 dpm_table->PPM_TemperatureLimit = cpu_to_be16((u16)ppm->tj_max * 256);
394 } else {
395 dpm_table->PPM_PkgPwrLimit = cpu_to_be16(0);
396 dpm_table->PPM_TemperatureLimit = cpu_to_be16(0);
397 }
398
399 dpm_table->BAPM_TEMP_GRADIENT = cpu_to_be32(pt_defaults->bapm_temp_gradient);
400 def1 = pt_defaults->bapmti_r;
401 def2 = pt_defaults->bapmti_rc;
402
403 for (i = 0; i < SMU7_DTE_ITERATIONS; i++) {
404 for (j = 0; j < SMU7_DTE_SOURCES; j++) {
405 for (k = 0; k < SMU7_DTE_SINKS; k++) {
406 dpm_table->BAPMTI_R[i][j][k] = cpu_to_be16(*def1);
407 dpm_table->BAPMTI_RC[i][j][k] = cpu_to_be16(*def2);
408 def1++;
409 def2++;
410 }
411 }
412 }
413
414 return 0;
415}
416
417static int ci_populate_pm_base(struct radeon_device *rdev)
418{
419 struct ci_power_info *pi = ci_get_pi(rdev);
420 u32 pm_fuse_table_offset;
421 int ret;
422
423 if (pi->caps_power_containment) {
424 ret = ci_read_smc_sram_dword(rdev,
425 SMU7_FIRMWARE_HEADER_LOCATION +
426 offsetof(SMU7_Firmware_Header, PmFuseTable),
427 &pm_fuse_table_offset, pi->sram_end);
428 if (ret)
429 return ret;
430 ret = ci_populate_bapm_vddc_vid_sidd(rdev);
431 if (ret)
432 return ret;
433 ret = ci_populate_vddc_vid(rdev);
434 if (ret)
435 return ret;
436 ret = ci_populate_svi_load_line(rdev);
437 if (ret)
438 return ret;
439 ret = ci_populate_tdc_limit(rdev);
440 if (ret)
441 return ret;
442 ret = ci_populate_dw8(rdev);
443 if (ret)
444 return ret;
445 ret = ci_min_max_v_gnbl_pm_lid_from_bapm_vddc(rdev);
446 if (ret)
447 return ret;
448 ret = ci_populate_bapm_vddc_base_leakage_sidd(rdev);
449 if (ret)
450 return ret;
451 ret = ci_copy_bytes_to_smc(rdev, pm_fuse_table_offset,
452 (u8 *)&pi->smc_powertune_table,
453 sizeof(SMU7_Discrete_PmFuses), pi->sram_end);
454 if (ret)
455 return ret;
456 }
457
458 return 0;
459}
460
461static void ci_do_enable_didt(struct radeon_device *rdev, const bool enable)
462{
463 struct ci_power_info *pi = ci_get_pi(rdev);
464 u32 data;
465
466 if (pi->caps_sq_ramping) {
467 data = RREG32_DIDT(DIDT_SQ_CTRL0);
468 if (enable)
469 data |= DIDT_CTRL_EN;
470 else
471 data &= ~DIDT_CTRL_EN;
472 WREG32_DIDT(DIDT_SQ_CTRL0, data);
473 }
474
475 if (pi->caps_db_ramping) {
476 data = RREG32_DIDT(DIDT_DB_CTRL0);
477 if (enable)
478 data |= DIDT_CTRL_EN;
479 else
480 data &= ~DIDT_CTRL_EN;
481 WREG32_DIDT(DIDT_DB_CTRL0, data);
482 }
483
484 if (pi->caps_td_ramping) {
485 data = RREG32_DIDT(DIDT_TD_CTRL0);
486 if (enable)
487 data |= DIDT_CTRL_EN;
488 else
489 data &= ~DIDT_CTRL_EN;
490 WREG32_DIDT(DIDT_TD_CTRL0, data);
491 }
492
493 if (pi->caps_tcp_ramping) {
494 data = RREG32_DIDT(DIDT_TCP_CTRL0);
495 if (enable)
496 data |= DIDT_CTRL_EN;
497 else
498 data &= ~DIDT_CTRL_EN;
499 WREG32_DIDT(DIDT_TCP_CTRL0, data);
500 }
501}
502
503static int ci_program_pt_config_registers(struct radeon_device *rdev,
504 const struct ci_pt_config_reg *cac_config_regs)
505{
506 const struct ci_pt_config_reg *config_regs = cac_config_regs;
507 u32 data;
508 u32 cache = 0;
509
510 if (config_regs == NULL)
511 return -EINVAL;
512
513 while (config_regs->offset != 0xFFFFFFFF) {
514 if (config_regs->type == CISLANDS_CONFIGREG_CACHE) {
515 cache |= ((config_regs->value << config_regs->shift) & config_regs->mask);
516 } else {
517 switch (config_regs->type) {
518 case CISLANDS_CONFIGREG_SMC_IND:
519 data = RREG32_SMC(config_regs->offset);
520 break;
521 case CISLANDS_CONFIGREG_DIDT_IND:
522 data = RREG32_DIDT(config_regs->offset);
523 break;
524 default:
525 data = RREG32(config_regs->offset << 2);
526 break;
527 }
528
529 data &= ~config_regs->mask;
530 data |= ((config_regs->value << config_regs->shift) & config_regs->mask);
531 data |= cache;
532
533 switch (config_regs->type) {
534 case CISLANDS_CONFIGREG_SMC_IND:
535 WREG32_SMC(config_regs->offset, data);
536 break;
537 case CISLANDS_CONFIGREG_DIDT_IND:
538 WREG32_DIDT(config_regs->offset, data);
539 break;
540 default:
541 WREG32(config_regs->offset << 2, data);
542 break;
543 }
544 cache = 0;
545 }
546 config_regs++;
547 }
548 return 0;
549}
550
551static int ci_enable_didt(struct radeon_device *rdev, bool enable)
552{
553 struct ci_power_info *pi = ci_get_pi(rdev);
554 int ret;
555
556 if (pi->caps_sq_ramping || pi->caps_db_ramping ||
557 pi->caps_td_ramping || pi->caps_tcp_ramping) {
558 cik_enter_rlc_safe_mode(rdev);
559
560 if (enable) {
561 ret = ci_program_pt_config_registers(rdev, didt_config_ci);
562 if (ret) {
563 cik_exit_rlc_safe_mode(rdev);
564 return ret;
565 }
566 }
567
568 ci_do_enable_didt(rdev, enable);
569
570 cik_exit_rlc_safe_mode(rdev);
571 }
572
573 return 0;
574}
575
576static int ci_enable_power_containment(struct radeon_device *rdev, bool enable)
577{
578 struct ci_power_info *pi = ci_get_pi(rdev);
579 PPSMC_Result smc_result;
580 int ret = 0;
581
582 if (enable) {
583 pi->power_containment_features = 0;
584 if (pi->caps_power_containment) {
585 if (pi->enable_bapm_feature) {
586 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_EnableDTE);
587 if (smc_result != PPSMC_Result_OK)
588 ret = -EINVAL;
589 else
590 pi->power_containment_features |= POWERCONTAINMENT_FEATURE_BAPM;
591 }
592
593 if (pi->enable_tdc_limit_feature) {
594 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_TDCLimitEnable);
595 if (smc_result != PPSMC_Result_OK)
596 ret = -EINVAL;
597 else
598 pi->power_containment_features |= POWERCONTAINMENT_FEATURE_TDCLimit;
599 }
600
601 if (pi->enable_pkg_pwr_tracking_feature) {
602 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_PkgPwrLimitEnable);
603 if (smc_result != PPSMC_Result_OK) {
604 ret = -EINVAL;
605 } else {
606 struct radeon_cac_tdp_table *cac_tdp_table =
607 rdev->pm.dpm.dyn_state.cac_tdp_table;
608 u32 default_pwr_limit =
609 (u32)(cac_tdp_table->maximum_power_delivery_limit * 256);
610
611 pi->power_containment_features |= POWERCONTAINMENT_FEATURE_PkgPwrLimit;
612
613 ci_set_power_limit(rdev, default_pwr_limit);
614 }
615 }
616 }
617 } else {
618 if (pi->caps_power_containment && pi->power_containment_features) {
619 if (pi->power_containment_features & POWERCONTAINMENT_FEATURE_TDCLimit)
620 ci_send_msg_to_smc(rdev, PPSMC_MSG_TDCLimitDisable);
621
622 if (pi->power_containment_features & POWERCONTAINMENT_FEATURE_BAPM)
623 ci_send_msg_to_smc(rdev, PPSMC_MSG_DisableDTE);
624
625 if (pi->power_containment_features & POWERCONTAINMENT_FEATURE_PkgPwrLimit)
626 ci_send_msg_to_smc(rdev, PPSMC_MSG_PkgPwrLimitDisable);
627 pi->power_containment_features = 0;
628 }
629 }
630
631 return ret;
632}
633
634static int ci_enable_smc_cac(struct radeon_device *rdev, bool enable)
635{
636 struct ci_power_info *pi = ci_get_pi(rdev);
637 PPSMC_Result smc_result;
638 int ret = 0;
639
640 if (pi->caps_cac) {
641 if (enable) {
642 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_EnableCac);
643 if (smc_result != PPSMC_Result_OK) {
644 ret = -EINVAL;
645 pi->cac_enabled = false;
646 } else {
647 pi->cac_enabled = true;
648 }
649 } else if (pi->cac_enabled) {
650 ci_send_msg_to_smc(rdev, PPSMC_MSG_DisableCac);
651 pi->cac_enabled = false;
652 }
653 }
654
655 return ret;
656}
657
658static int ci_power_control_set_level(struct radeon_device *rdev)
659{
660 struct ci_power_info *pi = ci_get_pi(rdev);
661 struct radeon_cac_tdp_table *cac_tdp_table =
662 rdev->pm.dpm.dyn_state.cac_tdp_table;
663 s32 adjust_percent;
664 s32 target_tdp;
665 int ret = 0;
666 bool adjust_polarity = false; /* ??? */
667
668 if (pi->caps_power_containment &&
669 (pi->power_containment_features & POWERCONTAINMENT_FEATURE_BAPM)) {
670 adjust_percent = adjust_polarity ?
671 rdev->pm.dpm.tdp_adjustment : (-1 * rdev->pm.dpm.tdp_adjustment);
672 target_tdp = ((100 + adjust_percent) *
673 (s32)cac_tdp_table->configurable_tdp) / 100;
674 target_tdp *= 256;
675
676 ret = ci_set_overdrive_target_tdp(rdev, (u32)target_tdp);
677 }
678
679 return ret;
680}
681
682void ci_dpm_powergate_uvd(struct radeon_device *rdev, bool gate)
683{
684 struct ci_power_info *pi = ci_get_pi(rdev);
685
686 if (pi->uvd_power_gated == gate)
687 return;
688
689 pi->uvd_power_gated = gate;
690
691 ci_update_uvd_dpm(rdev, gate);
692}
693
694bool ci_dpm_vblank_too_short(struct radeon_device *rdev)
695{
696 struct ci_power_info *pi = ci_get_pi(rdev);
697 u32 vblank_time = r600_dpm_get_vblank_time(rdev);
698 u32 switch_limit = pi->mem_gddr5 ? 450 : 300;
699
700 if (vblank_time < switch_limit)
701 return true;
702 else
703 return false;
704
705}
706
707static void ci_apply_state_adjust_rules(struct radeon_device *rdev,
708 struct radeon_ps *rps)
709{
710 struct ci_ps *ps = ci_get_ps(rps);
711 struct ci_power_info *pi = ci_get_pi(rdev);
712 struct radeon_clock_and_voltage_limits *max_limits;
713 bool disable_mclk_switching;
714 u32 sclk, mclk;
715 int i;
716
717 if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
718 ci_dpm_vblank_too_short(rdev))
719 disable_mclk_switching = true;
720 else
721 disable_mclk_switching = false;
722
723 if ((rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) == ATOM_PPLIB_CLASSIFICATION_UI_BATTERY)
724 pi->battery_state = true;
725 else
726 pi->battery_state = false;
727
728 if (rdev->pm.dpm.ac_power)
729 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
730 else
731 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
732
733 if (rdev->pm.dpm.ac_power == false) {
734 for (i = 0; i < ps->performance_level_count; i++) {
735 if (ps->performance_levels[i].mclk > max_limits->mclk)
736 ps->performance_levels[i].mclk = max_limits->mclk;
737 if (ps->performance_levels[i].sclk > max_limits->sclk)
738 ps->performance_levels[i].sclk = max_limits->sclk;
739 }
740 }
741
742 /* XXX validate the min clocks required for display */
743
744 if (disable_mclk_switching) {
745 mclk = ps->performance_levels[ps->performance_level_count - 1].mclk;
746 sclk = ps->performance_levels[0].sclk;
747 } else {
748 mclk = ps->performance_levels[0].mclk;
749 sclk = ps->performance_levels[0].sclk;
750 }
751
752 ps->performance_levels[0].sclk = sclk;
753 ps->performance_levels[0].mclk = mclk;
754
755 if (ps->performance_levels[1].sclk < ps->performance_levels[0].sclk)
756 ps->performance_levels[1].sclk = ps->performance_levels[0].sclk;
757
758 if (disable_mclk_switching) {
759 if (ps->performance_levels[0].mclk < ps->performance_levels[1].mclk)
760 ps->performance_levels[0].mclk = ps->performance_levels[1].mclk;
761 } else {
762 if (ps->performance_levels[1].mclk < ps->performance_levels[0].mclk)
763 ps->performance_levels[1].mclk = ps->performance_levels[0].mclk;
764 }
765}
766
767static int ci_set_thermal_temperature_range(struct radeon_device *rdev,
768 int min_temp, int max_temp)
769{
770 int low_temp = 0 * 1000;
771 int high_temp = 255 * 1000;
772 u32 tmp;
773
774 if (low_temp < min_temp)
775 low_temp = min_temp;
776 if (high_temp > max_temp)
777 high_temp = max_temp;
778 if (high_temp < low_temp) {
779 DRM_ERROR("invalid thermal range: %d - %d\n", low_temp, high_temp);
780 return -EINVAL;
781 }
782
783 tmp = RREG32_SMC(CG_THERMAL_INT);
784 tmp &= ~(CI_DIG_THERM_INTH_MASK | CI_DIG_THERM_INTL_MASK);
785 tmp |= CI_DIG_THERM_INTH(high_temp / 1000) |
786 CI_DIG_THERM_INTL(low_temp / 1000);
787 WREG32_SMC(CG_THERMAL_INT, tmp);
788
789#if 0
790 /* XXX: need to figure out how to handle this properly */
791 tmp = RREG32_SMC(CG_THERMAL_CTRL);
792 tmp &= DIG_THERM_DPM_MASK;
793 tmp |= DIG_THERM_DPM(high_temp / 1000);
794 WREG32_SMC(CG_THERMAL_CTRL, tmp);
795#endif
796
797 return 0;
798}
799
800#if 0
801static int ci_read_smc_soft_register(struct radeon_device *rdev,
802 u16 reg_offset, u32 *value)
803{
804 struct ci_power_info *pi = ci_get_pi(rdev);
805
806 return ci_read_smc_sram_dword(rdev,
807 pi->soft_regs_start + reg_offset,
808 value, pi->sram_end);
809}
810#endif
811
812static int ci_write_smc_soft_register(struct radeon_device *rdev,
813 u16 reg_offset, u32 value)
814{
815 struct ci_power_info *pi = ci_get_pi(rdev);
816
817 return ci_write_smc_sram_dword(rdev,
818 pi->soft_regs_start + reg_offset,
819 value, pi->sram_end);
820}
821
822static void ci_init_fps_limits(struct radeon_device *rdev)
823{
824 struct ci_power_info *pi = ci_get_pi(rdev);
825 SMU7_Discrete_DpmTable *table = &pi->smc_state_table;
826
827 if (pi->caps_fps) {
828 u16 tmp;
829
830 tmp = 45;
831 table->FpsHighT = cpu_to_be16(tmp);
832
833 tmp = 30;
834 table->FpsLowT = cpu_to_be16(tmp);
835 }
836}
837
838static int ci_update_sclk_t(struct radeon_device *rdev)
839{
840 struct ci_power_info *pi = ci_get_pi(rdev);
841 int ret = 0;
842 u32 low_sclk_interrupt_t = 0;
843
844 if (pi->caps_sclk_throttle_low_notification) {
845 low_sclk_interrupt_t = cpu_to_be32(pi->low_sclk_interrupt_t);
846
847 ret = ci_copy_bytes_to_smc(rdev,
848 pi->dpm_table_start +
849 offsetof(SMU7_Discrete_DpmTable, LowSclkInterruptT),
850 (u8 *)&low_sclk_interrupt_t,
851 sizeof(u32), pi->sram_end);
852
853 }
854
855 return ret;
856}
857
858static void ci_get_leakage_voltages(struct radeon_device *rdev)
859{
860 struct ci_power_info *pi = ci_get_pi(rdev);
861 u16 leakage_id, virtual_voltage_id;
862 u16 vddc, vddci;
863 int i;
864
865 pi->vddc_leakage.count = 0;
866 pi->vddci_leakage.count = 0;
867
868 if (radeon_atom_get_leakage_id_from_vbios(rdev, &leakage_id) == 0) {
869 for (i = 0; i < CISLANDS_MAX_LEAKAGE_COUNT; i++) {
870 virtual_voltage_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i;
871 if (radeon_atom_get_leakage_vddc_based_on_leakage_params(rdev, &vddc, &vddci,
872 virtual_voltage_id,
873 leakage_id) == 0) {
874 if (vddc != 0 && vddc != virtual_voltage_id) {
875 pi->vddc_leakage.actual_voltage[pi->vddc_leakage.count] = vddc;
876 pi->vddc_leakage.leakage_id[pi->vddc_leakage.count] = virtual_voltage_id;
877 pi->vddc_leakage.count++;
878 }
879 if (vddci != 0 && vddci != virtual_voltage_id) {
880 pi->vddci_leakage.actual_voltage[pi->vddci_leakage.count] = vddci;
881 pi->vddci_leakage.leakage_id[pi->vddci_leakage.count] = virtual_voltage_id;
882 pi->vddci_leakage.count++;
883 }
884 }
885 }
886 }
887}
888
889static void ci_set_dpm_event_sources(struct radeon_device *rdev, u32 sources)
890{
891 struct ci_power_info *pi = ci_get_pi(rdev);
892 bool want_thermal_protection;
893 enum radeon_dpm_event_src dpm_event_src;
894 u32 tmp;
895
896 switch (sources) {
897 case 0:
898 default:
899 want_thermal_protection = false;
900 break;
901 case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL):
902 want_thermal_protection = true;
903 dpm_event_src = RADEON_DPM_EVENT_SRC_DIGITAL;
904 break;
905 case (1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL):
906 want_thermal_protection = true;
907 dpm_event_src = RADEON_DPM_EVENT_SRC_EXTERNAL;
908 break;
909 case ((1 << RADEON_DPM_AUTO_THROTTLE_SRC_EXTERNAL) |
910 (1 << RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL)):
911 want_thermal_protection = true;
912 dpm_event_src = RADEON_DPM_EVENT_SRC_DIGIAL_OR_EXTERNAL;
913 break;
914 }
915
916 if (want_thermal_protection) {
917#if 0
918 /* XXX: need to figure out how to handle this properly */
919 tmp = RREG32_SMC(CG_THERMAL_CTRL);
920 tmp &= DPM_EVENT_SRC_MASK;
921 tmp |= DPM_EVENT_SRC(dpm_event_src);
922 WREG32_SMC(CG_THERMAL_CTRL, tmp);
923#endif
924
925 tmp = RREG32_SMC(GENERAL_PWRMGT);
926 if (pi->thermal_protection)
927 tmp &= ~THERMAL_PROTECTION_DIS;
928 else
929 tmp |= THERMAL_PROTECTION_DIS;
930 WREG32_SMC(GENERAL_PWRMGT, tmp);
931 } else {
932 tmp = RREG32_SMC(GENERAL_PWRMGT);
933 tmp |= THERMAL_PROTECTION_DIS;
934 WREG32_SMC(GENERAL_PWRMGT, tmp);
935 }
936}
937
938static void ci_enable_auto_throttle_source(struct radeon_device *rdev,
939 enum radeon_dpm_auto_throttle_src source,
940 bool enable)
941{
942 struct ci_power_info *pi = ci_get_pi(rdev);
943
944 if (enable) {
945 if (!(pi->active_auto_throttle_sources & (1 << source))) {
946 pi->active_auto_throttle_sources |= 1 << source;
947 ci_set_dpm_event_sources(rdev, pi->active_auto_throttle_sources);
948 }
949 } else {
950 if (pi->active_auto_throttle_sources & (1 << source)) {
951 pi->active_auto_throttle_sources &= ~(1 << source);
952 ci_set_dpm_event_sources(rdev, pi->active_auto_throttle_sources);
953 }
954 }
955}
956
957static void ci_enable_vr_hot_gpio_interrupt(struct radeon_device *rdev)
958{
959 if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_REGULATOR_HOT)
960 ci_send_msg_to_smc(rdev, PPSMC_MSG_EnableVRHotGPIOInterrupt);
961}
962
963static int ci_unfreeze_sclk_mclk_dpm(struct radeon_device *rdev)
964{
965 struct ci_power_info *pi = ci_get_pi(rdev);
966 PPSMC_Result smc_result;
967
968 if (!pi->need_update_smu7_dpm_table)
969 return 0;
970
971 if ((!pi->sclk_dpm_key_disabled) &&
972 (pi->need_update_smu7_dpm_table & (DPMTABLE_OD_UPDATE_SCLK | DPMTABLE_UPDATE_SCLK))) {
973 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_SCLKDPM_UnfreezeLevel);
974 if (smc_result != PPSMC_Result_OK)
975 return -EINVAL;
976 }
977
978 if ((!pi->mclk_dpm_key_disabled) &&
979 (pi->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK)) {
980 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_MCLKDPM_UnfreezeLevel);
981 if (smc_result != PPSMC_Result_OK)
982 return -EINVAL;
983 }
984
985 pi->need_update_smu7_dpm_table = 0;
986 return 0;
987}
988
989static int ci_enable_sclk_mclk_dpm(struct radeon_device *rdev, bool enable)
990{
991 struct ci_power_info *pi = ci_get_pi(rdev);
992 PPSMC_Result smc_result;
993
994 if (enable) {
995 if (!pi->sclk_dpm_key_disabled) {
996 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_DPM_Enable);
997 if (smc_result != PPSMC_Result_OK)
998 return -EINVAL;
999 }
1000
1001 if (!pi->mclk_dpm_key_disabled) {
1002 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_MCLKDPM_Enable);
1003 if (smc_result != PPSMC_Result_OK)
1004 return -EINVAL;
1005
1006 WREG32_P(MC_SEQ_CNTL_3, CAC_EN, ~CAC_EN);
1007
1008 WREG32_SMC(LCAC_MC0_CNTL, 0x05);
1009 WREG32_SMC(LCAC_MC1_CNTL, 0x05);
1010 WREG32_SMC(LCAC_CPL_CNTL, 0x100005);
1011
1012 udelay(10);
1013
1014 WREG32_SMC(LCAC_MC0_CNTL, 0x400005);
1015 WREG32_SMC(LCAC_MC1_CNTL, 0x400005);
1016 WREG32_SMC(LCAC_CPL_CNTL, 0x500005);
1017 }
1018 } else {
1019 if (!pi->sclk_dpm_key_disabled) {
1020 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_DPM_Disable);
1021 if (smc_result != PPSMC_Result_OK)
1022 return -EINVAL;
1023 }
1024
1025 if (!pi->mclk_dpm_key_disabled) {
1026 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_MCLKDPM_Disable);
1027 if (smc_result != PPSMC_Result_OK)
1028 return -EINVAL;
1029 }
1030 }
1031
1032 return 0;
1033}
1034
1035static int ci_start_dpm(struct radeon_device *rdev)
1036{
1037 struct ci_power_info *pi = ci_get_pi(rdev);
1038 PPSMC_Result smc_result;
1039 int ret;
1040 u32 tmp;
1041
1042 tmp = RREG32_SMC(GENERAL_PWRMGT);
1043 tmp |= GLOBAL_PWRMGT_EN;
1044 WREG32_SMC(GENERAL_PWRMGT, tmp);
1045
1046 tmp = RREG32_SMC(SCLK_PWRMGT_CNTL);
1047 tmp |= DYNAMIC_PM_EN;
1048 WREG32_SMC(SCLK_PWRMGT_CNTL, tmp);
1049
1050 ci_write_smc_soft_register(rdev, offsetof(SMU7_SoftRegisters, VoltageChangeTimeout), 0x1000);
1051
1052 WREG32_P(BIF_LNCNT_RESET, 0, ~RESET_LNCNT_EN);
1053
1054 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_Voltage_Cntl_Enable);
1055 if (smc_result != PPSMC_Result_OK)
1056 return -EINVAL;
1057
1058 ret = ci_enable_sclk_mclk_dpm(rdev, true);
1059 if (ret)
1060 return ret;
1061
1062 if (!pi->pcie_dpm_key_disabled) {
1063 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_PCIeDPM_Enable);
1064 if (smc_result != PPSMC_Result_OK)
1065 return -EINVAL;
1066 }
1067
1068 return 0;
1069}
1070
1071static int ci_freeze_sclk_mclk_dpm(struct radeon_device *rdev)
1072{
1073 struct ci_power_info *pi = ci_get_pi(rdev);
1074 PPSMC_Result smc_result;
1075
1076 if (!pi->need_update_smu7_dpm_table)
1077 return 0;
1078
1079 if ((!pi->sclk_dpm_key_disabled) &&
1080 (pi->need_update_smu7_dpm_table & (DPMTABLE_OD_UPDATE_SCLK | DPMTABLE_UPDATE_SCLK))) {
1081 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_SCLKDPM_FreezeLevel);
1082 if (smc_result != PPSMC_Result_OK)
1083 return -EINVAL;
1084 }
1085
1086 if ((!pi->mclk_dpm_key_disabled) &&
1087 (pi->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK)) {
1088 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_MCLKDPM_FreezeLevel);
1089 if (smc_result != PPSMC_Result_OK)
1090 return -EINVAL;
1091 }
1092
1093 return 0;
1094}
1095
1096static int ci_stop_dpm(struct radeon_device *rdev)
1097{
1098 struct ci_power_info *pi = ci_get_pi(rdev);
1099 PPSMC_Result smc_result;
1100 int ret;
1101 u32 tmp;
1102
1103 tmp = RREG32_SMC(GENERAL_PWRMGT);
1104 tmp &= ~GLOBAL_PWRMGT_EN;
1105 WREG32_SMC(GENERAL_PWRMGT, tmp);
1106
1107 tmp = RREG32(SCLK_PWRMGT_CNTL);
1108 tmp &= ~DYNAMIC_PM_EN;
1109 WREG32_SMC(SCLK_PWRMGT_CNTL, tmp);
1110
1111 if (!pi->pcie_dpm_key_disabled) {
1112 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_PCIeDPM_Disable);
1113 if (smc_result != PPSMC_Result_OK)
1114 return -EINVAL;
1115 }
1116
1117 ret = ci_enable_sclk_mclk_dpm(rdev, false);
1118 if (ret)
1119 return ret;
1120
1121 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_Voltage_Cntl_Disable);
1122 if (smc_result != PPSMC_Result_OK)
1123 return -EINVAL;
1124
1125 return 0;
1126}
1127
1128static void ci_enable_sclk_control(struct radeon_device *rdev, bool enable)
1129{
1130 u32 tmp = RREG32_SMC(SCLK_PWRMGT_CNTL);
1131
1132 if (enable)
1133 tmp &= ~SCLK_PWRMGT_OFF;
1134 else
1135 tmp |= SCLK_PWRMGT_OFF;
1136 WREG32_SMC(SCLK_PWRMGT_CNTL, tmp);
1137}
1138
1139#if 0
1140static int ci_notify_hw_of_power_source(struct radeon_device *rdev,
1141 bool ac_power)
1142{
1143 struct ci_power_info *pi = ci_get_pi(rdev);
1144 struct radeon_cac_tdp_table *cac_tdp_table =
1145 rdev->pm.dpm.dyn_state.cac_tdp_table;
1146 u32 power_limit;
1147
1148 if (ac_power)
1149 power_limit = (u32)(cac_tdp_table->maximum_power_delivery_limit * 256);
1150 else
1151 power_limit = (u32)(cac_tdp_table->battery_power_limit * 256);
1152
1153 ci_set_power_limit(rdev, power_limit);
1154
1155 if (pi->caps_automatic_dc_transition) {
1156 if (ac_power)
1157 ci_send_msg_to_smc(rdev, PPSMC_MSG_RunningOnAC);
1158 else
1159 ci_send_msg_to_smc(rdev, PPSMC_MSG_Remove_DC_Clamp);
1160 }
1161
1162 return 0;
1163}
1164#endif
1165
1166static PPSMC_Result ci_send_msg_to_smc_with_parameter(struct radeon_device *rdev,
1167 PPSMC_Msg msg, u32 parameter)
1168{
1169 WREG32(SMC_MSG_ARG_0, parameter);
1170 return ci_send_msg_to_smc(rdev, msg);
1171}
1172
1173static PPSMC_Result ci_send_msg_to_smc_return_parameter(struct radeon_device *rdev,
1174 PPSMC_Msg msg, u32 *parameter)
1175{
1176 PPSMC_Result smc_result;
1177
1178 smc_result = ci_send_msg_to_smc(rdev, msg);
1179
1180 if ((smc_result == PPSMC_Result_OK) && parameter)
1181 *parameter = RREG32(SMC_MSG_ARG_0);
1182
1183 return smc_result;
1184}
1185
1186static int ci_dpm_force_state_sclk(struct radeon_device *rdev, u32 n)
1187{
1188 struct ci_power_info *pi = ci_get_pi(rdev);
1189
1190 if (!pi->sclk_dpm_key_disabled) {
1191 PPSMC_Result smc_result =
1192 ci_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, n);
1193 if (smc_result != PPSMC_Result_OK)
1194 return -EINVAL;
1195 }
1196
1197 return 0;
1198}
1199
1200static int ci_dpm_force_state_mclk(struct radeon_device *rdev, u32 n)
1201{
1202 struct ci_power_info *pi = ci_get_pi(rdev);
1203
1204 if (!pi->mclk_dpm_key_disabled) {
1205 PPSMC_Result smc_result =
1206 ci_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_MCLKDPM_ForceState, n);
1207 if (smc_result != PPSMC_Result_OK)
1208 return -EINVAL;
1209 }
1210
1211 return 0;
1212}
1213
1214static int ci_dpm_force_state_pcie(struct radeon_device *rdev, u32 n)
1215{
1216 struct ci_power_info *pi = ci_get_pi(rdev);
1217
1218 if (!pi->pcie_dpm_key_disabled) {
1219 PPSMC_Result smc_result =
1220 ci_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_PCIeDPM_ForceLevel, n);
1221 if (smc_result != PPSMC_Result_OK)
1222 return -EINVAL;
1223 }
1224
1225 return 0;
1226}
1227
1228static int ci_set_power_limit(struct radeon_device *rdev, u32 n)
1229{
1230 struct ci_power_info *pi = ci_get_pi(rdev);
1231
1232 if (pi->power_containment_features & POWERCONTAINMENT_FEATURE_PkgPwrLimit) {
1233 PPSMC_Result smc_result =
1234 ci_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_PkgPwrSetLimit, n);
1235 if (smc_result != PPSMC_Result_OK)
1236 return -EINVAL;
1237 }
1238
1239 return 0;
1240}
1241
1242static int ci_set_overdrive_target_tdp(struct radeon_device *rdev,
1243 u32 target_tdp)
1244{
1245 PPSMC_Result smc_result =
1246 ci_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_OverDriveSetTargetTdp, target_tdp);
1247 if (smc_result != PPSMC_Result_OK)
1248 return -EINVAL;
1249 return 0;
1250}
1251
1252static int ci_set_boot_state(struct radeon_device *rdev)
1253{
1254 return ci_enable_sclk_mclk_dpm(rdev, false);
1255}
1256
1257static u32 ci_get_average_sclk_freq(struct radeon_device *rdev)
1258{
1259 u32 sclk_freq;
1260 PPSMC_Result smc_result =
1261 ci_send_msg_to_smc_return_parameter(rdev,
1262 PPSMC_MSG_API_GetSclkFrequency,
1263 &sclk_freq);
1264 if (smc_result != PPSMC_Result_OK)
1265 sclk_freq = 0;
1266
1267 return sclk_freq;
1268}
1269
1270static u32 ci_get_average_mclk_freq(struct radeon_device *rdev)
1271{
1272 u32 mclk_freq;
1273 PPSMC_Result smc_result =
1274 ci_send_msg_to_smc_return_parameter(rdev,
1275 PPSMC_MSG_API_GetMclkFrequency,
1276 &mclk_freq);
1277 if (smc_result != PPSMC_Result_OK)
1278 mclk_freq = 0;
1279
1280 return mclk_freq;
1281}
1282
1283static void ci_dpm_start_smc(struct radeon_device *rdev)
1284{
1285 int i;
1286
1287 ci_program_jump_on_start(rdev);
1288 ci_start_smc_clock(rdev);
1289 ci_start_smc(rdev);
1290 for (i = 0; i < rdev->usec_timeout; i++) {
1291 if (RREG32_SMC(FIRMWARE_FLAGS) & INTERRUPTS_ENABLED)
1292 break;
1293 }
1294}
1295
1296static void ci_dpm_stop_smc(struct radeon_device *rdev)
1297{
1298 ci_reset_smc(rdev);
1299 ci_stop_smc_clock(rdev);
1300}
1301
1302static int ci_process_firmware_header(struct radeon_device *rdev)
1303{
1304 struct ci_power_info *pi = ci_get_pi(rdev);
1305 u32 tmp;
1306 int ret;
1307
1308 ret = ci_read_smc_sram_dword(rdev,
1309 SMU7_FIRMWARE_HEADER_LOCATION +
1310 offsetof(SMU7_Firmware_Header, DpmTable),
1311 &tmp, pi->sram_end);
1312 if (ret)
1313 return ret;
1314
1315 pi->dpm_table_start = tmp;
1316
1317 ret = ci_read_smc_sram_dword(rdev,
1318 SMU7_FIRMWARE_HEADER_LOCATION +
1319 offsetof(SMU7_Firmware_Header, SoftRegisters),
1320 &tmp, pi->sram_end);
1321 if (ret)
1322 return ret;
1323
1324 pi->soft_regs_start = tmp;
1325
1326 ret = ci_read_smc_sram_dword(rdev,
1327 SMU7_FIRMWARE_HEADER_LOCATION +
1328 offsetof(SMU7_Firmware_Header, mcRegisterTable),
1329 &tmp, pi->sram_end);
1330 if (ret)
1331 return ret;
1332
1333 pi->mc_reg_table_start = tmp;
1334
1335 ret = ci_read_smc_sram_dword(rdev,
1336 SMU7_FIRMWARE_HEADER_LOCATION +
1337 offsetof(SMU7_Firmware_Header, FanTable),
1338 &tmp, pi->sram_end);
1339 if (ret)
1340 return ret;
1341
1342 pi->fan_table_start = tmp;
1343
1344 ret = ci_read_smc_sram_dword(rdev,
1345 SMU7_FIRMWARE_HEADER_LOCATION +
1346 offsetof(SMU7_Firmware_Header, mcArbDramTimingTable),
1347 &tmp, pi->sram_end);
1348 if (ret)
1349 return ret;
1350
1351 pi->arb_table_start = tmp;
1352
1353 return 0;
1354}
1355
1356static void ci_read_clock_registers(struct radeon_device *rdev)
1357{
1358 struct ci_power_info *pi = ci_get_pi(rdev);
1359
1360 pi->clock_registers.cg_spll_func_cntl =
1361 RREG32_SMC(CG_SPLL_FUNC_CNTL);
1362 pi->clock_registers.cg_spll_func_cntl_2 =
1363 RREG32_SMC(CG_SPLL_FUNC_CNTL_2);
1364 pi->clock_registers.cg_spll_func_cntl_3 =
1365 RREG32_SMC(CG_SPLL_FUNC_CNTL_3);
1366 pi->clock_registers.cg_spll_func_cntl_4 =
1367 RREG32_SMC(CG_SPLL_FUNC_CNTL_4);
1368 pi->clock_registers.cg_spll_spread_spectrum =
1369 RREG32_SMC(CG_SPLL_SPREAD_SPECTRUM);
1370 pi->clock_registers.cg_spll_spread_spectrum_2 =
1371 RREG32_SMC(CG_SPLL_SPREAD_SPECTRUM_2);
1372 pi->clock_registers.dll_cntl = RREG32(DLL_CNTL);
1373 pi->clock_registers.mclk_pwrmgt_cntl = RREG32(MCLK_PWRMGT_CNTL);
1374 pi->clock_registers.mpll_ad_func_cntl = RREG32(MPLL_AD_FUNC_CNTL);
1375 pi->clock_registers.mpll_dq_func_cntl = RREG32(MPLL_DQ_FUNC_CNTL);
1376 pi->clock_registers.mpll_func_cntl = RREG32(MPLL_FUNC_CNTL);
1377 pi->clock_registers.mpll_func_cntl_1 = RREG32(MPLL_FUNC_CNTL_1);
1378 pi->clock_registers.mpll_func_cntl_2 = RREG32(MPLL_FUNC_CNTL_2);
1379 pi->clock_registers.mpll_ss1 = RREG32(MPLL_SS1);
1380 pi->clock_registers.mpll_ss2 = RREG32(MPLL_SS2);
1381}
1382
1383static void ci_init_sclk_t(struct radeon_device *rdev)
1384{
1385 struct ci_power_info *pi = ci_get_pi(rdev);
1386
1387 pi->low_sclk_interrupt_t = 0;
1388}
1389
1390static void ci_enable_thermal_protection(struct radeon_device *rdev,
1391 bool enable)
1392{
1393 u32 tmp = RREG32_SMC(GENERAL_PWRMGT);
1394
1395 if (enable)
1396 tmp &= ~THERMAL_PROTECTION_DIS;
1397 else
1398 tmp |= THERMAL_PROTECTION_DIS;
1399 WREG32_SMC(GENERAL_PWRMGT, tmp);
1400}
1401
1402static void ci_enable_acpi_power_management(struct radeon_device *rdev)
1403{
1404 u32 tmp = RREG32_SMC(GENERAL_PWRMGT);
1405
1406 tmp |= STATIC_PM_EN;
1407
1408 WREG32_SMC(GENERAL_PWRMGT, tmp);
1409}
1410
1411#if 0
1412static int ci_enter_ulp_state(struct radeon_device *rdev)
1413{
1414
1415 WREG32(SMC_MESSAGE_0, PPSMC_MSG_SwitchToMinimumPower);
1416
1417 udelay(25000);
1418
1419 return 0;
1420}
1421
1422static int ci_exit_ulp_state(struct radeon_device *rdev)
1423{
1424 int i;
1425
1426 WREG32(SMC_MESSAGE_0, PPSMC_MSG_ResumeFromMinimumPower);
1427
1428 udelay(7000);
1429
1430 for (i = 0; i < rdev->usec_timeout; i++) {
1431 if (RREG32(SMC_RESP_0) == 1)
1432 break;
1433 udelay(1000);
1434 }
1435
1436 return 0;
1437}
1438#endif
1439
1440static int ci_notify_smc_display_change(struct radeon_device *rdev,
1441 bool has_display)
1442{
1443 PPSMC_Msg msg = has_display ? PPSMC_MSG_HasDisplay : PPSMC_MSG_NoDisplay;
1444
1445 return (ci_send_msg_to_smc(rdev, msg) == PPSMC_Result_OK) ? 0 : -EINVAL;
1446}
1447
1448static int ci_enable_ds_master_switch(struct radeon_device *rdev,
1449 bool enable)
1450{
1451 struct ci_power_info *pi = ci_get_pi(rdev);
1452
1453 if (enable) {
1454 if (pi->caps_sclk_ds) {
1455 if (ci_send_msg_to_smc(rdev, PPSMC_MSG_MASTER_DeepSleep_ON) != PPSMC_Result_OK)
1456 return -EINVAL;
1457 } else {
1458 if (ci_send_msg_to_smc(rdev, PPSMC_MSG_MASTER_DeepSleep_OFF) != PPSMC_Result_OK)
1459 return -EINVAL;
1460 }
1461 } else {
1462 if (pi->caps_sclk_ds) {
1463 if (ci_send_msg_to_smc(rdev, PPSMC_MSG_MASTER_DeepSleep_OFF) != PPSMC_Result_OK)
1464 return -EINVAL;
1465 }
1466 }
1467
1468 return 0;
1469}
1470
1471static void ci_program_display_gap(struct radeon_device *rdev)
1472{
1473 u32 tmp = RREG32_SMC(CG_DISPLAY_GAP_CNTL);
1474 u32 pre_vbi_time_in_us;
1475 u32 frame_time_in_us;
1476 u32 ref_clock = rdev->clock.spll.reference_freq;
1477 u32 refresh_rate = r600_dpm_get_vrefresh(rdev);
1478 u32 vblank_time = r600_dpm_get_vblank_time(rdev);
1479
1480 tmp &= ~DISP_GAP_MASK;
1481 if (rdev->pm.dpm.new_active_crtc_count > 0)
1482 tmp |= DISP_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM);
1483 else
1484 tmp |= DISP_GAP(R600_PM_DISPLAY_GAP_IGNORE);
1485 WREG32_SMC(CG_DISPLAY_GAP_CNTL, tmp);
1486
1487 if (refresh_rate == 0)
1488 refresh_rate = 60;
1489 if (vblank_time == 0xffffffff)
1490 vblank_time = 500;
1491 frame_time_in_us = 1000000 / refresh_rate;
1492 pre_vbi_time_in_us =
1493 frame_time_in_us - 200 - vblank_time;
1494 tmp = pre_vbi_time_in_us * (ref_clock / 100);
1495
1496 WREG32_SMC(CG_DISPLAY_GAP_CNTL2, tmp);
1497 ci_write_smc_soft_register(rdev, offsetof(SMU7_SoftRegisters, PreVBlankGap), 0x64);
1498 ci_write_smc_soft_register(rdev, offsetof(SMU7_SoftRegisters, VBlankTimeout), (frame_time_in_us - pre_vbi_time_in_us));
1499
1500
1501 ci_notify_smc_display_change(rdev, (rdev->pm.dpm.new_active_crtc_count == 1));
1502
1503}
1504
1505static void ci_enable_spread_spectrum(struct radeon_device *rdev, bool enable)
1506{
1507 struct ci_power_info *pi = ci_get_pi(rdev);
1508 u32 tmp;
1509
1510 if (enable) {
1511 if (pi->caps_sclk_ss_support) {
1512 tmp = RREG32_SMC(GENERAL_PWRMGT);
1513 tmp |= DYN_SPREAD_SPECTRUM_EN;
1514 WREG32_SMC(GENERAL_PWRMGT, tmp);
1515 }
1516 } else {
1517 tmp = RREG32_SMC(CG_SPLL_SPREAD_SPECTRUM);
1518 tmp &= ~SSEN;
1519 WREG32_SMC(CG_SPLL_SPREAD_SPECTRUM, tmp);
1520
1521 tmp = RREG32_SMC(GENERAL_PWRMGT);
1522 tmp &= ~DYN_SPREAD_SPECTRUM_EN;
1523 WREG32_SMC(GENERAL_PWRMGT, tmp);
1524 }
1525}
1526
1527static void ci_program_sstp(struct radeon_device *rdev)
1528{
1529 WREG32_SMC(CG_SSP, (SSTU(R600_SSTU_DFLT) | SST(R600_SST_DFLT)));
1530}
1531
1532static void ci_enable_display_gap(struct radeon_device *rdev)
1533{
1534 u32 tmp = RREG32_SMC(CG_DISPLAY_GAP_CNTL);
1535
1536 tmp &= ~(DISP_GAP_MASK | DISP_GAP_MCHG_MASK);
1537 tmp |= (DISP_GAP(R600_PM_DISPLAY_GAP_IGNORE) |
1538 DISP_GAP_MCHG(R600_PM_DISPLAY_GAP_VBLANK));
1539
1540 WREG32_SMC(CG_DISPLAY_GAP_CNTL, tmp);
1541}
1542
1543static void ci_program_vc(struct radeon_device *rdev)
1544{
1545 u32 tmp;
1546
1547 tmp = RREG32_SMC(SCLK_PWRMGT_CNTL);
1548 tmp &= ~(RESET_SCLK_CNT | RESET_BUSY_CNT);
1549 WREG32_SMC(SCLK_PWRMGT_CNTL, tmp);
1550
1551 WREG32_SMC(CG_FTV_0, CISLANDS_VRC_DFLT0);
1552 WREG32_SMC(CG_FTV_1, CISLANDS_VRC_DFLT1);
1553 WREG32_SMC(CG_FTV_2, CISLANDS_VRC_DFLT2);
1554 WREG32_SMC(CG_FTV_3, CISLANDS_VRC_DFLT3);
1555 WREG32_SMC(CG_FTV_4, CISLANDS_VRC_DFLT4);
1556 WREG32_SMC(CG_FTV_5, CISLANDS_VRC_DFLT5);
1557 WREG32_SMC(CG_FTV_6, CISLANDS_VRC_DFLT6);
1558 WREG32_SMC(CG_FTV_7, CISLANDS_VRC_DFLT7);
1559}
1560
1561static void ci_clear_vc(struct radeon_device *rdev)
1562{
1563 u32 tmp;
1564
1565 tmp = RREG32_SMC(SCLK_PWRMGT_CNTL);
1566 tmp |= (RESET_SCLK_CNT | RESET_BUSY_CNT);
1567 WREG32_SMC(SCLK_PWRMGT_CNTL, tmp);
1568
1569 WREG32_SMC(CG_FTV_0, 0);
1570 WREG32_SMC(CG_FTV_1, 0);
1571 WREG32_SMC(CG_FTV_2, 0);
1572 WREG32_SMC(CG_FTV_3, 0);
1573 WREG32_SMC(CG_FTV_4, 0);
1574 WREG32_SMC(CG_FTV_5, 0);
1575 WREG32_SMC(CG_FTV_6, 0);
1576 WREG32_SMC(CG_FTV_7, 0);
1577}
1578
1579static int ci_upload_firmware(struct radeon_device *rdev)
1580{
1581 struct ci_power_info *pi = ci_get_pi(rdev);
1582 int i, ret;
1583
1584 for (i = 0; i < rdev->usec_timeout; i++) {
1585 if (RREG32_SMC(RCU_UC_EVENTS) & BOOT_SEQ_DONE)
1586 break;
1587 }
1588 WREG32_SMC(SMC_SYSCON_MISC_CNTL, 1);
1589
1590 ci_stop_smc_clock(rdev);
1591 ci_reset_smc(rdev);
1592
1593 ret = ci_load_smc_ucode(rdev, pi->sram_end);
1594
1595 return ret;
1596
1597}
1598
1599static int ci_get_svi2_voltage_table(struct radeon_device *rdev,
1600 struct radeon_clock_voltage_dependency_table *voltage_dependency_table,
1601 struct atom_voltage_table *voltage_table)
1602{
1603 u32 i;
1604
1605 if (voltage_dependency_table == NULL)
1606 return -EINVAL;
1607
1608 voltage_table->mask_low = 0;
1609 voltage_table->phase_delay = 0;
1610
1611 voltage_table->count = voltage_dependency_table->count;
1612 for (i = 0; i < voltage_table->count; i++) {
1613 voltage_table->entries[i].value = voltage_dependency_table->entries[i].v;
1614 voltage_table->entries[i].smio_low = 0;
1615 }
1616
1617 return 0;
1618}
1619
1620static int ci_construct_voltage_tables(struct radeon_device *rdev)
1621{
1622 struct ci_power_info *pi = ci_get_pi(rdev);
1623 int ret;
1624
1625 if (pi->voltage_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO) {
1626 ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDC,
1627 VOLTAGE_OBJ_GPIO_LUT,
1628 &pi->vddc_voltage_table);
1629 if (ret)
1630 return ret;
1631 } else if (pi->voltage_control == CISLANDS_VOLTAGE_CONTROL_BY_SVID2) {
1632 ret = ci_get_svi2_voltage_table(rdev,
1633 &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
1634 &pi->vddc_voltage_table);
1635 if (ret)
1636 return ret;
1637 }
1638
1639 if (pi->vddc_voltage_table.count > SMU7_MAX_LEVELS_VDDC)
1640 si_trim_voltage_table_to_fit_state_table(rdev, SMU7_MAX_LEVELS_VDDC,
1641 &pi->vddc_voltage_table);
1642
1643 if (pi->vddci_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO) {
1644 ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDCI,
1645 VOLTAGE_OBJ_GPIO_LUT,
1646 &pi->vddci_voltage_table);
1647 if (ret)
1648 return ret;
1649 } else if (pi->vddci_control == CISLANDS_VOLTAGE_CONTROL_BY_SVID2) {
1650 ret = ci_get_svi2_voltage_table(rdev,
1651 &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
1652 &pi->vddci_voltage_table);
1653 if (ret)
1654 return ret;
1655 }
1656
1657 if (pi->vddci_voltage_table.count > SMU7_MAX_LEVELS_VDDCI)
1658 si_trim_voltage_table_to_fit_state_table(rdev, SMU7_MAX_LEVELS_VDDCI,
1659 &pi->vddci_voltage_table);
1660
1661 if (pi->mvdd_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO) {
1662 ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_MVDDC,
1663 VOLTAGE_OBJ_GPIO_LUT,
1664 &pi->mvdd_voltage_table);
1665 if (ret)
1666 return ret;
1667 } else if (pi->mvdd_control == CISLANDS_VOLTAGE_CONTROL_BY_SVID2) {
1668 ret = ci_get_svi2_voltage_table(rdev,
1669 &rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk,
1670 &pi->mvdd_voltage_table);
1671 if (ret)
1672 return ret;
1673 }
1674
1675 if (pi->mvdd_voltage_table.count > SMU7_MAX_LEVELS_MVDD)
1676 si_trim_voltage_table_to_fit_state_table(rdev, SMU7_MAX_LEVELS_MVDD,
1677 &pi->mvdd_voltage_table);
1678
1679 return 0;
1680}
1681
1682static void ci_populate_smc_voltage_table(struct radeon_device *rdev,
1683 struct atom_voltage_table_entry *voltage_table,
1684 SMU7_Discrete_VoltageLevel *smc_voltage_table)
1685{
1686 int ret;
1687
1688 ret = ci_get_std_voltage_value_sidd(rdev, voltage_table,
1689 &smc_voltage_table->StdVoltageHiSidd,
1690 &smc_voltage_table->StdVoltageLoSidd);
1691
1692 if (ret) {
1693 smc_voltage_table->StdVoltageHiSidd = voltage_table->value * VOLTAGE_SCALE;
1694 smc_voltage_table->StdVoltageLoSidd = voltage_table->value * VOLTAGE_SCALE;
1695 }
1696
1697 smc_voltage_table->Voltage = cpu_to_be16(voltage_table->value * VOLTAGE_SCALE);
1698 smc_voltage_table->StdVoltageHiSidd =
1699 cpu_to_be16(smc_voltage_table->StdVoltageHiSidd);
1700 smc_voltage_table->StdVoltageLoSidd =
1701 cpu_to_be16(smc_voltage_table->StdVoltageLoSidd);
1702}
1703
1704static int ci_populate_smc_vddc_table(struct radeon_device *rdev,
1705 SMU7_Discrete_DpmTable *table)
1706{
1707 struct ci_power_info *pi = ci_get_pi(rdev);
1708 unsigned int count;
1709
1710 table->VddcLevelCount = pi->vddc_voltage_table.count;
1711 for (count = 0; count < table->VddcLevelCount; count++) {
1712 ci_populate_smc_voltage_table(rdev,
1713 &pi->vddc_voltage_table.entries[count],
1714 &table->VddcLevel[count]);
1715
1716 if (pi->voltage_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO)
1717 table->VddcLevel[count].Smio |=
1718 pi->vddc_voltage_table.entries[count].smio_low;
1719 else
1720 table->VddcLevel[count].Smio = 0;
1721 }
1722 table->VddcLevelCount = cpu_to_be32(table->VddcLevelCount);
1723
1724 return 0;
1725}
1726
1727static int ci_populate_smc_vddci_table(struct radeon_device *rdev,
1728 SMU7_Discrete_DpmTable *table)
1729{
1730 unsigned int count;
1731 struct ci_power_info *pi = ci_get_pi(rdev);
1732
1733 table->VddciLevelCount = pi->vddci_voltage_table.count;
1734 for (count = 0; count < table->VddciLevelCount; count++) {
1735 ci_populate_smc_voltage_table(rdev,
1736 &pi->vddci_voltage_table.entries[count],
1737 &table->VddciLevel[count]);
1738
1739 if (pi->vddci_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO)
1740 table->VddciLevel[count].Smio |=
1741 pi->vddci_voltage_table.entries[count].smio_low;
1742 else
1743 table->VddciLevel[count].Smio = 0;
1744 }
1745 table->VddciLevelCount = cpu_to_be32(table->VddciLevelCount);
1746
1747 return 0;
1748}
1749
1750static int ci_populate_smc_mvdd_table(struct radeon_device *rdev,
1751 SMU7_Discrete_DpmTable *table)
1752{
1753 struct ci_power_info *pi = ci_get_pi(rdev);
1754 unsigned int count;
1755
1756 table->MvddLevelCount = pi->mvdd_voltage_table.count;
1757 for (count = 0; count < table->MvddLevelCount; count++) {
1758 ci_populate_smc_voltage_table(rdev,
1759 &pi->mvdd_voltage_table.entries[count],
1760 &table->MvddLevel[count]);
1761
1762 if (pi->mvdd_control == CISLANDS_VOLTAGE_CONTROL_BY_GPIO)
1763 table->MvddLevel[count].Smio |=
1764 pi->mvdd_voltage_table.entries[count].smio_low;
1765 else
1766 table->MvddLevel[count].Smio = 0;
1767 }
1768 table->MvddLevelCount = cpu_to_be32(table->MvddLevelCount);
1769
1770 return 0;
1771}
1772
1773static int ci_populate_smc_voltage_tables(struct radeon_device *rdev,
1774 SMU7_Discrete_DpmTable *table)
1775{
1776 int ret;
1777
1778 ret = ci_populate_smc_vddc_table(rdev, table);
1779 if (ret)
1780 return ret;
1781
1782 ret = ci_populate_smc_vddci_table(rdev, table);
1783 if (ret)
1784 return ret;
1785
1786 ret = ci_populate_smc_mvdd_table(rdev, table);
1787 if (ret)
1788 return ret;
1789
1790 return 0;
1791}
1792
1793static int ci_populate_mvdd_value(struct radeon_device *rdev, u32 mclk,
1794 SMU7_Discrete_VoltageLevel *voltage)
1795{
1796 struct ci_power_info *pi = ci_get_pi(rdev);
1797 u32 i = 0;
1798
1799 if (pi->mvdd_control != CISLANDS_VOLTAGE_CONTROL_NONE) {
1800 for (i = 0; i < rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk.count; i++) {
1801 if (mclk <= rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk.entries[i].clk) {
1802 voltage->Voltage = pi->mvdd_voltage_table.entries[i].value;
1803 break;
1804 }
1805 }
1806
1807 if (i >= rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk.count)
1808 return -EINVAL;
1809 }
1810
1811 return -EINVAL;
1812}
1813
1814static int ci_get_std_voltage_value_sidd(struct radeon_device *rdev,
1815 struct atom_voltage_table_entry *voltage_table,
1816 u16 *std_voltage_hi_sidd, u16 *std_voltage_lo_sidd)
1817{
1818 u16 v_index, idx;
1819 bool voltage_found = false;
1820 *std_voltage_hi_sidd = voltage_table->value * VOLTAGE_SCALE;
1821 *std_voltage_lo_sidd = voltage_table->value * VOLTAGE_SCALE;
1822
1823 if (rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries == NULL)
1824 return -EINVAL;
1825
1826 if (rdev->pm.dpm.dyn_state.cac_leakage_table.entries) {
1827 for (v_index = 0; (u32)v_index < rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; v_index++) {
1828 if (voltage_table->value ==
1829 rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[v_index].v) {
1830 voltage_found = true;
1831 if ((u32)v_index < rdev->pm.dpm.dyn_state.cac_leakage_table.count)
1832 idx = v_index;
1833 else
1834 idx = rdev->pm.dpm.dyn_state.cac_leakage_table.count - 1;
1835 *std_voltage_lo_sidd =
1836 rdev->pm.dpm.dyn_state.cac_leakage_table.entries[idx].vddc * VOLTAGE_SCALE;
1837 *std_voltage_hi_sidd =
1838 rdev->pm.dpm.dyn_state.cac_leakage_table.entries[idx].leakage * VOLTAGE_SCALE;
1839 break;
1840 }
1841 }
1842
1843 if (!voltage_found) {
1844 for (v_index = 0; (u32)v_index < rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; v_index++) {
1845 if (voltage_table->value <=
1846 rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[v_index].v) {
1847 voltage_found = true;
1848 if ((u32)v_index < rdev->pm.dpm.dyn_state.cac_leakage_table.count)
1849 idx = v_index;
1850 else
1851 idx = rdev->pm.dpm.dyn_state.cac_leakage_table.count - 1;
1852 *std_voltage_lo_sidd =
1853 rdev->pm.dpm.dyn_state.cac_leakage_table.entries[idx].vddc * VOLTAGE_SCALE;
1854 *std_voltage_hi_sidd =
1855 rdev->pm.dpm.dyn_state.cac_leakage_table.entries[idx].leakage * VOLTAGE_SCALE;
1856 break;
1857 }
1858 }
1859 }
1860 }
1861
1862 return 0;
1863}
1864
1865static void ci_populate_phase_value_based_on_sclk(struct radeon_device *rdev,
1866 const struct radeon_phase_shedding_limits_table *limits,
1867 u32 sclk,
1868 u32 *phase_shedding)
1869{
1870 unsigned int i;
1871
1872 *phase_shedding = 1;
1873
1874 for (i = 0; i < limits->count; i++) {
1875 if (sclk < limits->entries[i].sclk) {
1876 *phase_shedding = i;
1877 break;
1878 }
1879 }
1880}
1881
1882static void ci_populate_phase_value_based_on_mclk(struct radeon_device *rdev,
1883 const struct radeon_phase_shedding_limits_table *limits,
1884 u32 mclk,
1885 u32 *phase_shedding)
1886{
1887 unsigned int i;
1888
1889 *phase_shedding = 1;
1890
1891 for (i = 0; i < limits->count; i++) {
1892 if (mclk < limits->entries[i].mclk) {
1893 *phase_shedding = i;
1894 break;
1895 }
1896 }
1897}
1898
1899static int ci_init_arb_table_index(struct radeon_device *rdev)
1900{
1901 struct ci_power_info *pi = ci_get_pi(rdev);
1902 u32 tmp;
1903 int ret;
1904
1905 ret = ci_read_smc_sram_dword(rdev, pi->arb_table_start,
1906 &tmp, pi->sram_end);
1907 if (ret)
1908 return ret;
1909
1910 tmp &= 0x00FFFFFF;
1911 tmp |= MC_CG_ARB_FREQ_F1 << 24;
1912
1913 return ci_write_smc_sram_dword(rdev, pi->arb_table_start,
1914 tmp, pi->sram_end);
1915}
1916
1917static int ci_get_dependency_volt_by_clk(struct radeon_device *rdev,
1918 struct radeon_clock_voltage_dependency_table *allowed_clock_voltage_table,
1919 u32 clock, u32 *voltage)
1920{
1921 u32 i = 0;
1922
1923 if (allowed_clock_voltage_table->count == 0)
1924 return -EINVAL;
1925
1926 for (i = 0; i < allowed_clock_voltage_table->count; i++) {
1927 if (allowed_clock_voltage_table->entries[i].clk >= clock) {
1928 *voltage = allowed_clock_voltage_table->entries[i].v;
1929 return 0;
1930 }
1931 }
1932
1933 *voltage = allowed_clock_voltage_table->entries[i-1].v;
1934
1935 return 0;
1936}
1937
1938static u8 ci_get_sleep_divider_id_from_clock(struct radeon_device *rdev,
1939 u32 sclk, u32 min_sclk_in_sr)
1940{
1941 u32 i;
1942 u32 tmp;
1943 u32 min = (min_sclk_in_sr > CISLAND_MINIMUM_ENGINE_CLOCK) ?
1944 min_sclk_in_sr : CISLAND_MINIMUM_ENGINE_CLOCK;
1945
1946 if (sclk < min)
1947 return 0;
1948
1949 for (i = CISLAND_MAX_DEEPSLEEP_DIVIDER_ID; ; i--) {
1950 tmp = sclk / (1 << i);
1951 if (tmp >= min || i == 0)
1952 break;
1953 }
1954
1955 return (u8)i;
1956}
1957
1958static int ci_initial_switch_from_arb_f0_to_f1(struct radeon_device *rdev)
1959{
1960 return ni_copy_and_switch_arb_sets(rdev, MC_CG_ARB_FREQ_F0, MC_CG_ARB_FREQ_F1);
1961}
1962
1963static int ci_reset_to_default(struct radeon_device *rdev)
1964{
1965 return (ci_send_msg_to_smc(rdev, PPSMC_MSG_ResetToDefaults) == PPSMC_Result_OK) ?
1966 0 : -EINVAL;
1967}
1968
1969static int ci_force_switch_to_arb_f0(struct radeon_device *rdev)
1970{
1971 u32 tmp;
1972
1973 tmp = (RREG32_SMC(SMC_SCRATCH9) & 0x0000ff00) >> 8;
1974
1975 if (tmp == MC_CG_ARB_FREQ_F0)
1976 return 0;
1977
1978 return ni_copy_and_switch_arb_sets(rdev, tmp, MC_CG_ARB_FREQ_F0);
1979}
1980
1981static int ci_populate_memory_timing_parameters(struct radeon_device *rdev,
1982 u32 sclk,
1983 u32 mclk,
1984 SMU7_Discrete_MCArbDramTimingTableEntry *arb_regs)
1985{
1986 u32 dram_timing;
1987 u32 dram_timing2;
1988 u32 burst_time;
1989
1990 radeon_atom_set_engine_dram_timings(rdev, sclk, mclk);
1991
1992 dram_timing = RREG32(MC_ARB_DRAM_TIMING);
1993 dram_timing2 = RREG32(MC_ARB_DRAM_TIMING2);
1994 burst_time = RREG32(MC_ARB_BURST_TIME) & STATE0_MASK;
1995
1996 arb_regs->McArbDramTiming = cpu_to_be32(dram_timing);
1997 arb_regs->McArbDramTiming2 = cpu_to_be32(dram_timing2);
1998 arb_regs->McArbBurstTime = (u8)burst_time;
1999
2000 return 0;
2001}
2002
2003static int ci_do_program_memory_timing_parameters(struct radeon_device *rdev)
2004{
2005 struct ci_power_info *pi = ci_get_pi(rdev);
2006 SMU7_Discrete_MCArbDramTimingTable arb_regs;
2007 u32 i, j;
2008 int ret = 0;
2009
2010 memset(&arb_regs, 0, sizeof(SMU7_Discrete_MCArbDramTimingTable));
2011
2012 for (i = 0; i < pi->dpm_table.sclk_table.count; i++) {
2013 for (j = 0; j < pi->dpm_table.mclk_table.count; j++) {
2014 ret = ci_populate_memory_timing_parameters(rdev,
2015 pi->dpm_table.sclk_table.dpm_levels[i].value,
2016 pi->dpm_table.mclk_table.dpm_levels[j].value,
2017 &arb_regs.entries[i][j]);
2018 if (ret)
2019 break;
2020 }
2021 }
2022
2023 if (ret == 0)
2024 ret = ci_copy_bytes_to_smc(rdev,
2025 pi->arb_table_start,
2026 (u8 *)&arb_regs,
2027 sizeof(SMU7_Discrete_MCArbDramTimingTable),
2028 pi->sram_end);
2029
2030 return ret;
2031}
2032
2033static int ci_program_memory_timing_parameters(struct radeon_device *rdev)
2034{
2035 struct ci_power_info *pi = ci_get_pi(rdev);
2036
2037 if (pi->need_update_smu7_dpm_table == 0)
2038 return 0;
2039
2040 return ci_do_program_memory_timing_parameters(rdev);
2041}
2042
2043static void ci_populate_smc_initial_state(struct radeon_device *rdev,
2044 struct radeon_ps *radeon_boot_state)
2045{
2046 struct ci_ps *boot_state = ci_get_ps(radeon_boot_state);
2047 struct ci_power_info *pi = ci_get_pi(rdev);
2048 u32 level = 0;
2049
2050 for (level = 0; level < rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; level++) {
2051 if (rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[level].clk >=
2052 boot_state->performance_levels[0].sclk) {
2053 pi->smc_state_table.GraphicsBootLevel = level;
2054 break;
2055 }
2056 }
2057
2058 for (level = 0; level < rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.count; level++) {
2059 if (rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries[level].clk >=
2060 boot_state->performance_levels[0].mclk) {
2061 pi->smc_state_table.MemoryBootLevel = level;
2062 break;
2063 }
2064 }
2065}
2066
2067static u32 ci_get_dpm_level_enable_mask_value(struct ci_single_dpm_table *dpm_table)
2068{
2069 u32 i;
2070 u32 mask_value = 0;
2071
2072 for (i = dpm_table->count; i > 0; i--) {
2073 mask_value = mask_value << 1;
2074 if (dpm_table->dpm_levels[i-1].enabled)
2075 mask_value |= 0x1;
2076 else
2077 mask_value &= 0xFFFFFFFE;
2078 }
2079
2080 return mask_value;
2081}
2082
2083static void ci_populate_smc_link_level(struct radeon_device *rdev,
2084 SMU7_Discrete_DpmTable *table)
2085{
2086 struct ci_power_info *pi = ci_get_pi(rdev);
2087 struct ci_dpm_table *dpm_table = &pi->dpm_table;
2088 u32 i;
2089
2090 for (i = 0; i < dpm_table->pcie_speed_table.count; i++) {
2091 table->LinkLevel[i].PcieGenSpeed =
2092 (u8)dpm_table->pcie_speed_table.dpm_levels[i].value;
2093 table->LinkLevel[i].PcieLaneCount =
2094 r600_encode_pci_lane_width(dpm_table->pcie_speed_table.dpm_levels[i].param1);
2095 table->LinkLevel[i].EnabledForActivity = 1;
2096 table->LinkLevel[i].DownT = cpu_to_be32(5);
2097 table->LinkLevel[i].UpT = cpu_to_be32(30);
2098 }
2099
2100 pi->smc_state_table.LinkLevelCount = (u8)dpm_table->pcie_speed_table.count;
2101 pi->dpm_level_enable_mask.pcie_dpm_enable_mask =
2102 ci_get_dpm_level_enable_mask_value(&dpm_table->pcie_speed_table);
2103}
2104
2105static int ci_populate_smc_uvd_level(struct radeon_device *rdev,
2106 SMU7_Discrete_DpmTable *table)
2107{
2108 u32 count;
2109 struct atom_clock_dividers dividers;
2110 int ret = -EINVAL;
2111
2112 table->UvdLevelCount =
2113 rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count;
2114
2115 for (count = 0; count < table->UvdLevelCount; count++) {
2116 table->UvdLevel[count].VclkFrequency =
2117 rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[count].vclk;
2118 table->UvdLevel[count].DclkFrequency =
2119 rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[count].dclk;
2120 table->UvdLevel[count].MinVddc =
2121 rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[count].v * VOLTAGE_SCALE;
2122 table->UvdLevel[count].MinVddcPhases = 1;
2123
2124 ret = radeon_atom_get_clock_dividers(rdev,
2125 COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
2126 table->UvdLevel[count].VclkFrequency, false, &dividers);
2127 if (ret)
2128 return ret;
2129
2130 table->UvdLevel[count].VclkDivider = (u8)dividers.post_divider;
2131
2132 ret = radeon_atom_get_clock_dividers(rdev,
2133 COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
2134 table->UvdLevel[count].DclkFrequency, false, &dividers);
2135 if (ret)
2136 return ret;
2137
2138 table->UvdLevel[count].DclkDivider = (u8)dividers.post_divider;
2139
2140 table->UvdLevel[count].VclkFrequency = cpu_to_be32(table->UvdLevel[count].VclkFrequency);
2141 table->UvdLevel[count].DclkFrequency = cpu_to_be32(table->UvdLevel[count].DclkFrequency);
2142 table->UvdLevel[count].MinVddc = cpu_to_be16(table->UvdLevel[count].MinVddc);
2143 }
2144
2145 return ret;
2146}
2147
2148static int ci_populate_smc_vce_level(struct radeon_device *rdev,
2149 SMU7_Discrete_DpmTable *table)
2150{
2151 u32 count;
2152 struct atom_clock_dividers dividers;
2153 int ret = -EINVAL;
2154
2155 table->VceLevelCount =
2156 rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.count;
2157
2158 for (count = 0; count < table->VceLevelCount; count++) {
2159 table->VceLevel[count].Frequency =
2160 rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries[count].evclk;
2161 table->VceLevel[count].MinVoltage =
2162 (u16)rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries[count].v * VOLTAGE_SCALE;
2163 table->VceLevel[count].MinPhases = 1;
2164
2165 ret = radeon_atom_get_clock_dividers(rdev,
2166 COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
2167 table->VceLevel[count].Frequency, false, &dividers);
2168 if (ret)
2169 return ret;
2170
2171 table->VceLevel[count].Divider = (u8)dividers.post_divider;
2172
2173 table->VceLevel[count].Frequency = cpu_to_be32(table->VceLevel[count].Frequency);
2174 table->VceLevel[count].MinVoltage = cpu_to_be16(table->VceLevel[count].MinVoltage);
2175 }
2176
2177 return ret;
2178
2179}
2180
2181static int ci_populate_smc_acp_level(struct radeon_device *rdev,
2182 SMU7_Discrete_DpmTable *table)
2183{
2184 u32 count;
2185 struct atom_clock_dividers dividers;
2186 int ret = -EINVAL;
2187
2188 table->AcpLevelCount = (u8)
2189 (rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.count);
2190
2191 for (count = 0; count < table->AcpLevelCount; count++) {
2192 table->AcpLevel[count].Frequency =
2193 rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries[count].clk;
2194 table->AcpLevel[count].MinVoltage =
2195 rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries[count].v;
2196 table->AcpLevel[count].MinPhases = 1;
2197
2198 ret = radeon_atom_get_clock_dividers(rdev,
2199 COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
2200 table->AcpLevel[count].Frequency, false, &dividers);
2201 if (ret)
2202 return ret;
2203
2204 table->AcpLevel[count].Divider = (u8)dividers.post_divider;
2205
2206 table->AcpLevel[count].Frequency = cpu_to_be32(table->AcpLevel[count].Frequency);
2207 table->AcpLevel[count].MinVoltage = cpu_to_be16(table->AcpLevel[count].MinVoltage);
2208 }
2209
2210 return ret;
2211}
2212
2213static int ci_populate_smc_samu_level(struct radeon_device *rdev,
2214 SMU7_Discrete_DpmTable *table)
2215{
2216 u32 count;
2217 struct atom_clock_dividers dividers;
2218 int ret = -EINVAL;
2219
2220 table->SamuLevelCount =
2221 rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.count;
2222
2223 for (count = 0; count < table->SamuLevelCount; count++) {
2224 table->SamuLevel[count].Frequency =
2225 rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries[count].clk;
2226 table->SamuLevel[count].MinVoltage =
2227 rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries[count].v * VOLTAGE_SCALE;
2228 table->SamuLevel[count].MinPhases = 1;
2229
2230 ret = radeon_atom_get_clock_dividers(rdev,
2231 COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK,
2232 table->SamuLevel[count].Frequency, false, &dividers);
2233 if (ret)
2234 return ret;
2235
2236 table->SamuLevel[count].Divider = (u8)dividers.post_divider;
2237
2238 table->SamuLevel[count].Frequency = cpu_to_be32(table->SamuLevel[count].Frequency);
2239 table->SamuLevel[count].MinVoltage = cpu_to_be16(table->SamuLevel[count].MinVoltage);
2240 }
2241
2242 return ret;
2243}
2244
2245static int ci_calculate_mclk_params(struct radeon_device *rdev,
2246 u32 memory_clock,
2247 SMU7_Discrete_MemoryLevel *mclk,
2248 bool strobe_mode,
2249 bool dll_state_on)
2250{
2251 struct ci_power_info *pi = ci_get_pi(rdev);
2252 u32 dll_cntl = pi->clock_registers.dll_cntl;
2253 u32 mclk_pwrmgt_cntl = pi->clock_registers.mclk_pwrmgt_cntl;
2254 u32 mpll_ad_func_cntl = pi->clock_registers.mpll_ad_func_cntl;
2255 u32 mpll_dq_func_cntl = pi->clock_registers.mpll_dq_func_cntl;
2256 u32 mpll_func_cntl = pi->clock_registers.mpll_func_cntl;
2257 u32 mpll_func_cntl_1 = pi->clock_registers.mpll_func_cntl_1;
2258 u32 mpll_func_cntl_2 = pi->clock_registers.mpll_func_cntl_2;
2259 u32 mpll_ss1 = pi->clock_registers.mpll_ss1;
2260 u32 mpll_ss2 = pi->clock_registers.mpll_ss2;
2261 struct atom_mpll_param mpll_param;
2262 int ret;
2263
2264 ret = radeon_atom_get_memory_pll_dividers(rdev, memory_clock, strobe_mode, &mpll_param);
2265 if (ret)
2266 return ret;
2267
2268 mpll_func_cntl &= ~BWCTRL_MASK;
2269 mpll_func_cntl |= BWCTRL(mpll_param.bwcntl);
2270
2271 mpll_func_cntl_1 &= ~(CLKF_MASK | CLKFRAC_MASK | VCO_MODE_MASK);
2272 mpll_func_cntl_1 |= CLKF(mpll_param.clkf) |
2273 CLKFRAC(mpll_param.clkfrac) | VCO_MODE(mpll_param.vco_mode);
2274
2275 mpll_ad_func_cntl &= ~YCLK_POST_DIV_MASK;
2276 mpll_ad_func_cntl |= YCLK_POST_DIV(mpll_param.post_div);
2277
2278 if (pi->mem_gddr5) {
2279 mpll_dq_func_cntl &= ~(YCLK_SEL_MASK | YCLK_POST_DIV_MASK);
2280 mpll_dq_func_cntl |= YCLK_SEL(mpll_param.yclk_sel) |
2281 YCLK_POST_DIV(mpll_param.post_div);
2282 }
2283
2284 if (pi->caps_mclk_ss_support) {
2285 struct radeon_atom_ss ss;
2286 u32 freq_nom;
2287 u32 tmp;
2288 u32 reference_clock = rdev->clock.mpll.reference_freq;
2289
2290 if (pi->mem_gddr5)
2291 freq_nom = memory_clock * 4;
2292 else
2293 freq_nom = memory_clock * 2;
2294
2295 tmp = (freq_nom / reference_clock);
2296 tmp = tmp * tmp;
2297 if (radeon_atombios_get_asic_ss_info(rdev, &ss,
2298 ASIC_INTERNAL_MEMORY_SS, freq_nom)) {
2299 u32 clks = reference_clock * 5 / ss.rate;
2300 u32 clkv = (u32)((((131 * ss.percentage * ss.rate) / 100) * tmp) / freq_nom);
2301
2302 mpll_ss1 &= ~CLKV_MASK;
2303 mpll_ss1 |= CLKV(clkv);
2304
2305 mpll_ss2 &= ~CLKS_MASK;
2306 mpll_ss2 |= CLKS(clks);
2307 }
2308 }
2309
2310 mclk_pwrmgt_cntl &= ~DLL_SPEED_MASK;
2311 mclk_pwrmgt_cntl |= DLL_SPEED(mpll_param.dll_speed);
2312
2313 if (dll_state_on)
2314 mclk_pwrmgt_cntl |= MRDCK0_PDNB | MRDCK1_PDNB;
2315 else
2316 mclk_pwrmgt_cntl &= ~(MRDCK0_PDNB | MRDCK1_PDNB);
2317
2318 mclk->MclkFrequency = memory_clock;
2319 mclk->MpllFuncCntl = mpll_func_cntl;
2320 mclk->MpllFuncCntl_1 = mpll_func_cntl_1;
2321 mclk->MpllFuncCntl_2 = mpll_func_cntl_2;
2322 mclk->MpllAdFuncCntl = mpll_ad_func_cntl;
2323 mclk->MpllDqFuncCntl = mpll_dq_func_cntl;
2324 mclk->MclkPwrmgtCntl = mclk_pwrmgt_cntl;
2325 mclk->DllCntl = dll_cntl;
2326 mclk->MpllSs1 = mpll_ss1;
2327 mclk->MpllSs2 = mpll_ss2;
2328
2329 return 0;
2330}
2331
2332static int ci_populate_single_memory_level(struct radeon_device *rdev,
2333 u32 memory_clock,
2334 SMU7_Discrete_MemoryLevel *memory_level)
2335{
2336 struct ci_power_info *pi = ci_get_pi(rdev);
2337 int ret;
2338 bool dll_state_on;
2339
2340 if (rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries) {
2341 ret = ci_get_dependency_volt_by_clk(rdev,
2342 &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk,
2343 memory_clock, &memory_level->MinVddc);
2344 if (ret)
2345 return ret;
2346 }
2347
2348 if (rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk.entries) {
2349 ret = ci_get_dependency_volt_by_clk(rdev,
2350 &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk,
2351 memory_clock, &memory_level->MinVddci);
2352 if (ret)
2353 return ret;
2354 }
2355
2356 if (rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk.entries) {
2357 ret = ci_get_dependency_volt_by_clk(rdev,
2358 &rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk,
2359 memory_clock, &memory_level->MinMvdd);
2360 if (ret)
2361 return ret;
2362 }
2363
2364 memory_level->MinVddcPhases = 1;
2365
2366 if (pi->vddc_phase_shed_control)
2367 ci_populate_phase_value_based_on_mclk(rdev,
2368 &rdev->pm.dpm.dyn_state.phase_shedding_limits_table,
2369 memory_clock,
2370 &memory_level->MinVddcPhases);
2371
2372 memory_level->EnabledForThrottle = 1;
2373 memory_level->EnabledForActivity = 1;
2374 memory_level->UpH = 0;
2375 memory_level->DownH = 100;
2376 memory_level->VoltageDownH = 0;
2377 memory_level->ActivityLevel = (u16)pi->mclk_activity_target;
2378
2379 memory_level->StutterEnable = false;
2380 memory_level->StrobeEnable = false;
2381 memory_level->EdcReadEnable = false;
2382 memory_level->EdcWriteEnable = false;
2383 memory_level->RttEnable = false;
2384
2385 memory_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
2386
2387 if (pi->mclk_stutter_mode_threshold &&
2388 (memory_clock <= pi->mclk_stutter_mode_threshold) &&
2389 (pi->uvd_enabled == false) &&
2390 (RREG32(DPG_PIPE_STUTTER_CONTROL) & STUTTER_ENABLE) &&
2391 (rdev->pm.dpm.new_active_crtc_count <= 2))
2392 memory_level->StutterEnable = true;
2393
2394 if (pi->mclk_strobe_mode_threshold &&
2395 (memory_clock <= pi->mclk_strobe_mode_threshold))
2396 memory_level->StrobeEnable = 1;
2397
2398 if (pi->mem_gddr5) {
2399 memory_level->StrobeRatio =
2400 si_get_mclk_frequency_ratio(memory_clock, memory_level->StrobeEnable);
2401 if (pi->mclk_edc_enable_threshold &&
2402 (memory_clock > pi->mclk_edc_enable_threshold))
2403 memory_level->EdcReadEnable = true;
2404
2405 if (pi->mclk_edc_wr_enable_threshold &&
2406 (memory_clock > pi->mclk_edc_wr_enable_threshold))
2407 memory_level->EdcWriteEnable = true;
2408
2409 if (memory_level->StrobeEnable) {
2410 if (si_get_mclk_frequency_ratio(memory_clock, true) >=
2411 ((RREG32(MC_SEQ_MISC7) >> 16) & 0xf))
2412 dll_state_on = ((RREG32(MC_SEQ_MISC5) >> 1) & 0x1) ? true : false;
2413 else
2414 dll_state_on = ((RREG32(MC_SEQ_MISC6) >> 1) & 0x1) ? true : false;
2415 } else {
2416 dll_state_on = pi->dll_default_on;
2417 }
2418 } else {
2419 memory_level->StrobeRatio = si_get_ddr3_mclk_frequency_ratio(memory_clock);
2420 dll_state_on = ((RREG32(MC_SEQ_MISC5) >> 1) & 0x1) ? true : false;
2421 }
2422
2423 ret = ci_calculate_mclk_params(rdev, memory_clock, memory_level, memory_level->StrobeEnable, dll_state_on);
2424 if (ret)
2425 return ret;
2426
2427 memory_level->MinVddc = cpu_to_be32(memory_level->MinVddc * VOLTAGE_SCALE);
2428 memory_level->MinVddcPhases = cpu_to_be32(memory_level->MinVddcPhases);
2429 memory_level->MinVddci = cpu_to_be32(memory_level->MinVddci * VOLTAGE_SCALE);
2430 memory_level->MinMvdd = cpu_to_be32(memory_level->MinMvdd * VOLTAGE_SCALE);
2431
2432 memory_level->MclkFrequency = cpu_to_be32(memory_level->MclkFrequency);
2433 memory_level->ActivityLevel = cpu_to_be16(memory_level->ActivityLevel);
2434 memory_level->MpllFuncCntl = cpu_to_be32(memory_level->MpllFuncCntl);
2435 memory_level->MpllFuncCntl_1 = cpu_to_be32(memory_level->MpllFuncCntl_1);
2436 memory_level->MpllFuncCntl_2 = cpu_to_be32(memory_level->MpllFuncCntl_2);
2437 memory_level->MpllAdFuncCntl = cpu_to_be32(memory_level->MpllAdFuncCntl);
2438 memory_level->MpllDqFuncCntl = cpu_to_be32(memory_level->MpllDqFuncCntl);
2439 memory_level->MclkPwrmgtCntl = cpu_to_be32(memory_level->MclkPwrmgtCntl);
2440 memory_level->DllCntl = cpu_to_be32(memory_level->DllCntl);
2441 memory_level->MpllSs1 = cpu_to_be32(memory_level->MpllSs1);
2442 memory_level->MpllSs2 = cpu_to_be32(memory_level->MpllSs2);
2443
2444 return 0;
2445}
2446
2447static int ci_populate_smc_acpi_level(struct radeon_device *rdev,
2448 SMU7_Discrete_DpmTable *table)
2449{
2450 struct ci_power_info *pi = ci_get_pi(rdev);
2451 struct atom_clock_dividers dividers;
2452 SMU7_Discrete_VoltageLevel voltage_level;
2453 u32 spll_func_cntl = pi->clock_registers.cg_spll_func_cntl;
2454 u32 spll_func_cntl_2 = pi->clock_registers.cg_spll_func_cntl_2;
2455 u32 dll_cntl = pi->clock_registers.dll_cntl;
2456 u32 mclk_pwrmgt_cntl = pi->clock_registers.mclk_pwrmgt_cntl;
2457 int ret;
2458
2459 table->ACPILevel.Flags &= ~PPSMC_SWSTATE_FLAG_DC;
2460
2461 if (pi->acpi_vddc)
2462 table->ACPILevel.MinVddc = cpu_to_be32(pi->acpi_vddc * VOLTAGE_SCALE);
2463 else
2464 table->ACPILevel.MinVddc = cpu_to_be32(pi->min_vddc_in_pp_table * VOLTAGE_SCALE);
2465
2466 table->ACPILevel.MinVddcPhases = pi->vddc_phase_shed_control ? 0 : 1;
2467
2468 table->ACPILevel.SclkFrequency = rdev->clock.spll.reference_freq;
2469
2470 ret = radeon_atom_get_clock_dividers(rdev,
2471 COMPUTE_GPUCLK_INPUT_FLAG_SCLK,
2472 table->ACPILevel.SclkFrequency, false, &dividers);
2473 if (ret)
2474 return ret;
2475
2476 table->ACPILevel.SclkDid = (u8)dividers.post_divider;
2477 table->ACPILevel.DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
2478 table->ACPILevel.DeepSleepDivId = 0;
2479
2480 spll_func_cntl &= ~SPLL_PWRON;
2481 spll_func_cntl |= SPLL_RESET;
2482
2483 spll_func_cntl_2 &= ~SCLK_MUX_SEL_MASK;
2484 spll_func_cntl_2 |= SCLK_MUX_SEL(4);
2485
2486 table->ACPILevel.CgSpllFuncCntl = spll_func_cntl;
2487 table->ACPILevel.CgSpllFuncCntl2 = spll_func_cntl_2;
2488 table->ACPILevel.CgSpllFuncCntl3 = pi->clock_registers.cg_spll_func_cntl_3;
2489 table->ACPILevel.CgSpllFuncCntl4 = pi->clock_registers.cg_spll_func_cntl_4;
2490 table->ACPILevel.SpllSpreadSpectrum = pi->clock_registers.cg_spll_spread_spectrum;
2491 table->ACPILevel.SpllSpreadSpectrum2 = pi->clock_registers.cg_spll_spread_spectrum_2;
2492 table->ACPILevel.CcPwrDynRm = 0;
2493 table->ACPILevel.CcPwrDynRm1 = 0;
2494
2495 table->ACPILevel.Flags = cpu_to_be32(table->ACPILevel.Flags);
2496 table->ACPILevel.MinVddcPhases = cpu_to_be32(table->ACPILevel.MinVddcPhases);
2497 table->ACPILevel.SclkFrequency = cpu_to_be32(table->ACPILevel.SclkFrequency);
2498 table->ACPILevel.CgSpllFuncCntl = cpu_to_be32(table->ACPILevel.CgSpllFuncCntl);
2499 table->ACPILevel.CgSpllFuncCntl2 = cpu_to_be32(table->ACPILevel.CgSpllFuncCntl2);
2500 table->ACPILevel.CgSpllFuncCntl3 = cpu_to_be32(table->ACPILevel.CgSpllFuncCntl3);
2501 table->ACPILevel.CgSpllFuncCntl4 = cpu_to_be32(table->ACPILevel.CgSpllFuncCntl4);
2502 table->ACPILevel.SpllSpreadSpectrum = cpu_to_be32(table->ACPILevel.SpllSpreadSpectrum);
2503 table->ACPILevel.SpllSpreadSpectrum2 = cpu_to_be32(table->ACPILevel.SpllSpreadSpectrum2);
2504 table->ACPILevel.CcPwrDynRm = cpu_to_be32(table->ACPILevel.CcPwrDynRm);
2505 table->ACPILevel.CcPwrDynRm1 = cpu_to_be32(table->ACPILevel.CcPwrDynRm1);
2506
2507 table->MemoryACPILevel.MinVddc = table->ACPILevel.MinVddc;
2508 table->MemoryACPILevel.MinVddcPhases = table->ACPILevel.MinVddcPhases;
2509
2510 if (pi->vddci_control != CISLANDS_VOLTAGE_CONTROL_NONE) {
2511 if (pi->acpi_vddci)
2512 table->MemoryACPILevel.MinVddci =
2513 cpu_to_be32(pi->acpi_vddci * VOLTAGE_SCALE);
2514 else
2515 table->MemoryACPILevel.MinVddci =
2516 cpu_to_be32(pi->min_vddci_in_pp_table * VOLTAGE_SCALE);
2517 }
2518
2519 if (ci_populate_mvdd_value(rdev, 0, &voltage_level))
2520 table->MemoryACPILevel.MinMvdd = 0;
2521 else
2522 table->MemoryACPILevel.MinMvdd =
2523 cpu_to_be32(voltage_level.Voltage * VOLTAGE_SCALE);
2524
2525 mclk_pwrmgt_cntl |= MRDCK0_RESET | MRDCK1_RESET;
2526 mclk_pwrmgt_cntl &= ~(MRDCK0_PDNB | MRDCK1_PDNB);
2527
2528 dll_cntl &= ~(MRDCK0_BYPASS | MRDCK1_BYPASS);
2529
2530 table->MemoryACPILevel.DllCntl = cpu_to_be32(dll_cntl);
2531 table->MemoryACPILevel.MclkPwrmgtCntl = cpu_to_be32(mclk_pwrmgt_cntl);
2532 table->MemoryACPILevel.MpllAdFuncCntl =
2533 cpu_to_be32(pi->clock_registers.mpll_ad_func_cntl);
2534 table->MemoryACPILevel.MpllDqFuncCntl =
2535 cpu_to_be32(pi->clock_registers.mpll_dq_func_cntl);
2536 table->MemoryACPILevel.MpllFuncCntl =
2537 cpu_to_be32(pi->clock_registers.mpll_func_cntl);
2538 table->MemoryACPILevel.MpllFuncCntl_1 =
2539 cpu_to_be32(pi->clock_registers.mpll_func_cntl_1);
2540 table->MemoryACPILevel.MpllFuncCntl_2 =
2541 cpu_to_be32(pi->clock_registers.mpll_func_cntl_2);
2542 table->MemoryACPILevel.MpllSs1 = cpu_to_be32(pi->clock_registers.mpll_ss1);
2543 table->MemoryACPILevel.MpllSs2 = cpu_to_be32(pi->clock_registers.mpll_ss2);
2544
2545 table->MemoryACPILevel.EnabledForThrottle = 0;
2546 table->MemoryACPILevel.EnabledForActivity = 0;
2547 table->MemoryACPILevel.UpH = 0;
2548 table->MemoryACPILevel.DownH = 100;
2549 table->MemoryACPILevel.VoltageDownH = 0;
2550 table->MemoryACPILevel.ActivityLevel =
2551 cpu_to_be16((u16)pi->mclk_activity_target);
2552
2553 table->MemoryACPILevel.StutterEnable = false;
2554 table->MemoryACPILevel.StrobeEnable = false;
2555 table->MemoryACPILevel.EdcReadEnable = false;
2556 table->MemoryACPILevel.EdcWriteEnable = false;
2557 table->MemoryACPILevel.RttEnable = false;
2558
2559 return 0;
2560}
2561
2562
2563static int ci_enable_ulv(struct radeon_device *rdev, bool enable)
2564{
2565 struct ci_power_info *pi = ci_get_pi(rdev);
2566 struct ci_ulv_parm *ulv = &pi->ulv;
2567
2568 if (ulv->supported) {
2569 if (enable)
2570 return (ci_send_msg_to_smc(rdev, PPSMC_MSG_EnableULV) == PPSMC_Result_OK) ?
2571 0 : -EINVAL;
2572 else
2573 return (ci_send_msg_to_smc(rdev, PPSMC_MSG_DisableULV) == PPSMC_Result_OK) ?
2574 0 : -EINVAL;
2575 }
2576
2577 return 0;
2578}
2579
2580static int ci_populate_ulv_level(struct radeon_device *rdev,
2581 SMU7_Discrete_Ulv *state)
2582{
2583 struct ci_power_info *pi = ci_get_pi(rdev);
2584 u16 ulv_voltage = rdev->pm.dpm.backbias_response_time;
2585
2586 state->CcPwrDynRm = 0;
2587 state->CcPwrDynRm1 = 0;
2588
2589 if (ulv_voltage == 0) {
2590 pi->ulv.supported = false;
2591 return 0;
2592 }
2593
2594 if (pi->voltage_control != CISLANDS_VOLTAGE_CONTROL_BY_SVID2) {
2595 if (ulv_voltage > rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[0].v)
2596 state->VddcOffset = 0;
2597 else
2598 state->VddcOffset =
2599 rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[0].v - ulv_voltage;
2600 } else {
2601 if (ulv_voltage > rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[0].v)
2602 state->VddcOffsetVid = 0;
2603 else
2604 state->VddcOffsetVid = (u8)
2605 ((rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[0].v - ulv_voltage) *
2606 VOLTAGE_VID_OFFSET_SCALE2 / VOLTAGE_VID_OFFSET_SCALE1);
2607 }
2608 state->VddcPhase = pi->vddc_phase_shed_control ? 0 : 1;
2609
2610 state->CcPwrDynRm = cpu_to_be32(state->CcPwrDynRm);
2611 state->CcPwrDynRm1 = cpu_to_be32(state->CcPwrDynRm1);
2612 state->VddcOffset = cpu_to_be16(state->VddcOffset);
2613
2614 return 0;
2615}
2616
2617static int ci_calculate_sclk_params(struct radeon_device *rdev,
2618 u32 engine_clock,
2619 SMU7_Discrete_GraphicsLevel *sclk)
2620{
2621 struct ci_power_info *pi = ci_get_pi(rdev);
2622 struct atom_clock_dividers dividers;
2623 u32 spll_func_cntl_3 = pi->clock_registers.cg_spll_func_cntl_3;
2624 u32 spll_func_cntl_4 = pi->clock_registers.cg_spll_func_cntl_4;
2625 u32 cg_spll_spread_spectrum = pi->clock_registers.cg_spll_spread_spectrum;
2626 u32 cg_spll_spread_spectrum_2 = pi->clock_registers.cg_spll_spread_spectrum_2;
2627 u32 reference_clock = rdev->clock.spll.reference_freq;
2628 u32 reference_divider;
2629 u32 fbdiv;
2630 int ret;
2631
2632 ret = radeon_atom_get_clock_dividers(rdev,
2633 COMPUTE_GPUCLK_INPUT_FLAG_SCLK,
2634 engine_clock, false, &dividers);
2635 if (ret)
2636 return ret;
2637
2638 reference_divider = 1 + dividers.ref_div;
2639 fbdiv = dividers.fb_div & 0x3FFFFFF;
2640
2641 spll_func_cntl_3 &= ~SPLL_FB_DIV_MASK;
2642 spll_func_cntl_3 |= SPLL_FB_DIV(fbdiv);
2643 spll_func_cntl_3 |= SPLL_DITHEN;
2644
2645 if (pi->caps_sclk_ss_support) {
2646 struct radeon_atom_ss ss;
2647 u32 vco_freq = engine_clock * dividers.post_div;
2648
2649 if (radeon_atombios_get_asic_ss_info(rdev, &ss,
2650 ASIC_INTERNAL_ENGINE_SS, vco_freq)) {
2651 u32 clk_s = reference_clock * 5 / (reference_divider * ss.rate);
2652 u32 clk_v = 4 * ss.percentage * fbdiv / (clk_s * 10000);
2653
2654 cg_spll_spread_spectrum &= ~CLK_S_MASK;
2655 cg_spll_spread_spectrum |= CLK_S(clk_s);
2656 cg_spll_spread_spectrum |= SSEN;
2657
2658 cg_spll_spread_spectrum_2 &= ~CLK_V_MASK;
2659 cg_spll_spread_spectrum_2 |= CLK_V(clk_v);
2660 }
2661 }
2662
2663 sclk->SclkFrequency = engine_clock;
2664 sclk->CgSpllFuncCntl3 = spll_func_cntl_3;
2665 sclk->CgSpllFuncCntl4 = spll_func_cntl_4;
2666 sclk->SpllSpreadSpectrum = cg_spll_spread_spectrum;
2667 sclk->SpllSpreadSpectrum2 = cg_spll_spread_spectrum_2;
2668 sclk->SclkDid = (u8)dividers.post_divider;
2669
2670 return 0;
2671}
2672
2673static int ci_populate_single_graphic_level(struct radeon_device *rdev,
2674 u32 engine_clock,
2675 u16 sclk_activity_level_t,
2676 SMU7_Discrete_GraphicsLevel *graphic_level)
2677{
2678 struct ci_power_info *pi = ci_get_pi(rdev);
2679 int ret;
2680
2681 ret = ci_calculate_sclk_params(rdev, engine_clock, graphic_level);
2682 if (ret)
2683 return ret;
2684
2685 ret = ci_get_dependency_volt_by_clk(rdev,
2686 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk,
2687 engine_clock, &graphic_level->MinVddc);
2688 if (ret)
2689 return ret;
2690
2691 graphic_level->SclkFrequency = engine_clock;
2692
2693 graphic_level->Flags = 0;
2694 graphic_level->MinVddcPhases = 1;
2695
2696 if (pi->vddc_phase_shed_control)
2697 ci_populate_phase_value_based_on_sclk(rdev,
2698 &rdev->pm.dpm.dyn_state.phase_shedding_limits_table,
2699 engine_clock,
2700 &graphic_level->MinVddcPhases);
2701
2702 graphic_level->ActivityLevel = sclk_activity_level_t;
2703
2704 graphic_level->CcPwrDynRm = 0;
2705 graphic_level->CcPwrDynRm1 = 0;
2706 graphic_level->EnabledForActivity = 1;
2707 graphic_level->EnabledForThrottle = 1;
2708 graphic_level->UpH = 0;
2709 graphic_level->DownH = 0;
2710 graphic_level->VoltageDownH = 0;
2711 graphic_level->PowerThrottle = 0;
2712
2713 if (pi->caps_sclk_ds)
2714 graphic_level->DeepSleepDivId = ci_get_sleep_divider_id_from_clock(rdev,
2715 engine_clock,
2716 CISLAND_MINIMUM_ENGINE_CLOCK);
2717
2718 graphic_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
2719
2720 graphic_level->Flags = cpu_to_be32(graphic_level->Flags);
2721 graphic_level->MinVddc = cpu_to_be32(graphic_level->MinVddc * VOLTAGE_SCALE);
2722 graphic_level->MinVddcPhases = cpu_to_be32(graphic_level->MinVddcPhases);
2723 graphic_level->SclkFrequency = cpu_to_be32(graphic_level->SclkFrequency);
2724 graphic_level->ActivityLevel = cpu_to_be16(graphic_level->ActivityLevel);
2725 graphic_level->CgSpllFuncCntl3 = cpu_to_be32(graphic_level->CgSpllFuncCntl3);
2726 graphic_level->CgSpllFuncCntl4 = cpu_to_be32(graphic_level->CgSpllFuncCntl4);
2727 graphic_level->SpllSpreadSpectrum = cpu_to_be32(graphic_level->SpllSpreadSpectrum);
2728 graphic_level->SpllSpreadSpectrum2 = cpu_to_be32(graphic_level->SpllSpreadSpectrum2);
2729 graphic_level->CcPwrDynRm = cpu_to_be32(graphic_level->CcPwrDynRm);
2730 graphic_level->CcPwrDynRm1 = cpu_to_be32(graphic_level->CcPwrDynRm1);
2731
2732 return 0;
2733}
2734
2735static int ci_populate_all_graphic_levels(struct radeon_device *rdev)
2736{
2737 struct ci_power_info *pi = ci_get_pi(rdev);
2738 struct ci_dpm_table *dpm_table = &pi->dpm_table;
2739 u32 level_array_address = pi->dpm_table_start +
2740 offsetof(SMU7_Discrete_DpmTable, GraphicsLevel);
2741 u32 level_array_size = sizeof(SMU7_Discrete_GraphicsLevel) *
2742 SMU7_MAX_LEVELS_GRAPHICS;
2743 SMU7_Discrete_GraphicsLevel *levels = pi->smc_state_table.GraphicsLevel;
2744 u32 i, ret;
2745
2746 memset(levels, 0, level_array_size);
2747
2748 for (i = 0; i < dpm_table->sclk_table.count; i++) {
2749 ret = ci_populate_single_graphic_level(rdev,
2750 dpm_table->sclk_table.dpm_levels[i].value,
2751 (u16)pi->activity_target[i],
2752 &pi->smc_state_table.GraphicsLevel[i]);
2753 if (ret)
2754 return ret;
2755 if (i == (dpm_table->sclk_table.count - 1))
2756 pi->smc_state_table.GraphicsLevel[i].DisplayWatermark =
2757 PPSMC_DISPLAY_WATERMARK_HIGH;
2758 }
2759
2760 pi->smc_state_table.GraphicsDpmLevelCount = (u8)dpm_table->sclk_table.count;
2761 pi->dpm_level_enable_mask.sclk_dpm_enable_mask =
2762 ci_get_dpm_level_enable_mask_value(&dpm_table->sclk_table);
2763
2764 ret = ci_copy_bytes_to_smc(rdev, level_array_address,
2765 (u8 *)levels, level_array_size,
2766 pi->sram_end);
2767 if (ret)
2768 return ret;
2769
2770 return 0;
2771}
2772
2773static int ci_populate_ulv_state(struct radeon_device *rdev,
2774 SMU7_Discrete_Ulv *ulv_level)
2775{
2776 return ci_populate_ulv_level(rdev, ulv_level);
2777}
2778
2779static int ci_populate_all_memory_levels(struct radeon_device *rdev)
2780{
2781 struct ci_power_info *pi = ci_get_pi(rdev);
2782 struct ci_dpm_table *dpm_table = &pi->dpm_table;
2783 u32 level_array_address = pi->dpm_table_start +
2784 offsetof(SMU7_Discrete_DpmTable, MemoryLevel);
2785 u32 level_array_size = sizeof(SMU7_Discrete_MemoryLevel) *
2786 SMU7_MAX_LEVELS_MEMORY;
2787 SMU7_Discrete_MemoryLevel *levels = pi->smc_state_table.MemoryLevel;
2788 u32 i, ret;
2789
2790 memset(levels, 0, level_array_size);
2791
2792 for (i = 0; i < dpm_table->mclk_table.count; i++) {
2793 if (dpm_table->mclk_table.dpm_levels[i].value == 0)
2794 return -EINVAL;
2795 ret = ci_populate_single_memory_level(rdev,
2796 dpm_table->mclk_table.dpm_levels[i].value,
2797 &pi->smc_state_table.MemoryLevel[i]);
2798 if (ret)
2799 return ret;
2800 }
2801
2802 pi->smc_state_table.MemoryLevel[0].ActivityLevel = cpu_to_be16(0x1F);
2803
2804 pi->smc_state_table.MemoryDpmLevelCount = (u8)dpm_table->mclk_table.count;
2805 pi->dpm_level_enable_mask.mclk_dpm_enable_mask =
2806 ci_get_dpm_level_enable_mask_value(&dpm_table->mclk_table);
2807
2808 pi->smc_state_table.MemoryLevel[dpm_table->mclk_table.count - 1].DisplayWatermark =
2809 PPSMC_DISPLAY_WATERMARK_HIGH;
2810
2811 ret = ci_copy_bytes_to_smc(rdev, level_array_address,
2812 (u8 *)levels, level_array_size,
2813 pi->sram_end);
2814 if (ret)
2815 return ret;
2816
2817 return 0;
2818}
2819
2820static void ci_reset_single_dpm_table(struct radeon_device *rdev,
2821 struct ci_single_dpm_table* dpm_table,
2822 u32 count)
2823{
2824 u32 i;
2825
2826 dpm_table->count = count;
2827 for (i = 0; i < MAX_REGULAR_DPM_NUMBER; i++)
2828 dpm_table->dpm_levels[i].enabled = false;
2829}
2830
2831static void ci_setup_pcie_table_entry(struct ci_single_dpm_table* dpm_table,
2832 u32 index, u32 pcie_gen, u32 pcie_lanes)
2833{
2834 dpm_table->dpm_levels[index].value = pcie_gen;
2835 dpm_table->dpm_levels[index].param1 = pcie_lanes;
2836 dpm_table->dpm_levels[index].enabled = true;
2837}
2838
2839static int ci_setup_default_pcie_tables(struct radeon_device *rdev)
2840{
2841 struct ci_power_info *pi = ci_get_pi(rdev);
2842
2843 if (!pi->use_pcie_performance_levels && !pi->use_pcie_powersaving_levels)
2844 return -EINVAL;
2845
2846 if (pi->use_pcie_performance_levels && !pi->use_pcie_powersaving_levels) {
2847 pi->pcie_gen_powersaving = pi->pcie_gen_performance;
2848 pi->pcie_lane_powersaving = pi->pcie_lane_performance;
2849 } else if (!pi->use_pcie_performance_levels && pi->use_pcie_powersaving_levels) {
2850 pi->pcie_gen_performance = pi->pcie_gen_powersaving;
2851 pi->pcie_lane_performance = pi->pcie_lane_powersaving;
2852 }
2853
2854 ci_reset_single_dpm_table(rdev,
2855 &pi->dpm_table.pcie_speed_table,
2856 SMU7_MAX_LEVELS_LINK);
2857
2858 ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 0,
2859 pi->pcie_gen_powersaving.min,
2860 pi->pcie_lane_powersaving.min);
2861 ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 1,
2862 pi->pcie_gen_performance.min,
2863 pi->pcie_lane_performance.min);
2864 ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 2,
2865 pi->pcie_gen_powersaving.min,
2866 pi->pcie_lane_powersaving.max);
2867 ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 3,
2868 pi->pcie_gen_performance.min,
2869 pi->pcie_lane_performance.max);
2870 ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 4,
2871 pi->pcie_gen_powersaving.max,
2872 pi->pcie_lane_powersaving.max);
2873 ci_setup_pcie_table_entry(&pi->dpm_table.pcie_speed_table, 5,
2874 pi->pcie_gen_performance.max,
2875 pi->pcie_lane_performance.max);
2876
2877 pi->dpm_table.pcie_speed_table.count = 6;
2878
2879 return 0;
2880}
2881
2882static int ci_setup_default_dpm_tables(struct radeon_device *rdev)
2883{
2884 struct ci_power_info *pi = ci_get_pi(rdev);
2885 struct radeon_clock_voltage_dependency_table *allowed_sclk_vddc_table =
2886 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
2887 struct radeon_clock_voltage_dependency_table *allowed_mclk_table =
2888 &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk;
2889 struct radeon_cac_leakage_table *std_voltage_table =
2890 &rdev->pm.dpm.dyn_state.cac_leakage_table;
2891 u32 i;
2892
2893 if (allowed_sclk_vddc_table == NULL)
2894 return -EINVAL;
2895 if (allowed_sclk_vddc_table->count < 1)
2896 return -EINVAL;
2897 if (allowed_mclk_table == NULL)
2898 return -EINVAL;
2899 if (allowed_mclk_table->count < 1)
2900 return -EINVAL;
2901
2902 memset(&pi->dpm_table, 0, sizeof(struct ci_dpm_table));
2903
2904 ci_reset_single_dpm_table(rdev,
2905 &pi->dpm_table.sclk_table,
2906 SMU7_MAX_LEVELS_GRAPHICS);
2907 ci_reset_single_dpm_table(rdev,
2908 &pi->dpm_table.mclk_table,
2909 SMU7_MAX_LEVELS_MEMORY);
2910 ci_reset_single_dpm_table(rdev,
2911 &pi->dpm_table.vddc_table,
2912 SMU7_MAX_LEVELS_VDDC);
2913 ci_reset_single_dpm_table(rdev,
2914 &pi->dpm_table.vddci_table,
2915 SMU7_MAX_LEVELS_VDDCI);
2916 ci_reset_single_dpm_table(rdev,
2917 &pi->dpm_table.mvdd_table,
2918 SMU7_MAX_LEVELS_MVDD);
2919
2920 pi->dpm_table.sclk_table.count = 0;
2921 for (i = 0; i < allowed_sclk_vddc_table->count; i++) {
2922 if ((i == 0) ||
2923 (pi->dpm_table.sclk_table.dpm_levels[pi->dpm_table.sclk_table.count-1].value !=
2924 allowed_sclk_vddc_table->entries[i].clk)) {
2925 pi->dpm_table.sclk_table.dpm_levels[pi->dpm_table.sclk_table.count].value =
2926 allowed_sclk_vddc_table->entries[i].clk;
2927 pi->dpm_table.sclk_table.dpm_levels[pi->dpm_table.sclk_table.count].enabled = true;
2928 pi->dpm_table.sclk_table.count++;
2929 }
2930 }
2931
2932 pi->dpm_table.mclk_table.count = 0;
2933 for (i = 0; i < allowed_mclk_table->count; i++) {
2934 if ((i==0) ||
2935 (pi->dpm_table.mclk_table.dpm_levels[pi->dpm_table.mclk_table.count-1].value !=
2936 allowed_mclk_table->entries[i].clk)) {
2937 pi->dpm_table.mclk_table.dpm_levels[pi->dpm_table.mclk_table.count].value =
2938 allowed_mclk_table->entries[i].clk;
2939 pi->dpm_table.mclk_table.dpm_levels[pi->dpm_table.mclk_table.count].enabled = true;
2940 pi->dpm_table.mclk_table.count++;
2941 }
2942 }
2943
2944 for (i = 0; i < allowed_sclk_vddc_table->count; i++) {
2945 pi->dpm_table.vddc_table.dpm_levels[i].value =
2946 allowed_sclk_vddc_table->entries[i].v;
2947 pi->dpm_table.vddc_table.dpm_levels[i].param1 =
2948 std_voltage_table->entries[i].leakage;
2949 pi->dpm_table.vddc_table.dpm_levels[i].enabled = true;
2950 }
2951 pi->dpm_table.vddc_table.count = allowed_sclk_vddc_table->count;
2952
2953 allowed_mclk_table = &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk;
2954 if (allowed_mclk_table) {
2955 for (i = 0; i < allowed_mclk_table->count; i++) {
2956 pi->dpm_table.vddci_table.dpm_levels[i].value =
2957 allowed_mclk_table->entries[i].v;
2958 pi->dpm_table.vddci_table.dpm_levels[i].enabled = true;
2959 }
2960 pi->dpm_table.vddci_table.count = allowed_mclk_table->count;
2961 }
2962
2963 allowed_mclk_table = &rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk;
2964 if (allowed_mclk_table) {
2965 for (i = 0; i < allowed_mclk_table->count; i++) {
2966 pi->dpm_table.mvdd_table.dpm_levels[i].value =
2967 allowed_mclk_table->entries[i].v;
2968 pi->dpm_table.mvdd_table.dpm_levels[i].enabled = true;
2969 }
2970 pi->dpm_table.mvdd_table.count = allowed_mclk_table->count;
2971 }
2972
2973 ci_setup_default_pcie_tables(rdev);
2974
2975 return 0;
2976}
2977
2978static int ci_find_boot_level(struct ci_single_dpm_table *table,
2979 u32 value, u32 *boot_level)
2980{
2981 u32 i;
2982 int ret = -EINVAL;
2983
2984 for(i = 0; i < table->count; i++) {
2985 if (value == table->dpm_levels[i].value) {
2986 *boot_level = i;
2987 ret = 0;
2988 }
2989 }
2990
2991 return ret;
2992}
2993
2994static int ci_init_smc_table(struct radeon_device *rdev)
2995{
2996 struct ci_power_info *pi = ci_get_pi(rdev);
2997 struct ci_ulv_parm *ulv = &pi->ulv;
2998 struct radeon_ps *radeon_boot_state = rdev->pm.dpm.boot_ps;
2999 SMU7_Discrete_DpmTable *table = &pi->smc_state_table;
3000 int ret;
3001
3002 ret = ci_setup_default_dpm_tables(rdev);
3003 if (ret)
3004 return ret;
3005
3006 if (pi->voltage_control != CISLANDS_VOLTAGE_CONTROL_NONE)
3007 ci_populate_smc_voltage_tables(rdev, table);
3008
3009 ci_init_fps_limits(rdev);
3010
3011 if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_HARDWAREDC)
3012 table->SystemFlags |= PPSMC_SYSTEMFLAG_GPIO_DC;
3013
3014 if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_STEPVDDC)
3015 table->SystemFlags |= PPSMC_SYSTEMFLAG_STEPVDDC;
3016
3017 if (pi->mem_gddr5)
3018 table->SystemFlags |= PPSMC_SYSTEMFLAG_GDDR5;
3019
3020 if (ulv->supported) {
3021 ret = ci_populate_ulv_state(rdev, &pi->smc_state_table.Ulv);
3022 if (ret)
3023 return ret;
3024 WREG32_SMC(CG_ULV_PARAMETER, ulv->cg_ulv_parameter);
3025 }
3026
3027 ret = ci_populate_all_graphic_levels(rdev);
3028 if (ret)
3029 return ret;
3030
3031 ret = ci_populate_all_memory_levels(rdev);
3032 if (ret)
3033 return ret;
3034
3035 ci_populate_smc_link_level(rdev, table);
3036
3037 ret = ci_populate_smc_acpi_level(rdev, table);
3038 if (ret)
3039 return ret;
3040
3041 ret = ci_populate_smc_vce_level(rdev, table);
3042 if (ret)
3043 return ret;
3044
3045 ret = ci_populate_smc_acp_level(rdev, table);
3046 if (ret)
3047 return ret;
3048
3049 ret = ci_populate_smc_samu_level(rdev, table);
3050 if (ret)
3051 return ret;
3052
3053 ret = ci_do_program_memory_timing_parameters(rdev);
3054 if (ret)
3055 return ret;
3056
3057 ret = ci_populate_smc_uvd_level(rdev, table);
3058 if (ret)
3059 return ret;
3060
3061 table->UvdBootLevel = 0;
3062 table->VceBootLevel = 0;
3063 table->AcpBootLevel = 0;
3064 table->SamuBootLevel = 0;
3065 table->GraphicsBootLevel = 0;
3066 table->MemoryBootLevel = 0;
3067
3068 ret = ci_find_boot_level(&pi->dpm_table.sclk_table,
3069 pi->vbios_boot_state.sclk_bootup_value,
3070 (u32 *)&pi->smc_state_table.GraphicsBootLevel);
3071
3072 ret = ci_find_boot_level(&pi->dpm_table.mclk_table,
3073 pi->vbios_boot_state.mclk_bootup_value,
3074 (u32 *)&pi->smc_state_table.MemoryBootLevel);
3075
3076 table->BootVddc = pi->vbios_boot_state.vddc_bootup_value;
3077 table->BootVddci = pi->vbios_boot_state.vddci_bootup_value;
3078 table->BootMVdd = pi->vbios_boot_state.mvdd_bootup_value;
3079
3080 ci_populate_smc_initial_state(rdev, radeon_boot_state);
3081
3082 ret = ci_populate_bapm_parameters_in_dpm_table(rdev);
3083 if (ret)
3084 return ret;
3085
3086 table->UVDInterval = 1;
3087 table->VCEInterval = 1;
3088 table->ACPInterval = 1;
3089 table->SAMUInterval = 1;
3090 table->GraphicsVoltageChangeEnable = 1;
3091 table->GraphicsThermThrottleEnable = 1;
3092 table->GraphicsInterval = 1;
3093 table->VoltageInterval = 1;
3094 table->ThermalInterval = 1;
3095 table->TemperatureLimitHigh = (u16)((pi->thermal_temp_setting.temperature_high *
3096 CISLANDS_Q88_FORMAT_CONVERSION_UNIT) / 1000);
3097 table->TemperatureLimitLow = (u16)((pi->thermal_temp_setting.temperature_low *
3098 CISLANDS_Q88_FORMAT_CONVERSION_UNIT) / 1000);
3099 table->MemoryVoltageChangeEnable = 1;
3100 table->MemoryInterval = 1;
3101 table->VoltageResponseTime = 0;
3102 table->VddcVddciDelta = 4000;
3103 table->PhaseResponseTime = 0;
3104 table->MemoryThermThrottleEnable = 1;
3105 table->PCIeBootLinkLevel = 0;
3106 table->PCIeGenInterval = 1;
3107 if (pi->voltage_control == CISLANDS_VOLTAGE_CONTROL_BY_SVID2)
3108 table->SVI2Enable = 1;
3109 else
3110 table->SVI2Enable = 0;
3111
3112 table->ThermGpio = 17;
3113 table->SclkStepSize = 0x4000;
3114
3115 table->SystemFlags = cpu_to_be32(table->SystemFlags);
3116 table->SmioMaskVddcVid = cpu_to_be32(table->SmioMaskVddcVid);
3117 table->SmioMaskVddcPhase = cpu_to_be32(table->SmioMaskVddcPhase);
3118 table->SmioMaskVddciVid = cpu_to_be32(table->SmioMaskVddciVid);
3119 table->SmioMaskMvddVid = cpu_to_be32(table->SmioMaskMvddVid);
3120 table->SclkStepSize = cpu_to_be32(table->SclkStepSize);
3121 table->TemperatureLimitHigh = cpu_to_be16(table->TemperatureLimitHigh);
3122 table->TemperatureLimitLow = cpu_to_be16(table->TemperatureLimitLow);
3123 table->VddcVddciDelta = cpu_to_be16(table->VddcVddciDelta);
3124 table->VoltageResponseTime = cpu_to_be16(table->VoltageResponseTime);
3125 table->PhaseResponseTime = cpu_to_be16(table->PhaseResponseTime);
3126 table->BootVddc = cpu_to_be16(table->BootVddc * VOLTAGE_SCALE);
3127 table->BootVddci = cpu_to_be16(table->BootVddci * VOLTAGE_SCALE);
3128 table->BootMVdd = cpu_to_be16(table->BootMVdd * VOLTAGE_SCALE);
3129
3130 ret = ci_copy_bytes_to_smc(rdev,
3131 pi->dpm_table_start +
3132 offsetof(SMU7_Discrete_DpmTable, SystemFlags),
3133 (u8 *)&table->SystemFlags,
3134 sizeof(SMU7_Discrete_DpmTable) - 3 * sizeof(SMU7_PIDController),
3135 pi->sram_end);
3136 if (ret)
3137 return ret;
3138
3139 return 0;
3140}
3141
3142static void ci_trim_single_dpm_states(struct radeon_device *rdev,
3143 struct ci_single_dpm_table *dpm_table,
3144 u32 low_limit, u32 high_limit)
3145{
3146 u32 i;
3147
3148 for (i = 0; i < dpm_table->count; i++) {
3149 if ((dpm_table->dpm_levels[i].value < low_limit) ||
3150 (dpm_table->dpm_levels[i].value > high_limit))
3151 dpm_table->dpm_levels[i].enabled = false;
3152 else
3153 dpm_table->dpm_levels[i].enabled = true;
3154 }
3155}
3156
3157static void ci_trim_pcie_dpm_states(struct radeon_device *rdev,
3158 u32 speed_low, u32 lanes_low,
3159 u32 speed_high, u32 lanes_high)
3160{
3161 struct ci_power_info *pi = ci_get_pi(rdev);
3162 struct ci_single_dpm_table *pcie_table = &pi->dpm_table.pcie_speed_table;
3163 u32 i, j;
3164
3165 for (i = 0; i < pcie_table->count; i++) {
3166 if ((pcie_table->dpm_levels[i].value < speed_low) ||
3167 (pcie_table->dpm_levels[i].param1 < lanes_low) ||
3168 (pcie_table->dpm_levels[i].value > speed_high) ||
3169 (pcie_table->dpm_levels[i].param1 > lanes_high))
3170 pcie_table->dpm_levels[i].enabled = false;
3171 else
3172 pcie_table->dpm_levels[i].enabled = true;
3173 }
3174
3175 for (i = 0; i < pcie_table->count; i++) {
3176 if (pcie_table->dpm_levels[i].enabled) {
3177 for (j = i + 1; j < pcie_table->count; j++) {
3178 if (pcie_table->dpm_levels[j].enabled) {
3179 if ((pcie_table->dpm_levels[i].value == pcie_table->dpm_levels[j].value) &&
3180 (pcie_table->dpm_levels[i].param1 == pcie_table->dpm_levels[j].param1))
3181 pcie_table->dpm_levels[j].enabled = false;
3182 }
3183 }
3184 }
3185 }
3186}
3187
3188static int ci_trim_dpm_states(struct radeon_device *rdev,
3189 struct radeon_ps *radeon_state)
3190{
3191 struct ci_ps *state = ci_get_ps(radeon_state);
3192 struct ci_power_info *pi = ci_get_pi(rdev);
3193 u32 high_limit_count;
3194
3195 if (state->performance_level_count < 1)
3196 return -EINVAL;
3197
3198 if (state->performance_level_count == 1)
3199 high_limit_count = 0;
3200 else
3201 high_limit_count = 1;
3202
3203 ci_trim_single_dpm_states(rdev,
3204 &pi->dpm_table.sclk_table,
3205 state->performance_levels[0].sclk,
3206 state->performance_levels[high_limit_count].sclk);
3207
3208 ci_trim_single_dpm_states(rdev,
3209 &pi->dpm_table.mclk_table,
3210 state->performance_levels[0].mclk,
3211 state->performance_levels[high_limit_count].mclk);
3212
3213 ci_trim_pcie_dpm_states(rdev,
3214 state->performance_levels[0].pcie_gen,
3215 state->performance_levels[0].pcie_lane,
3216 state->performance_levels[high_limit_count].pcie_gen,
3217 state->performance_levels[high_limit_count].pcie_lane);
3218
3219 return 0;
3220}
3221
3222static int ci_apply_disp_minimum_voltage_request(struct radeon_device *rdev)
3223{
3224 struct radeon_clock_voltage_dependency_table *disp_voltage_table =
3225 &rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk;
3226 struct radeon_clock_voltage_dependency_table *vddc_table =
3227 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
3228 u32 requested_voltage = 0;
3229 u32 i;
3230
3231 if (disp_voltage_table == NULL)
3232 return -EINVAL;
3233 if (!disp_voltage_table->count)
3234 return -EINVAL;
3235
3236 for (i = 0; i < disp_voltage_table->count; i++) {
3237 if (rdev->clock.current_dispclk == disp_voltage_table->entries[i].clk)
3238 requested_voltage = disp_voltage_table->entries[i].v;
3239 }
3240
3241 for (i = 0; i < vddc_table->count; i++) {
3242 if (requested_voltage <= vddc_table->entries[i].v) {
3243 requested_voltage = vddc_table->entries[i].v;
3244 return (ci_send_msg_to_smc_with_parameter(rdev,
3245 PPSMC_MSG_VddC_Request,
3246 requested_voltage * VOLTAGE_SCALE) == PPSMC_Result_OK) ?
3247 0 : -EINVAL;
3248 }
3249 }
3250
3251 return -EINVAL;
3252}
3253
3254static int ci_upload_dpm_level_enable_mask(struct radeon_device *rdev)
3255{
3256 struct ci_power_info *pi = ci_get_pi(rdev);
3257 PPSMC_Result result;
3258
3259 if (!pi->sclk_dpm_key_disabled) {
3260 if (pi->dpm_level_enable_mask.sclk_dpm_enable_mask) {
3261 result = ci_send_msg_to_smc_with_parameter(rdev,
3262 PPSMC_MSG_SCLKDPM_SetEnabledMask,
3263 pi->dpm_level_enable_mask.sclk_dpm_enable_mask);
3264 if (result != PPSMC_Result_OK)
3265 return -EINVAL;
3266 }
3267 }
3268
3269 if (!pi->mclk_dpm_key_disabled) {
3270 if (pi->dpm_level_enable_mask.mclk_dpm_enable_mask) {
3271 result = ci_send_msg_to_smc_with_parameter(rdev,
3272 PPSMC_MSG_MCLKDPM_SetEnabledMask,
3273 pi->dpm_level_enable_mask.mclk_dpm_enable_mask);
3274 if (result != PPSMC_Result_OK)
3275 return -EINVAL;
3276 }
3277 }
3278
3279 if (!pi->pcie_dpm_key_disabled) {
3280 if (pi->dpm_level_enable_mask.pcie_dpm_enable_mask) {
3281 result = ci_send_msg_to_smc_with_parameter(rdev,
3282 PPSMC_MSG_PCIeDPM_SetEnabledMask,
3283 pi->dpm_level_enable_mask.pcie_dpm_enable_mask);
3284 if (result != PPSMC_Result_OK)
3285 return -EINVAL;
3286 }
3287 }
3288
3289 ci_apply_disp_minimum_voltage_request(rdev);
3290
3291 return 0;
3292}
3293
3294static void ci_find_dpm_states_clocks_in_dpm_table(struct radeon_device *rdev,
3295 struct radeon_ps *radeon_state)
3296{
3297 struct ci_power_info *pi = ci_get_pi(rdev);
3298 struct ci_ps *state = ci_get_ps(radeon_state);
3299 struct ci_single_dpm_table *sclk_table = &pi->dpm_table.sclk_table;
3300 u32 sclk = state->performance_levels[state->performance_level_count-1].sclk;
3301 struct ci_single_dpm_table *mclk_table = &pi->dpm_table.mclk_table;
3302 u32 mclk = state->performance_levels[state->performance_level_count-1].mclk;
3303 u32 i;
3304
3305 pi->need_update_smu7_dpm_table = 0;
3306
3307 for (i = 0; i < sclk_table->count; i++) {
3308 if (sclk == sclk_table->dpm_levels[i].value)
3309 break;
3310 }
3311
3312 if (i >= sclk_table->count) {
3313 pi->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_SCLK;
3314 } else {
3315 /* XXX check display min clock requirements */
3316 if (0 != CISLAND_MINIMUM_ENGINE_CLOCK)
3317 pi->need_update_smu7_dpm_table |= DPMTABLE_UPDATE_SCLK;
3318 }
3319
3320 for (i = 0; i < mclk_table->count; i++) {
3321 if (mclk == mclk_table->dpm_levels[i].value)
3322 break;
3323 }
3324
3325 if (i >= mclk_table->count)
3326 pi->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_MCLK;
3327
3328 if (rdev->pm.dpm.current_active_crtc_count !=
3329 rdev->pm.dpm.new_active_crtc_count)
3330 pi->need_update_smu7_dpm_table |= DPMTABLE_UPDATE_MCLK;
3331}
3332
3333static int ci_populate_and_upload_sclk_mclk_dpm_levels(struct radeon_device *rdev,
3334 struct radeon_ps *radeon_state)
3335{
3336 struct ci_power_info *pi = ci_get_pi(rdev);
3337 struct ci_ps *state = ci_get_ps(radeon_state);
3338 u32 sclk = state->performance_levels[state->performance_level_count-1].sclk;
3339 u32 mclk = state->performance_levels[state->performance_level_count-1].mclk;
3340 struct ci_dpm_table *dpm_table = &pi->dpm_table;
3341 int ret;
3342
3343 if (!pi->need_update_smu7_dpm_table)
3344 return 0;
3345
3346 if (pi->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_SCLK)
3347 dpm_table->sclk_table.dpm_levels[dpm_table->sclk_table.count-1].value = sclk;
3348
3349 if (pi->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK)
3350 dpm_table->mclk_table.dpm_levels[dpm_table->mclk_table.count-1].value = mclk;
3351
3352 if (pi->need_update_smu7_dpm_table & (DPMTABLE_OD_UPDATE_SCLK | DPMTABLE_UPDATE_SCLK)) {
3353 ret = ci_populate_all_graphic_levels(rdev);
3354 if (ret)
3355 return ret;
3356 }
3357
3358 if (pi->need_update_smu7_dpm_table & (DPMTABLE_OD_UPDATE_MCLK | DPMTABLE_UPDATE_MCLK)) {
3359 ret = ci_populate_all_memory_levels(rdev);
3360 if (ret)
3361 return ret;
3362 }
3363
3364 return 0;
3365}
3366
3367static int ci_enable_uvd_dpm(struct radeon_device *rdev, bool enable)
3368{
3369 struct ci_power_info *pi = ci_get_pi(rdev);
3370 const struct radeon_clock_and_voltage_limits *max_limits;
3371 int i;
3372
3373 if (rdev->pm.dpm.ac_power)
3374 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
3375 else
3376 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
3377
3378 if (enable) {
3379 pi->dpm_level_enable_mask.uvd_dpm_enable_mask = 0;
3380
3381 for (i = rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count - 1; i >= 0; i--) {
3382 if (rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].v <= max_limits->vddc) {
3383 pi->dpm_level_enable_mask.uvd_dpm_enable_mask |= 1 << i;
3384
3385 if (!pi->caps_uvd_dpm)
3386 break;
3387 }
3388 }
3389
3390 ci_send_msg_to_smc_with_parameter(rdev,
3391 PPSMC_MSG_UVDDPM_SetEnabledMask,
3392 pi->dpm_level_enable_mask.uvd_dpm_enable_mask);
3393
3394 if (pi->last_mclk_dpm_enable_mask & 0x1) {
3395 pi->uvd_enabled = true;
3396 pi->dpm_level_enable_mask.mclk_dpm_enable_mask &= 0xFFFFFFFE;
3397 ci_send_msg_to_smc_with_parameter(rdev,
3398 PPSMC_MSG_MCLKDPM_SetEnabledMask,
3399 pi->dpm_level_enable_mask.mclk_dpm_enable_mask);
3400 }
3401 } else {
3402 if (pi->last_mclk_dpm_enable_mask & 0x1) {
3403 pi->uvd_enabled = false;
3404 pi->dpm_level_enable_mask.mclk_dpm_enable_mask |= 1;
3405 ci_send_msg_to_smc_with_parameter(rdev,
3406 PPSMC_MSG_MCLKDPM_SetEnabledMask,
3407 pi->dpm_level_enable_mask.mclk_dpm_enable_mask);
3408 }
3409 }
3410
3411 return (ci_send_msg_to_smc(rdev, enable ?
3412 PPSMC_MSG_UVDDPM_Enable : PPSMC_MSG_UVDDPM_Disable) == PPSMC_Result_OK) ?
3413 0 : -EINVAL;
3414}
3415
3416#if 0
3417static int ci_enable_vce_dpm(struct radeon_device *rdev, bool enable)
3418{
3419 struct ci_power_info *pi = ci_get_pi(rdev);
3420 const struct radeon_clock_and_voltage_limits *max_limits;
3421 int i;
3422
3423 if (rdev->pm.dpm.ac_power)
3424 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
3425 else
3426 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
3427
3428 if (enable) {
3429 pi->dpm_level_enable_mask.vce_dpm_enable_mask = 0;
3430 for (i = rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.count - 1; i >= 0; i--) {
3431 if (rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries[i].v <= max_limits->vddc) {
3432 pi->dpm_level_enable_mask.vce_dpm_enable_mask |= 1 << i;
3433
3434 if (!pi->caps_vce_dpm)
3435 break;
3436 }
3437 }
3438
3439 ci_send_msg_to_smc_with_parameter(rdev,
3440 PPSMC_MSG_VCEDPM_SetEnabledMask,
3441 pi->dpm_level_enable_mask.vce_dpm_enable_mask);
3442 }
3443
3444 return (ci_send_msg_to_smc(rdev, enable ?
3445 PPSMC_MSG_VCEDPM_Enable : PPSMC_MSG_VCEDPM_Disable) == PPSMC_Result_OK) ?
3446 0 : -EINVAL;
3447}
3448
3449static int ci_enable_samu_dpm(struct radeon_device *rdev, bool enable)
3450{
3451 struct ci_power_info *pi = ci_get_pi(rdev);
3452 const struct radeon_clock_and_voltage_limits *max_limits;
3453 int i;
3454
3455 if (rdev->pm.dpm.ac_power)
3456 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
3457 else
3458 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
3459
3460 if (enable) {
3461 pi->dpm_level_enable_mask.samu_dpm_enable_mask = 0;
3462 for (i = rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.count - 1; i >= 0; i--) {
3463 if (rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries[i].v <= max_limits->vddc) {
3464 pi->dpm_level_enable_mask.samu_dpm_enable_mask |= 1 << i;
3465
3466 if (!pi->caps_samu_dpm)
3467 break;
3468 }
3469 }
3470
3471 ci_send_msg_to_smc_with_parameter(rdev,
3472 PPSMC_MSG_SAMUDPM_SetEnabledMask,
3473 pi->dpm_level_enable_mask.samu_dpm_enable_mask);
3474 }
3475 return (ci_send_msg_to_smc(rdev, enable ?
3476 PPSMC_MSG_SAMUDPM_Enable : PPSMC_MSG_SAMUDPM_Disable) == PPSMC_Result_OK) ?
3477 0 : -EINVAL;
3478}
3479
3480static int ci_enable_acp_dpm(struct radeon_device *rdev, bool enable)
3481{
3482 struct ci_power_info *pi = ci_get_pi(rdev);
3483 const struct radeon_clock_and_voltage_limits *max_limits;
3484 int i;
3485
3486 if (rdev->pm.dpm.ac_power)
3487 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
3488 else
3489 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc;
3490
3491 if (enable) {
3492 pi->dpm_level_enable_mask.acp_dpm_enable_mask = 0;
3493 for (i = rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.count - 1; i >= 0; i--) {
3494 if (rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries[i].v <= max_limits->vddc) {
3495 pi->dpm_level_enable_mask.acp_dpm_enable_mask |= 1 << i;
3496
3497 if (!pi->caps_acp_dpm)
3498 break;
3499 }
3500 }
3501
3502 ci_send_msg_to_smc_with_parameter(rdev,
3503 PPSMC_MSG_ACPDPM_SetEnabledMask,
3504 pi->dpm_level_enable_mask.acp_dpm_enable_mask);
3505 }
3506
3507 return (ci_send_msg_to_smc(rdev, enable ?
3508 PPSMC_MSG_ACPDPM_Enable : PPSMC_MSG_ACPDPM_Disable) == PPSMC_Result_OK) ?
3509 0 : -EINVAL;
3510}
3511#endif
3512
3513static int ci_update_uvd_dpm(struct radeon_device *rdev, bool gate)
3514{
3515 struct ci_power_info *pi = ci_get_pi(rdev);
3516 u32 tmp;
3517
3518 if (!gate) {
3519 if (pi->caps_uvd_dpm ||
3520 (rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count <= 0))
3521 pi->smc_state_table.UvdBootLevel = 0;
3522 else
3523 pi->smc_state_table.UvdBootLevel =
3524 rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count - 1;
3525
3526 tmp = RREG32_SMC(DPM_TABLE_475);
3527 tmp &= ~UvdBootLevel_MASK;
3528 tmp |= UvdBootLevel(pi->smc_state_table.UvdBootLevel);
3529 WREG32_SMC(DPM_TABLE_475, tmp);
3530 }
3531
3532 return ci_enable_uvd_dpm(rdev, !gate);
3533}
3534
3535#if 0
3536static u8 ci_get_vce_boot_level(struct radeon_device *rdev)
3537{
3538 u8 i;
3539 u32 min_evclk = 30000; /* ??? */
3540 struct radeon_vce_clock_voltage_dependency_table *table =
3541 &rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table;
3542
3543 for (i = 0; i < table->count; i++) {
3544 if (table->entries[i].evclk >= min_evclk)
3545 return i;
3546 }
3547
3548 return table->count - 1;
3549}
3550
3551static int ci_update_vce_dpm(struct radeon_device *rdev,
3552 struct radeon_ps *radeon_new_state,
3553 struct radeon_ps *radeon_current_state)
3554{
3555 struct ci_power_info *pi = ci_get_pi(rdev);
3556 bool new_vce_clock_non_zero = (radeon_new_state->evclk != 0);
3557 bool old_vce_clock_non_zero = (radeon_current_state->evclk != 0);
3558 int ret = 0;
3559 u32 tmp;
3560
3561 if (new_vce_clock_non_zero != old_vce_clock_non_zero) {
3562 if (new_vce_clock_non_zero) {
3563 pi->smc_state_table.VceBootLevel = ci_get_vce_boot_level(rdev);
3564
3565 tmp = RREG32_SMC(DPM_TABLE_475);
3566 tmp &= ~VceBootLevel_MASK;
3567 tmp |= VceBootLevel(pi->smc_state_table.VceBootLevel);
3568 WREG32_SMC(DPM_TABLE_475, tmp);
3569
3570 ret = ci_enable_vce_dpm(rdev, true);
3571 } else {
3572 ret = ci_enable_vce_dpm(rdev, false);
3573 }
3574 }
3575 return ret;
3576}
3577
3578static int ci_update_samu_dpm(struct radeon_device *rdev, bool gate)
3579{
3580 return ci_enable_samu_dpm(rdev, gate);
3581}
3582
3583static int ci_update_acp_dpm(struct radeon_device *rdev, bool gate)
3584{
3585 struct ci_power_info *pi = ci_get_pi(rdev);
3586 u32 tmp;
3587
3588 if (!gate) {
3589 pi->smc_state_table.AcpBootLevel = 0;
3590
3591 tmp = RREG32_SMC(DPM_TABLE_475);
3592 tmp &= ~AcpBootLevel_MASK;
3593 tmp |= AcpBootLevel(pi->smc_state_table.AcpBootLevel);
3594 WREG32_SMC(DPM_TABLE_475, tmp);
3595 }
3596
3597 return ci_enable_acp_dpm(rdev, !gate);
3598}
3599#endif
3600
3601static int ci_generate_dpm_level_enable_mask(struct radeon_device *rdev,
3602 struct radeon_ps *radeon_state)
3603{
3604 struct ci_power_info *pi = ci_get_pi(rdev);
3605 int ret;
3606
3607 ret = ci_trim_dpm_states(rdev, radeon_state);
3608 if (ret)
3609 return ret;
3610
3611 pi->dpm_level_enable_mask.sclk_dpm_enable_mask =
3612 ci_get_dpm_level_enable_mask_value(&pi->dpm_table.sclk_table);
3613 pi->dpm_level_enable_mask.mclk_dpm_enable_mask =
3614 ci_get_dpm_level_enable_mask_value(&pi->dpm_table.mclk_table);
3615 pi->last_mclk_dpm_enable_mask =
3616 pi->dpm_level_enable_mask.mclk_dpm_enable_mask;
3617 if (pi->uvd_enabled) {
3618 if (pi->dpm_level_enable_mask.mclk_dpm_enable_mask & 1)
3619 pi->dpm_level_enable_mask.mclk_dpm_enable_mask &= 0xFFFFFFFE;
3620 }
3621 pi->dpm_level_enable_mask.pcie_dpm_enable_mask =
3622 ci_get_dpm_level_enable_mask_value(&pi->dpm_table.pcie_speed_table);
3623
3624 return 0;
3625}
3626
3627static u32 ci_get_lowest_enabled_level(struct radeon_device *rdev,
3628 u32 level_mask)
3629{
3630 u32 level = 0;
3631
3632 while ((level_mask & (1 << level)) == 0)
3633 level++;
3634
3635 return level;
3636}
3637
3638
3639int ci_dpm_force_performance_level(struct radeon_device *rdev,
3640 enum radeon_dpm_forced_level level)
3641{
3642 struct ci_power_info *pi = ci_get_pi(rdev);
3643 PPSMC_Result smc_result;
3644 u32 tmp, levels, i;
3645 int ret;
3646
3647 if (level == RADEON_DPM_FORCED_LEVEL_HIGH) {
3648 if ((!pi->sclk_dpm_key_disabled) &&
3649 pi->dpm_level_enable_mask.sclk_dpm_enable_mask) {
3650 levels = 0;
3651 tmp = pi->dpm_level_enable_mask.sclk_dpm_enable_mask;
3652 while (tmp >>= 1)
3653 levels++;
3654 if (levels) {
3655 ret = ci_dpm_force_state_sclk(rdev, levels);
3656 if (ret)
3657 return ret;
3658 for (i = 0; i < rdev->usec_timeout; i++) {
3659 tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX) &
3660 CURR_SCLK_INDEX_MASK) >> CURR_SCLK_INDEX_SHIFT;
3661 if (tmp == levels)
3662 break;
3663 udelay(1);
3664 }
3665 }
3666 }
3667 if ((!pi->mclk_dpm_key_disabled) &&
3668 pi->dpm_level_enable_mask.mclk_dpm_enable_mask) {
3669 levels = 0;
3670 tmp = pi->dpm_level_enable_mask.mclk_dpm_enable_mask;
3671 while (tmp >>= 1)
3672 levels++;
3673 if (levels) {
3674 ret = ci_dpm_force_state_mclk(rdev, levels);
3675 if (ret)
3676 return ret;
3677 for (i = 0; i < rdev->usec_timeout; i++) {
3678 tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX) &
3679 CURR_MCLK_INDEX_MASK) >> CURR_MCLK_INDEX_SHIFT;
3680 if (tmp == levels)
3681 break;
3682 udelay(1);
3683 }
3684 }
3685 }
3686 if ((!pi->pcie_dpm_key_disabled) &&
3687 pi->dpm_level_enable_mask.pcie_dpm_enable_mask) {
3688 levels = 0;
3689 tmp = pi->dpm_level_enable_mask.pcie_dpm_enable_mask;
3690 while (tmp >>= 1)
3691 levels++;
3692 if (levels) {
3693 ret = ci_dpm_force_state_pcie(rdev, level);
3694 if (ret)
3695 return ret;
3696 for (i = 0; i < rdev->usec_timeout; i++) {
3697 tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX_1) &
3698 CURR_PCIE_INDEX_MASK) >> CURR_PCIE_INDEX_SHIFT;
3699 if (tmp == levels)
3700 break;
3701 udelay(1);
3702 }
3703 }
3704 }
3705 } else if (level == RADEON_DPM_FORCED_LEVEL_LOW) {
3706 if ((!pi->sclk_dpm_key_disabled) &&
3707 pi->dpm_level_enable_mask.sclk_dpm_enable_mask) {
3708 levels = ci_get_lowest_enabled_level(rdev,
3709 pi->dpm_level_enable_mask.sclk_dpm_enable_mask);
3710 ret = ci_dpm_force_state_sclk(rdev, levels);
3711 if (ret)
3712 return ret;
3713 for (i = 0; i < rdev->usec_timeout; i++) {
3714 tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX) &
3715 CURR_SCLK_INDEX_MASK) >> CURR_SCLK_INDEX_SHIFT;
3716 if (tmp == levels)
3717 break;
3718 udelay(1);
3719 }
3720 }
3721 if ((!pi->mclk_dpm_key_disabled) &&
3722 pi->dpm_level_enable_mask.mclk_dpm_enable_mask) {
3723 levels = ci_get_lowest_enabled_level(rdev,
3724 pi->dpm_level_enable_mask.mclk_dpm_enable_mask);
3725 ret = ci_dpm_force_state_mclk(rdev, levels);
3726 if (ret)
3727 return ret;
3728 for (i = 0; i < rdev->usec_timeout; i++) {
3729 tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX) &
3730 CURR_MCLK_INDEX_MASK) >> CURR_MCLK_INDEX_SHIFT;
3731 if (tmp == levels)
3732 break;
3733 udelay(1);
3734 }
3735 }
3736 if ((!pi->pcie_dpm_key_disabled) &&
3737 pi->dpm_level_enable_mask.pcie_dpm_enable_mask) {
3738 levels = ci_get_lowest_enabled_level(rdev,
3739 pi->dpm_level_enable_mask.pcie_dpm_enable_mask);
3740 ret = ci_dpm_force_state_pcie(rdev, levels);
3741 if (ret)
3742 return ret;
3743 for (i = 0; i < rdev->usec_timeout; i++) {
3744 tmp = (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX_1) &
3745 CURR_PCIE_INDEX_MASK) >> CURR_PCIE_INDEX_SHIFT;
3746 if (tmp == levels)
3747 break;
3748 udelay(1);
3749 }
3750 }
3751 } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) {
3752 if (!pi->sclk_dpm_key_disabled) {
3753 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_NoForcedLevel);
3754 if (smc_result != PPSMC_Result_OK)
3755 return -EINVAL;
3756 }
3757 if (!pi->mclk_dpm_key_disabled) {
3758 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_MCLKDPM_NoForcedLevel);
3759 if (smc_result != PPSMC_Result_OK)
3760 return -EINVAL;
3761 }
3762 if (!pi->pcie_dpm_key_disabled) {
3763 smc_result = ci_send_msg_to_smc(rdev, PPSMC_MSG_PCIeDPM_UnForceLevel);
3764 if (smc_result != PPSMC_Result_OK)
3765 return -EINVAL;
3766 }
3767 }
3768
3769 rdev->pm.dpm.forced_level = level;
3770
3771 return 0;
3772}
3773
3774static int ci_set_mc_special_registers(struct radeon_device *rdev,
3775 struct ci_mc_reg_table *table)
3776{
3777 struct ci_power_info *pi = ci_get_pi(rdev);
3778 u8 i, j, k;
3779 u32 temp_reg;
3780
3781 for (i = 0, j = table->last; i < table->last; i++) {
3782 if (j >= SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
3783 return -EINVAL;
3784 switch(table->mc_reg_address[i].s1 << 2) {
3785 case MC_SEQ_MISC1:
3786 temp_reg = RREG32(MC_PMG_CMD_EMRS);
3787 table->mc_reg_address[j].s1 = MC_PMG_CMD_EMRS >> 2;
3788 table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
3789 for (k = 0; k < table->num_entries; k++) {
3790 table->mc_reg_table_entry[k].mc_data[j] =
3791 ((temp_reg & 0xffff0000)) | ((table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16);
3792 }
3793 j++;
3794 if (j >= SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
3795 return -EINVAL;
3796
3797 temp_reg = RREG32(MC_PMG_CMD_MRS);
3798 table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS >> 2;
3799 table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS_LP >> 2;
3800 for (k = 0; k < table->num_entries; k++) {
3801 table->mc_reg_table_entry[k].mc_data[j] =
3802 (temp_reg & 0xffff0000) | (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
3803 if (!pi->mem_gddr5)
3804 table->mc_reg_table_entry[k].mc_data[j] |= 0x100;
3805 }
3806 j++;
3807 if (j > SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
3808 return -EINVAL;
3809
3810 if (!pi->mem_gddr5) {
3811 table->mc_reg_address[j].s1 = MC_PMG_AUTO_CMD >> 2;
3812 table->mc_reg_address[j].s0 = MC_PMG_AUTO_CMD >> 2;
3813 for (k = 0; k < table->num_entries; k++) {
3814 table->mc_reg_table_entry[k].mc_data[j] =
3815 (table->mc_reg_table_entry[k].mc_data[i] & 0xffff0000) >> 16;
3816 }
3817 j++;
3818 if (j > SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
3819 return -EINVAL;
3820 }
3821 break;
3822 case MC_SEQ_RESERVE_M:
3823 temp_reg = RREG32(MC_PMG_CMD_MRS1);
3824 table->mc_reg_address[j].s1 = MC_PMG_CMD_MRS1 >> 2;
3825 table->mc_reg_address[j].s0 = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
3826 for (k = 0; k < table->num_entries; k++) {
3827 table->mc_reg_table_entry[k].mc_data[j] =
3828 (temp_reg & 0xffff0000) | (table->mc_reg_table_entry[k].mc_data[i] & 0x0000ffff);
3829 }
3830 j++;
3831 if (j > SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
3832 return -EINVAL;
3833 break;
3834 default:
3835 break;
3836 }
3837
3838 }
3839
3840 table->last = j;
3841
3842 return 0;
3843}
3844
3845static bool ci_check_s0_mc_reg_index(u16 in_reg, u16 *out_reg)
3846{
3847 bool result = true;
3848
3849 switch(in_reg) {
3850 case MC_SEQ_RAS_TIMING >> 2:
3851 *out_reg = MC_SEQ_RAS_TIMING_LP >> 2;
3852 break;
3853 case MC_SEQ_DLL_STBY >> 2:
3854 *out_reg = MC_SEQ_DLL_STBY_LP >> 2;
3855 break;
3856 case MC_SEQ_G5PDX_CMD0 >> 2:
3857 *out_reg = MC_SEQ_G5PDX_CMD0_LP >> 2;
3858 break;
3859 case MC_SEQ_G5PDX_CMD1 >> 2:
3860 *out_reg = MC_SEQ_G5PDX_CMD1_LP >> 2;
3861 break;
3862 case MC_SEQ_G5PDX_CTRL >> 2:
3863 *out_reg = MC_SEQ_G5PDX_CTRL_LP >> 2;
3864 break;
3865 case MC_SEQ_CAS_TIMING >> 2:
3866 *out_reg = MC_SEQ_CAS_TIMING_LP >> 2;
3867 break;
3868 case MC_SEQ_MISC_TIMING >> 2:
3869 *out_reg = MC_SEQ_MISC_TIMING_LP >> 2;
3870 break;
3871 case MC_SEQ_MISC_TIMING2 >> 2:
3872 *out_reg = MC_SEQ_MISC_TIMING2_LP >> 2;
3873 break;
3874 case MC_SEQ_PMG_DVS_CMD >> 2:
3875 *out_reg = MC_SEQ_PMG_DVS_CMD_LP >> 2;
3876 break;
3877 case MC_SEQ_PMG_DVS_CTL >> 2:
3878 *out_reg = MC_SEQ_PMG_DVS_CTL_LP >> 2;
3879 break;
3880 case MC_SEQ_RD_CTL_D0 >> 2:
3881 *out_reg = MC_SEQ_RD_CTL_D0_LP >> 2;
3882 break;
3883 case MC_SEQ_RD_CTL_D1 >> 2:
3884 *out_reg = MC_SEQ_RD_CTL_D1_LP >> 2;
3885 break;
3886 case MC_SEQ_WR_CTL_D0 >> 2:
3887 *out_reg = MC_SEQ_WR_CTL_D0_LP >> 2;
3888 break;
3889 case MC_SEQ_WR_CTL_D1 >> 2:
3890 *out_reg = MC_SEQ_WR_CTL_D1_LP >> 2;
3891 break;
3892 case MC_PMG_CMD_EMRS >> 2:
3893 *out_reg = MC_SEQ_PMG_CMD_EMRS_LP >> 2;
3894 break;
3895 case MC_PMG_CMD_MRS >> 2:
3896 *out_reg = MC_SEQ_PMG_CMD_MRS_LP >> 2;
3897 break;
3898 case MC_PMG_CMD_MRS1 >> 2:
3899 *out_reg = MC_SEQ_PMG_CMD_MRS1_LP >> 2;
3900 break;
3901 case MC_SEQ_PMG_TIMING >> 2:
3902 *out_reg = MC_SEQ_PMG_TIMING_LP >> 2;
3903 break;
3904 case MC_PMG_CMD_MRS2 >> 2:
3905 *out_reg = MC_SEQ_PMG_CMD_MRS2_LP >> 2;
3906 break;
3907 case MC_SEQ_WR_CTL_2 >> 2:
3908 *out_reg = MC_SEQ_WR_CTL_2_LP >> 2;
3909 break;
3910 default:
3911 result = false;
3912 break;
3913 }
3914
3915 return result;
3916}
3917
3918static void ci_set_valid_flag(struct ci_mc_reg_table *table)
3919{
3920 u8 i, j;
3921
3922 for (i = 0; i < table->last; i++) {
3923 for (j = 1; j < table->num_entries; j++) {
3924 if (table->mc_reg_table_entry[j-1].mc_data[i] !=
3925 table->mc_reg_table_entry[j].mc_data[i]) {
3926 table->valid_flag |= 1 << i;
3927 break;
3928 }
3929 }
3930 }
3931}
3932
3933static void ci_set_s0_mc_reg_index(struct ci_mc_reg_table *table)
3934{
3935 u32 i;
3936 u16 address;
3937
3938 for (i = 0; i < table->last; i++) {
3939 table->mc_reg_address[i].s0 =
3940 ci_check_s0_mc_reg_index(table->mc_reg_address[i].s1, &address) ?
3941 address : table->mc_reg_address[i].s1;
3942 }
3943}
3944
3945static int ci_copy_vbios_mc_reg_table(const struct atom_mc_reg_table *table,
3946 struct ci_mc_reg_table *ci_table)
3947{
3948 u8 i, j;
3949
3950 if (table->last > SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
3951 return -EINVAL;
3952 if (table->num_entries > MAX_AC_TIMING_ENTRIES)
3953 return -EINVAL;
3954
3955 for (i = 0; i < table->last; i++)
3956 ci_table->mc_reg_address[i].s1 = table->mc_reg_address[i].s1;
3957
3958 ci_table->last = table->last;
3959
3960 for (i = 0; i < table->num_entries; i++) {
3961 ci_table->mc_reg_table_entry[i].mclk_max =
3962 table->mc_reg_table_entry[i].mclk_max;
3963 for (j = 0; j < table->last; j++)
3964 ci_table->mc_reg_table_entry[i].mc_data[j] =
3965 table->mc_reg_table_entry[i].mc_data[j];
3966 }
3967 ci_table->num_entries = table->num_entries;
3968
3969 return 0;
3970}
3971
3972static int ci_initialize_mc_reg_table(struct radeon_device *rdev)
3973{
3974 struct ci_power_info *pi = ci_get_pi(rdev);
3975 struct atom_mc_reg_table *table;
3976 struct ci_mc_reg_table *ci_table = &pi->mc_reg_table;
3977 u8 module_index = rv770_get_memory_module_index(rdev);
3978 int ret;
3979
3980 table = kzalloc(sizeof(struct atom_mc_reg_table), GFP_KERNEL);
3981 if (!table)
3982 return -ENOMEM;
3983
3984 WREG32(MC_SEQ_RAS_TIMING_LP, RREG32(MC_SEQ_RAS_TIMING));
3985 WREG32(MC_SEQ_CAS_TIMING_LP, RREG32(MC_SEQ_CAS_TIMING));
3986 WREG32(MC_SEQ_DLL_STBY_LP, RREG32(MC_SEQ_DLL_STBY));
3987 WREG32(MC_SEQ_G5PDX_CMD0_LP, RREG32(MC_SEQ_G5PDX_CMD0));
3988 WREG32(MC_SEQ_G5PDX_CMD1_LP, RREG32(MC_SEQ_G5PDX_CMD1));
3989 WREG32(MC_SEQ_G5PDX_CTRL_LP, RREG32(MC_SEQ_G5PDX_CTRL));
3990 WREG32(MC_SEQ_PMG_DVS_CMD_LP, RREG32(MC_SEQ_PMG_DVS_CMD));
3991 WREG32(MC_SEQ_PMG_DVS_CTL_LP, RREG32(MC_SEQ_PMG_DVS_CTL));
3992 WREG32(MC_SEQ_MISC_TIMING_LP, RREG32(MC_SEQ_MISC_TIMING));
3993 WREG32(MC_SEQ_MISC_TIMING2_LP, RREG32(MC_SEQ_MISC_TIMING2));
3994 WREG32(MC_SEQ_PMG_CMD_EMRS_LP, RREG32(MC_PMG_CMD_EMRS));
3995 WREG32(MC_SEQ_PMG_CMD_MRS_LP, RREG32(MC_PMG_CMD_MRS));
3996 WREG32(MC_SEQ_PMG_CMD_MRS1_LP, RREG32(MC_PMG_CMD_MRS1));
3997 WREG32(MC_SEQ_WR_CTL_D0_LP, RREG32(MC_SEQ_WR_CTL_D0));
3998 WREG32(MC_SEQ_WR_CTL_D1_LP, RREG32(MC_SEQ_WR_CTL_D1));
3999 WREG32(MC_SEQ_RD_CTL_D0_LP, RREG32(MC_SEQ_RD_CTL_D0));
4000 WREG32(MC_SEQ_RD_CTL_D1_LP, RREG32(MC_SEQ_RD_CTL_D1));
4001 WREG32(MC_SEQ_PMG_TIMING_LP, RREG32(MC_SEQ_PMG_TIMING));
4002 WREG32(MC_SEQ_PMG_CMD_MRS2_LP, RREG32(MC_PMG_CMD_MRS2));
4003 WREG32(MC_SEQ_WR_CTL_2_LP, RREG32(MC_SEQ_WR_CTL_2));
4004
4005 ret = radeon_atom_init_mc_reg_table(rdev, module_index, table);
4006 if (ret)
4007 goto init_mc_done;
4008
4009 ret = ci_copy_vbios_mc_reg_table(table, ci_table);
4010 if (ret)
4011 goto init_mc_done;
4012
4013 ci_set_s0_mc_reg_index(ci_table);
4014
4015 ret = ci_set_mc_special_registers(rdev, ci_table);
4016 if (ret)
4017 goto init_mc_done;
4018
4019 ci_set_valid_flag(ci_table);
4020
4021init_mc_done:
4022 kfree(table);
4023
4024 return ret;
4025}
4026
4027static int ci_populate_mc_reg_addresses(struct radeon_device *rdev,
4028 SMU7_Discrete_MCRegisters *mc_reg_table)
4029{
4030 struct ci_power_info *pi = ci_get_pi(rdev);
4031 u32 i, j;
4032
4033 for (i = 0, j = 0; j < pi->mc_reg_table.last; j++) {
4034 if (pi->mc_reg_table.valid_flag & (1 << j)) {
4035 if (i >= SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE)
4036 return -EINVAL;
4037 mc_reg_table->address[i].s0 = cpu_to_be16(pi->mc_reg_table.mc_reg_address[j].s0);
4038 mc_reg_table->address[i].s1 = cpu_to_be16(pi->mc_reg_table.mc_reg_address[j].s1);
4039 i++;
4040 }
4041 }
4042
4043 mc_reg_table->last = (u8)i;
4044
4045 return 0;
4046}
4047
4048static void ci_convert_mc_registers(const struct ci_mc_reg_entry *entry,
4049 SMU7_Discrete_MCRegisterSet *data,
4050 u32 num_entries, u32 valid_flag)
4051{
4052 u32 i, j;
4053
4054 for (i = 0, j = 0; j < num_entries; j++) {
4055 if (valid_flag & (1 << j)) {
4056 data->value[i] = cpu_to_be32(entry->mc_data[j]);
4057 i++;
4058 }
4059 }
4060}
4061
4062static void ci_convert_mc_reg_table_entry_to_smc(struct radeon_device *rdev,
4063 const u32 memory_clock,
4064 SMU7_Discrete_MCRegisterSet *mc_reg_table_data)
4065{
4066 struct ci_power_info *pi = ci_get_pi(rdev);
4067 u32 i = 0;
4068
4069 for(i = 0; i < pi->mc_reg_table.num_entries; i++) {
4070 if (memory_clock <= pi->mc_reg_table.mc_reg_table_entry[i].mclk_max)
4071 break;
4072 }
4073
4074 if ((i == pi->mc_reg_table.num_entries) && (i > 0))
4075 --i;
4076
4077 ci_convert_mc_registers(&pi->mc_reg_table.mc_reg_table_entry[i],
4078 mc_reg_table_data, pi->mc_reg_table.last,
4079 pi->mc_reg_table.valid_flag);
4080}
4081
4082static void ci_convert_mc_reg_table_to_smc(struct radeon_device *rdev,
4083 SMU7_Discrete_MCRegisters *mc_reg_table)
4084{
4085 struct ci_power_info *pi = ci_get_pi(rdev);
4086 u32 i;
4087
4088 for (i = 0; i < pi->dpm_table.mclk_table.count; i++)
4089 ci_convert_mc_reg_table_entry_to_smc(rdev,
4090 pi->dpm_table.mclk_table.dpm_levels[i].value,
4091 &mc_reg_table->data[i]);
4092}
4093
4094static int ci_populate_initial_mc_reg_table(struct radeon_device *rdev)
4095{
4096 struct ci_power_info *pi = ci_get_pi(rdev);
4097 int ret;
4098
4099 memset(&pi->smc_mc_reg_table, 0, sizeof(SMU7_Discrete_MCRegisters));
4100
4101 ret = ci_populate_mc_reg_addresses(rdev, &pi->smc_mc_reg_table);
4102 if (ret)
4103 return ret;
4104 ci_convert_mc_reg_table_to_smc(rdev, &pi->smc_mc_reg_table);
4105
4106 return ci_copy_bytes_to_smc(rdev,
4107 pi->mc_reg_table_start,
4108 (u8 *)&pi->smc_mc_reg_table,
4109 sizeof(SMU7_Discrete_MCRegisters),
4110 pi->sram_end);
4111}
4112
4113static int ci_update_and_upload_mc_reg_table(struct radeon_device *rdev)
4114{
4115 struct ci_power_info *pi = ci_get_pi(rdev);
4116
4117 if (!(pi->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK))
4118 return 0;
4119
4120 memset(&pi->smc_mc_reg_table, 0, sizeof(SMU7_Discrete_MCRegisters));
4121
4122 ci_convert_mc_reg_table_to_smc(rdev, &pi->smc_mc_reg_table);
4123
4124 return ci_copy_bytes_to_smc(rdev,
4125 pi->mc_reg_table_start +
4126 offsetof(SMU7_Discrete_MCRegisters, data[0]),
4127 (u8 *)&pi->smc_mc_reg_table.data[0],
4128 sizeof(SMU7_Discrete_MCRegisterSet) *
4129 pi->dpm_table.mclk_table.count,
4130 pi->sram_end);
4131}
4132
4133static void ci_enable_voltage_control(struct radeon_device *rdev)
4134{
4135 u32 tmp = RREG32_SMC(GENERAL_PWRMGT);
4136
4137 tmp |= VOLT_PWRMGT_EN;
4138 WREG32_SMC(GENERAL_PWRMGT, tmp);
4139}
4140
4141static enum radeon_pcie_gen ci_get_maximum_link_speed(struct radeon_device *rdev,
4142 struct radeon_ps *radeon_state)
4143{
4144 struct ci_ps *state = ci_get_ps(radeon_state);
4145 int i;
4146 u16 pcie_speed, max_speed = 0;
4147
4148 for (i = 0; i < state->performance_level_count; i++) {
4149 pcie_speed = state->performance_levels[i].pcie_gen;
4150 if (max_speed < pcie_speed)
4151 max_speed = pcie_speed;
4152 }
4153
4154 return max_speed;
4155}
4156
4157static u16 ci_get_current_pcie_speed(struct radeon_device *rdev)
4158{
4159 u32 speed_cntl = 0;
4160
4161 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL) & LC_CURRENT_DATA_RATE_MASK;
4162 speed_cntl >>= LC_CURRENT_DATA_RATE_SHIFT;
4163
4164 return (u16)speed_cntl;
4165}
4166
4167static int ci_get_current_pcie_lane_number(struct radeon_device *rdev)
4168{
4169 u32 link_width = 0;
4170
4171 link_width = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL) & LC_LINK_WIDTH_RD_MASK;
4172 link_width >>= LC_LINK_WIDTH_RD_SHIFT;
4173
4174 switch (link_width) {
4175 case RADEON_PCIE_LC_LINK_WIDTH_X1:
4176 return 1;
4177 case RADEON_PCIE_LC_LINK_WIDTH_X2:
4178 return 2;
4179 case RADEON_PCIE_LC_LINK_WIDTH_X4:
4180 return 4;
4181 case RADEON_PCIE_LC_LINK_WIDTH_X8:
4182 return 8;
4183 case RADEON_PCIE_LC_LINK_WIDTH_X12:
4184 /* not actually supported */
4185 return 12;
4186 case RADEON_PCIE_LC_LINK_WIDTH_X0:
4187 case RADEON_PCIE_LC_LINK_WIDTH_X16:
4188 default:
4189 return 16;
4190 }
4191}
4192
4193static void ci_request_link_speed_change_before_state_change(struct radeon_device *rdev,
4194 struct radeon_ps *radeon_new_state,
4195 struct radeon_ps *radeon_current_state)
4196{
4197 struct ci_power_info *pi = ci_get_pi(rdev);
4198 enum radeon_pcie_gen target_link_speed =
4199 ci_get_maximum_link_speed(rdev, radeon_new_state);
4200 enum radeon_pcie_gen current_link_speed;
4201
4202 if (pi->force_pcie_gen == RADEON_PCIE_GEN_INVALID)
4203 current_link_speed = ci_get_maximum_link_speed(rdev, radeon_current_state);
4204 else
4205 current_link_speed = pi->force_pcie_gen;
4206
4207 pi->force_pcie_gen = RADEON_PCIE_GEN_INVALID;
4208 pi->pspp_notify_required = false;
4209 if (target_link_speed > current_link_speed) {
4210 switch (target_link_speed) {
4211 case RADEON_PCIE_GEN3:
4212 if (radeon_acpi_pcie_performance_request(rdev, PCIE_PERF_REQ_PECI_GEN3, false) == 0)
4213 break;
4214 pi->force_pcie_gen = RADEON_PCIE_GEN2;
4215 if (current_link_speed == RADEON_PCIE_GEN2)
4216 break;
4217 case RADEON_PCIE_GEN2:
4218 if (radeon_acpi_pcie_performance_request(rdev, PCIE_PERF_REQ_PECI_GEN2, false) == 0)
4219 break;
4220 default:
4221 pi->force_pcie_gen = ci_get_current_pcie_speed(rdev);
4222 break;
4223 }
4224 } else {
4225 if (target_link_speed < current_link_speed)
4226 pi->pspp_notify_required = true;
4227 }
4228}
4229
4230static void ci_notify_link_speed_change_after_state_change(struct radeon_device *rdev,
4231 struct radeon_ps *radeon_new_state,
4232 struct radeon_ps *radeon_current_state)
4233{
4234 struct ci_power_info *pi = ci_get_pi(rdev);
4235 enum radeon_pcie_gen target_link_speed =
4236 ci_get_maximum_link_speed(rdev, radeon_new_state);
4237 u8 request;
4238
4239 if (pi->pspp_notify_required) {
4240 if (target_link_speed == RADEON_PCIE_GEN3)
4241 request = PCIE_PERF_REQ_PECI_GEN3;
4242 else if (target_link_speed == RADEON_PCIE_GEN2)
4243 request = PCIE_PERF_REQ_PECI_GEN2;
4244 else
4245 request = PCIE_PERF_REQ_PECI_GEN1;
4246
4247 if ((request == PCIE_PERF_REQ_PECI_GEN1) &&
4248 (ci_get_current_pcie_speed(rdev) > 0))
4249 return;
4250
4251 radeon_acpi_pcie_performance_request(rdev, request, false);
4252 }
4253}
4254
4255static int ci_set_private_data_variables_based_on_pptable(struct radeon_device *rdev)
4256{
4257 struct ci_power_info *pi = ci_get_pi(rdev);
4258 struct radeon_clock_voltage_dependency_table *allowed_sclk_vddc_table =
4259 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
4260 struct radeon_clock_voltage_dependency_table *allowed_mclk_vddc_table =
4261 &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk;
4262 struct radeon_clock_voltage_dependency_table *allowed_mclk_vddci_table =
4263 &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk;
4264
4265 if (allowed_sclk_vddc_table == NULL)
4266 return -EINVAL;
4267 if (allowed_sclk_vddc_table->count < 1)
4268 return -EINVAL;
4269 if (allowed_mclk_vddc_table == NULL)
4270 return -EINVAL;
4271 if (allowed_mclk_vddc_table->count < 1)
4272 return -EINVAL;
4273 if (allowed_mclk_vddci_table == NULL)
4274 return -EINVAL;
4275 if (allowed_mclk_vddci_table->count < 1)
4276 return -EINVAL;
4277
4278 pi->min_vddc_in_pp_table = allowed_sclk_vddc_table->entries[0].v;
4279 pi->max_vddc_in_pp_table =
4280 allowed_sclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].v;
4281
4282 pi->min_vddci_in_pp_table = allowed_mclk_vddci_table->entries[0].v;
4283 pi->max_vddci_in_pp_table =
4284 allowed_mclk_vddci_table->entries[allowed_mclk_vddci_table->count - 1].v;
4285
4286 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.sclk =
4287 allowed_sclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].clk;
4288 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.mclk =
4289 allowed_mclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].clk;
4290 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddc =
4291 allowed_sclk_vddc_table->entries[allowed_sclk_vddc_table->count - 1].v;
4292 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac.vddci =
4293 allowed_mclk_vddci_table->entries[allowed_mclk_vddci_table->count - 1].v;
4294
4295 return 0;
4296}
4297
4298static void ci_patch_with_vddc_leakage(struct radeon_device *rdev, u16 *vddc)
4299{
4300 struct ci_power_info *pi = ci_get_pi(rdev);
4301 struct ci_leakage_voltage *leakage_table = &pi->vddc_leakage;
4302 u32 leakage_index;
4303
4304 for (leakage_index = 0; leakage_index < leakage_table->count; leakage_index++) {
4305 if (leakage_table->leakage_id[leakage_index] == *vddc) {
4306 *vddc = leakage_table->actual_voltage[leakage_index];
4307 break;
4308 }
4309 }
4310}
4311
4312static void ci_patch_with_vddci_leakage(struct radeon_device *rdev, u16 *vddci)
4313{
4314 struct ci_power_info *pi = ci_get_pi(rdev);
4315 struct ci_leakage_voltage *leakage_table = &pi->vddci_leakage;
4316 u32 leakage_index;
4317
4318 for (leakage_index = 0; leakage_index < leakage_table->count; leakage_index++) {
4319 if (leakage_table->leakage_id[leakage_index] == *vddci) {
4320 *vddci = leakage_table->actual_voltage[leakage_index];
4321 break;
4322 }
4323 }
4324}
4325
4326static void ci_patch_clock_voltage_dependency_table_with_vddc_leakage(struct radeon_device *rdev,
4327 struct radeon_clock_voltage_dependency_table *table)
4328{
4329 u32 i;
4330
4331 if (table) {
4332 for (i = 0; i < table->count; i++)
4333 ci_patch_with_vddc_leakage(rdev, &table->entries[i].v);
4334 }
4335}
4336
4337static void ci_patch_clock_voltage_dependency_table_with_vddci_leakage(struct radeon_device *rdev,
4338 struct radeon_clock_voltage_dependency_table *table)
4339{
4340 u32 i;
4341
4342 if (table) {
4343 for (i = 0; i < table->count; i++)
4344 ci_patch_with_vddci_leakage(rdev, &table->entries[i].v);
4345 }
4346}
4347
4348static void ci_patch_vce_clock_voltage_dependency_table_with_vddc_leakage(struct radeon_device *rdev,
4349 struct radeon_vce_clock_voltage_dependency_table *table)
4350{
4351 u32 i;
4352
4353 if (table) {
4354 for (i = 0; i < table->count; i++)
4355 ci_patch_with_vddc_leakage(rdev, &table->entries[i].v);
4356 }
4357}
4358
4359static void ci_patch_uvd_clock_voltage_dependency_table_with_vddc_leakage(struct radeon_device *rdev,
4360 struct radeon_uvd_clock_voltage_dependency_table *table)
4361{
4362 u32 i;
4363
4364 if (table) {
4365 for (i = 0; i < table->count; i++)
4366 ci_patch_with_vddc_leakage(rdev, &table->entries[i].v);
4367 }
4368}
4369
4370static void ci_patch_vddc_phase_shed_limit_table_with_vddc_leakage(struct radeon_device *rdev,
4371 struct radeon_phase_shedding_limits_table *table)
4372{
4373 u32 i;
4374
4375 if (table) {
4376 for (i = 0; i < table->count; i++)
4377 ci_patch_with_vddc_leakage(rdev, &table->entries[i].voltage);
4378 }
4379}
4380
4381static void ci_patch_clock_voltage_limits_with_vddc_leakage(struct radeon_device *rdev,
4382 struct radeon_clock_and_voltage_limits *table)
4383{
4384 if (table) {
4385 ci_patch_with_vddc_leakage(rdev, (u16 *)&table->vddc);
4386 ci_patch_with_vddci_leakage(rdev, (u16 *)&table->vddci);
4387 }
4388}
4389
4390static void ci_patch_cac_leakage_table_with_vddc_leakage(struct radeon_device *rdev,
4391 struct radeon_cac_leakage_table *table)
4392{
4393 u32 i;
4394
4395 if (table) {
4396 for (i = 0; i < table->count; i++)
4397 ci_patch_with_vddc_leakage(rdev, &table->entries[i].vddc);
4398 }
4399}
4400
4401static void ci_patch_dependency_tables_with_leakage(struct radeon_device *rdev)
4402{
4403
4404 ci_patch_clock_voltage_dependency_table_with_vddc_leakage(rdev,
4405 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk);
4406 ci_patch_clock_voltage_dependency_table_with_vddc_leakage(rdev,
4407 &rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk);
4408 ci_patch_clock_voltage_dependency_table_with_vddc_leakage(rdev,
4409 &rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk);
4410 ci_patch_clock_voltage_dependency_table_with_vddci_leakage(rdev,
4411 &rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk);
4412 ci_patch_vce_clock_voltage_dependency_table_with_vddc_leakage(rdev,
4413 &rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table);
4414 ci_patch_uvd_clock_voltage_dependency_table_with_vddc_leakage(rdev,
4415 &rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table);
4416 ci_patch_clock_voltage_dependency_table_with_vddc_leakage(rdev,
4417 &rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table);
4418 ci_patch_clock_voltage_dependency_table_with_vddc_leakage(rdev,
4419 &rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table);
4420 ci_patch_vddc_phase_shed_limit_table_with_vddc_leakage(rdev,
4421 &rdev->pm.dpm.dyn_state.phase_shedding_limits_table);
4422 ci_patch_clock_voltage_limits_with_vddc_leakage(rdev,
4423 &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac);
4424 ci_patch_clock_voltage_limits_with_vddc_leakage(rdev,
4425 &rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc);
4426 ci_patch_cac_leakage_table_with_vddc_leakage(rdev,
4427 &rdev->pm.dpm.dyn_state.cac_leakage_table);
4428
4429}
4430
4431static void ci_get_memory_type(struct radeon_device *rdev)
4432{
4433 struct ci_power_info *pi = ci_get_pi(rdev);
4434 u32 tmp;
4435
4436 tmp = RREG32(MC_SEQ_MISC0);
4437
4438 if (((tmp & MC_SEQ_MISC0_GDDR5_MASK) >> MC_SEQ_MISC0_GDDR5_SHIFT) ==
4439 MC_SEQ_MISC0_GDDR5_VALUE)
4440 pi->mem_gddr5 = true;
4441 else
4442 pi->mem_gddr5 = false;
4443
4444}
4445
4446void ci_update_current_ps(struct radeon_device *rdev,
4447 struct radeon_ps *rps)
4448{
4449 struct ci_ps *new_ps = ci_get_ps(rps);
4450 struct ci_power_info *pi = ci_get_pi(rdev);
4451
4452 pi->current_rps = *rps;
4453 pi->current_ps = *new_ps;
4454 pi->current_rps.ps_priv = &pi->current_ps;
4455}
4456
4457void ci_update_requested_ps(struct radeon_device *rdev,
4458 struct radeon_ps *rps)
4459{
4460 struct ci_ps *new_ps = ci_get_ps(rps);
4461 struct ci_power_info *pi = ci_get_pi(rdev);
4462
4463 pi->requested_rps = *rps;
4464 pi->requested_ps = *new_ps;
4465 pi->requested_rps.ps_priv = &pi->requested_ps;
4466}
4467
4468int ci_dpm_pre_set_power_state(struct radeon_device *rdev)
4469{
4470 struct ci_power_info *pi = ci_get_pi(rdev);
4471 struct radeon_ps requested_ps = *rdev->pm.dpm.requested_ps;
4472 struct radeon_ps *new_ps = &requested_ps;
4473
4474 ci_update_requested_ps(rdev, new_ps);
4475
4476 ci_apply_state_adjust_rules(rdev, &pi->requested_rps);
4477
4478 return 0;
4479}
4480
4481void ci_dpm_post_set_power_state(struct radeon_device *rdev)
4482{
4483 struct ci_power_info *pi = ci_get_pi(rdev);
4484 struct radeon_ps *new_ps = &pi->requested_rps;
4485
4486 ci_update_current_ps(rdev, new_ps);
4487}
4488
4489
4490void ci_dpm_setup_asic(struct radeon_device *rdev)
4491{
4492 ci_read_clock_registers(rdev);
4493 ci_get_memory_type(rdev);
4494 ci_enable_acpi_power_management(rdev);
4495 ci_init_sclk_t(rdev);
4496}
4497
4498int ci_dpm_enable(struct radeon_device *rdev)
4499{
4500 struct ci_power_info *pi = ci_get_pi(rdev);
4501 struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
4502 int ret;
4503
4504 cik_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
4505 RADEON_CG_BLOCK_MC |
4506 RADEON_CG_BLOCK_SDMA |
4507 RADEON_CG_BLOCK_BIF |
4508 RADEON_CG_BLOCK_UVD |
4509 RADEON_CG_BLOCK_HDP), false);
4510
4511 if (ci_is_smc_running(rdev))
4512 return -EINVAL;
4513 if (pi->voltage_control != CISLANDS_VOLTAGE_CONTROL_NONE) {
4514 ci_enable_voltage_control(rdev);
4515 ret = ci_construct_voltage_tables(rdev);
4516 if (ret) {
4517 DRM_ERROR("ci_construct_voltage_tables failed\n");
4518 return ret;
4519 }
4520 }
4521 if (pi->caps_dynamic_ac_timing) {
4522 ret = ci_initialize_mc_reg_table(rdev);
4523 if (ret)
4524 pi->caps_dynamic_ac_timing = false;
4525 }
4526 if (pi->dynamic_ss)
4527 ci_enable_spread_spectrum(rdev, true);
4528 if (pi->thermal_protection)
4529 ci_enable_thermal_protection(rdev, true);
4530 ci_program_sstp(rdev);
4531 ci_enable_display_gap(rdev);
4532 ci_program_vc(rdev);
4533 ret = ci_upload_firmware(rdev);
4534 if (ret) {
4535 DRM_ERROR("ci_upload_firmware failed\n");
4536 return ret;
4537 }
4538 ret = ci_process_firmware_header(rdev);
4539 if (ret) {
4540 DRM_ERROR("ci_process_firmware_header failed\n");
4541 return ret;
4542 }
4543 ret = ci_initial_switch_from_arb_f0_to_f1(rdev);
4544 if (ret) {
4545 DRM_ERROR("ci_initial_switch_from_arb_f0_to_f1 failed\n");
4546 return ret;
4547 }
4548 ret = ci_init_smc_table(rdev);
4549 if (ret) {
4550 DRM_ERROR("ci_init_smc_table failed\n");
4551 return ret;
4552 }
4553 ret = ci_init_arb_table_index(rdev);
4554 if (ret) {
4555 DRM_ERROR("ci_init_arb_table_index failed\n");
4556 return ret;
4557 }
4558 if (pi->caps_dynamic_ac_timing) {
4559 ret = ci_populate_initial_mc_reg_table(rdev);
4560 if (ret) {
4561 DRM_ERROR("ci_populate_initial_mc_reg_table failed\n");
4562 return ret;
4563 }
4564 }
4565 ret = ci_populate_pm_base(rdev);
4566 if (ret) {
4567 DRM_ERROR("ci_populate_pm_base failed\n");
4568 return ret;
4569 }
4570 ci_dpm_start_smc(rdev);
4571 ci_enable_vr_hot_gpio_interrupt(rdev);
4572 ret = ci_notify_smc_display_change(rdev, false);
4573 if (ret) {
4574 DRM_ERROR("ci_notify_smc_display_change failed\n");
4575 return ret;
4576 }
4577 ci_enable_sclk_control(rdev, true);
4578 ret = ci_enable_ulv(rdev, true);
4579 if (ret) {
4580 DRM_ERROR("ci_enable_ulv failed\n");
4581 return ret;
4582 }
4583 ret = ci_enable_ds_master_switch(rdev, true);
4584 if (ret) {
4585 DRM_ERROR("ci_enable_ds_master_switch failed\n");
4586 return ret;
4587 }
4588 ret = ci_start_dpm(rdev);
4589 if (ret) {
4590 DRM_ERROR("ci_start_dpm failed\n");
4591 return ret;
4592 }
4593 ret = ci_enable_didt(rdev, true);
4594 if (ret) {
4595 DRM_ERROR("ci_enable_didt failed\n");
4596 return ret;
4597 }
4598 ret = ci_enable_smc_cac(rdev, true);
4599 if (ret) {
4600 DRM_ERROR("ci_enable_smc_cac failed\n");
4601 return ret;
4602 }
4603 ret = ci_enable_power_containment(rdev, true);
4604 if (ret) {
4605 DRM_ERROR("ci_enable_power_containment failed\n");
4606 return ret;
4607 }
4608 if (rdev->irq.installed &&
4609 r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) {
4610#if 0
4611 PPSMC_Result result;
4612#endif
4613 ret = ci_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX);
4614 if (ret) {
4615 DRM_ERROR("ci_set_thermal_temperature_range failed\n");
4616 return ret;
4617 }
4618 rdev->irq.dpm_thermal = true;
4619 radeon_irq_set(rdev);
4620#if 0
4621 result = ci_send_msg_to_smc(rdev, PPSMC_MSG_EnableThermalInterrupt);
4622
4623 if (result != PPSMC_Result_OK)
4624 DRM_DEBUG_KMS("Could not enable thermal interrupts.\n");
4625#endif
4626 }
4627
4628 ci_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true);
4629
4630 ci_dpm_powergate_uvd(rdev, true);
4631
4632 cik_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
4633 RADEON_CG_BLOCK_MC |
4634 RADEON_CG_BLOCK_SDMA |
4635 RADEON_CG_BLOCK_BIF |
4636 RADEON_CG_BLOCK_UVD |
4637 RADEON_CG_BLOCK_HDP), true);
4638
4639 ci_update_current_ps(rdev, boot_ps);
4640
4641 return 0;
4642}
4643
4644void ci_dpm_disable(struct radeon_device *rdev)
4645{
4646 struct ci_power_info *pi = ci_get_pi(rdev);
4647 struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
4648
4649 cik_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
4650 RADEON_CG_BLOCK_MC |
4651 RADEON_CG_BLOCK_SDMA |
4652 RADEON_CG_BLOCK_UVD |
4653 RADEON_CG_BLOCK_HDP), false);
4654
4655 ci_dpm_powergate_uvd(rdev, false);
4656
4657 if (!ci_is_smc_running(rdev))
4658 return;
4659
4660 if (pi->thermal_protection)
4661 ci_enable_thermal_protection(rdev, false);
4662 ci_enable_power_containment(rdev, false);
4663 ci_enable_smc_cac(rdev, false);
4664 ci_enable_didt(rdev, false);
4665 ci_enable_spread_spectrum(rdev, false);
4666 ci_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, false);
4667 ci_stop_dpm(rdev);
4668 ci_enable_ds_master_switch(rdev, true);
4669 ci_enable_ulv(rdev, false);
4670 ci_clear_vc(rdev);
4671 ci_reset_to_default(rdev);
4672 ci_dpm_stop_smc(rdev);
4673 ci_force_switch_to_arb_f0(rdev);
4674
4675 ci_update_current_ps(rdev, boot_ps);
4676}
4677
4678int ci_dpm_set_power_state(struct radeon_device *rdev)
4679{
4680 struct ci_power_info *pi = ci_get_pi(rdev);
4681 struct radeon_ps *new_ps = &pi->requested_rps;
4682 struct radeon_ps *old_ps = &pi->current_rps;
4683 int ret;
4684
4685 cik_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
4686 RADEON_CG_BLOCK_MC |
4687 RADEON_CG_BLOCK_SDMA |
4688 RADEON_CG_BLOCK_BIF |
4689 RADEON_CG_BLOCK_UVD |
4690 RADEON_CG_BLOCK_HDP), false);
4691
4692 ci_find_dpm_states_clocks_in_dpm_table(rdev, new_ps);
4693 if (pi->pcie_performance_request)
4694 ci_request_link_speed_change_before_state_change(rdev, new_ps, old_ps);
4695 ret = ci_freeze_sclk_mclk_dpm(rdev);
4696 if (ret) {
4697 DRM_ERROR("ci_freeze_sclk_mclk_dpm failed\n");
4698 return ret;
4699 }
4700 ret = ci_populate_and_upload_sclk_mclk_dpm_levels(rdev, new_ps);
4701 if (ret) {
4702 DRM_ERROR("ci_populate_and_upload_sclk_mclk_dpm_levels failed\n");
4703 return ret;
4704 }
4705 ret = ci_generate_dpm_level_enable_mask(rdev, new_ps);
4706 if (ret) {
4707 DRM_ERROR("ci_generate_dpm_level_enable_mask failed\n");
4708 return ret;
4709 }
4710#if 0
4711 ret = ci_update_vce_dpm(rdev, new_ps, old_ps);
4712 if (ret) {
4713 DRM_ERROR("ci_update_vce_dpm failed\n");
4714 return ret;
4715 }
4716#endif
4717 ret = ci_update_sclk_t(rdev);
4718 if (ret) {
4719 DRM_ERROR("ci_update_sclk_t failed\n");
4720 return ret;
4721 }
4722 if (pi->caps_dynamic_ac_timing) {
4723 ret = ci_update_and_upload_mc_reg_table(rdev);
4724 if (ret) {
4725 DRM_ERROR("ci_update_and_upload_mc_reg_table failed\n");
4726 return ret;
4727 }
4728 }
4729 ret = ci_program_memory_timing_parameters(rdev);
4730 if (ret) {
4731 DRM_ERROR("ci_program_memory_timing_parameters failed\n");
4732 return ret;
4733 }
4734 ret = ci_unfreeze_sclk_mclk_dpm(rdev);
4735 if (ret) {
4736 DRM_ERROR("ci_unfreeze_sclk_mclk_dpm failed\n");
4737 return ret;
4738 }
4739 ret = ci_upload_dpm_level_enable_mask(rdev);
4740 if (ret) {
4741 DRM_ERROR("ci_upload_dpm_level_enable_mask failed\n");
4742 return ret;
4743 }
4744 if (pi->pcie_performance_request)
4745 ci_notify_link_speed_change_after_state_change(rdev, new_ps, old_ps);
4746
4747 ret = ci_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_AUTO);
4748 if (ret) {
4749 DRM_ERROR("ci_dpm_force_performance_level failed\n");
4750 return ret;
4751 }
4752
4753 cik_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
4754 RADEON_CG_BLOCK_MC |
4755 RADEON_CG_BLOCK_SDMA |
4756 RADEON_CG_BLOCK_BIF |
4757 RADEON_CG_BLOCK_UVD |
4758 RADEON_CG_BLOCK_HDP), true);
4759
4760 return 0;
4761}
4762
4763int ci_dpm_power_control_set_level(struct radeon_device *rdev)
4764{
4765 return ci_power_control_set_level(rdev);
4766}
4767
4768void ci_dpm_reset_asic(struct radeon_device *rdev)
4769{
4770 ci_set_boot_state(rdev);
4771}
4772
4773void ci_dpm_display_configuration_changed(struct radeon_device *rdev)
4774{
4775 ci_program_display_gap(rdev);
4776}
4777
4778union power_info {
4779 struct _ATOM_POWERPLAY_INFO info;
4780 struct _ATOM_POWERPLAY_INFO_V2 info_2;
4781 struct _ATOM_POWERPLAY_INFO_V3 info_3;
4782 struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
4783 struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
4784 struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
4785};
4786
4787union pplib_clock_info {
4788 struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
4789 struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
4790 struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
4791 struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
4792 struct _ATOM_PPLIB_SI_CLOCK_INFO si;
4793 struct _ATOM_PPLIB_CI_CLOCK_INFO ci;
4794};
4795
4796union pplib_power_state {
4797 struct _ATOM_PPLIB_STATE v1;
4798 struct _ATOM_PPLIB_STATE_V2 v2;
4799};
4800
4801static void ci_parse_pplib_non_clock_info(struct radeon_device *rdev,
4802 struct radeon_ps *rps,
4803 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info,
4804 u8 table_rev)
4805{
4806 rps->caps = le32_to_cpu(non_clock_info->ulCapsAndSettings);
4807 rps->class = le16_to_cpu(non_clock_info->usClassification);
4808 rps->class2 = le16_to_cpu(non_clock_info->usClassification2);
4809
4810 if (ATOM_PPLIB_NONCLOCKINFO_VER1 < table_rev) {
4811 rps->vclk = le32_to_cpu(non_clock_info->ulVCLK);
4812 rps->dclk = le32_to_cpu(non_clock_info->ulDCLK);
4813 } else {
4814 rps->vclk = 0;
4815 rps->dclk = 0;
4816 }
4817
4818 if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT)
4819 rdev->pm.dpm.boot_ps = rps;
4820 if (rps->class & ATOM_PPLIB_CLASSIFICATION_UVDSTATE)
4821 rdev->pm.dpm.uvd_ps = rps;
4822}
4823
4824static void ci_parse_pplib_clock_info(struct radeon_device *rdev,
4825 struct radeon_ps *rps, int index,
4826 union pplib_clock_info *clock_info)
4827{
4828 struct ci_power_info *pi = ci_get_pi(rdev);
4829 struct ci_ps *ps = ci_get_ps(rps);
4830 struct ci_pl *pl = &ps->performance_levels[index];
4831
4832 ps->performance_level_count = index + 1;
4833
4834 pl->sclk = le16_to_cpu(clock_info->ci.usEngineClockLow);
4835 pl->sclk |= clock_info->ci.ucEngineClockHigh << 16;
4836 pl->mclk = le16_to_cpu(clock_info->ci.usMemoryClockLow);
4837 pl->mclk |= clock_info->ci.ucMemoryClockHigh << 16;
4838
4839 pl->pcie_gen = r600_get_pcie_gen_support(rdev,
4840 pi->sys_pcie_mask,
4841 pi->vbios_boot_state.pcie_gen_bootup_value,
4842 clock_info->ci.ucPCIEGen);
4843 pl->pcie_lane = r600_get_pcie_lane_support(rdev,
4844 pi->vbios_boot_state.pcie_lane_bootup_value,
4845 le16_to_cpu(clock_info->ci.usPCIELane));
4846
4847 if (rps->class & ATOM_PPLIB_CLASSIFICATION_ACPI) {
4848 pi->acpi_pcie_gen = pl->pcie_gen;
4849 }
4850
4851 if (rps->class2 & ATOM_PPLIB_CLASSIFICATION2_ULV) {
4852 pi->ulv.supported = true;
4853 pi->ulv.pl = *pl;
4854 pi->ulv.cg_ulv_parameter = CISLANDS_CGULVPARAMETER_DFLT;
4855 }
4856
4857 /* patch up boot state */
4858 if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT) {
4859 pl->mclk = pi->vbios_boot_state.mclk_bootup_value;
4860 pl->sclk = pi->vbios_boot_state.sclk_bootup_value;
4861 pl->pcie_gen = pi->vbios_boot_state.pcie_gen_bootup_value;
4862 pl->pcie_lane = pi->vbios_boot_state.pcie_lane_bootup_value;
4863 }
4864
4865 switch (rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) {
4866 case ATOM_PPLIB_CLASSIFICATION_UI_BATTERY:
4867 pi->use_pcie_powersaving_levels = true;
4868 if (pi->pcie_gen_powersaving.max < pl->pcie_gen)
4869 pi->pcie_gen_powersaving.max = pl->pcie_gen;
4870 if (pi->pcie_gen_powersaving.min > pl->pcie_gen)
4871 pi->pcie_gen_powersaving.min = pl->pcie_gen;
4872 if (pi->pcie_lane_powersaving.max < pl->pcie_lane)
4873 pi->pcie_lane_powersaving.max = pl->pcie_lane;
4874 if (pi->pcie_lane_powersaving.min > pl->pcie_lane)
4875 pi->pcie_lane_powersaving.min = pl->pcie_lane;
4876 break;
4877 case ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE:
4878 pi->use_pcie_performance_levels = true;
4879 if (pi->pcie_gen_performance.max < pl->pcie_gen)
4880 pi->pcie_gen_performance.max = pl->pcie_gen;
4881 if (pi->pcie_gen_performance.min > pl->pcie_gen)
4882 pi->pcie_gen_performance.min = pl->pcie_gen;
4883 if (pi->pcie_lane_performance.max < pl->pcie_lane)
4884 pi->pcie_lane_performance.max = pl->pcie_lane;
4885 if (pi->pcie_lane_performance.min > pl->pcie_lane)
4886 pi->pcie_lane_performance.min = pl->pcie_lane;
4887 break;
4888 default:
4889 break;
4890 }
4891}
4892
4893static int ci_parse_power_table(struct radeon_device *rdev)
4894{
4895 struct radeon_mode_info *mode_info = &rdev->mode_info;
4896 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
4897 union pplib_power_state *power_state;
4898 int i, j, k, non_clock_array_index, clock_array_index;
4899 union pplib_clock_info *clock_info;
4900 struct _StateArray *state_array;
4901 struct _ClockInfoArray *clock_info_array;
4902 struct _NonClockInfoArray *non_clock_info_array;
4903 union power_info *power_info;
4904 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
4905 u16 data_offset;
4906 u8 frev, crev;
4907 u8 *power_state_offset;
4908 struct ci_ps *ps;
4909
4910 if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
4911 &frev, &crev, &data_offset))
4912 return -EINVAL;
4913 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
4914
4915 state_array = (struct _StateArray *)
4916 (mode_info->atom_context->bios + data_offset +
4917 le16_to_cpu(power_info->pplib.usStateArrayOffset));
4918 clock_info_array = (struct _ClockInfoArray *)
4919 (mode_info->atom_context->bios + data_offset +
4920 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
4921 non_clock_info_array = (struct _NonClockInfoArray *)
4922 (mode_info->atom_context->bios + data_offset +
4923 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
4924
4925 rdev->pm.dpm.ps = kzalloc(sizeof(struct radeon_ps) *
4926 state_array->ucNumEntries, GFP_KERNEL);
4927 if (!rdev->pm.dpm.ps)
4928 return -ENOMEM;
4929 power_state_offset = (u8 *)state_array->states;
4930 rdev->pm.dpm.platform_caps = le32_to_cpu(power_info->pplib.ulPlatformCaps);
4931 rdev->pm.dpm.backbias_response_time = le16_to_cpu(power_info->pplib.usBackbiasTime);
4932 rdev->pm.dpm.voltage_response_time = le16_to_cpu(power_info->pplib.usVoltageTime);
4933 for (i = 0; i < state_array->ucNumEntries; i++) {
4934 u8 *idx;
4935 power_state = (union pplib_power_state *)power_state_offset;
4936 non_clock_array_index = power_state->v2.nonClockInfoIndex;
4937 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
4938 &non_clock_info_array->nonClockInfo[non_clock_array_index];
4939 if (!rdev->pm.power_state[i].clock_info)
4940 return -EINVAL;
4941 ps = kzalloc(sizeof(struct ci_ps), GFP_KERNEL);
4942 if (ps == NULL) {
4943 kfree(rdev->pm.dpm.ps);
4944 return -ENOMEM;
4945 }
4946 rdev->pm.dpm.ps[i].ps_priv = ps;
4947 ci_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i],
4948 non_clock_info,
4949 non_clock_info_array->ucEntrySize);
4950 k = 0;
4951 idx = (u8 *)&power_state->v2.clockInfoIndex[0];
4952 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
4953 clock_array_index = idx[j];
4954 if (clock_array_index >= clock_info_array->ucNumEntries)
4955 continue;
4956 if (k >= CISLANDS_MAX_HARDWARE_POWERLEVELS)
4957 break;
4958 clock_info = (union pplib_clock_info *)
4959 ((u8 *)&clock_info_array->clockInfo[0] +
4960 (clock_array_index * clock_info_array->ucEntrySize));
4961 ci_parse_pplib_clock_info(rdev,
4962 &rdev->pm.dpm.ps[i], k,
4963 clock_info);
4964 k++;
4965 }
4966 power_state_offset += 2 + power_state->v2.ucNumDPMLevels;
4967 }
4968 rdev->pm.dpm.num_ps = state_array->ucNumEntries;
4969 return 0;
4970}
4971
4972int ci_get_vbios_boot_values(struct radeon_device *rdev,
4973 struct ci_vbios_boot_state *boot_state)
4974{
4975 struct radeon_mode_info *mode_info = &rdev->mode_info;
4976 int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
4977 ATOM_FIRMWARE_INFO_V2_2 *firmware_info;
4978 u8 frev, crev;
4979 u16 data_offset;
4980
4981 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
4982 &frev, &crev, &data_offset)) {
4983 firmware_info =
4984 (ATOM_FIRMWARE_INFO_V2_2 *)(mode_info->atom_context->bios +
4985 data_offset);
4986 boot_state->mvdd_bootup_value = le16_to_cpu(firmware_info->usBootUpMVDDCVoltage);
4987 boot_state->vddc_bootup_value = le16_to_cpu(firmware_info->usBootUpVDDCVoltage);
4988 boot_state->vddci_bootup_value = le16_to_cpu(firmware_info->usBootUpVDDCIVoltage);
4989 boot_state->pcie_gen_bootup_value = ci_get_current_pcie_speed(rdev);
4990 boot_state->pcie_lane_bootup_value = ci_get_current_pcie_lane_number(rdev);
4991 boot_state->sclk_bootup_value = le32_to_cpu(firmware_info->ulDefaultEngineClock);
4992 boot_state->mclk_bootup_value = le32_to_cpu(firmware_info->ulDefaultMemoryClock);
4993
4994 return 0;
4995 }
4996 return -EINVAL;
4997}
4998
4999void ci_dpm_fini(struct radeon_device *rdev)
5000{
5001 int i;
5002
5003 for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
5004 kfree(rdev->pm.dpm.ps[i].ps_priv);
5005 }
5006 kfree(rdev->pm.dpm.ps);
5007 kfree(rdev->pm.dpm.priv);
5008 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries);
5009 r600_free_extended_power_table(rdev);
5010}
5011
5012int ci_dpm_init(struct radeon_device *rdev)
5013{
5014 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
5015 u16 data_offset, size;
5016 u8 frev, crev;
5017 struct ci_power_info *pi;
5018 int ret;
5019 u32 mask;
5020
5021 pi = kzalloc(sizeof(struct ci_power_info), GFP_KERNEL);
5022 if (pi == NULL)
5023 return -ENOMEM;
5024 rdev->pm.dpm.priv = pi;
5025
5026 ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
5027 if (ret)
5028 pi->sys_pcie_mask = 0;
5029 else
5030 pi->sys_pcie_mask = mask;
5031 pi->force_pcie_gen = RADEON_PCIE_GEN_INVALID;
5032
5033 pi->pcie_gen_performance.max = RADEON_PCIE_GEN1;
5034 pi->pcie_gen_performance.min = RADEON_PCIE_GEN3;
5035 pi->pcie_gen_powersaving.max = RADEON_PCIE_GEN1;
5036 pi->pcie_gen_powersaving.min = RADEON_PCIE_GEN3;
5037
5038 pi->pcie_lane_performance.max = 0;
5039 pi->pcie_lane_performance.min = 16;
5040 pi->pcie_lane_powersaving.max = 0;
5041 pi->pcie_lane_powersaving.min = 16;
5042
5043 ret = ci_get_vbios_boot_values(rdev, &pi->vbios_boot_state);
5044 if (ret) {
5045 ci_dpm_fini(rdev);
5046 return ret;
5047 }
5048 ret = ci_parse_power_table(rdev);
5049 if (ret) {
5050 ci_dpm_fini(rdev);
5051 return ret;
5052 }
5053 ret = r600_parse_extended_power_table(rdev);
5054 if (ret) {
5055 ci_dpm_fini(rdev);
5056 return ret;
5057 }
5058
5059 pi->dll_default_on = false;
5060 pi->sram_end = SMC_RAM_END;
5061
5062 pi->activity_target[0] = CISLAND_TARGETACTIVITY_DFLT;
5063 pi->activity_target[1] = CISLAND_TARGETACTIVITY_DFLT;
5064 pi->activity_target[2] = CISLAND_TARGETACTIVITY_DFLT;
5065 pi->activity_target[3] = CISLAND_TARGETACTIVITY_DFLT;
5066 pi->activity_target[4] = CISLAND_TARGETACTIVITY_DFLT;
5067 pi->activity_target[5] = CISLAND_TARGETACTIVITY_DFLT;
5068 pi->activity_target[6] = CISLAND_TARGETACTIVITY_DFLT;
5069 pi->activity_target[7] = CISLAND_TARGETACTIVITY_DFLT;
5070
5071 pi->mclk_activity_target = CISLAND_MCLK_TARGETACTIVITY_DFLT;
5072
5073 pi->sclk_dpm_key_disabled = 0;
5074 pi->mclk_dpm_key_disabled = 0;
5075 pi->pcie_dpm_key_disabled = 0;
5076
5077 pi->caps_sclk_ds = true;
5078
5079 pi->mclk_strobe_mode_threshold = 40000;
5080 pi->mclk_stutter_mode_threshold = 40000;
5081 pi->mclk_edc_enable_threshold = 40000;
5082 pi->mclk_edc_wr_enable_threshold = 40000;
5083
5084 ci_initialize_powertune_defaults(rdev);
5085
5086 pi->caps_fps = false;
5087
5088 pi->caps_sclk_throttle_low_notification = false;
5089
5090 pi->caps_uvd_dpm = true;
5091
5092 ci_get_leakage_voltages(rdev);
5093 ci_patch_dependency_tables_with_leakage(rdev);
5094 ci_set_private_data_variables_based_on_pptable(rdev);
5095
5096 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries =
5097 kzalloc(4 * sizeof(struct radeon_clock_voltage_dependency_entry), GFP_KERNEL);
5098 if (!rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries) {
5099 ci_dpm_fini(rdev);
5100 return -ENOMEM;
5101 }
5102 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count = 4;
5103 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].clk = 0;
5104 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[0].v = 0;
5105 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].clk = 36000;
5106 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[1].v = 720;
5107 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].clk = 54000;
5108 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[2].v = 810;
5109 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].clk = 72000;
5110 rdev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[3].v = 900;
5111
5112 rdev->pm.dpm.dyn_state.mclk_sclk_ratio = 4;
5113 rdev->pm.dpm.dyn_state.sclk_mclk_delta = 15000;
5114 rdev->pm.dpm.dyn_state.vddc_vddci_delta = 200;
5115
5116 rdev->pm.dpm.dyn_state.valid_sclk_values.count = 0;
5117 rdev->pm.dpm.dyn_state.valid_sclk_values.values = NULL;
5118 rdev->pm.dpm.dyn_state.valid_mclk_values.count = 0;
5119 rdev->pm.dpm.dyn_state.valid_mclk_values.values = NULL;
5120
5121 pi->thermal_temp_setting.temperature_low = 99500;
5122 pi->thermal_temp_setting.temperature_high = 100000;
5123 pi->thermal_temp_setting.temperature_shutdown = 104000;
5124
5125 pi->uvd_enabled = false;
5126
5127 pi->voltage_control = CISLANDS_VOLTAGE_CONTROL_NONE;
5128 pi->vddci_control = CISLANDS_VOLTAGE_CONTROL_NONE;
5129 pi->mvdd_control = CISLANDS_VOLTAGE_CONTROL_NONE;
5130 if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_GPIO_LUT))
5131 pi->voltage_control = CISLANDS_VOLTAGE_CONTROL_BY_GPIO;
5132 else if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_SVID2))
5133 pi->voltage_control = CISLANDS_VOLTAGE_CONTROL_BY_SVID2;
5134
5135 if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_VDDCI_CONTROL) {
5136 if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_VDDCI, VOLTAGE_OBJ_GPIO_LUT))
5137 pi->vddci_control = CISLANDS_VOLTAGE_CONTROL_BY_GPIO;
5138 else if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_VDDCI, VOLTAGE_OBJ_SVID2))
5139 pi->vddci_control = CISLANDS_VOLTAGE_CONTROL_BY_SVID2;
5140 else
5141 rdev->pm.dpm.platform_caps &= ~ATOM_PP_PLATFORM_CAP_VDDCI_CONTROL;
5142 }
5143
5144 if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_MVDDCONTROL) {
5145 if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_MVDDC, VOLTAGE_OBJ_GPIO_LUT))
5146 pi->mvdd_control = CISLANDS_VOLTAGE_CONTROL_BY_GPIO;
5147 else if (radeon_atom_is_voltage_gpio(rdev, VOLTAGE_TYPE_MVDDC, VOLTAGE_OBJ_SVID2))
5148 pi->mvdd_control = CISLANDS_VOLTAGE_CONTROL_BY_SVID2;
5149 else
5150 rdev->pm.dpm.platform_caps &= ~ATOM_PP_PLATFORM_CAP_MVDDCONTROL;
5151 }
5152
5153 pi->vddc_phase_shed_control = true;
5154
5155#if defined(CONFIG_ACPI)
5156 pi->pcie_performance_request =
5157 radeon_acpi_is_pcie_performance_request_supported(rdev);
5158#else
5159 pi->pcie_performance_request = false;
5160#endif
5161
5162 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
5163 &frev, &crev, &data_offset)) {
5164 pi->caps_sclk_ss_support = true;
5165 pi->caps_mclk_ss_support = true;
5166 pi->dynamic_ss = true;
5167 } else {
5168 pi->caps_sclk_ss_support = false;
5169 pi->caps_mclk_ss_support = false;
5170 pi->dynamic_ss = true;
5171 }
5172
5173 if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
5174 pi->thermal_protection = true;
5175 else
5176 pi->thermal_protection = false;
5177
5178 pi->caps_dynamic_ac_timing = true;
5179
5180 pi->uvd_power_gated = false;
5181
5182 /* make sure dc limits are valid */
5183 if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
5184 (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
5185 rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
5186 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
5187
5188 return 0;
5189}
5190
5191void ci_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
5192 struct seq_file *m)
5193{
5194 u32 sclk = ci_get_average_sclk_freq(rdev);
5195 u32 mclk = ci_get_average_mclk_freq(rdev);
5196
5197 seq_printf(m, "power level avg sclk: %u mclk: %u\n",
5198 sclk, mclk);
5199}
5200
5201void ci_dpm_print_power_state(struct radeon_device *rdev,
5202 struct radeon_ps *rps)
5203{
5204 struct ci_ps *ps = ci_get_ps(rps);
5205 struct ci_pl *pl;
5206 int i;
5207
5208 r600_dpm_print_class_info(rps->class, rps->class2);
5209 r600_dpm_print_cap_info(rps->caps);
5210 printk("\tuvd vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
5211 for (i = 0; i < ps->performance_level_count; i++) {
5212 pl = &ps->performance_levels[i];
5213 printk("\t\tpower level %d sclk: %u mclk: %u pcie gen: %u pcie lanes: %u\n",
5214 i, pl->sclk, pl->mclk, pl->pcie_gen + 1, pl->pcie_lane);
5215 }
5216 r600_dpm_print_ps_status(rdev, rps);
5217}
5218
5219u32 ci_dpm_get_sclk(struct radeon_device *rdev, bool low)
5220{
5221 struct ci_power_info *pi = ci_get_pi(rdev);
5222 struct ci_ps *requested_state = ci_get_ps(&pi->requested_rps);
5223
5224 if (low)
5225 return requested_state->performance_levels[0].sclk;
5226 else
5227 return requested_state->performance_levels[requested_state->performance_level_count - 1].sclk;
5228}
5229
5230u32 ci_dpm_get_mclk(struct radeon_device *rdev, bool low)
5231{
5232 struct ci_power_info *pi = ci_get_pi(rdev);
5233 struct ci_ps *requested_state = ci_get_ps(&pi->requested_rps);
5234
5235 if (low)
5236 return requested_state->performance_levels[0].mclk;
5237 else
5238 return requested_state->performance_levels[requested_state->performance_level_count - 1].mclk;
5239}
diff --git a/drivers/gpu/drm/radeon/ci_dpm.h b/drivers/gpu/drm/radeon/ci_dpm.h
new file mode 100644
index 000000000000..93bbed977ffb
--- /dev/null
+++ b/drivers/gpu/drm/radeon/ci_dpm.h
@@ -0,0 +1,332 @@
1/*
2 * Copyright 2013 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#ifndef __CI_DPM_H__
24#define __CI_DPM_H__
25
26#include "ppsmc.h"
27
28#define SMU__NUM_SCLK_DPM_STATE 8
29#define SMU__NUM_MCLK_DPM_LEVELS 6
30#define SMU__NUM_LCLK_DPM_LEVELS 8
31#define SMU__NUM_PCIE_DPM_LEVELS 8
32#include "smu7_discrete.h"
33
34#define CISLANDS_MAX_HARDWARE_POWERLEVELS 2
35
36struct ci_pl {
37 u32 mclk;
38 u32 sclk;
39 enum radeon_pcie_gen pcie_gen;
40 u16 pcie_lane;
41};
42
43struct ci_ps {
44 u16 performance_level_count;
45 bool dc_compatible;
46 u32 sclk_t;
47 struct ci_pl performance_levels[CISLANDS_MAX_HARDWARE_POWERLEVELS];
48};
49
50struct ci_dpm_level {
51 bool enabled;
52 u32 value;
53 u32 param1;
54};
55
56#define CISLAND_MAX_DEEPSLEEP_DIVIDER_ID 5
57#define MAX_REGULAR_DPM_NUMBER 8
58#define CISLAND_MINIMUM_ENGINE_CLOCK 800
59
60struct ci_single_dpm_table {
61 u32 count;
62 struct ci_dpm_level dpm_levels[MAX_REGULAR_DPM_NUMBER];
63};
64
65struct ci_dpm_table {
66 struct ci_single_dpm_table sclk_table;
67 struct ci_single_dpm_table mclk_table;
68 struct ci_single_dpm_table pcie_speed_table;
69 struct ci_single_dpm_table vddc_table;
70 struct ci_single_dpm_table vddci_table;
71 struct ci_single_dpm_table mvdd_table;
72};
73
74struct ci_mc_reg_entry {
75 u32 mclk_max;
76 u32 mc_data[SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE];
77};
78
79struct ci_mc_reg_table {
80 u8 last;
81 u8 num_entries;
82 u16 valid_flag;
83 struct ci_mc_reg_entry mc_reg_table_entry[MAX_AC_TIMING_ENTRIES];
84 SMU7_Discrete_MCRegisterAddress mc_reg_address[SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE];
85};
86
87struct ci_ulv_parm
88{
89 bool supported;
90 u32 cg_ulv_parameter;
91 u32 volt_change_delay;
92 struct ci_pl pl;
93};
94
95#define CISLANDS_MAX_LEAKAGE_COUNT 8
96
97struct ci_leakage_voltage {
98 u16 count;
99 u16 leakage_id[CISLANDS_MAX_LEAKAGE_COUNT];
100 u16 actual_voltage[CISLANDS_MAX_LEAKAGE_COUNT];
101};
102
103struct ci_dpm_level_enable_mask {
104 u32 uvd_dpm_enable_mask;
105 u32 vce_dpm_enable_mask;
106 u32 acp_dpm_enable_mask;
107 u32 samu_dpm_enable_mask;
108 u32 sclk_dpm_enable_mask;
109 u32 mclk_dpm_enable_mask;
110 u32 pcie_dpm_enable_mask;
111};
112
113struct ci_vbios_boot_state
114{
115 u16 mvdd_bootup_value;
116 u16 vddc_bootup_value;
117 u16 vddci_bootup_value;
118 u32 sclk_bootup_value;
119 u32 mclk_bootup_value;
120 u16 pcie_gen_bootup_value;
121 u16 pcie_lane_bootup_value;
122};
123
124struct ci_clock_registers {
125 u32 cg_spll_func_cntl;
126 u32 cg_spll_func_cntl_2;
127 u32 cg_spll_func_cntl_3;
128 u32 cg_spll_func_cntl_4;
129 u32 cg_spll_spread_spectrum;
130 u32 cg_spll_spread_spectrum_2;
131 u32 dll_cntl;
132 u32 mclk_pwrmgt_cntl;
133 u32 mpll_ad_func_cntl;
134 u32 mpll_dq_func_cntl;
135 u32 mpll_func_cntl;
136 u32 mpll_func_cntl_1;
137 u32 mpll_func_cntl_2;
138 u32 mpll_ss1;
139 u32 mpll_ss2;
140};
141
142struct ci_thermal_temperature_setting {
143 s32 temperature_low;
144 s32 temperature_high;
145 s32 temperature_shutdown;
146};
147
148struct ci_pcie_perf_range {
149 u16 max;
150 u16 min;
151};
152
153enum ci_pt_config_reg_type {
154 CISLANDS_CONFIGREG_MMR = 0,
155 CISLANDS_CONFIGREG_SMC_IND,
156 CISLANDS_CONFIGREG_DIDT_IND,
157 CISLANDS_CONFIGREG_CACHE,
158 CISLANDS_CONFIGREG_MAX
159};
160
161#define POWERCONTAINMENT_FEATURE_BAPM 0x00000001
162#define POWERCONTAINMENT_FEATURE_TDCLimit 0x00000002
163#define POWERCONTAINMENT_FEATURE_PkgPwrLimit 0x00000004
164
165struct ci_pt_config_reg {
166 u32 offset;
167 u32 mask;
168 u32 shift;
169 u32 value;
170 enum ci_pt_config_reg_type type;
171};
172
173struct ci_pt_defaults {
174 u8 svi_load_line_en;
175 u8 svi_load_line_vddc;
176 u8 tdc_vddc_throttle_release_limit_perc;
177 u8 tdc_mawt;
178 u8 tdc_waterfall_ctl;
179 u8 dte_ambient_temp_base;
180 u32 display_cac;
181 u32 bapm_temp_gradient;
182 u16 bapmti_r[SMU7_DTE_ITERATIONS * SMU7_DTE_SOURCES * SMU7_DTE_SINKS];
183 u16 bapmti_rc[SMU7_DTE_ITERATIONS * SMU7_DTE_SOURCES * SMU7_DTE_SINKS];
184};
185
186#define DPMTABLE_OD_UPDATE_SCLK 0x00000001
187#define DPMTABLE_OD_UPDATE_MCLK 0x00000002
188#define DPMTABLE_UPDATE_SCLK 0x00000004
189#define DPMTABLE_UPDATE_MCLK 0x00000008
190
191struct ci_power_info {
192 struct ci_dpm_table dpm_table;
193 u32 voltage_control;
194 u32 mvdd_control;
195 u32 vddci_control;
196 u32 active_auto_throttle_sources;
197 struct ci_clock_registers clock_registers;
198 u16 acpi_vddc;
199 u16 acpi_vddci;
200 enum radeon_pcie_gen force_pcie_gen;
201 enum radeon_pcie_gen acpi_pcie_gen;
202 struct ci_leakage_voltage vddc_leakage;
203 struct ci_leakage_voltage vddci_leakage;
204 u16 max_vddc_in_pp_table;
205 u16 min_vddc_in_pp_table;
206 u16 max_vddci_in_pp_table;
207 u16 min_vddci_in_pp_table;
208 u32 mclk_strobe_mode_threshold;
209 u32 mclk_stutter_mode_threshold;
210 u32 mclk_edc_enable_threshold;
211 u32 mclk_edc_wr_enable_threshold;
212 struct ci_vbios_boot_state vbios_boot_state;
213 /* smc offsets */
214 u32 sram_end;
215 u32 dpm_table_start;
216 u32 soft_regs_start;
217 u32 mc_reg_table_start;
218 u32 fan_table_start;
219 u32 arb_table_start;
220 /* smc tables */
221 SMU7_Discrete_DpmTable smc_state_table;
222 SMU7_Discrete_MCRegisters smc_mc_reg_table;
223 SMU7_Discrete_PmFuses smc_powertune_table;
224 /* other stuff */
225 struct ci_mc_reg_table mc_reg_table;
226 struct atom_voltage_table vddc_voltage_table;
227 struct atom_voltage_table vddci_voltage_table;
228 struct atom_voltage_table mvdd_voltage_table;
229 struct ci_ulv_parm ulv;
230 u32 power_containment_features;
231 const struct ci_pt_defaults *powertune_defaults;
232 u32 dte_tj_offset;
233 bool vddc_phase_shed_control;
234 struct ci_thermal_temperature_setting thermal_temp_setting;
235 struct ci_dpm_level_enable_mask dpm_level_enable_mask;
236 u32 need_update_smu7_dpm_table;
237 u32 sclk_dpm_key_disabled;
238 u32 mclk_dpm_key_disabled;
239 u32 pcie_dpm_key_disabled;
240 struct ci_pcie_perf_range pcie_gen_performance;
241 struct ci_pcie_perf_range pcie_lane_performance;
242 struct ci_pcie_perf_range pcie_gen_powersaving;
243 struct ci_pcie_perf_range pcie_lane_powersaving;
244 u32 activity_target[SMU7_MAX_LEVELS_GRAPHICS];
245 u32 mclk_activity_target;
246 u32 low_sclk_interrupt_t;
247 u32 last_mclk_dpm_enable_mask;
248 u32 sys_pcie_mask;
249 /* caps */
250 bool caps_power_containment;
251 bool caps_cac;
252 bool caps_sq_ramping;
253 bool caps_db_ramping;
254 bool caps_td_ramping;
255 bool caps_tcp_ramping;
256 bool caps_fps;
257 bool caps_sclk_ds;
258 bool caps_sclk_ss_support;
259 bool caps_mclk_ss_support;
260 bool caps_uvd_dpm;
261 bool caps_vce_dpm;
262 bool caps_samu_dpm;
263 bool caps_acp_dpm;
264 bool caps_automatic_dc_transition;
265 bool caps_sclk_throttle_low_notification;
266 bool caps_dynamic_ac_timing;
267 /* flags */
268 bool thermal_protection;
269 bool pcie_performance_request;
270 bool dynamic_ss;
271 bool dll_default_on;
272 bool cac_enabled;
273 bool uvd_enabled;
274 bool battery_state;
275 bool pspp_notify_required;
276 bool mem_gddr5;
277 bool enable_bapm_feature;
278 bool enable_tdc_limit_feature;
279 bool enable_pkg_pwr_tracking_feature;
280 bool use_pcie_performance_levels;
281 bool use_pcie_powersaving_levels;
282 bool uvd_power_gated;
283 /* driver states */
284 struct radeon_ps current_rps;
285 struct ci_ps current_ps;
286 struct radeon_ps requested_rps;
287 struct ci_ps requested_ps;
288};
289
290#define CISLANDS_VOLTAGE_CONTROL_NONE 0x0
291#define CISLANDS_VOLTAGE_CONTROL_BY_GPIO 0x1
292#define CISLANDS_VOLTAGE_CONTROL_BY_SVID2 0x2
293
294#define CISLANDS_Q88_FORMAT_CONVERSION_UNIT 256
295
296#define CISLANDS_VRC_DFLT0 0x3FFFC000
297#define CISLANDS_VRC_DFLT1 0x000400
298#define CISLANDS_VRC_DFLT2 0xC00080
299#define CISLANDS_VRC_DFLT3 0xC00200
300#define CISLANDS_VRC_DFLT4 0xC01680
301#define CISLANDS_VRC_DFLT5 0xC00033
302#define CISLANDS_VRC_DFLT6 0xC00033
303#define CISLANDS_VRC_DFLT7 0x3FFFC000
304
305#define CISLANDS_CGULVPARAMETER_DFLT 0x00040035
306#define CISLAND_TARGETACTIVITY_DFLT 30
307#define CISLAND_MCLK_TARGETACTIVITY_DFLT 10
308
309#define PCIE_PERF_REQ_REMOVE_REGISTRY 0
310#define PCIE_PERF_REQ_FORCE_LOWPOWER 1
311#define PCIE_PERF_REQ_PECI_GEN1 2
312#define PCIE_PERF_REQ_PECI_GEN2 3
313#define PCIE_PERF_REQ_PECI_GEN3 4
314
315int ci_copy_bytes_to_smc(struct radeon_device *rdev,
316 u32 smc_start_address,
317 const u8 *src, u32 byte_count, u32 limit);
318void ci_start_smc(struct radeon_device *rdev);
319void ci_reset_smc(struct radeon_device *rdev);
320int ci_program_jump_on_start(struct radeon_device *rdev);
321void ci_stop_smc_clock(struct radeon_device *rdev);
322void ci_start_smc_clock(struct radeon_device *rdev);
323bool ci_is_smc_running(struct radeon_device *rdev);
324PPSMC_Result ci_send_msg_to_smc(struct radeon_device *rdev, PPSMC_Msg msg);
325PPSMC_Result ci_wait_for_smc_inactive(struct radeon_device *rdev);
326int ci_load_smc_ucode(struct radeon_device *rdev, u32 limit);
327int ci_read_smc_sram_dword(struct radeon_device *rdev,
328 u32 smc_address, u32 *value, u32 limit);
329int ci_write_smc_sram_dword(struct radeon_device *rdev,
330 u32 smc_address, u32 value, u32 limit);
331
332#endif
diff --git a/drivers/gpu/drm/radeon/ci_smc.c b/drivers/gpu/drm/radeon/ci_smc.c
new file mode 100644
index 000000000000..53b43dd3cf1e
--- /dev/null
+++ b/drivers/gpu/drm/radeon/ci_smc.c
@@ -0,0 +1,262 @@
1/*
2 * Copyright 2011 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: Alex Deucher
23 */
24
25#include <linux/firmware.h>
26#include "drmP.h"
27#include "radeon.h"
28#include "cikd.h"
29#include "ppsmc.h"
30#include "radeon_ucode.h"
31
32static int ci_set_smc_sram_address(struct radeon_device *rdev,
33 u32 smc_address, u32 limit)
34{
35 if (smc_address & 3)
36 return -EINVAL;
37 if ((smc_address + 3) > limit)
38 return -EINVAL;
39
40 WREG32(SMC_IND_INDEX_0, smc_address);
41 WREG32_P(SMC_IND_ACCESS_CNTL, 0, ~AUTO_INCREMENT_IND_0);
42
43 return 0;
44}
45
46int ci_copy_bytes_to_smc(struct radeon_device *rdev,
47 u32 smc_start_address,
48 const u8 *src, u32 byte_count, u32 limit)
49{
50 u32 data, original_data;
51 u32 addr;
52 u32 extra_shift;
53 int ret;
54
55 if (smc_start_address & 3)
56 return -EINVAL;
57 if ((smc_start_address + byte_count) > limit)
58 return -EINVAL;
59
60 addr = smc_start_address;
61
62 while (byte_count >= 4) {
63 /* SMC address space is BE */
64 data = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
65
66 ret = ci_set_smc_sram_address(rdev, addr, limit);
67 if (ret)
68 return ret;
69
70 WREG32(SMC_IND_DATA_0, data);
71
72 src += 4;
73 byte_count -= 4;
74 addr += 4;
75 }
76
77 /* RMW for the final bytes */
78 if (byte_count > 0) {
79 data = 0;
80
81 ret = ci_set_smc_sram_address(rdev, addr, limit);
82 if (ret)
83 return ret;
84
85 original_data = RREG32(SMC_IND_DATA_0);
86
87 extra_shift = 8 * (4 - byte_count);
88
89 while (byte_count > 0) {
90 data = (data << 8) + *src++;
91 byte_count--;
92 }
93
94 data <<= extra_shift;
95
96 data |= (original_data & ~((~0UL) << extra_shift));
97
98 ret = ci_set_smc_sram_address(rdev, addr, limit);
99 if (ret)
100 return ret;
101
102 WREG32(SMC_IND_DATA_0, data);
103 }
104 return 0;
105}
106
107void ci_start_smc(struct radeon_device *rdev)
108{
109 u32 tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL);
110
111 tmp &= ~RST_REG;
112 WREG32_SMC(SMC_SYSCON_RESET_CNTL, tmp);
113}
114
115void ci_reset_smc(struct radeon_device *rdev)
116{
117 u32 tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL);
118
119 tmp |= RST_REG;
120 WREG32_SMC(SMC_SYSCON_RESET_CNTL, tmp);
121}
122
123int ci_program_jump_on_start(struct radeon_device *rdev)
124{
125 static u8 data[] = { 0xE0, 0x00, 0x80, 0x40 };
126
127 return ci_copy_bytes_to_smc(rdev, 0x0, data, 4, sizeof(data)+1);
128}
129
130void ci_stop_smc_clock(struct radeon_device *rdev)
131{
132 u32 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
133
134 tmp |= CK_DISABLE;
135
136 WREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0, tmp);
137}
138
139void ci_start_smc_clock(struct radeon_device *rdev)
140{
141 u32 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
142
143 tmp &= ~CK_DISABLE;
144
145 WREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0, tmp);
146}
147
148bool ci_is_smc_running(struct radeon_device *rdev)
149{
150 u32 clk = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
151 u32 pc_c = RREG32_SMC(SMC_PC_C);
152
153 if (!(clk & CK_DISABLE) && (0x20100 <= pc_c))
154 return true;
155
156 return false;
157}
158
159PPSMC_Result ci_send_msg_to_smc(struct radeon_device *rdev, PPSMC_Msg msg)
160{
161 u32 tmp;
162 int i;
163
164 if (!ci_is_smc_running(rdev))
165 return PPSMC_Result_Failed;
166
167 WREG32(SMC_MESSAGE_0, msg);
168
169 for (i = 0; i < rdev->usec_timeout; i++) {
170 tmp = RREG32(SMC_RESP_0);
171 if (tmp != 0)
172 break;
173 udelay(1);
174 }
175 tmp = RREG32(SMC_RESP_0);
176
177 return (PPSMC_Result)tmp;
178}
179
180PPSMC_Result ci_wait_for_smc_inactive(struct radeon_device *rdev)
181{
182 u32 tmp;
183 int i;
184
185 if (!ci_is_smc_running(rdev))
186 return PPSMC_Result_OK;
187
188 for (i = 0; i < rdev->usec_timeout; i++) {
189 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
190 if ((tmp & CKEN) == 0)
191 break;
192 udelay(1);
193 }
194
195 return PPSMC_Result_OK;
196}
197
198int ci_load_smc_ucode(struct radeon_device *rdev, u32 limit)
199{
200 u32 ucode_start_address;
201 u32 ucode_size;
202 const u8 *src;
203 u32 data;
204
205 if (!rdev->smc_fw)
206 return -EINVAL;
207
208 switch (rdev->family) {
209 case CHIP_BONAIRE:
210 ucode_start_address = BONAIRE_SMC_UCODE_START;
211 ucode_size = BONAIRE_SMC_UCODE_SIZE;
212 break;
213 default:
214 DRM_ERROR("unknown asic in smc ucode loader\n");
215 BUG();
216 }
217
218 if (ucode_size & 3)
219 return -EINVAL;
220
221 src = (const u8 *)rdev->smc_fw->data;
222 WREG32(SMC_IND_INDEX_0, ucode_start_address);
223 WREG32_P(SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_0, ~AUTO_INCREMENT_IND_0);
224 while (ucode_size >= 4) {
225 /* SMC address space is BE */
226 data = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
227
228 WREG32(SMC_IND_DATA_0, data);
229
230 src += 4;
231 ucode_size -= 4;
232 }
233 WREG32_P(SMC_IND_ACCESS_CNTL, 0, ~AUTO_INCREMENT_IND_0);
234
235 return 0;
236}
237
238int ci_read_smc_sram_dword(struct radeon_device *rdev,
239 u32 smc_address, u32 *value, u32 limit)
240{
241 int ret;
242
243 ret = ci_set_smc_sram_address(rdev, smc_address, limit);
244 if (ret)
245 return ret;
246
247 *value = RREG32(SMC_IND_DATA_0);
248 return 0;
249}
250
251int ci_write_smc_sram_dword(struct radeon_device *rdev,
252 u32 smc_address, u32 value, u32 limit)
253{
254 int ret;
255
256 ret = ci_set_smc_sram_address(rdev, smc_address, limit);
257 if (ret)
258 return ret;
259
260 WREG32(SMC_IND_DATA_0, value);
261 return 0;
262}
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 6adbc998349e..a3bba0587276 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -30,22 +30,8 @@
30#include "cikd.h" 30#include "cikd.h"
31#include "atom.h" 31#include "atom.h"
32#include "cik_blit_shaders.h" 32#include "cik_blit_shaders.h"
33 33#include "radeon_ucode.h"
34/* GFX */ 34#include "clearstate_ci.h"
35#define CIK_PFP_UCODE_SIZE 2144
36#define CIK_ME_UCODE_SIZE 2144
37#define CIK_CE_UCODE_SIZE 2144
38/* compute */
39#define CIK_MEC_UCODE_SIZE 4192
40/* interrupts */
41#define BONAIRE_RLC_UCODE_SIZE 2048
42#define KB_RLC_UCODE_SIZE 2560
43#define KV_RLC_UCODE_SIZE 2560
44/* gddr controller */
45#define CIK_MC_UCODE_SIZE 7866
46/* sdma */
47#define CIK_SDMA_UCODE_SIZE 1050
48#define CIK_SDMA_UCODE_VERSION 64
49 35
50MODULE_FIRMWARE("radeon/BONAIRE_pfp.bin"); 36MODULE_FIRMWARE("radeon/BONAIRE_pfp.bin");
51MODULE_FIRMWARE("radeon/BONAIRE_me.bin"); 37MODULE_FIRMWARE("radeon/BONAIRE_me.bin");
@@ -54,6 +40,7 @@ MODULE_FIRMWARE("radeon/BONAIRE_mec.bin");
54MODULE_FIRMWARE("radeon/BONAIRE_mc.bin"); 40MODULE_FIRMWARE("radeon/BONAIRE_mc.bin");
55MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin"); 41MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
56MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin"); 42MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin");
43MODULE_FIRMWARE("radeon/BONAIRE_smc.bin");
57MODULE_FIRMWARE("radeon/KAVERI_pfp.bin"); 44MODULE_FIRMWARE("radeon/KAVERI_pfp.bin");
58MODULE_FIRMWARE("radeon/KAVERI_me.bin"); 45MODULE_FIRMWARE("radeon/KAVERI_me.bin");
59MODULE_FIRMWARE("radeon/KAVERI_ce.bin"); 46MODULE_FIRMWARE("radeon/KAVERI_ce.bin");
@@ -72,10 +59,61 @@ extern void r600_ih_ring_fini(struct radeon_device *rdev);
72extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save); 59extern void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *save);
73extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save); 60extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save);
74extern bool evergreen_is_display_hung(struct radeon_device *rdev); 61extern bool evergreen_is_display_hung(struct radeon_device *rdev);
62extern void sumo_rlc_fini(struct radeon_device *rdev);
63extern int sumo_rlc_init(struct radeon_device *rdev);
75extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc); 64extern void si_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
76extern void si_rlc_fini(struct radeon_device *rdev); 65extern void si_rlc_reset(struct radeon_device *rdev);
77extern int si_rlc_init(struct radeon_device *rdev); 66extern void si_init_uvd_internal_cg(struct radeon_device *rdev);
67extern int cik_sdma_resume(struct radeon_device *rdev);
68extern void cik_sdma_enable(struct radeon_device *rdev, bool enable);
69extern void cik_sdma_fini(struct radeon_device *rdev);
70extern void cik_sdma_vm_set_page(struct radeon_device *rdev,
71 struct radeon_ib *ib,
72 uint64_t pe,
73 uint64_t addr, unsigned count,
74 uint32_t incr, uint32_t flags);
78static void cik_rlc_stop(struct radeon_device *rdev); 75static void cik_rlc_stop(struct radeon_device *rdev);
76static void cik_pcie_gen3_enable(struct radeon_device *rdev);
77static void cik_program_aspm(struct radeon_device *rdev);
78static void cik_init_pg(struct radeon_device *rdev);
79static void cik_init_cg(struct radeon_device *rdev);
80
81/* get temperature in millidegrees */
82int ci_get_temp(struct radeon_device *rdev)
83{
84 u32 temp;
85 int actual_temp = 0;
86
87 temp = (RREG32_SMC(CG_MULT_THERMAL_STATUS) & CTF_TEMP_MASK) >>
88 CTF_TEMP_SHIFT;
89
90 if (temp & 0x200)
91 actual_temp = 255;
92 else
93 actual_temp = temp & 0x1ff;
94
95 actual_temp = actual_temp * 1000;
96
97 return actual_temp;
98}
99
100/* get temperature in millidegrees */
101int kv_get_temp(struct radeon_device *rdev)
102{
103 u32 temp;
104 int actual_temp = 0;
105
106 temp = RREG32_SMC(0xC0300E0C);
107
108 if (temp)
109 actual_temp = (temp / 8) - 49;
110 else
111 actual_temp = 0;
112
113 actual_temp = actual_temp * 1000;
114
115 return actual_temp;
116}
79 117
80/* 118/*
81 * Indirect registers accessor 119 * Indirect registers accessor
@@ -98,6 +136,778 @@ void cik_pciep_wreg(struct radeon_device *rdev, u32 reg, u32 v)
98 (void)RREG32(PCIE_DATA); 136 (void)RREG32(PCIE_DATA);
99} 137}
100 138
139static const u32 spectre_rlc_save_restore_register_list[] =
140{
141 (0x0e00 << 16) | (0xc12c >> 2),
142 0x00000000,
143 (0x0e00 << 16) | (0xc140 >> 2),
144 0x00000000,
145 (0x0e00 << 16) | (0xc150 >> 2),
146 0x00000000,
147 (0x0e00 << 16) | (0xc15c >> 2),
148 0x00000000,
149 (0x0e00 << 16) | (0xc168 >> 2),
150 0x00000000,
151 (0x0e00 << 16) | (0xc170 >> 2),
152 0x00000000,
153 (0x0e00 << 16) | (0xc178 >> 2),
154 0x00000000,
155 (0x0e00 << 16) | (0xc204 >> 2),
156 0x00000000,
157 (0x0e00 << 16) | (0xc2b4 >> 2),
158 0x00000000,
159 (0x0e00 << 16) | (0xc2b8 >> 2),
160 0x00000000,
161 (0x0e00 << 16) | (0xc2bc >> 2),
162 0x00000000,
163 (0x0e00 << 16) | (0xc2c0 >> 2),
164 0x00000000,
165 (0x0e00 << 16) | (0x8228 >> 2),
166 0x00000000,
167 (0x0e00 << 16) | (0x829c >> 2),
168 0x00000000,
169 (0x0e00 << 16) | (0x869c >> 2),
170 0x00000000,
171 (0x0600 << 16) | (0x98f4 >> 2),
172 0x00000000,
173 (0x0e00 << 16) | (0x98f8 >> 2),
174 0x00000000,
175 (0x0e00 << 16) | (0x9900 >> 2),
176 0x00000000,
177 (0x0e00 << 16) | (0xc260 >> 2),
178 0x00000000,
179 (0x0e00 << 16) | (0x90e8 >> 2),
180 0x00000000,
181 (0x0e00 << 16) | (0x3c000 >> 2),
182 0x00000000,
183 (0x0e00 << 16) | (0x3c00c >> 2),
184 0x00000000,
185 (0x0e00 << 16) | (0x8c1c >> 2),
186 0x00000000,
187 (0x0e00 << 16) | (0x9700 >> 2),
188 0x00000000,
189 (0x0e00 << 16) | (0xcd20 >> 2),
190 0x00000000,
191 (0x4e00 << 16) | (0xcd20 >> 2),
192 0x00000000,
193 (0x5e00 << 16) | (0xcd20 >> 2),
194 0x00000000,
195 (0x6e00 << 16) | (0xcd20 >> 2),
196 0x00000000,
197 (0x7e00 << 16) | (0xcd20 >> 2),
198 0x00000000,
199 (0x8e00 << 16) | (0xcd20 >> 2),
200 0x00000000,
201 (0x9e00 << 16) | (0xcd20 >> 2),
202 0x00000000,
203 (0xae00 << 16) | (0xcd20 >> 2),
204 0x00000000,
205 (0xbe00 << 16) | (0xcd20 >> 2),
206 0x00000000,
207 (0x0e00 << 16) | (0x89bc >> 2),
208 0x00000000,
209 (0x0e00 << 16) | (0x8900 >> 2),
210 0x00000000,
211 0x3,
212 (0x0e00 << 16) | (0xc130 >> 2),
213 0x00000000,
214 (0x0e00 << 16) | (0xc134 >> 2),
215 0x00000000,
216 (0x0e00 << 16) | (0xc1fc >> 2),
217 0x00000000,
218 (0x0e00 << 16) | (0xc208 >> 2),
219 0x00000000,
220 (0x0e00 << 16) | (0xc264 >> 2),
221 0x00000000,
222 (0x0e00 << 16) | (0xc268 >> 2),
223 0x00000000,
224 (0x0e00 << 16) | (0xc26c >> 2),
225 0x00000000,
226 (0x0e00 << 16) | (0xc270 >> 2),
227 0x00000000,
228 (0x0e00 << 16) | (0xc274 >> 2),
229 0x00000000,
230 (0x0e00 << 16) | (0xc278 >> 2),
231 0x00000000,
232 (0x0e00 << 16) | (0xc27c >> 2),
233 0x00000000,
234 (0x0e00 << 16) | (0xc280 >> 2),
235 0x00000000,
236 (0x0e00 << 16) | (0xc284 >> 2),
237 0x00000000,
238 (0x0e00 << 16) | (0xc288 >> 2),
239 0x00000000,
240 (0x0e00 << 16) | (0xc28c >> 2),
241 0x00000000,
242 (0x0e00 << 16) | (0xc290 >> 2),
243 0x00000000,
244 (0x0e00 << 16) | (0xc294 >> 2),
245 0x00000000,
246 (0x0e00 << 16) | (0xc298 >> 2),
247 0x00000000,
248 (0x0e00 << 16) | (0xc29c >> 2),
249 0x00000000,
250 (0x0e00 << 16) | (0xc2a0 >> 2),
251 0x00000000,
252 (0x0e00 << 16) | (0xc2a4 >> 2),
253 0x00000000,
254 (0x0e00 << 16) | (0xc2a8 >> 2),
255 0x00000000,
256 (0x0e00 << 16) | (0xc2ac >> 2),
257 0x00000000,
258 (0x0e00 << 16) | (0xc2b0 >> 2),
259 0x00000000,
260 (0x0e00 << 16) | (0x301d0 >> 2),
261 0x00000000,
262 (0x0e00 << 16) | (0x30238 >> 2),
263 0x00000000,
264 (0x0e00 << 16) | (0x30250 >> 2),
265 0x00000000,
266 (0x0e00 << 16) | (0x30254 >> 2),
267 0x00000000,
268 (0x0e00 << 16) | (0x30258 >> 2),
269 0x00000000,
270 (0x0e00 << 16) | (0x3025c >> 2),
271 0x00000000,
272 (0x4e00 << 16) | (0xc900 >> 2),
273 0x00000000,
274 (0x5e00 << 16) | (0xc900 >> 2),
275 0x00000000,
276 (0x6e00 << 16) | (0xc900 >> 2),
277 0x00000000,
278 (0x7e00 << 16) | (0xc900 >> 2),
279 0x00000000,
280 (0x8e00 << 16) | (0xc900 >> 2),
281 0x00000000,
282 (0x9e00 << 16) | (0xc900 >> 2),
283 0x00000000,
284 (0xae00 << 16) | (0xc900 >> 2),
285 0x00000000,
286 (0xbe00 << 16) | (0xc900 >> 2),
287 0x00000000,
288 (0x4e00 << 16) | (0xc904 >> 2),
289 0x00000000,
290 (0x5e00 << 16) | (0xc904 >> 2),
291 0x00000000,
292 (0x6e00 << 16) | (0xc904 >> 2),
293 0x00000000,
294 (0x7e00 << 16) | (0xc904 >> 2),
295 0x00000000,
296 (0x8e00 << 16) | (0xc904 >> 2),
297 0x00000000,
298 (0x9e00 << 16) | (0xc904 >> 2),
299 0x00000000,
300 (0xae00 << 16) | (0xc904 >> 2),
301 0x00000000,
302 (0xbe00 << 16) | (0xc904 >> 2),
303 0x00000000,
304 (0x4e00 << 16) | (0xc908 >> 2),
305 0x00000000,
306 (0x5e00 << 16) | (0xc908 >> 2),
307 0x00000000,
308 (0x6e00 << 16) | (0xc908 >> 2),
309 0x00000000,
310 (0x7e00 << 16) | (0xc908 >> 2),
311 0x00000000,
312 (0x8e00 << 16) | (0xc908 >> 2),
313 0x00000000,
314 (0x9e00 << 16) | (0xc908 >> 2),
315 0x00000000,
316 (0xae00 << 16) | (0xc908 >> 2),
317 0x00000000,
318 (0xbe00 << 16) | (0xc908 >> 2),
319 0x00000000,
320 (0x4e00 << 16) | (0xc90c >> 2),
321 0x00000000,
322 (0x5e00 << 16) | (0xc90c >> 2),
323 0x00000000,
324 (0x6e00 << 16) | (0xc90c >> 2),
325 0x00000000,
326 (0x7e00 << 16) | (0xc90c >> 2),
327 0x00000000,
328 (0x8e00 << 16) | (0xc90c >> 2),
329 0x00000000,
330 (0x9e00 << 16) | (0xc90c >> 2),
331 0x00000000,
332 (0xae00 << 16) | (0xc90c >> 2),
333 0x00000000,
334 (0xbe00 << 16) | (0xc90c >> 2),
335 0x00000000,
336 (0x4e00 << 16) | (0xc910 >> 2),
337 0x00000000,
338 (0x5e00 << 16) | (0xc910 >> 2),
339 0x00000000,
340 (0x6e00 << 16) | (0xc910 >> 2),
341 0x00000000,
342 (0x7e00 << 16) | (0xc910 >> 2),
343 0x00000000,
344 (0x8e00 << 16) | (0xc910 >> 2),
345 0x00000000,
346 (0x9e00 << 16) | (0xc910 >> 2),
347 0x00000000,
348 (0xae00 << 16) | (0xc910 >> 2),
349 0x00000000,
350 (0xbe00 << 16) | (0xc910 >> 2),
351 0x00000000,
352 (0x0e00 << 16) | (0xc99c >> 2),
353 0x00000000,
354 (0x0e00 << 16) | (0x9834 >> 2),
355 0x00000000,
356 (0x0000 << 16) | (0x30f00 >> 2),
357 0x00000000,
358 (0x0001 << 16) | (0x30f00 >> 2),
359 0x00000000,
360 (0x0000 << 16) | (0x30f04 >> 2),
361 0x00000000,
362 (0x0001 << 16) | (0x30f04 >> 2),
363 0x00000000,
364 (0x0000 << 16) | (0x30f08 >> 2),
365 0x00000000,
366 (0x0001 << 16) | (0x30f08 >> 2),
367 0x00000000,
368 (0x0000 << 16) | (0x30f0c >> 2),
369 0x00000000,
370 (0x0001 << 16) | (0x30f0c >> 2),
371 0x00000000,
372 (0x0600 << 16) | (0x9b7c >> 2),
373 0x00000000,
374 (0x0e00 << 16) | (0x8a14 >> 2),
375 0x00000000,
376 (0x0e00 << 16) | (0x8a18 >> 2),
377 0x00000000,
378 (0x0600 << 16) | (0x30a00 >> 2),
379 0x00000000,
380 (0x0e00 << 16) | (0x8bf0 >> 2),
381 0x00000000,
382 (0x0e00 << 16) | (0x8bcc >> 2),
383 0x00000000,
384 (0x0e00 << 16) | (0x8b24 >> 2),
385 0x00000000,
386 (0x0e00 << 16) | (0x30a04 >> 2),
387 0x00000000,
388 (0x0600 << 16) | (0x30a10 >> 2),
389 0x00000000,
390 (0x0600 << 16) | (0x30a14 >> 2),
391 0x00000000,
392 (0x0600 << 16) | (0x30a18 >> 2),
393 0x00000000,
394 (0x0600 << 16) | (0x30a2c >> 2),
395 0x00000000,
396 (0x0e00 << 16) | (0xc700 >> 2),
397 0x00000000,
398 (0x0e00 << 16) | (0xc704 >> 2),
399 0x00000000,
400 (0x0e00 << 16) | (0xc708 >> 2),
401 0x00000000,
402 (0x0e00 << 16) | (0xc768 >> 2),
403 0x00000000,
404 (0x0400 << 16) | (0xc770 >> 2),
405 0x00000000,
406 (0x0400 << 16) | (0xc774 >> 2),
407 0x00000000,
408 (0x0400 << 16) | (0xc778 >> 2),
409 0x00000000,
410 (0x0400 << 16) | (0xc77c >> 2),
411 0x00000000,
412 (0x0400 << 16) | (0xc780 >> 2),
413 0x00000000,
414 (0x0400 << 16) | (0xc784 >> 2),
415 0x00000000,
416 (0x0400 << 16) | (0xc788 >> 2),
417 0x00000000,
418 (0x0400 << 16) | (0xc78c >> 2),
419 0x00000000,
420 (0x0400 << 16) | (0xc798 >> 2),
421 0x00000000,
422 (0x0400 << 16) | (0xc79c >> 2),
423 0x00000000,
424 (0x0400 << 16) | (0xc7a0 >> 2),
425 0x00000000,
426 (0x0400 << 16) | (0xc7a4 >> 2),
427 0x00000000,
428 (0x0400 << 16) | (0xc7a8 >> 2),
429 0x00000000,
430 (0x0400 << 16) | (0xc7ac >> 2),
431 0x00000000,
432 (0x0400 << 16) | (0xc7b0 >> 2),
433 0x00000000,
434 (0x0400 << 16) | (0xc7b4 >> 2),
435 0x00000000,
436 (0x0e00 << 16) | (0x9100 >> 2),
437 0x00000000,
438 (0x0e00 << 16) | (0x3c010 >> 2),
439 0x00000000,
440 (0x0e00 << 16) | (0x92a8 >> 2),
441 0x00000000,
442 (0x0e00 << 16) | (0x92ac >> 2),
443 0x00000000,
444 (0x0e00 << 16) | (0x92b4 >> 2),
445 0x00000000,
446 (0x0e00 << 16) | (0x92b8 >> 2),
447 0x00000000,
448 (0x0e00 << 16) | (0x92bc >> 2),
449 0x00000000,
450 (0x0e00 << 16) | (0x92c0 >> 2),
451 0x00000000,
452 (0x0e00 << 16) | (0x92c4 >> 2),
453 0x00000000,
454 (0x0e00 << 16) | (0x92c8 >> 2),
455 0x00000000,
456 (0x0e00 << 16) | (0x92cc >> 2),
457 0x00000000,
458 (0x0e00 << 16) | (0x92d0 >> 2),
459 0x00000000,
460 (0x0e00 << 16) | (0x8c00 >> 2),
461 0x00000000,
462 (0x0e00 << 16) | (0x8c04 >> 2),
463 0x00000000,
464 (0x0e00 << 16) | (0x8c20 >> 2),
465 0x00000000,
466 (0x0e00 << 16) | (0x8c38 >> 2),
467 0x00000000,
468 (0x0e00 << 16) | (0x8c3c >> 2),
469 0x00000000,
470 (0x0e00 << 16) | (0xae00 >> 2),
471 0x00000000,
472 (0x0e00 << 16) | (0x9604 >> 2),
473 0x00000000,
474 (0x0e00 << 16) | (0xac08 >> 2),
475 0x00000000,
476 (0x0e00 << 16) | (0xac0c >> 2),
477 0x00000000,
478 (0x0e00 << 16) | (0xac10 >> 2),
479 0x00000000,
480 (0x0e00 << 16) | (0xac14 >> 2),
481 0x00000000,
482 (0x0e00 << 16) | (0xac58 >> 2),
483 0x00000000,
484 (0x0e00 << 16) | (0xac68 >> 2),
485 0x00000000,
486 (0x0e00 << 16) | (0xac6c >> 2),
487 0x00000000,
488 (0x0e00 << 16) | (0xac70 >> 2),
489 0x00000000,
490 (0x0e00 << 16) | (0xac74 >> 2),
491 0x00000000,
492 (0x0e00 << 16) | (0xac78 >> 2),
493 0x00000000,
494 (0x0e00 << 16) | (0xac7c >> 2),
495 0x00000000,
496 (0x0e00 << 16) | (0xac80 >> 2),
497 0x00000000,
498 (0x0e00 << 16) | (0xac84 >> 2),
499 0x00000000,
500 (0x0e00 << 16) | (0xac88 >> 2),
501 0x00000000,
502 (0x0e00 << 16) | (0xac8c >> 2),
503 0x00000000,
504 (0x0e00 << 16) | (0x970c >> 2),
505 0x00000000,
506 (0x0e00 << 16) | (0x9714 >> 2),
507 0x00000000,
508 (0x0e00 << 16) | (0x9718 >> 2),
509 0x00000000,
510 (0x0e00 << 16) | (0x971c >> 2),
511 0x00000000,
512 (0x0e00 << 16) | (0x31068 >> 2),
513 0x00000000,
514 (0x4e00 << 16) | (0x31068 >> 2),
515 0x00000000,
516 (0x5e00 << 16) | (0x31068 >> 2),
517 0x00000000,
518 (0x6e00 << 16) | (0x31068 >> 2),
519 0x00000000,
520 (0x7e00 << 16) | (0x31068 >> 2),
521 0x00000000,
522 (0x8e00 << 16) | (0x31068 >> 2),
523 0x00000000,
524 (0x9e00 << 16) | (0x31068 >> 2),
525 0x00000000,
526 (0xae00 << 16) | (0x31068 >> 2),
527 0x00000000,
528 (0xbe00 << 16) | (0x31068 >> 2),
529 0x00000000,
530 (0x0e00 << 16) | (0xcd10 >> 2),
531 0x00000000,
532 (0x0e00 << 16) | (0xcd14 >> 2),
533 0x00000000,
534 (0x0e00 << 16) | (0x88b0 >> 2),
535 0x00000000,
536 (0x0e00 << 16) | (0x88b4 >> 2),
537 0x00000000,
538 (0x0e00 << 16) | (0x88b8 >> 2),
539 0x00000000,
540 (0x0e00 << 16) | (0x88bc >> 2),
541 0x00000000,
542 (0x0400 << 16) | (0x89c0 >> 2),
543 0x00000000,
544 (0x0e00 << 16) | (0x88c4 >> 2),
545 0x00000000,
546 (0x0e00 << 16) | (0x88c8 >> 2),
547 0x00000000,
548 (0x0e00 << 16) | (0x88d0 >> 2),
549 0x00000000,
550 (0x0e00 << 16) | (0x88d4 >> 2),
551 0x00000000,
552 (0x0e00 << 16) | (0x88d8 >> 2),
553 0x00000000,
554 (0x0e00 << 16) | (0x8980 >> 2),
555 0x00000000,
556 (0x0e00 << 16) | (0x30938 >> 2),
557 0x00000000,
558 (0x0e00 << 16) | (0x3093c >> 2),
559 0x00000000,
560 (0x0e00 << 16) | (0x30940 >> 2),
561 0x00000000,
562 (0x0e00 << 16) | (0x89a0 >> 2),
563 0x00000000,
564 (0x0e00 << 16) | (0x30900 >> 2),
565 0x00000000,
566 (0x0e00 << 16) | (0x30904 >> 2),
567 0x00000000,
568 (0x0e00 << 16) | (0x89b4 >> 2),
569 0x00000000,
570 (0x0e00 << 16) | (0x3c210 >> 2),
571 0x00000000,
572 (0x0e00 << 16) | (0x3c214 >> 2),
573 0x00000000,
574 (0x0e00 << 16) | (0x3c218 >> 2),
575 0x00000000,
576 (0x0e00 << 16) | (0x8904 >> 2),
577 0x00000000,
578 0x5,
579 (0x0e00 << 16) | (0x8c28 >> 2),
580 (0x0e00 << 16) | (0x8c2c >> 2),
581 (0x0e00 << 16) | (0x8c30 >> 2),
582 (0x0e00 << 16) | (0x8c34 >> 2),
583 (0x0e00 << 16) | (0x9600 >> 2),
584};
585
586static const u32 kalindi_rlc_save_restore_register_list[] =
587{
588 (0x0e00 << 16) | (0xc12c >> 2),
589 0x00000000,
590 (0x0e00 << 16) | (0xc140 >> 2),
591 0x00000000,
592 (0x0e00 << 16) | (0xc150 >> 2),
593 0x00000000,
594 (0x0e00 << 16) | (0xc15c >> 2),
595 0x00000000,
596 (0x0e00 << 16) | (0xc168 >> 2),
597 0x00000000,
598 (0x0e00 << 16) | (0xc170 >> 2),
599 0x00000000,
600 (0x0e00 << 16) | (0xc204 >> 2),
601 0x00000000,
602 (0x0e00 << 16) | (0xc2b4 >> 2),
603 0x00000000,
604 (0x0e00 << 16) | (0xc2b8 >> 2),
605 0x00000000,
606 (0x0e00 << 16) | (0xc2bc >> 2),
607 0x00000000,
608 (0x0e00 << 16) | (0xc2c0 >> 2),
609 0x00000000,
610 (0x0e00 << 16) | (0x8228 >> 2),
611 0x00000000,
612 (0x0e00 << 16) | (0x829c >> 2),
613 0x00000000,
614 (0x0e00 << 16) | (0x869c >> 2),
615 0x00000000,
616 (0x0600 << 16) | (0x98f4 >> 2),
617 0x00000000,
618 (0x0e00 << 16) | (0x98f8 >> 2),
619 0x00000000,
620 (0x0e00 << 16) | (0x9900 >> 2),
621 0x00000000,
622 (0x0e00 << 16) | (0xc260 >> 2),
623 0x00000000,
624 (0x0e00 << 16) | (0x90e8 >> 2),
625 0x00000000,
626 (0x0e00 << 16) | (0x3c000 >> 2),
627 0x00000000,
628 (0x0e00 << 16) | (0x3c00c >> 2),
629 0x00000000,
630 (0x0e00 << 16) | (0x8c1c >> 2),
631 0x00000000,
632 (0x0e00 << 16) | (0x9700 >> 2),
633 0x00000000,
634 (0x0e00 << 16) | (0xcd20 >> 2),
635 0x00000000,
636 (0x4e00 << 16) | (0xcd20 >> 2),
637 0x00000000,
638 (0x5e00 << 16) | (0xcd20 >> 2),
639 0x00000000,
640 (0x6e00 << 16) | (0xcd20 >> 2),
641 0x00000000,
642 (0x7e00 << 16) | (0xcd20 >> 2),
643 0x00000000,
644 (0x0e00 << 16) | (0x89bc >> 2),
645 0x00000000,
646 (0x0e00 << 16) | (0x8900 >> 2),
647 0x00000000,
648 0x3,
649 (0x0e00 << 16) | (0xc130 >> 2),
650 0x00000000,
651 (0x0e00 << 16) | (0xc134 >> 2),
652 0x00000000,
653 (0x0e00 << 16) | (0xc1fc >> 2),
654 0x00000000,
655 (0x0e00 << 16) | (0xc208 >> 2),
656 0x00000000,
657 (0x0e00 << 16) | (0xc264 >> 2),
658 0x00000000,
659 (0x0e00 << 16) | (0xc268 >> 2),
660 0x00000000,
661 (0x0e00 << 16) | (0xc26c >> 2),
662 0x00000000,
663 (0x0e00 << 16) | (0xc270 >> 2),
664 0x00000000,
665 (0x0e00 << 16) | (0xc274 >> 2),
666 0x00000000,
667 (0x0e00 << 16) | (0xc28c >> 2),
668 0x00000000,
669 (0x0e00 << 16) | (0xc290 >> 2),
670 0x00000000,
671 (0x0e00 << 16) | (0xc294 >> 2),
672 0x00000000,
673 (0x0e00 << 16) | (0xc298 >> 2),
674 0x00000000,
675 (0x0e00 << 16) | (0xc2a0 >> 2),
676 0x00000000,
677 (0x0e00 << 16) | (0xc2a4 >> 2),
678 0x00000000,
679 (0x0e00 << 16) | (0xc2a8 >> 2),
680 0x00000000,
681 (0x0e00 << 16) | (0xc2ac >> 2),
682 0x00000000,
683 (0x0e00 << 16) | (0x301d0 >> 2),
684 0x00000000,
685 (0x0e00 << 16) | (0x30238 >> 2),
686 0x00000000,
687 (0x0e00 << 16) | (0x30250 >> 2),
688 0x00000000,
689 (0x0e00 << 16) | (0x30254 >> 2),
690 0x00000000,
691 (0x0e00 << 16) | (0x30258 >> 2),
692 0x00000000,
693 (0x0e00 << 16) | (0x3025c >> 2),
694 0x00000000,
695 (0x4e00 << 16) | (0xc900 >> 2),
696 0x00000000,
697 (0x5e00 << 16) | (0xc900 >> 2),
698 0x00000000,
699 (0x6e00 << 16) | (0xc900 >> 2),
700 0x00000000,
701 (0x7e00 << 16) | (0xc900 >> 2),
702 0x00000000,
703 (0x4e00 << 16) | (0xc904 >> 2),
704 0x00000000,
705 (0x5e00 << 16) | (0xc904 >> 2),
706 0x00000000,
707 (0x6e00 << 16) | (0xc904 >> 2),
708 0x00000000,
709 (0x7e00 << 16) | (0xc904 >> 2),
710 0x00000000,
711 (0x4e00 << 16) | (0xc908 >> 2),
712 0x00000000,
713 (0x5e00 << 16) | (0xc908 >> 2),
714 0x00000000,
715 (0x6e00 << 16) | (0xc908 >> 2),
716 0x00000000,
717 (0x7e00 << 16) | (0xc908 >> 2),
718 0x00000000,
719 (0x4e00 << 16) | (0xc90c >> 2),
720 0x00000000,
721 (0x5e00 << 16) | (0xc90c >> 2),
722 0x00000000,
723 (0x6e00 << 16) | (0xc90c >> 2),
724 0x00000000,
725 (0x7e00 << 16) | (0xc90c >> 2),
726 0x00000000,
727 (0x4e00 << 16) | (0xc910 >> 2),
728 0x00000000,
729 (0x5e00 << 16) | (0xc910 >> 2),
730 0x00000000,
731 (0x6e00 << 16) | (0xc910 >> 2),
732 0x00000000,
733 (0x7e00 << 16) | (0xc910 >> 2),
734 0x00000000,
735 (0x0e00 << 16) | (0xc99c >> 2),
736 0x00000000,
737 (0x0e00 << 16) | (0x9834 >> 2),
738 0x00000000,
739 (0x0000 << 16) | (0x30f00 >> 2),
740 0x00000000,
741 (0x0000 << 16) | (0x30f04 >> 2),
742 0x00000000,
743 (0x0000 << 16) | (0x30f08 >> 2),
744 0x00000000,
745 (0x0000 << 16) | (0x30f0c >> 2),
746 0x00000000,
747 (0x0600 << 16) | (0x9b7c >> 2),
748 0x00000000,
749 (0x0e00 << 16) | (0x8a14 >> 2),
750 0x00000000,
751 (0x0e00 << 16) | (0x8a18 >> 2),
752 0x00000000,
753 (0x0600 << 16) | (0x30a00 >> 2),
754 0x00000000,
755 (0x0e00 << 16) | (0x8bf0 >> 2),
756 0x00000000,
757 (0x0e00 << 16) | (0x8bcc >> 2),
758 0x00000000,
759 (0x0e00 << 16) | (0x8b24 >> 2),
760 0x00000000,
761 (0x0e00 << 16) | (0x30a04 >> 2),
762 0x00000000,
763 (0x0600 << 16) | (0x30a10 >> 2),
764 0x00000000,
765 (0x0600 << 16) | (0x30a14 >> 2),
766 0x00000000,
767 (0x0600 << 16) | (0x30a18 >> 2),
768 0x00000000,
769 (0x0600 << 16) | (0x30a2c >> 2),
770 0x00000000,
771 (0x0e00 << 16) | (0xc700 >> 2),
772 0x00000000,
773 (0x0e00 << 16) | (0xc704 >> 2),
774 0x00000000,
775 (0x0e00 << 16) | (0xc708 >> 2),
776 0x00000000,
777 (0x0e00 << 16) | (0xc768 >> 2),
778 0x00000000,
779 (0x0400 << 16) | (0xc770 >> 2),
780 0x00000000,
781 (0x0400 << 16) | (0xc774 >> 2),
782 0x00000000,
783 (0x0400 << 16) | (0xc798 >> 2),
784 0x00000000,
785 (0x0400 << 16) | (0xc79c >> 2),
786 0x00000000,
787 (0x0e00 << 16) | (0x9100 >> 2),
788 0x00000000,
789 (0x0e00 << 16) | (0x3c010 >> 2),
790 0x00000000,
791 (0x0e00 << 16) | (0x8c00 >> 2),
792 0x00000000,
793 (0x0e00 << 16) | (0x8c04 >> 2),
794 0x00000000,
795 (0x0e00 << 16) | (0x8c20 >> 2),
796 0x00000000,
797 (0x0e00 << 16) | (0x8c38 >> 2),
798 0x00000000,
799 (0x0e00 << 16) | (0x8c3c >> 2),
800 0x00000000,
801 (0x0e00 << 16) | (0xae00 >> 2),
802 0x00000000,
803 (0x0e00 << 16) | (0x9604 >> 2),
804 0x00000000,
805 (0x0e00 << 16) | (0xac08 >> 2),
806 0x00000000,
807 (0x0e00 << 16) | (0xac0c >> 2),
808 0x00000000,
809 (0x0e00 << 16) | (0xac10 >> 2),
810 0x00000000,
811 (0x0e00 << 16) | (0xac14 >> 2),
812 0x00000000,
813 (0x0e00 << 16) | (0xac58 >> 2),
814 0x00000000,
815 (0x0e00 << 16) | (0xac68 >> 2),
816 0x00000000,
817 (0x0e00 << 16) | (0xac6c >> 2),
818 0x00000000,
819 (0x0e00 << 16) | (0xac70 >> 2),
820 0x00000000,
821 (0x0e00 << 16) | (0xac74 >> 2),
822 0x00000000,
823 (0x0e00 << 16) | (0xac78 >> 2),
824 0x00000000,
825 (0x0e00 << 16) | (0xac7c >> 2),
826 0x00000000,
827 (0x0e00 << 16) | (0xac80 >> 2),
828 0x00000000,
829 (0x0e00 << 16) | (0xac84 >> 2),
830 0x00000000,
831 (0x0e00 << 16) | (0xac88 >> 2),
832 0x00000000,
833 (0x0e00 << 16) | (0xac8c >> 2),
834 0x00000000,
835 (0x0e00 << 16) | (0x970c >> 2),
836 0x00000000,
837 (0x0e00 << 16) | (0x9714 >> 2),
838 0x00000000,
839 (0x0e00 << 16) | (0x9718 >> 2),
840 0x00000000,
841 (0x0e00 << 16) | (0x971c >> 2),
842 0x00000000,
843 (0x0e00 << 16) | (0x31068 >> 2),
844 0x00000000,
845 (0x4e00 << 16) | (0x31068 >> 2),
846 0x00000000,
847 (0x5e00 << 16) | (0x31068 >> 2),
848 0x00000000,
849 (0x6e00 << 16) | (0x31068 >> 2),
850 0x00000000,
851 (0x7e00 << 16) | (0x31068 >> 2),
852 0x00000000,
853 (0x0e00 << 16) | (0xcd10 >> 2),
854 0x00000000,
855 (0x0e00 << 16) | (0xcd14 >> 2),
856 0x00000000,
857 (0x0e00 << 16) | (0x88b0 >> 2),
858 0x00000000,
859 (0x0e00 << 16) | (0x88b4 >> 2),
860 0x00000000,
861 (0x0e00 << 16) | (0x88b8 >> 2),
862 0x00000000,
863 (0x0e00 << 16) | (0x88bc >> 2),
864 0x00000000,
865 (0x0400 << 16) | (0x89c0 >> 2),
866 0x00000000,
867 (0x0e00 << 16) | (0x88c4 >> 2),
868 0x00000000,
869 (0x0e00 << 16) | (0x88c8 >> 2),
870 0x00000000,
871 (0x0e00 << 16) | (0x88d0 >> 2),
872 0x00000000,
873 (0x0e00 << 16) | (0x88d4 >> 2),
874 0x00000000,
875 (0x0e00 << 16) | (0x88d8 >> 2),
876 0x00000000,
877 (0x0e00 << 16) | (0x8980 >> 2),
878 0x00000000,
879 (0x0e00 << 16) | (0x30938 >> 2),
880 0x00000000,
881 (0x0e00 << 16) | (0x3093c >> 2),
882 0x00000000,
883 (0x0e00 << 16) | (0x30940 >> 2),
884 0x00000000,
885 (0x0e00 << 16) | (0x89a0 >> 2),
886 0x00000000,
887 (0x0e00 << 16) | (0x30900 >> 2),
888 0x00000000,
889 (0x0e00 << 16) | (0x30904 >> 2),
890 0x00000000,
891 (0x0e00 << 16) | (0x89b4 >> 2),
892 0x00000000,
893 (0x0e00 << 16) | (0x3e1fc >> 2),
894 0x00000000,
895 (0x0e00 << 16) | (0x3c210 >> 2),
896 0x00000000,
897 (0x0e00 << 16) | (0x3c214 >> 2),
898 0x00000000,
899 (0x0e00 << 16) | (0x3c218 >> 2),
900 0x00000000,
901 (0x0e00 << 16) | (0x8904 >> 2),
902 0x00000000,
903 0x5,
904 (0x0e00 << 16) | (0x8c28 >> 2),
905 (0x0e00 << 16) | (0x8c2c >> 2),
906 (0x0e00 << 16) | (0x8c30 >> 2),
907 (0x0e00 << 16) | (0x8c34 >> 2),
908 (0x0e00 << 16) | (0x9600 >> 2),
909};
910
101static const u32 bonaire_golden_spm_registers[] = 911static const u32 bonaire_golden_spm_registers[] =
102{ 912{
103 0x30800, 0xe0ffffff, 0xe0000000 913 0x30800, 0xe0ffffff, 0xe0000000
@@ -744,7 +1554,7 @@ static int cik_init_microcode(struct radeon_device *rdev)
744 const char *chip_name; 1554 const char *chip_name;
745 size_t pfp_req_size, me_req_size, ce_req_size, 1555 size_t pfp_req_size, me_req_size, ce_req_size,
746 mec_req_size, rlc_req_size, mc_req_size, 1556 mec_req_size, rlc_req_size, mc_req_size,
747 sdma_req_size; 1557 sdma_req_size, smc_req_size;
748 char fw_name[30]; 1558 char fw_name[30];
749 int err; 1559 int err;
750 1560
@@ -760,6 +1570,7 @@ static int cik_init_microcode(struct radeon_device *rdev)
760 rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; 1570 rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
761 mc_req_size = CIK_MC_UCODE_SIZE * 4; 1571 mc_req_size = CIK_MC_UCODE_SIZE * 4;
762 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; 1572 sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
1573 smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4);
763 break; 1574 break;
764 case CHIP_KAVERI: 1575 case CHIP_KAVERI:
765 chip_name = "KAVERI"; 1576 chip_name = "KAVERI";
@@ -851,7 +1662,7 @@ static int cik_init_microcode(struct radeon_device *rdev)
851 err = -EINVAL; 1662 err = -EINVAL;
852 } 1663 }
853 1664
854 /* No MC ucode on APUs */ 1665 /* No SMC, MC ucode on APUs */
855 if (!(rdev->flags & RADEON_IS_IGP)) { 1666 if (!(rdev->flags & RADEON_IS_IGP)) {
856 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); 1667 snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
857 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); 1668 err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
@@ -863,6 +1674,21 @@ static int cik_init_microcode(struct radeon_device *rdev)
863 rdev->mc_fw->size, fw_name); 1674 rdev->mc_fw->size, fw_name);
864 err = -EINVAL; 1675 err = -EINVAL;
865 } 1676 }
1677
1678 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
1679 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
1680 if (err) {
1681 printk(KERN_ERR
1682 "smc: error loading firmware \"%s\"\n",
1683 fw_name);
1684 release_firmware(rdev->smc_fw);
1685 rdev->smc_fw = NULL;
1686 } else if (rdev->smc_fw->size != smc_req_size) {
1687 printk(KERN_ERR
1688 "cik_smc: Bogus length %zu in firmware \"%s\"\n",
1689 rdev->smc_fw->size, fw_name);
1690 err = -EINVAL;
1691 }
866 } 1692 }
867 1693
868out: 1694out:
@@ -881,6 +1707,8 @@ out:
881 rdev->rlc_fw = NULL; 1707 rdev->rlc_fw = NULL;
882 release_firmware(rdev->mc_fw); 1708 release_firmware(rdev->mc_fw);
883 rdev->mc_fw = NULL; 1709 rdev->mc_fw = NULL;
1710 release_firmware(rdev->smc_fw);
1711 rdev->smc_fw = NULL;
884 } 1712 }
885 return err; 1713 return err;
886} 1714}
@@ -1880,7 +2708,46 @@ static void cik_gpu_init(struct radeon_device *rdev)
1880 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN; 2708 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
1881 break; 2709 break;
1882 case CHIP_KAVERI: 2710 case CHIP_KAVERI:
1883 /* TODO */ 2711 rdev->config.cik.max_shader_engines = 1;
2712 rdev->config.cik.max_tile_pipes = 4;
2713 if ((rdev->pdev->device == 0x1304) ||
2714 (rdev->pdev->device == 0x1305) ||
2715 (rdev->pdev->device == 0x130C) ||
2716 (rdev->pdev->device == 0x130F) ||
2717 (rdev->pdev->device == 0x1310) ||
2718 (rdev->pdev->device == 0x1311) ||
2719 (rdev->pdev->device == 0x131C)) {
2720 rdev->config.cik.max_cu_per_sh = 8;
2721 rdev->config.cik.max_backends_per_se = 2;
2722 } else if ((rdev->pdev->device == 0x1309) ||
2723 (rdev->pdev->device == 0x130A) ||
2724 (rdev->pdev->device == 0x130D) ||
2725 (rdev->pdev->device == 0x1313)) {
2726 rdev->config.cik.max_cu_per_sh = 6;
2727 rdev->config.cik.max_backends_per_se = 2;
2728 } else if ((rdev->pdev->device == 0x1306) ||
2729 (rdev->pdev->device == 0x1307) ||
2730 (rdev->pdev->device == 0x130B) ||
2731 (rdev->pdev->device == 0x130E) ||
2732 (rdev->pdev->device == 0x1315) ||
2733 (rdev->pdev->device == 0x131B)) {
2734 rdev->config.cik.max_cu_per_sh = 4;
2735 rdev->config.cik.max_backends_per_se = 1;
2736 } else {
2737 rdev->config.cik.max_cu_per_sh = 3;
2738 rdev->config.cik.max_backends_per_se = 1;
2739 }
2740 rdev->config.cik.max_sh_per_se = 1;
2741 rdev->config.cik.max_texture_channel_caches = 4;
2742 rdev->config.cik.max_gprs = 256;
2743 rdev->config.cik.max_gs_threads = 16;
2744 rdev->config.cik.max_hw_contexts = 8;
2745
2746 rdev->config.cik.sc_prim_fifo_size_frontend = 0x20;
2747 rdev->config.cik.sc_prim_fifo_size_backend = 0x100;
2748 rdev->config.cik.sc_hiz_tile_fifo_size = 0x30;
2749 rdev->config.cik.sc_earlyz_tile_fifo_size = 0x130;
2750 gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
1884 break; 2751 break;
1885 case CHIP_KABINI: 2752 case CHIP_KABINI:
1886 default: 2753 default:
@@ -2587,11 +3454,12 @@ u32 cik_compute_ring_get_rptr(struct radeon_device *rdev,
2587 if (rdev->wb.enabled) { 3454 if (rdev->wb.enabled) {
2588 rptr = le32_to_cpu(rdev->wb.wb[ring->rptr_offs/4]); 3455 rptr = le32_to_cpu(rdev->wb.wb[ring->rptr_offs/4]);
2589 } else { 3456 } else {
3457 mutex_lock(&rdev->srbm_mutex);
2590 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0); 3458 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
2591 rptr = RREG32(CP_HQD_PQ_RPTR); 3459 rptr = RREG32(CP_HQD_PQ_RPTR);
2592 cik_srbm_select(rdev, 0, 0, 0, 0); 3460 cik_srbm_select(rdev, 0, 0, 0, 0);
3461 mutex_unlock(&rdev->srbm_mutex);
2593 } 3462 }
2594 rptr = (rptr & ring->ptr_reg_mask) >> ring->ptr_reg_shift;
2595 3463
2596 return rptr; 3464 return rptr;
2597} 3465}
@@ -2604,11 +3472,12 @@ u32 cik_compute_ring_get_wptr(struct radeon_device *rdev,
2604 if (rdev->wb.enabled) { 3472 if (rdev->wb.enabled) {
2605 wptr = le32_to_cpu(rdev->wb.wb[ring->wptr_offs/4]); 3473 wptr = le32_to_cpu(rdev->wb.wb[ring->wptr_offs/4]);
2606 } else { 3474 } else {
3475 mutex_lock(&rdev->srbm_mutex);
2607 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0); 3476 cik_srbm_select(rdev, ring->me, ring->pipe, ring->queue, 0);
2608 wptr = RREG32(CP_HQD_PQ_WPTR); 3477 wptr = RREG32(CP_HQD_PQ_WPTR);
2609 cik_srbm_select(rdev, 0, 0, 0, 0); 3478 cik_srbm_select(rdev, 0, 0, 0, 0);
3479 mutex_unlock(&rdev->srbm_mutex);
2610 } 3480 }
2611 wptr = (wptr & ring->ptr_reg_mask) >> ring->ptr_reg_shift;
2612 3481
2613 return wptr; 3482 return wptr;
2614} 3483}
@@ -2616,10 +3485,8 @@ u32 cik_compute_ring_get_wptr(struct radeon_device *rdev,
2616void cik_compute_ring_set_wptr(struct radeon_device *rdev, 3485void cik_compute_ring_set_wptr(struct radeon_device *rdev,
2617 struct radeon_ring *ring) 3486 struct radeon_ring *ring)
2618{ 3487{
2619 u32 wptr = (ring->wptr << ring->ptr_reg_shift) & ring->ptr_reg_mask; 3488 rdev->wb.wb[ring->wptr_offs/4] = cpu_to_le32(ring->wptr);
2620 3489 WDOORBELL32(ring->doorbell_offset, ring->wptr);
2621 rdev->wb.wb[ring->wptr_offs/4] = cpu_to_le32(wptr);
2622 WDOORBELL32(ring->doorbell_offset, wptr);
2623} 3490}
2624 3491
2625/** 3492/**
@@ -2897,6 +3764,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
2897 WREG32(CP_CPF_DEBUG, tmp); 3764 WREG32(CP_CPF_DEBUG, tmp);
2898 3765
2899 /* init the pipes */ 3766 /* init the pipes */
3767 mutex_lock(&rdev->srbm_mutex);
2900 for (i = 0; i < (rdev->mec.num_pipe * rdev->mec.num_mec); i++) { 3768 for (i = 0; i < (rdev->mec.num_pipe * rdev->mec.num_mec); i++) {
2901 int me = (i < 4) ? 1 : 2; 3769 int me = (i < 4) ? 1 : 2;
2902 int pipe = (i < 4) ? i : (i - 4); 3770 int pipe = (i < 4) ? i : (i - 4);
@@ -2919,6 +3787,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
2919 WREG32(CP_HPD_EOP_CONTROL, tmp); 3787 WREG32(CP_HPD_EOP_CONTROL, tmp);
2920 } 3788 }
2921 cik_srbm_select(rdev, 0, 0, 0, 0); 3789 cik_srbm_select(rdev, 0, 0, 0, 0);
3790 mutex_unlock(&rdev->srbm_mutex);
2922 3791
2923 /* init the queues. Just two for now. */ 3792 /* init the queues. Just two for now. */
2924 for (i = 0; i < 2; i++) { 3793 for (i = 0; i < 2; i++) {
@@ -2972,6 +3841,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
2972 mqd->static_thread_mgmt23[0] = 0xffffffff; 3841 mqd->static_thread_mgmt23[0] = 0xffffffff;
2973 mqd->static_thread_mgmt23[1] = 0xffffffff; 3842 mqd->static_thread_mgmt23[1] = 0xffffffff;
2974 3843
3844 mutex_lock(&rdev->srbm_mutex);
2975 cik_srbm_select(rdev, rdev->ring[idx].me, 3845 cik_srbm_select(rdev, rdev->ring[idx].me,
2976 rdev->ring[idx].pipe, 3846 rdev->ring[idx].pipe,
2977 rdev->ring[idx].queue, 0); 3847 rdev->ring[idx].queue, 0);
@@ -3099,6 +3969,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
3099 WREG32(CP_HQD_ACTIVE, mqd->queue_state.cp_hqd_active); 3969 WREG32(CP_HQD_ACTIVE, mqd->queue_state.cp_hqd_active);
3100 3970
3101 cik_srbm_select(rdev, 0, 0, 0, 0); 3971 cik_srbm_select(rdev, 0, 0, 0, 0);
3972 mutex_unlock(&rdev->srbm_mutex);
3102 3973
3103 radeon_bo_kunmap(rdev->ring[idx].mqd_obj); 3974 radeon_bo_kunmap(rdev->ring[idx].mqd_obj);
3104 radeon_bo_unreserve(rdev->ring[idx].mqd_obj); 3975 radeon_bo_unreserve(rdev->ring[idx].mqd_obj);
@@ -3142,13 +4013,6 @@ static int cik_cp_resume(struct radeon_device *rdev)
3142{ 4013{
3143 int r; 4014 int r;
3144 4015
3145 /* Reset all cp blocks */
3146 WREG32(GRBM_SOFT_RESET, SOFT_RESET_CP);
3147 RREG32(GRBM_SOFT_RESET);
3148 mdelay(15);
3149 WREG32(GRBM_SOFT_RESET, 0);
3150 RREG32(GRBM_SOFT_RESET);
3151
3152 r = cik_cp_load_microcode(rdev); 4016 r = cik_cp_load_microcode(rdev);
3153 if (r) 4017 if (r)
3154 return r; 4018 return r;
@@ -3163,579 +4027,6 @@ static int cik_cp_resume(struct radeon_device *rdev)
3163 return 0; 4027 return 0;
3164} 4028}
3165 4029
3166/*
3167 * sDMA - System DMA
3168 * Starting with CIK, the GPU has new asynchronous
3169 * DMA engines. These engines are used for compute
3170 * and gfx. There are two DMA engines (SDMA0, SDMA1)
3171 * and each one supports 1 ring buffer used for gfx
3172 * and 2 queues used for compute.
3173 *
3174 * The programming model is very similar to the CP
3175 * (ring buffer, IBs, etc.), but sDMA has it's own
3176 * packet format that is different from the PM4 format
3177 * used by the CP. sDMA supports copying data, writing
3178 * embedded data, solid fills, and a number of other
3179 * things. It also has support for tiling/detiling of
3180 * buffers.
3181 */
3182/**
3183 * cik_sdma_ring_ib_execute - Schedule an IB on the DMA engine
3184 *
3185 * @rdev: radeon_device pointer
3186 * @ib: IB object to schedule
3187 *
3188 * Schedule an IB in the DMA ring (CIK).
3189 */
3190void cik_sdma_ring_ib_execute(struct radeon_device *rdev,
3191 struct radeon_ib *ib)
3192{
3193 struct radeon_ring *ring = &rdev->ring[ib->ring];
3194 u32 extra_bits = (ib->vm ? ib->vm->id : 0) & 0xf;
3195
3196 if (rdev->wb.enabled) {
3197 u32 next_rptr = ring->wptr + 5;
3198 while ((next_rptr & 7) != 4)
3199 next_rptr++;
3200 next_rptr += 4;
3201 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0));
3202 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
3203 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff);
3204 radeon_ring_write(ring, 1); /* number of DWs to follow */
3205 radeon_ring_write(ring, next_rptr);
3206 }
3207
3208 /* IB packet must end on a 8 DW boundary */
3209 while ((ring->wptr & 7) != 4)
3210 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
3211 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_INDIRECT_BUFFER, 0, extra_bits));
3212 radeon_ring_write(ring, ib->gpu_addr & 0xffffffe0); /* base must be 32 byte aligned */
3213 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xffffffff);
3214 radeon_ring_write(ring, ib->length_dw);
3215
3216}
3217
3218/**
3219 * cik_sdma_fence_ring_emit - emit a fence on the DMA ring
3220 *
3221 * @rdev: radeon_device pointer
3222 * @fence: radeon fence object
3223 *
3224 * Add a DMA fence packet to the ring to write
3225 * the fence seq number and DMA trap packet to generate
3226 * an interrupt if needed (CIK).
3227 */
3228void cik_sdma_fence_ring_emit(struct radeon_device *rdev,
3229 struct radeon_fence *fence)
3230{
3231 struct radeon_ring *ring = &rdev->ring[fence->ring];
3232 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3233 u32 extra_bits = (SDMA_POLL_REG_MEM_EXTRA_OP(1) |
3234 SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */
3235 u32 ref_and_mask;
3236
3237 if (fence->ring == R600_RING_TYPE_DMA_INDEX)
3238 ref_and_mask = SDMA0;
3239 else
3240 ref_and_mask = SDMA1;
3241
3242 /* write the fence */
3243 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_FENCE, 0, 0));
3244 radeon_ring_write(ring, addr & 0xffffffff);
3245 radeon_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
3246 radeon_ring_write(ring, fence->seq);
3247 /* generate an interrupt */
3248 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_TRAP, 0, 0));
3249 /* flush HDP */
3250 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_POLL_REG_MEM, 0, extra_bits));
3251 radeon_ring_write(ring, GPU_HDP_FLUSH_DONE);
3252 radeon_ring_write(ring, GPU_HDP_FLUSH_REQ);
3253 radeon_ring_write(ring, ref_and_mask); /* REFERENCE */
3254 radeon_ring_write(ring, ref_and_mask); /* MASK */
3255 radeon_ring_write(ring, (4 << 16) | 10); /* RETRY_COUNT, POLL_INTERVAL */
3256}
3257
3258/**
3259 * cik_sdma_semaphore_ring_emit - emit a semaphore on the dma ring
3260 *
3261 * @rdev: radeon_device pointer
3262 * @ring: radeon_ring structure holding ring information
3263 * @semaphore: radeon semaphore object
3264 * @emit_wait: wait or signal semaphore
3265 *
3266 * Add a DMA semaphore packet to the ring wait on or signal
3267 * other rings (CIK).
3268 */
3269void cik_sdma_semaphore_ring_emit(struct radeon_device *rdev,
3270 struct radeon_ring *ring,
3271 struct radeon_semaphore *semaphore,
3272 bool emit_wait)
3273{
3274 u64 addr = semaphore->gpu_addr;
3275 u32 extra_bits = emit_wait ? 0 : SDMA_SEMAPHORE_EXTRA_S;
3276
3277 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SEMAPHORE, 0, extra_bits));
3278 radeon_ring_write(ring, addr & 0xfffffff8);
3279 radeon_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
3280}
3281
3282/**
3283 * cik_sdma_gfx_stop - stop the gfx async dma engines
3284 *
3285 * @rdev: radeon_device pointer
3286 *
3287 * Stop the gfx async dma ring buffers (CIK).
3288 */
3289static void cik_sdma_gfx_stop(struct radeon_device *rdev)
3290{
3291 u32 rb_cntl, reg_offset;
3292 int i;
3293
3294 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
3295
3296 for (i = 0; i < 2; i++) {
3297 if (i == 0)
3298 reg_offset = SDMA0_REGISTER_OFFSET;
3299 else
3300 reg_offset = SDMA1_REGISTER_OFFSET;
3301 rb_cntl = RREG32(SDMA0_GFX_RB_CNTL + reg_offset);
3302 rb_cntl &= ~SDMA_RB_ENABLE;
3303 WREG32(SDMA0_GFX_RB_CNTL + reg_offset, rb_cntl);
3304 WREG32(SDMA0_GFX_IB_CNTL + reg_offset, 0);
3305 }
3306}
3307
3308/**
3309 * cik_sdma_rlc_stop - stop the compute async dma engines
3310 *
3311 * @rdev: radeon_device pointer
3312 *
3313 * Stop the compute async dma queues (CIK).
3314 */
3315static void cik_sdma_rlc_stop(struct radeon_device *rdev)
3316{
3317 /* XXX todo */
3318}
3319
3320/**
3321 * cik_sdma_enable - stop the async dma engines
3322 *
3323 * @rdev: radeon_device pointer
3324 * @enable: enable/disable the DMA MEs.
3325 *
3326 * Halt or unhalt the async dma engines (CIK).
3327 */
3328static void cik_sdma_enable(struct radeon_device *rdev, bool enable)
3329{
3330 u32 me_cntl, reg_offset;
3331 int i;
3332
3333 for (i = 0; i < 2; i++) {
3334 if (i == 0)
3335 reg_offset = SDMA0_REGISTER_OFFSET;
3336 else
3337 reg_offset = SDMA1_REGISTER_OFFSET;
3338 me_cntl = RREG32(SDMA0_ME_CNTL + reg_offset);
3339 if (enable)
3340 me_cntl &= ~SDMA_HALT;
3341 else
3342 me_cntl |= SDMA_HALT;
3343 WREG32(SDMA0_ME_CNTL + reg_offset, me_cntl);
3344 }
3345}
3346
3347/**
3348 * cik_sdma_gfx_resume - setup and start the async dma engines
3349 *
3350 * @rdev: radeon_device pointer
3351 *
3352 * Set up the gfx DMA ring buffers and enable them (CIK).
3353 * Returns 0 for success, error for failure.
3354 */
3355static int cik_sdma_gfx_resume(struct radeon_device *rdev)
3356{
3357 struct radeon_ring *ring;
3358 u32 rb_cntl, ib_cntl;
3359 u32 rb_bufsz;
3360 u32 reg_offset, wb_offset;
3361 int i, r;
3362
3363 for (i = 0; i < 2; i++) {
3364 if (i == 0) {
3365 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
3366 reg_offset = SDMA0_REGISTER_OFFSET;
3367 wb_offset = R600_WB_DMA_RPTR_OFFSET;
3368 } else {
3369 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
3370 reg_offset = SDMA1_REGISTER_OFFSET;
3371 wb_offset = CAYMAN_WB_DMA1_RPTR_OFFSET;
3372 }
3373
3374 WREG32(SDMA0_SEM_INCOMPLETE_TIMER_CNTL + reg_offset, 0);
3375 WREG32(SDMA0_SEM_WAIT_FAIL_TIMER_CNTL + reg_offset, 0);
3376
3377 /* Set ring buffer size in dwords */
3378 rb_bufsz = order_base_2(ring->ring_size / 4);
3379 rb_cntl = rb_bufsz << 1;
3380#ifdef __BIG_ENDIAN
3381 rb_cntl |= SDMA_RB_SWAP_ENABLE | SDMA_RPTR_WRITEBACK_SWAP_ENABLE;
3382#endif
3383 WREG32(SDMA0_GFX_RB_CNTL + reg_offset, rb_cntl);
3384
3385 /* Initialize the ring buffer's read and write pointers */
3386 WREG32(SDMA0_GFX_RB_RPTR + reg_offset, 0);
3387 WREG32(SDMA0_GFX_RB_WPTR + reg_offset, 0);
3388
3389 /* set the wb address whether it's enabled or not */
3390 WREG32(SDMA0_GFX_RB_RPTR_ADDR_HI + reg_offset,
3391 upper_32_bits(rdev->wb.gpu_addr + wb_offset) & 0xFFFFFFFF);
3392 WREG32(SDMA0_GFX_RB_RPTR_ADDR_LO + reg_offset,
3393 ((rdev->wb.gpu_addr + wb_offset) & 0xFFFFFFFC));
3394
3395 if (rdev->wb.enabled)
3396 rb_cntl |= SDMA_RPTR_WRITEBACK_ENABLE;
3397
3398 WREG32(SDMA0_GFX_RB_BASE + reg_offset, ring->gpu_addr >> 8);
3399 WREG32(SDMA0_GFX_RB_BASE_HI + reg_offset, ring->gpu_addr >> 40);
3400
3401 ring->wptr = 0;
3402 WREG32(SDMA0_GFX_RB_WPTR + reg_offset, ring->wptr << 2);
3403
3404 ring->rptr = RREG32(SDMA0_GFX_RB_RPTR + reg_offset) >> 2;
3405
3406 /* enable DMA RB */
3407 WREG32(SDMA0_GFX_RB_CNTL + reg_offset, rb_cntl | SDMA_RB_ENABLE);
3408
3409 ib_cntl = SDMA_IB_ENABLE;
3410#ifdef __BIG_ENDIAN
3411 ib_cntl |= SDMA_IB_SWAP_ENABLE;
3412#endif
3413 /* enable DMA IBs */
3414 WREG32(SDMA0_GFX_IB_CNTL + reg_offset, ib_cntl);
3415
3416 ring->ready = true;
3417
3418 r = radeon_ring_test(rdev, ring->idx, ring);
3419 if (r) {
3420 ring->ready = false;
3421 return r;
3422 }
3423 }
3424
3425 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
3426
3427 return 0;
3428}
3429
3430/**
3431 * cik_sdma_rlc_resume - setup and start the async dma engines
3432 *
3433 * @rdev: radeon_device pointer
3434 *
3435 * Set up the compute DMA queues and enable them (CIK).
3436 * Returns 0 for success, error for failure.
3437 */
3438static int cik_sdma_rlc_resume(struct radeon_device *rdev)
3439{
3440 /* XXX todo */
3441 return 0;
3442}
3443
3444/**
3445 * cik_sdma_load_microcode - load the sDMA ME ucode
3446 *
3447 * @rdev: radeon_device pointer
3448 *
3449 * Loads the sDMA0/1 ucode.
3450 * Returns 0 for success, -EINVAL if the ucode is not available.
3451 */
3452static int cik_sdma_load_microcode(struct radeon_device *rdev)
3453{
3454 const __be32 *fw_data;
3455 int i;
3456
3457 if (!rdev->sdma_fw)
3458 return -EINVAL;
3459
3460 /* stop the gfx rings and rlc compute queues */
3461 cik_sdma_gfx_stop(rdev);
3462 cik_sdma_rlc_stop(rdev);
3463
3464 /* halt the MEs */
3465 cik_sdma_enable(rdev, false);
3466
3467 /* sdma0 */
3468 fw_data = (const __be32 *)rdev->sdma_fw->data;
3469 WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0);
3470 for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++)
3471 WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, be32_to_cpup(fw_data++));
3472 WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION);
3473
3474 /* sdma1 */
3475 fw_data = (const __be32 *)rdev->sdma_fw->data;
3476 WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0);
3477 for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++)
3478 WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, be32_to_cpup(fw_data++));
3479 WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION);
3480
3481 WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0);
3482 WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0);
3483 return 0;
3484}
3485
3486/**
3487 * cik_sdma_resume - setup and start the async dma engines
3488 *
3489 * @rdev: radeon_device pointer
3490 *
3491 * Set up the DMA engines and enable them (CIK).
3492 * Returns 0 for success, error for failure.
3493 */
3494static int cik_sdma_resume(struct radeon_device *rdev)
3495{
3496 int r;
3497
3498 /* Reset dma */
3499 WREG32(SRBM_SOFT_RESET, SOFT_RESET_SDMA | SOFT_RESET_SDMA1);
3500 RREG32(SRBM_SOFT_RESET);
3501 udelay(50);
3502 WREG32(SRBM_SOFT_RESET, 0);
3503 RREG32(SRBM_SOFT_RESET);
3504
3505 r = cik_sdma_load_microcode(rdev);
3506 if (r)
3507 return r;
3508
3509 /* unhalt the MEs */
3510 cik_sdma_enable(rdev, true);
3511
3512 /* start the gfx rings and rlc compute queues */
3513 r = cik_sdma_gfx_resume(rdev);
3514 if (r)
3515 return r;
3516 r = cik_sdma_rlc_resume(rdev);
3517 if (r)
3518 return r;
3519
3520 return 0;
3521}
3522
3523/**
3524 * cik_sdma_fini - tear down the async dma engines
3525 *
3526 * @rdev: radeon_device pointer
3527 *
3528 * Stop the async dma engines and free the rings (CIK).
3529 */
3530static void cik_sdma_fini(struct radeon_device *rdev)
3531{
3532 /* stop the gfx rings and rlc compute queues */
3533 cik_sdma_gfx_stop(rdev);
3534 cik_sdma_rlc_stop(rdev);
3535 /* halt the MEs */
3536 cik_sdma_enable(rdev, false);
3537 radeon_ring_fini(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX]);
3538 radeon_ring_fini(rdev, &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]);
3539 /* XXX - compute dma queue tear down */
3540}
3541
3542/**
3543 * cik_copy_dma - copy pages using the DMA engine
3544 *
3545 * @rdev: radeon_device pointer
3546 * @src_offset: src GPU address
3547 * @dst_offset: dst GPU address
3548 * @num_gpu_pages: number of GPU pages to xfer
3549 * @fence: radeon fence object
3550 *
3551 * Copy GPU paging using the DMA engine (CIK).
3552 * Used by the radeon ttm implementation to move pages if
3553 * registered as the asic copy callback.
3554 */
3555int cik_copy_dma(struct radeon_device *rdev,
3556 uint64_t src_offset, uint64_t dst_offset,
3557 unsigned num_gpu_pages,
3558 struct radeon_fence **fence)
3559{
3560 struct radeon_semaphore *sem = NULL;
3561 int ring_index = rdev->asic->copy.dma_ring_index;
3562 struct radeon_ring *ring = &rdev->ring[ring_index];
3563 u32 size_in_bytes, cur_size_in_bytes;
3564 int i, num_loops;
3565 int r = 0;
3566
3567 r = radeon_semaphore_create(rdev, &sem);
3568 if (r) {
3569 DRM_ERROR("radeon: moving bo (%d).\n", r);
3570 return r;
3571 }
3572
3573 size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT);
3574 num_loops = DIV_ROUND_UP(size_in_bytes, 0x1fffff);
3575 r = radeon_ring_lock(rdev, ring, num_loops * 7 + 14);
3576 if (r) {
3577 DRM_ERROR("radeon: moving bo (%d).\n", r);
3578 radeon_semaphore_free(rdev, &sem, NULL);
3579 return r;
3580 }
3581
3582 if (radeon_fence_need_sync(*fence, ring->idx)) {
3583 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
3584 ring->idx);
3585 radeon_fence_note_sync(*fence, ring->idx);
3586 } else {
3587 radeon_semaphore_free(rdev, &sem, NULL);
3588 }
3589
3590 for (i = 0; i < num_loops; i++) {
3591 cur_size_in_bytes = size_in_bytes;
3592 if (cur_size_in_bytes > 0x1fffff)
3593 cur_size_in_bytes = 0x1fffff;
3594 size_in_bytes -= cur_size_in_bytes;
3595 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0));
3596 radeon_ring_write(ring, cur_size_in_bytes);
3597 radeon_ring_write(ring, 0); /* src/dst endian swap */
3598 radeon_ring_write(ring, src_offset & 0xffffffff);
3599 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xffffffff);
3600 radeon_ring_write(ring, dst_offset & 0xfffffffc);
3601 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xffffffff);
3602 src_offset += cur_size_in_bytes;
3603 dst_offset += cur_size_in_bytes;
3604 }
3605
3606 r = radeon_fence_emit(rdev, fence, ring->idx);
3607 if (r) {
3608 radeon_ring_unlock_undo(rdev, ring);
3609 return r;
3610 }
3611
3612 radeon_ring_unlock_commit(rdev, ring);
3613 radeon_semaphore_free(rdev, &sem, *fence);
3614
3615 return r;
3616}
3617
3618/**
3619 * cik_sdma_ring_test - simple async dma engine test
3620 *
3621 * @rdev: radeon_device pointer
3622 * @ring: radeon_ring structure holding ring information
3623 *
3624 * Test the DMA engine by writing using it to write an
3625 * value to memory. (CIK).
3626 * Returns 0 for success, error for failure.
3627 */
3628int cik_sdma_ring_test(struct radeon_device *rdev,
3629 struct radeon_ring *ring)
3630{
3631 unsigned i;
3632 int r;
3633 void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
3634 u32 tmp;
3635
3636 if (!ptr) {
3637 DRM_ERROR("invalid vram scratch pointer\n");
3638 return -EINVAL;
3639 }
3640
3641 tmp = 0xCAFEDEAD;
3642 writel(tmp, ptr);
3643
3644 r = radeon_ring_lock(rdev, ring, 4);
3645 if (r) {
3646 DRM_ERROR("radeon: dma failed to lock ring %d (%d).\n", ring->idx, r);
3647 return r;
3648 }
3649 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0));
3650 radeon_ring_write(ring, rdev->vram_scratch.gpu_addr & 0xfffffffc);
3651 radeon_ring_write(ring, upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xffffffff);
3652 radeon_ring_write(ring, 1); /* number of DWs to follow */
3653 radeon_ring_write(ring, 0xDEADBEEF);
3654 radeon_ring_unlock_commit(rdev, ring);
3655
3656 for (i = 0; i < rdev->usec_timeout; i++) {
3657 tmp = readl(ptr);
3658 if (tmp == 0xDEADBEEF)
3659 break;
3660 DRM_UDELAY(1);
3661 }
3662
3663 if (i < rdev->usec_timeout) {
3664 DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
3665 } else {
3666 DRM_ERROR("radeon: ring %d test failed (0x%08X)\n",
3667 ring->idx, tmp);
3668 r = -EINVAL;
3669 }
3670 return r;
3671}
3672
3673/**
3674 * cik_sdma_ib_test - test an IB on the DMA engine
3675 *
3676 * @rdev: radeon_device pointer
3677 * @ring: radeon_ring structure holding ring information
3678 *
3679 * Test a simple IB in the DMA ring (CIK).
3680 * Returns 0 on success, error on failure.
3681 */
3682int cik_sdma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
3683{
3684 struct radeon_ib ib;
3685 unsigned i;
3686 int r;
3687 void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
3688 u32 tmp = 0;
3689
3690 if (!ptr) {
3691 DRM_ERROR("invalid vram scratch pointer\n");
3692 return -EINVAL;
3693 }
3694
3695 tmp = 0xCAFEDEAD;
3696 writel(tmp, ptr);
3697
3698 r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
3699 if (r) {
3700 DRM_ERROR("radeon: failed to get ib (%d).\n", r);
3701 return r;
3702 }
3703
3704 ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
3705 ib.ptr[1] = rdev->vram_scratch.gpu_addr & 0xfffffffc;
3706 ib.ptr[2] = upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xffffffff;
3707 ib.ptr[3] = 1;
3708 ib.ptr[4] = 0xDEADBEEF;
3709 ib.length_dw = 5;
3710
3711 r = radeon_ib_schedule(rdev, &ib, NULL);
3712 if (r) {
3713 radeon_ib_free(rdev, &ib);
3714 DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
3715 return r;
3716 }
3717 r = radeon_fence_wait(ib.fence, false);
3718 if (r) {
3719 DRM_ERROR("radeon: fence wait failed (%d).\n", r);
3720 return r;
3721 }
3722 for (i = 0; i < rdev->usec_timeout; i++) {
3723 tmp = readl(ptr);
3724 if (tmp == 0xDEADBEEF)
3725 break;
3726 DRM_UDELAY(1);
3727 }
3728 if (i < rdev->usec_timeout) {
3729 DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i);
3730 } else {
3731 DRM_ERROR("radeon: ib test failed (0x%08X)\n", tmp);
3732 r = -EINVAL;
3733 }
3734 radeon_ib_free(rdev, &ib);
3735 return r;
3736}
3737
3738
3739static void cik_print_gpu_status_regs(struct radeon_device *rdev) 4030static void cik_print_gpu_status_regs(struct radeon_device *rdev)
3740{ 4031{
3741 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", 4032 dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n",
@@ -3785,7 +4076,7 @@ static void cik_print_gpu_status_regs(struct radeon_device *rdev)
3785 * mask to be used by cik_gpu_soft_reset(). 4076 * mask to be used by cik_gpu_soft_reset().
3786 * Returns a mask of the blocks to be reset. 4077 * Returns a mask of the blocks to be reset.
3787 */ 4078 */
3788static u32 cik_gpu_check_soft_reset(struct radeon_device *rdev) 4079u32 cik_gpu_check_soft_reset(struct radeon_device *rdev)
3789{ 4080{
3790 u32 reset_mask = 0; 4081 u32 reset_mask = 0;
3791 u32 tmp; 4082 u32 tmp;
@@ -4036,34 +4327,6 @@ bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
4036 return radeon_ring_test_lockup(rdev, ring); 4327 return radeon_ring_test_lockup(rdev, ring);
4037} 4328}
4038 4329
4039/**
4040 * cik_sdma_is_lockup - Check if the DMA engine is locked up
4041 *
4042 * @rdev: radeon_device pointer
4043 * @ring: radeon_ring structure holding ring information
4044 *
4045 * Check if the async DMA engine is locked up (CIK).
4046 * Returns true if the engine appears to be locked up, false if not.
4047 */
4048bool cik_sdma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
4049{
4050 u32 reset_mask = cik_gpu_check_soft_reset(rdev);
4051 u32 mask;
4052
4053 if (ring->idx == R600_RING_TYPE_DMA_INDEX)
4054 mask = RADEON_RESET_DMA;
4055 else
4056 mask = RADEON_RESET_DMA1;
4057
4058 if (!(reset_mask & mask)) {
4059 radeon_ring_lockup_update(ring);
4060 return false;
4061 }
4062 /* force ring activities */
4063 radeon_ring_force_activity(rdev, ring);
4064 return radeon_ring_test_lockup(rdev, ring);
4065}
4066
4067/* MC */ 4330/* MC */
4068/** 4331/**
4069 * cik_mc_program - program the GPU memory controller 4332 * cik_mc_program - program the GPU memory controller
@@ -4320,6 +4583,7 @@ static int cik_pcie_gart_enable(struct radeon_device *rdev)
4320 4583
4321 /* XXX SH_MEM regs */ 4584 /* XXX SH_MEM regs */
4322 /* where to put LDS, scratch, GPUVM in FSA64 space */ 4585 /* where to put LDS, scratch, GPUVM in FSA64 space */
4586 mutex_lock(&rdev->srbm_mutex);
4323 for (i = 0; i < 16; i++) { 4587 for (i = 0; i < 16; i++) {
4324 cik_srbm_select(rdev, 0, 0, 0, i); 4588 cik_srbm_select(rdev, 0, 0, 0, i);
4325 /* CP and shaders */ 4589 /* CP and shaders */
@@ -4335,6 +4599,7 @@ static int cik_pcie_gart_enable(struct radeon_device *rdev)
4335 /* XXX SDMA RLC - todo */ 4599 /* XXX SDMA RLC - todo */
4336 } 4600 }
4337 cik_srbm_select(rdev, 0, 0, 0, 0); 4601 cik_srbm_select(rdev, 0, 0, 0, 0);
4602 mutex_unlock(&rdev->srbm_mutex);
4338 4603
4339 cik_pcie_gart_tlb_flush(rdev); 4604 cik_pcie_gart_tlb_flush(rdev);
4340 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 4605 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
@@ -4598,131 +4863,8 @@ void cik_vm_set_page(struct radeon_device *rdev,
4598 } 4863 }
4599 } else { 4864 } else {
4600 /* DMA */ 4865 /* DMA */
4601 if (flags & RADEON_VM_PAGE_SYSTEM) { 4866 cik_sdma_vm_set_page(rdev, ib, pe, addr, count, incr, flags);
4602 while (count) {
4603 ndw = count * 2;
4604 if (ndw > 0xFFFFE)
4605 ndw = 0xFFFFE;
4606
4607 /* for non-physically contiguous pages (system) */
4608 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
4609 ib->ptr[ib->length_dw++] = pe;
4610 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
4611 ib->ptr[ib->length_dw++] = ndw;
4612 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
4613 if (flags & RADEON_VM_PAGE_SYSTEM) {
4614 value = radeon_vm_map_gart(rdev, addr);
4615 value &= 0xFFFFFFFFFFFFF000ULL;
4616 } else if (flags & RADEON_VM_PAGE_VALID) {
4617 value = addr;
4618 } else {
4619 value = 0;
4620 }
4621 addr += incr;
4622 value |= r600_flags;
4623 ib->ptr[ib->length_dw++] = value;
4624 ib->ptr[ib->length_dw++] = upper_32_bits(value);
4625 }
4626 }
4627 } else {
4628 while (count) {
4629 ndw = count;
4630 if (ndw > 0x7FFFF)
4631 ndw = 0x7FFFF;
4632
4633 if (flags & RADEON_VM_PAGE_VALID)
4634 value = addr;
4635 else
4636 value = 0;
4637 /* for physically contiguous pages (vram) */
4638 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_GENERATE_PTE_PDE, 0, 0);
4639 ib->ptr[ib->length_dw++] = pe; /* dst addr */
4640 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
4641 ib->ptr[ib->length_dw++] = r600_flags; /* mask */
4642 ib->ptr[ib->length_dw++] = 0;
4643 ib->ptr[ib->length_dw++] = value; /* value */
4644 ib->ptr[ib->length_dw++] = upper_32_bits(value);
4645 ib->ptr[ib->length_dw++] = incr; /* increment size */
4646 ib->ptr[ib->length_dw++] = 0;
4647 ib->ptr[ib->length_dw++] = ndw; /* number of entries */
4648 pe += ndw * 8;
4649 addr += ndw * incr;
4650 count -= ndw;
4651 }
4652 }
4653 while (ib->length_dw & 0x7)
4654 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0);
4655 }
4656}
4657
4658/**
4659 * cik_dma_vm_flush - cik vm flush using sDMA
4660 *
4661 * @rdev: radeon_device pointer
4662 *
4663 * Update the page table base and flush the VM TLB
4664 * using sDMA (CIK).
4665 */
4666void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
4667{
4668 struct radeon_ring *ring = &rdev->ring[ridx];
4669 u32 extra_bits = (SDMA_POLL_REG_MEM_EXTRA_OP(1) |
4670 SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */
4671 u32 ref_and_mask;
4672
4673 if (vm == NULL)
4674 return;
4675
4676 if (ridx == R600_RING_TYPE_DMA_INDEX)
4677 ref_and_mask = SDMA0;
4678 else
4679 ref_and_mask = SDMA1;
4680
4681 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
4682 if (vm->id < 8) {
4683 radeon_ring_write(ring, (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2);
4684 } else {
4685 radeon_ring_write(ring, (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2);
4686 } 4867 }
4687 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
4688
4689 /* update SH_MEM_* regs */
4690 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
4691 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
4692 radeon_ring_write(ring, VMID(vm->id));
4693
4694 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
4695 radeon_ring_write(ring, SH_MEM_BASES >> 2);
4696 radeon_ring_write(ring, 0);
4697
4698 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
4699 radeon_ring_write(ring, SH_MEM_CONFIG >> 2);
4700 radeon_ring_write(ring, 0);
4701
4702 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
4703 radeon_ring_write(ring, SH_MEM_APE1_BASE >> 2);
4704 radeon_ring_write(ring, 1);
4705
4706 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
4707 radeon_ring_write(ring, SH_MEM_APE1_LIMIT >> 2);
4708 radeon_ring_write(ring, 0);
4709
4710 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
4711 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
4712 radeon_ring_write(ring, VMID(0));
4713
4714 /* flush HDP */
4715 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_POLL_REG_MEM, 0, extra_bits));
4716 radeon_ring_write(ring, GPU_HDP_FLUSH_DONE);
4717 radeon_ring_write(ring, GPU_HDP_FLUSH_REQ);
4718 radeon_ring_write(ring, ref_and_mask); /* REFERENCE */
4719 radeon_ring_write(ring, ref_and_mask); /* MASK */
4720 radeon_ring_write(ring, (4 << 16) | 10); /* RETRY_COUNT, POLL_INTERVAL */
4721
4722 /* flush TLB */
4723 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
4724 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
4725 radeon_ring_write(ring, 1 << vm->id);
4726} 4868}
4727 4869
4728/* 4870/*
@@ -4731,31 +4873,34 @@ void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm
4731 * variety of functions, the most important of which is 4873 * variety of functions, the most important of which is
4732 * the interrupt controller. 4874 * the interrupt controller.
4733 */ 4875 */
4734/** 4876static void cik_enable_gui_idle_interrupt(struct radeon_device *rdev,
4735 * cik_rlc_stop - stop the RLC ME 4877 bool enable)
4736 *
4737 * @rdev: radeon_device pointer
4738 *
4739 * Halt the RLC ME (MicroEngine) (CIK).
4740 */
4741static void cik_rlc_stop(struct radeon_device *rdev)
4742{ 4878{
4743 int i, j, k; 4879 u32 tmp = RREG32(CP_INT_CNTL_RING0);
4744 u32 mask, tmp;
4745 4880
4746 tmp = RREG32(CP_INT_CNTL_RING0); 4881 if (enable)
4747 tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); 4882 tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4883 else
4884 tmp &= ~(CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4748 WREG32(CP_INT_CNTL_RING0, tmp); 4885 WREG32(CP_INT_CNTL_RING0, tmp);
4886}
4749 4887
4750 RREG32(CB_CGTT_SCLK_CTRL); 4888static void cik_enable_lbpw(struct radeon_device *rdev, bool enable)
4751 RREG32(CB_CGTT_SCLK_CTRL); 4889{
4752 RREG32(CB_CGTT_SCLK_CTRL); 4890 u32 tmp;
4753 RREG32(CB_CGTT_SCLK_CTRL);
4754 4891
4755 tmp = RREG32(RLC_CGCG_CGLS_CTRL) & 0xfffffffc; 4892 tmp = RREG32(RLC_LB_CNTL);
4756 WREG32(RLC_CGCG_CGLS_CTRL, tmp); 4893 if (enable)
4894 tmp |= LOAD_BALANCE_ENABLE;
4895 else
4896 tmp &= ~LOAD_BALANCE_ENABLE;
4897 WREG32(RLC_LB_CNTL, tmp);
4898}
4757 4899
4758 WREG32(RLC_CNTL, 0); 4900static void cik_wait_for_rlc_serdes(struct radeon_device *rdev)
4901{
4902 u32 i, j, k;
4903 u32 mask;
4759 4904
4760 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) { 4905 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
4761 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) { 4906 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
@@ -4777,6 +4922,84 @@ static void cik_rlc_stop(struct radeon_device *rdev)
4777 } 4922 }
4778} 4923}
4779 4924
4925static void cik_update_rlc(struct radeon_device *rdev, u32 rlc)
4926{
4927 u32 tmp;
4928
4929 tmp = RREG32(RLC_CNTL);
4930 if (tmp != rlc)
4931 WREG32(RLC_CNTL, rlc);
4932}
4933
4934static u32 cik_halt_rlc(struct radeon_device *rdev)
4935{
4936 u32 data, orig;
4937
4938 orig = data = RREG32(RLC_CNTL);
4939
4940 if (data & RLC_ENABLE) {
4941 u32 i;
4942
4943 data &= ~RLC_ENABLE;
4944 WREG32(RLC_CNTL, data);
4945
4946 for (i = 0; i < rdev->usec_timeout; i++) {
4947 if ((RREG32(RLC_GPM_STAT) & RLC_GPM_BUSY) == 0)
4948 break;
4949 udelay(1);
4950 }
4951
4952 cik_wait_for_rlc_serdes(rdev);
4953 }
4954
4955 return orig;
4956}
4957
4958void cik_enter_rlc_safe_mode(struct radeon_device *rdev)
4959{
4960 u32 tmp, i, mask;
4961
4962 tmp = REQ | MESSAGE(MSG_ENTER_RLC_SAFE_MODE);
4963 WREG32(RLC_GPR_REG2, tmp);
4964
4965 mask = GFX_POWER_STATUS | GFX_CLOCK_STATUS;
4966 for (i = 0; i < rdev->usec_timeout; i++) {
4967 if ((RREG32(RLC_GPM_STAT) & mask) == mask)
4968 break;
4969 udelay(1);
4970 }
4971
4972 for (i = 0; i < rdev->usec_timeout; i++) {
4973 if ((RREG32(RLC_GPR_REG2) & REQ) == 0)
4974 break;
4975 udelay(1);
4976 }
4977}
4978
4979void cik_exit_rlc_safe_mode(struct radeon_device *rdev)
4980{
4981 u32 tmp;
4982
4983 tmp = REQ | MESSAGE(MSG_EXIT_RLC_SAFE_MODE);
4984 WREG32(RLC_GPR_REG2, tmp);
4985}
4986
4987/**
4988 * cik_rlc_stop - stop the RLC ME
4989 *
4990 * @rdev: radeon_device pointer
4991 *
4992 * Halt the RLC ME (MicroEngine) (CIK).
4993 */
4994static void cik_rlc_stop(struct radeon_device *rdev)
4995{
4996 WREG32(RLC_CNTL, 0);
4997
4998 cik_enable_gui_idle_interrupt(rdev, false);
4999
5000 cik_wait_for_rlc_serdes(rdev);
5001}
5002
4780/** 5003/**
4781 * cik_rlc_start - start the RLC ME 5004 * cik_rlc_start - start the RLC ME
4782 * 5005 *
@@ -4786,13 +5009,9 @@ static void cik_rlc_stop(struct radeon_device *rdev)
4786 */ 5009 */
4787static void cik_rlc_start(struct radeon_device *rdev) 5010static void cik_rlc_start(struct radeon_device *rdev)
4788{ 5011{
4789 u32 tmp;
4790
4791 WREG32(RLC_CNTL, RLC_ENABLE); 5012 WREG32(RLC_CNTL, RLC_ENABLE);
4792 5013
4793 tmp = RREG32(CP_INT_CNTL_RING0); 5014 cik_enable_gui_idle_interrupt(rdev, true);
4794 tmp |= (CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
4795 WREG32(CP_INT_CNTL_RING0, tmp);
4796 5015
4797 udelay(50); 5016 udelay(50);
4798} 5017}
@@ -4808,8 +5027,7 @@ static void cik_rlc_start(struct radeon_device *rdev)
4808 */ 5027 */
4809static int cik_rlc_resume(struct radeon_device *rdev) 5028static int cik_rlc_resume(struct radeon_device *rdev)
4810{ 5029{
4811 u32 i, size; 5030 u32 i, size, tmp;
4812 u32 clear_state_info[3];
4813 const __be32 *fw_data; 5031 const __be32 *fw_data;
4814 5032
4815 if (!rdev->rlc_fw) 5033 if (!rdev->rlc_fw)
@@ -4830,12 +5048,15 @@ static int cik_rlc_resume(struct radeon_device *rdev)
4830 5048
4831 cik_rlc_stop(rdev); 5049 cik_rlc_stop(rdev);
4832 5050
4833 WREG32(GRBM_SOFT_RESET, SOFT_RESET_RLC); 5051 /* disable CG */
4834 RREG32(GRBM_SOFT_RESET); 5052 tmp = RREG32(RLC_CGCG_CGLS_CTRL) & 0xfffffffc;
4835 udelay(50); 5053 WREG32(RLC_CGCG_CGLS_CTRL, tmp);
4836 WREG32(GRBM_SOFT_RESET, 0); 5054
4837 RREG32(GRBM_SOFT_RESET); 5055 si_rlc_reset(rdev);
4838 udelay(50); 5056
5057 cik_init_pg(rdev);
5058
5059 cik_init_cg(rdev);
4839 5060
4840 WREG32(RLC_LB_CNTR_INIT, 0); 5061 WREG32(RLC_LB_CNTR_INIT, 0);
4841 WREG32(RLC_LB_CNTR_MAX, 0x00008000); 5062 WREG32(RLC_LB_CNTR_MAX, 0x00008000);
@@ -4854,20 +5075,757 @@ static int cik_rlc_resume(struct radeon_device *rdev)
4854 WREG32(RLC_GPM_UCODE_DATA, be32_to_cpup(fw_data++)); 5075 WREG32(RLC_GPM_UCODE_DATA, be32_to_cpup(fw_data++));
4855 WREG32(RLC_GPM_UCODE_ADDR, 0); 5076 WREG32(RLC_GPM_UCODE_ADDR, 0);
4856 5077
4857 /* XXX */ 5078 /* XXX - find out what chips support lbpw */
4858 clear_state_info[0] = 0;//upper_32_bits(rdev->rlc.save_restore_gpu_addr); 5079 cik_enable_lbpw(rdev, false);
4859 clear_state_info[1] = 0;//rdev->rlc.save_restore_gpu_addr; 5080
4860 clear_state_info[2] = 0;//cik_default_size; 5081 if (rdev->family == CHIP_BONAIRE)
4861 WREG32(RLC_GPM_SCRATCH_ADDR, 0x3d); 5082 WREG32(RLC_DRIVER_DMA_STATUS, 0);
4862 for (i = 0; i < 3; i++)
4863 WREG32(RLC_GPM_SCRATCH_DATA, clear_state_info[i]);
4864 WREG32(RLC_DRIVER_DMA_STATUS, 0);
4865 5083
4866 cik_rlc_start(rdev); 5084 cik_rlc_start(rdev);
4867 5085
4868 return 0; 5086 return 0;
4869} 5087}
4870 5088
5089static void cik_enable_cgcg(struct radeon_device *rdev, bool enable)
5090{
5091 u32 data, orig, tmp, tmp2;
5092
5093 orig = data = RREG32(RLC_CGCG_CGLS_CTRL);
5094
5095 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG)) {
5096 cik_enable_gui_idle_interrupt(rdev, true);
5097
5098 tmp = cik_halt_rlc(rdev);
5099
5100 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5101 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
5102 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
5103 tmp2 = BPM_ADDR_MASK | CGCG_OVERRIDE_0 | CGLS_ENABLE;
5104 WREG32(RLC_SERDES_WR_CTRL, tmp2);
5105
5106 cik_update_rlc(rdev, tmp);
5107
5108 data |= CGCG_EN | CGLS_EN;
5109 } else {
5110 cik_enable_gui_idle_interrupt(rdev, false);
5111
5112 RREG32(CB_CGTT_SCLK_CTRL);
5113 RREG32(CB_CGTT_SCLK_CTRL);
5114 RREG32(CB_CGTT_SCLK_CTRL);
5115 RREG32(CB_CGTT_SCLK_CTRL);
5116
5117 data &= ~(CGCG_EN | CGLS_EN);
5118 }
5119
5120 if (orig != data)
5121 WREG32(RLC_CGCG_CGLS_CTRL, data);
5122
5123}
5124
5125static void cik_enable_mgcg(struct radeon_device *rdev, bool enable)
5126{
5127 u32 data, orig, tmp = 0;
5128
5129 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG)) {
5130 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) {
5131 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CP_LS) {
5132 orig = data = RREG32(CP_MEM_SLP_CNTL);
5133 data |= CP_MEM_LS_EN;
5134 if (orig != data)
5135 WREG32(CP_MEM_SLP_CNTL, data);
5136 }
5137 }
5138
5139 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
5140 data &= 0xfffffffd;
5141 if (orig != data)
5142 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
5143
5144 tmp = cik_halt_rlc(rdev);
5145
5146 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5147 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
5148 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
5149 data = BPM_ADDR_MASK | MGCG_OVERRIDE_0;
5150 WREG32(RLC_SERDES_WR_CTRL, data);
5151
5152 cik_update_rlc(rdev, tmp);
5153
5154 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS) {
5155 orig = data = RREG32(CGTS_SM_CTRL_REG);
5156 data &= ~SM_MODE_MASK;
5157 data |= SM_MODE(0x2);
5158 data |= SM_MODE_ENABLE;
5159 data &= ~CGTS_OVERRIDE;
5160 if ((rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGLS) &&
5161 (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGTS_LS))
5162 data &= ~CGTS_LS_OVERRIDE;
5163 data &= ~ON_MONITOR_ADD_MASK;
5164 data |= ON_MONITOR_ADD_EN;
5165 data |= ON_MONITOR_ADD(0x96);
5166 if (orig != data)
5167 WREG32(CGTS_SM_CTRL_REG, data);
5168 }
5169 } else {
5170 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
5171 data |= 0x00000002;
5172 if (orig != data)
5173 WREG32(RLC_CGTT_MGCG_OVERRIDE, data);
5174
5175 data = RREG32(RLC_MEM_SLP_CNTL);
5176 if (data & RLC_MEM_LS_EN) {
5177 data &= ~RLC_MEM_LS_EN;
5178 WREG32(RLC_MEM_SLP_CNTL, data);
5179 }
5180
5181 data = RREG32(CP_MEM_SLP_CNTL);
5182 if (data & CP_MEM_LS_EN) {
5183 data &= ~CP_MEM_LS_EN;
5184 WREG32(CP_MEM_SLP_CNTL, data);
5185 }
5186
5187 orig = data = RREG32(CGTS_SM_CTRL_REG);
5188 data |= CGTS_OVERRIDE | CGTS_LS_OVERRIDE;
5189 if (orig != data)
5190 WREG32(CGTS_SM_CTRL_REG, data);
5191
5192 tmp = cik_halt_rlc(rdev);
5193
5194 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5195 WREG32(RLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);
5196 WREG32(RLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
5197 data = BPM_ADDR_MASK | MGCG_OVERRIDE_1;
5198 WREG32(RLC_SERDES_WR_CTRL, data);
5199
5200 cik_update_rlc(rdev, tmp);
5201 }
5202}
5203
5204static const u32 mc_cg_registers[] =
5205{
5206 MC_HUB_MISC_HUB_CG,
5207 MC_HUB_MISC_SIP_CG,
5208 MC_HUB_MISC_VM_CG,
5209 MC_XPB_CLK_GAT,
5210 ATC_MISC_CG,
5211 MC_CITF_MISC_WR_CG,
5212 MC_CITF_MISC_RD_CG,
5213 MC_CITF_MISC_VM_CG,
5214 VM_L2_CG,
5215};
5216
5217static void cik_enable_mc_ls(struct radeon_device *rdev,
5218 bool enable)
5219{
5220 int i;
5221 u32 orig, data;
5222
5223 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
5224 orig = data = RREG32(mc_cg_registers[i]);
5225 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_LS))
5226 data |= MC_LS_ENABLE;
5227 else
5228 data &= ~MC_LS_ENABLE;
5229 if (data != orig)
5230 WREG32(mc_cg_registers[i], data);
5231 }
5232}
5233
5234static void cik_enable_mc_mgcg(struct radeon_device *rdev,
5235 bool enable)
5236{
5237 int i;
5238 u32 orig, data;
5239
5240 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
5241 orig = data = RREG32(mc_cg_registers[i]);
5242 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_MGCG))
5243 data |= MC_CG_ENABLE;
5244 else
5245 data &= ~MC_CG_ENABLE;
5246 if (data != orig)
5247 WREG32(mc_cg_registers[i], data);
5248 }
5249}
5250
5251static void cik_enable_sdma_mgcg(struct radeon_device *rdev,
5252 bool enable)
5253{
5254 u32 orig, data;
5255
5256 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_MGCG)) {
5257 WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, 0x00000100);
5258 WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, 0x00000100);
5259 } else {
5260 orig = data = RREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET);
5261 data |= 0xff000000;
5262 if (data != orig)
5263 WREG32(SDMA0_CLK_CTRL + SDMA0_REGISTER_OFFSET, data);
5264
5265 orig = data = RREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET);
5266 data |= 0xff000000;
5267 if (data != orig)
5268 WREG32(SDMA0_CLK_CTRL + SDMA1_REGISTER_OFFSET, data);
5269 }
5270}
5271
5272static void cik_enable_sdma_mgls(struct radeon_device *rdev,
5273 bool enable)
5274{
5275 u32 orig, data;
5276
5277 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_LS)) {
5278 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
5279 data |= 0x100;
5280 if (orig != data)
5281 WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
5282
5283 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
5284 data |= 0x100;
5285 if (orig != data)
5286 WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
5287 } else {
5288 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET);
5289 data &= ~0x100;
5290 if (orig != data)
5291 WREG32(SDMA0_POWER_CNTL + SDMA0_REGISTER_OFFSET, data);
5292
5293 orig = data = RREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET);
5294 data &= ~0x100;
5295 if (orig != data)
5296 WREG32(SDMA0_POWER_CNTL + SDMA1_REGISTER_OFFSET, data);
5297 }
5298}
5299
5300static void cik_enable_uvd_mgcg(struct radeon_device *rdev,
5301 bool enable)
5302{
5303 u32 orig, data;
5304
5305 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_UVD_MGCG)) {
5306 data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
5307 data = 0xfff;
5308 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
5309
5310 orig = data = RREG32(UVD_CGC_CTRL);
5311 data |= DCM;
5312 if (orig != data)
5313 WREG32(UVD_CGC_CTRL, data);
5314 } else {
5315 data = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
5316 data &= ~0xfff;
5317 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, data);
5318
5319 orig = data = RREG32(UVD_CGC_CTRL);
5320 data &= ~DCM;
5321 if (orig != data)
5322 WREG32(UVD_CGC_CTRL, data);
5323 }
5324}
5325
5326static void cik_enable_bif_mgls(struct radeon_device *rdev,
5327 bool enable)
5328{
5329 u32 orig, data;
5330
5331 orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
5332
5333 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_BIF_LS))
5334 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN |
5335 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN;
5336 else
5337 data &= ~(SLV_MEM_LS_EN | MST_MEM_LS_EN |
5338 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN);
5339
5340 if (orig != data)
5341 WREG32_PCIE_PORT(PCIE_CNTL2, data);
5342}
5343
5344static void cik_enable_hdp_mgcg(struct radeon_device *rdev,
5345 bool enable)
5346{
5347 u32 orig, data;
5348
5349 orig = data = RREG32(HDP_HOST_PATH_CNTL);
5350
5351 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_MGCG))
5352 data &= ~CLOCK_GATING_DIS;
5353 else
5354 data |= CLOCK_GATING_DIS;
5355
5356 if (orig != data)
5357 WREG32(HDP_HOST_PATH_CNTL, data);
5358}
5359
5360static void cik_enable_hdp_ls(struct radeon_device *rdev,
5361 bool enable)
5362{
5363 u32 orig, data;
5364
5365 orig = data = RREG32(HDP_MEM_POWER_LS);
5366
5367 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_LS))
5368 data |= HDP_LS_ENABLE;
5369 else
5370 data &= ~HDP_LS_ENABLE;
5371
5372 if (orig != data)
5373 WREG32(HDP_MEM_POWER_LS, data);
5374}
5375
5376void cik_update_cg(struct radeon_device *rdev,
5377 u32 block, bool enable)
5378{
5379 if (block & RADEON_CG_BLOCK_GFX) {
5380 /* order matters! */
5381 if (enable) {
5382 cik_enable_mgcg(rdev, true);
5383 cik_enable_cgcg(rdev, true);
5384 } else {
5385 cik_enable_cgcg(rdev, false);
5386 cik_enable_mgcg(rdev, false);
5387 }
5388 }
5389
5390 if (block & RADEON_CG_BLOCK_MC) {
5391 if (!(rdev->flags & RADEON_IS_IGP)) {
5392 cik_enable_mc_mgcg(rdev, enable);
5393 cik_enable_mc_ls(rdev, enable);
5394 }
5395 }
5396
5397 if (block & RADEON_CG_BLOCK_SDMA) {
5398 cik_enable_sdma_mgcg(rdev, enable);
5399 cik_enable_sdma_mgls(rdev, enable);
5400 }
5401
5402 if (block & RADEON_CG_BLOCK_BIF) {
5403 cik_enable_bif_mgls(rdev, enable);
5404 }
5405
5406 if (block & RADEON_CG_BLOCK_UVD) {
5407 if (rdev->has_uvd)
5408 cik_enable_uvd_mgcg(rdev, enable);
5409 }
5410
5411 if (block & RADEON_CG_BLOCK_HDP) {
5412 cik_enable_hdp_mgcg(rdev, enable);
5413 cik_enable_hdp_ls(rdev, enable);
5414 }
5415}
5416
5417static void cik_init_cg(struct radeon_device *rdev)
5418{
5419
5420 cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, true);
5421
5422 if (rdev->has_uvd)
5423 si_init_uvd_internal_cg(rdev);
5424
5425 cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
5426 RADEON_CG_BLOCK_SDMA |
5427 RADEON_CG_BLOCK_BIF |
5428 RADEON_CG_BLOCK_UVD |
5429 RADEON_CG_BLOCK_HDP), true);
5430}
5431
5432static void cik_fini_cg(struct radeon_device *rdev)
5433{
5434 cik_update_cg(rdev, (RADEON_CG_BLOCK_MC |
5435 RADEON_CG_BLOCK_SDMA |
5436 RADEON_CG_BLOCK_BIF |
5437 RADEON_CG_BLOCK_UVD |
5438 RADEON_CG_BLOCK_HDP), false);
5439
5440 cik_update_cg(rdev, RADEON_CG_BLOCK_GFX, false);
5441}
5442
5443static void cik_enable_sck_slowdown_on_pu(struct radeon_device *rdev,
5444 bool enable)
5445{
5446 u32 data, orig;
5447
5448 orig = data = RREG32(RLC_PG_CNTL);
5449 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
5450 data |= SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
5451 else
5452 data &= ~SMU_CLK_SLOWDOWN_ON_PU_ENABLE;
5453 if (orig != data)
5454 WREG32(RLC_PG_CNTL, data);
5455}
5456
5457static void cik_enable_sck_slowdown_on_pd(struct radeon_device *rdev,
5458 bool enable)
5459{
5460 u32 data, orig;
5461
5462 orig = data = RREG32(RLC_PG_CNTL);
5463 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_RLC_SMU_HS))
5464 data |= SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
5465 else
5466 data &= ~SMU_CLK_SLOWDOWN_ON_PD_ENABLE;
5467 if (orig != data)
5468 WREG32(RLC_PG_CNTL, data);
5469}
5470
5471static void cik_enable_cp_pg(struct radeon_device *rdev, bool enable)
5472{
5473 u32 data, orig;
5474
5475 orig = data = RREG32(RLC_PG_CNTL);
5476 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_CP))
5477 data &= ~DISABLE_CP_PG;
5478 else
5479 data |= DISABLE_CP_PG;
5480 if (orig != data)
5481 WREG32(RLC_PG_CNTL, data);
5482}
5483
5484static void cik_enable_gds_pg(struct radeon_device *rdev, bool enable)
5485{
5486 u32 data, orig;
5487
5488 orig = data = RREG32(RLC_PG_CNTL);
5489 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GDS))
5490 data &= ~DISABLE_GDS_PG;
5491 else
5492 data |= DISABLE_GDS_PG;
5493 if (orig != data)
5494 WREG32(RLC_PG_CNTL, data);
5495}
5496
5497#define CP_ME_TABLE_SIZE 96
5498#define CP_ME_TABLE_OFFSET 2048
5499#define CP_MEC_TABLE_OFFSET 4096
5500
5501void cik_init_cp_pg_table(struct radeon_device *rdev)
5502{
5503 const __be32 *fw_data;
5504 volatile u32 *dst_ptr;
5505 int me, i, max_me = 4;
5506 u32 bo_offset = 0;
5507 u32 table_offset;
5508
5509 if (rdev->family == CHIP_KAVERI)
5510 max_me = 5;
5511
5512 if (rdev->rlc.cp_table_ptr == NULL)
5513 return;
5514
5515 /* write the cp table buffer */
5516 dst_ptr = rdev->rlc.cp_table_ptr;
5517 for (me = 0; me < max_me; me++) {
5518 if (me == 0) {
5519 fw_data = (const __be32 *)rdev->ce_fw->data;
5520 table_offset = CP_ME_TABLE_OFFSET;
5521 } else if (me == 1) {
5522 fw_data = (const __be32 *)rdev->pfp_fw->data;
5523 table_offset = CP_ME_TABLE_OFFSET;
5524 } else if (me == 2) {
5525 fw_data = (const __be32 *)rdev->me_fw->data;
5526 table_offset = CP_ME_TABLE_OFFSET;
5527 } else {
5528 fw_data = (const __be32 *)rdev->mec_fw->data;
5529 table_offset = CP_MEC_TABLE_OFFSET;
5530 }
5531
5532 for (i = 0; i < CP_ME_TABLE_SIZE; i ++) {
5533 dst_ptr[bo_offset + i] = be32_to_cpu(fw_data[table_offset + i]);
5534 }
5535 bo_offset += CP_ME_TABLE_SIZE;
5536 }
5537}
5538
5539static void cik_enable_gfx_cgpg(struct radeon_device *rdev,
5540 bool enable)
5541{
5542 u32 data, orig;
5543
5544 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG)) {
5545 orig = data = RREG32(RLC_PG_CNTL);
5546 data |= GFX_PG_ENABLE;
5547 if (orig != data)
5548 WREG32(RLC_PG_CNTL, data);
5549
5550 orig = data = RREG32(RLC_AUTO_PG_CTRL);
5551 data |= AUTO_PG_EN;
5552 if (orig != data)
5553 WREG32(RLC_AUTO_PG_CTRL, data);
5554 } else {
5555 orig = data = RREG32(RLC_PG_CNTL);
5556 data &= ~GFX_PG_ENABLE;
5557 if (orig != data)
5558 WREG32(RLC_PG_CNTL, data);
5559
5560 orig = data = RREG32(RLC_AUTO_PG_CTRL);
5561 data &= ~AUTO_PG_EN;
5562 if (orig != data)
5563 WREG32(RLC_AUTO_PG_CTRL, data);
5564
5565 data = RREG32(DB_RENDER_CONTROL);
5566 }
5567}
5568
5569static u32 cik_get_cu_active_bitmap(struct radeon_device *rdev, u32 se, u32 sh)
5570{
5571 u32 mask = 0, tmp, tmp1;
5572 int i;
5573
5574 cik_select_se_sh(rdev, se, sh);
5575 tmp = RREG32(CC_GC_SHADER_ARRAY_CONFIG);
5576 tmp1 = RREG32(GC_USER_SHADER_ARRAY_CONFIG);
5577 cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
5578
5579 tmp &= 0xffff0000;
5580
5581 tmp |= tmp1;
5582 tmp >>= 16;
5583
5584 for (i = 0; i < rdev->config.cik.max_cu_per_sh; i ++) {
5585 mask <<= 1;
5586 mask |= 1;
5587 }
5588
5589 return (~tmp) & mask;
5590}
5591
5592static void cik_init_ao_cu_mask(struct radeon_device *rdev)
5593{
5594 u32 i, j, k, active_cu_number = 0;
5595 u32 mask, counter, cu_bitmap;
5596 u32 tmp = 0;
5597
5598 for (i = 0; i < rdev->config.cik.max_shader_engines; i++) {
5599 for (j = 0; j < rdev->config.cik.max_sh_per_se; j++) {
5600 mask = 1;
5601 cu_bitmap = 0;
5602 counter = 0;
5603 for (k = 0; k < rdev->config.cik.max_cu_per_sh; k ++) {
5604 if (cik_get_cu_active_bitmap(rdev, i, j) & mask) {
5605 if (counter < 2)
5606 cu_bitmap |= mask;
5607 counter ++;
5608 }
5609 mask <<= 1;
5610 }
5611
5612 active_cu_number += counter;
5613 tmp |= (cu_bitmap << (i * 16 + j * 8));
5614 }
5615 }
5616
5617 WREG32(RLC_PG_AO_CU_MASK, tmp);
5618
5619 tmp = RREG32(RLC_MAX_PG_CU);
5620 tmp &= ~MAX_PU_CU_MASK;
5621 tmp |= MAX_PU_CU(active_cu_number);
5622 WREG32(RLC_MAX_PG_CU, tmp);
5623}
5624
5625static void cik_enable_gfx_static_mgpg(struct radeon_device *rdev,
5626 bool enable)
5627{
5628 u32 data, orig;
5629
5630 orig = data = RREG32(RLC_PG_CNTL);
5631 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_SMG))
5632 data |= STATIC_PER_CU_PG_ENABLE;
5633 else
5634 data &= ~STATIC_PER_CU_PG_ENABLE;
5635 if (orig != data)
5636 WREG32(RLC_PG_CNTL, data);
5637}
5638
5639static void cik_enable_gfx_dynamic_mgpg(struct radeon_device *rdev,
5640 bool enable)
5641{
5642 u32 data, orig;
5643
5644 orig = data = RREG32(RLC_PG_CNTL);
5645 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_DMG))
5646 data |= DYN_PER_CU_PG_ENABLE;
5647 else
5648 data &= ~DYN_PER_CU_PG_ENABLE;
5649 if (orig != data)
5650 WREG32(RLC_PG_CNTL, data);
5651}
5652
5653#define RLC_SAVE_AND_RESTORE_STARTING_OFFSET 0x90
5654#define RLC_CLEAR_STATE_DESCRIPTOR_OFFSET 0x3D
5655
5656static void cik_init_gfx_cgpg(struct radeon_device *rdev)
5657{
5658 u32 data, orig;
5659 u32 i;
5660
5661 if (rdev->rlc.cs_data) {
5662 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
5663 WREG32(RLC_GPM_SCRATCH_DATA, upper_32_bits(rdev->rlc.clear_state_gpu_addr));
5664 WREG32(RLC_GPM_SCRATCH_DATA, lower_32_bits(rdev->rlc.clear_state_gpu_addr));
5665 WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.clear_state_size);
5666 } else {
5667 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_CLEAR_STATE_DESCRIPTOR_OFFSET);
5668 for (i = 0; i < 3; i++)
5669 WREG32(RLC_GPM_SCRATCH_DATA, 0);
5670 }
5671 if (rdev->rlc.reg_list) {
5672 WREG32(RLC_GPM_SCRATCH_ADDR, RLC_SAVE_AND_RESTORE_STARTING_OFFSET);
5673 for (i = 0; i < rdev->rlc.reg_list_size; i++)
5674 WREG32(RLC_GPM_SCRATCH_DATA, rdev->rlc.reg_list[i]);
5675 }
5676
5677 orig = data = RREG32(RLC_PG_CNTL);
5678 data |= GFX_PG_SRC;
5679 if (orig != data)
5680 WREG32(RLC_PG_CNTL, data);
5681
5682 WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
5683 WREG32(RLC_CP_TABLE_RESTORE, rdev->rlc.cp_table_gpu_addr >> 8);
5684
5685 data = RREG32(CP_RB_WPTR_POLL_CNTL);
5686 data &= ~IDLE_POLL_COUNT_MASK;
5687 data |= IDLE_POLL_COUNT(0x60);
5688 WREG32(CP_RB_WPTR_POLL_CNTL, data);
5689
5690 data = 0x10101010;
5691 WREG32(RLC_PG_DELAY, data);
5692
5693 data = RREG32(RLC_PG_DELAY_2);
5694 data &= ~0xff;
5695 data |= 0x3;
5696 WREG32(RLC_PG_DELAY_2, data);
5697
5698 data = RREG32(RLC_AUTO_PG_CTRL);
5699 data &= ~GRBM_REG_SGIT_MASK;
5700 data |= GRBM_REG_SGIT(0x700);
5701 WREG32(RLC_AUTO_PG_CTRL, data);
5702
5703}
5704
5705static void cik_update_gfx_pg(struct radeon_device *rdev, bool enable)
5706{
5707 cik_enable_gfx_cgpg(rdev, enable);
5708 cik_enable_gfx_static_mgpg(rdev, enable);
5709 cik_enable_gfx_dynamic_mgpg(rdev, enable);
5710}
5711
5712u32 cik_get_csb_size(struct radeon_device *rdev)
5713{
5714 u32 count = 0;
5715 const struct cs_section_def *sect = NULL;
5716 const struct cs_extent_def *ext = NULL;
5717
5718 if (rdev->rlc.cs_data == NULL)
5719 return 0;
5720
5721 /* begin clear state */
5722 count += 2;
5723 /* context control state */
5724 count += 3;
5725
5726 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
5727 for (ext = sect->section; ext->extent != NULL; ++ext) {
5728 if (sect->id == SECT_CONTEXT)
5729 count += 2 + ext->reg_count;
5730 else
5731 return 0;
5732 }
5733 }
5734 /* pa_sc_raster_config/pa_sc_raster_config1 */
5735 count += 4;
5736 /* end clear state */
5737 count += 2;
5738 /* clear state */
5739 count += 2;
5740
5741 return count;
5742}
5743
5744void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer)
5745{
5746 u32 count = 0, i;
5747 const struct cs_section_def *sect = NULL;
5748 const struct cs_extent_def *ext = NULL;
5749
5750 if (rdev->rlc.cs_data == NULL)
5751 return;
5752 if (buffer == NULL)
5753 return;
5754
5755 buffer[count++] = PACKET3(PACKET3_PREAMBLE_CNTL, 0);
5756 buffer[count++] = PACKET3_PREAMBLE_BEGIN_CLEAR_STATE;
5757
5758 buffer[count++] = PACKET3(PACKET3_CONTEXT_CONTROL, 1);
5759 buffer[count++] = 0x80000000;
5760 buffer[count++] = 0x80000000;
5761
5762 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
5763 for (ext = sect->section; ext->extent != NULL; ++ext) {
5764 if (sect->id == SECT_CONTEXT) {
5765 buffer[count++] = PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count);
5766 buffer[count++] = ext->reg_index - 0xa000;
5767 for (i = 0; i < ext->reg_count; i++)
5768 buffer[count++] = ext->extent[i];
5769 } else {
5770 return;
5771 }
5772 }
5773 }
5774
5775 buffer[count++] = PACKET3(PACKET3_SET_CONTEXT_REG, 2);
5776 buffer[count++] = PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START;
5777 switch (rdev->family) {
5778 case CHIP_BONAIRE:
5779 buffer[count++] = 0x16000012;
5780 buffer[count++] = 0x00000000;
5781 break;
5782 case CHIP_KAVERI:
5783 buffer[count++] = 0x00000000; /* XXX */
5784 buffer[count++] = 0x00000000;
5785 break;
5786 case CHIP_KABINI:
5787 buffer[count++] = 0x00000000; /* XXX */
5788 buffer[count++] = 0x00000000;
5789 break;
5790 default:
5791 buffer[count++] = 0x00000000;
5792 buffer[count++] = 0x00000000;
5793 break;
5794 }
5795
5796 buffer[count++] = PACKET3(PACKET3_PREAMBLE_CNTL, 0);
5797 buffer[count++] = PACKET3_PREAMBLE_END_CLEAR_STATE;
5798
5799 buffer[count++] = PACKET3(PACKET3_CLEAR_STATE, 0);
5800 buffer[count++] = 0;
5801}
5802
5803static void cik_init_pg(struct radeon_device *rdev)
5804{
5805 if (rdev->pg_flags) {
5806 cik_enable_sck_slowdown_on_pu(rdev, true);
5807 cik_enable_sck_slowdown_on_pd(rdev, true);
5808 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG) {
5809 cik_init_gfx_cgpg(rdev);
5810 cik_enable_cp_pg(rdev, true);
5811 cik_enable_gds_pg(rdev, true);
5812 }
5813 cik_init_ao_cu_mask(rdev);
5814 cik_update_gfx_pg(rdev, true);
5815 }
5816}
5817
5818static void cik_fini_pg(struct radeon_device *rdev)
5819{
5820 if (rdev->pg_flags) {
5821 cik_update_gfx_pg(rdev, false);
5822 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG) {
5823 cik_enable_cp_pg(rdev, false);
5824 cik_enable_gds_pg(rdev, false);
5825 }
5826 }
5827}
5828
4871/* 5829/*
4872 * Interrupts 5830 * Interrupts
4873 * Starting with r6xx, interrupts are handled via a ring buffer. 5831 * Starting with r6xx, interrupts are handled via a ring buffer.
@@ -5086,6 +6044,7 @@ int cik_irq_set(struct radeon_device *rdev)
5086 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; 6044 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
5087 u32 grbm_int_cntl = 0; 6045 u32 grbm_int_cntl = 0;
5088 u32 dma_cntl, dma_cntl1; 6046 u32 dma_cntl, dma_cntl1;
6047 u32 thermal_int;
5089 6048
5090 if (!rdev->irq.installed) { 6049 if (!rdev->irq.installed) {
5091 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n"); 6050 WARN(1, "Can't enable IRQ/MSI because no handler is installed\n");
@@ -5118,6 +6077,13 @@ int cik_irq_set(struct radeon_device *rdev)
5118 cp_m2p2 = RREG32(CP_ME2_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE; 6077 cp_m2p2 = RREG32(CP_ME2_PIPE2_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
5119 cp_m2p3 = RREG32(CP_ME2_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE; 6078 cp_m2p3 = RREG32(CP_ME2_PIPE3_INT_CNTL) & ~TIME_STAMP_INT_ENABLE;
5120 6079
6080 if (rdev->flags & RADEON_IS_IGP)
6081 thermal_int = RREG32_SMC(CG_THERMAL_INT_CTRL) &
6082 ~(THERM_INTH_MASK | THERM_INTL_MASK);
6083 else
6084 thermal_int = RREG32_SMC(CG_THERMAL_INT) &
6085 ~(THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW);
6086
5121 /* enable CP interrupts on all rings */ 6087 /* enable CP interrupts on all rings */
5122 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) { 6088 if (atomic_read(&rdev->irq.ring_int[RADEON_RING_TYPE_GFX_INDEX])) {
5123 DRM_DEBUG("cik_irq_set: sw int gfx\n"); 6089 DRM_DEBUG("cik_irq_set: sw int gfx\n");
@@ -5275,6 +6241,14 @@ int cik_irq_set(struct radeon_device *rdev)
5275 hpd6 |= DC_HPDx_INT_EN; 6241 hpd6 |= DC_HPDx_INT_EN;
5276 } 6242 }
5277 6243
6244 if (rdev->irq.dpm_thermal) {
6245 DRM_DEBUG("dpm thermal\n");
6246 if (rdev->flags & RADEON_IS_IGP)
6247 thermal_int |= THERM_INTH_MASK | THERM_INTL_MASK;
6248 else
6249 thermal_int |= THERM_INT_MASK_HIGH | THERM_INT_MASK_LOW;
6250 }
6251
5278 WREG32(CP_INT_CNTL_RING0, cp_int_cntl); 6252 WREG32(CP_INT_CNTL_RING0, cp_int_cntl);
5279 6253
5280 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, dma_cntl); 6254 WREG32(SDMA0_CNTL + SDMA0_REGISTER_OFFSET, dma_cntl);
@@ -5309,6 +6283,11 @@ int cik_irq_set(struct radeon_device *rdev)
5309 WREG32(DC_HPD5_INT_CONTROL, hpd5); 6283 WREG32(DC_HPD5_INT_CONTROL, hpd5);
5310 WREG32(DC_HPD6_INT_CONTROL, hpd6); 6284 WREG32(DC_HPD6_INT_CONTROL, hpd6);
5311 6285
6286 if (rdev->flags & RADEON_IS_IGP)
6287 WREG32_SMC(CG_THERMAL_INT_CTRL, thermal_int);
6288 else
6289 WREG32_SMC(CG_THERMAL_INT, thermal_int);
6290
5312 return 0; 6291 return 0;
5313} 6292}
5314 6293
@@ -5520,6 +6499,7 @@ int cik_irq_process(struct radeon_device *rdev)
5520 bool queue_hotplug = false; 6499 bool queue_hotplug = false;
5521 bool queue_reset = false; 6500 bool queue_reset = false;
5522 u32 addr, status, mc_client; 6501 u32 addr, status, mc_client;
6502 bool queue_thermal = false;
5523 6503
5524 if (!rdev->ih.enabled || rdev->shutdown) 6504 if (!rdev->ih.enabled || rdev->shutdown)
5525 return IRQ_NONE; 6505 return IRQ_NONE;
@@ -5753,6 +6733,10 @@ restart_ih:
5753 break; 6733 break;
5754 } 6734 }
5755 break; 6735 break;
6736 case 124: /* UVD */
6737 DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data);
6738 radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX);
6739 break;
5756 case 146: 6740 case 146:
5757 case 147: 6741 case 147:
5758 addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR); 6742 addr = RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR);
@@ -5870,6 +6854,19 @@ restart_ih:
5870 break; 6854 break;
5871 } 6855 }
5872 break; 6856 break;
6857 case 230: /* thermal low to high */
6858 DRM_DEBUG("IH: thermal low to high\n");
6859 rdev->pm.dpm.thermal.high_to_low = false;
6860 queue_thermal = true;
6861 break;
6862 case 231: /* thermal high to low */
6863 DRM_DEBUG("IH: thermal high to low\n");
6864 rdev->pm.dpm.thermal.high_to_low = true;
6865 queue_thermal = true;
6866 break;
6867 case 233: /* GUI IDLE */
6868 DRM_DEBUG("IH: GUI idle\n");
6869 break;
5873 case 241: /* SDMA Privileged inst */ 6870 case 241: /* SDMA Privileged inst */
5874 case 247: /* SDMA Privileged inst */ 6871 case 247: /* SDMA Privileged inst */
5875 DRM_ERROR("Illegal instruction in SDMA command stream\n"); 6872 DRM_ERROR("Illegal instruction in SDMA command stream\n");
@@ -5909,9 +6906,6 @@ restart_ih:
5909 break; 6906 break;
5910 } 6907 }
5911 break; 6908 break;
5912 case 233: /* GUI IDLE */
5913 DRM_DEBUG("IH: GUI idle\n");
5914 break;
5915 default: 6909 default:
5916 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data); 6910 DRM_DEBUG("Unhandled interrupt: %d %d\n", src_id, src_data);
5917 break; 6911 break;
@@ -5925,6 +6919,8 @@ restart_ih:
5925 schedule_work(&rdev->hotplug_work); 6919 schedule_work(&rdev->hotplug_work);
5926 if (queue_reset) 6920 if (queue_reset)
5927 schedule_work(&rdev->reset_work); 6921 schedule_work(&rdev->reset_work);
6922 if (queue_thermal)
6923 schedule_work(&rdev->pm.dpm.thermal.work);
5928 rdev->ih.rptr = rptr; 6924 rdev->ih.rptr = rptr;
5929 WREG32(IH_RB_RPTR, rdev->ih.rptr); 6925 WREG32(IH_RB_RPTR, rdev->ih.rptr);
5930 atomic_set(&rdev->ih.lock, 0); 6926 atomic_set(&rdev->ih.lock, 0);
@@ -5954,6 +6950,18 @@ static int cik_startup(struct radeon_device *rdev)
5954 struct radeon_ring *ring; 6950 struct radeon_ring *ring;
5955 int r; 6951 int r;
5956 6952
6953 /* enable pcie gen2/3 link */
6954 cik_pcie_gen3_enable(rdev);
6955 /* enable aspm */
6956 cik_program_aspm(rdev);
6957
6958 /* scratch needs to be initialized before MC */
6959 r = r600_vram_scratch_init(rdev);
6960 if (r)
6961 return r;
6962
6963 cik_mc_program(rdev);
6964
5957 if (rdev->flags & RADEON_IS_IGP) { 6965 if (rdev->flags & RADEON_IS_IGP) {
5958 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw || 6966 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
5959 !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw) { 6967 !rdev->mec_fw || !rdev->sdma_fw || !rdev->rlc_fw) {
@@ -5981,18 +6989,26 @@ static int cik_startup(struct radeon_device *rdev)
5981 } 6989 }
5982 } 6990 }
5983 6991
5984 r = r600_vram_scratch_init(rdev);
5985 if (r)
5986 return r;
5987
5988 cik_mc_program(rdev);
5989 r = cik_pcie_gart_enable(rdev); 6992 r = cik_pcie_gart_enable(rdev);
5990 if (r) 6993 if (r)
5991 return r; 6994 return r;
5992 cik_gpu_init(rdev); 6995 cik_gpu_init(rdev);
5993 6996
5994 /* allocate rlc buffers */ 6997 /* allocate rlc buffers */
5995 r = si_rlc_init(rdev); 6998 if (rdev->flags & RADEON_IS_IGP) {
6999 if (rdev->family == CHIP_KAVERI) {
7000 rdev->rlc.reg_list = spectre_rlc_save_restore_register_list;
7001 rdev->rlc.reg_list_size =
7002 (u32)ARRAY_SIZE(spectre_rlc_save_restore_register_list);
7003 } else {
7004 rdev->rlc.reg_list = kalindi_rlc_save_restore_register_list;
7005 rdev->rlc.reg_list_size =
7006 (u32)ARRAY_SIZE(kalindi_rlc_save_restore_register_list);
7007 }
7008 }
7009 rdev->rlc.cs_data = ci_cs_data;
7010 rdev->rlc.cp_table_size = CP_ME_TABLE_SIZE * 5 * 4;
7011 r = sumo_rlc_init(rdev);
5996 if (r) { 7012 if (r) {
5997 DRM_ERROR("Failed to init rlc BOs!\n"); 7013 DRM_ERROR("Failed to init rlc BOs!\n");
5998 return r; 7014 return r;
@@ -6040,12 +7056,15 @@ static int cik_startup(struct radeon_device *rdev)
6040 return r; 7056 return r;
6041 } 7057 }
6042 7058
6043 r = cik_uvd_resume(rdev); 7059 r = radeon_uvd_resume(rdev);
6044 if (!r) { 7060 if (!r) {
6045 r = radeon_fence_driver_start_ring(rdev, 7061 r = uvd_v4_2_resume(rdev);
6046 R600_RING_TYPE_UVD_INDEX); 7062 if (!r) {
6047 if (r) 7063 r = radeon_fence_driver_start_ring(rdev,
6048 dev_err(rdev->dev, "UVD fences init error (%d).\n", r); 7064 R600_RING_TYPE_UVD_INDEX);
7065 if (r)
7066 dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
7067 }
6049 } 7068 }
6050 if (r) 7069 if (r)
6051 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; 7070 rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
@@ -6068,7 +7087,7 @@ static int cik_startup(struct radeon_device *rdev)
6068 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 7087 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
6069 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 7088 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
6070 CP_RB0_RPTR, CP_RB0_WPTR, 7089 CP_RB0_RPTR, CP_RB0_WPTR,
6071 0, 0xfffff, RADEON_CP_PACKET2); 7090 RADEON_CP_PACKET2);
6072 if (r) 7091 if (r)
6073 return r; 7092 return r;
6074 7093
@@ -6077,7 +7096,7 @@ static int cik_startup(struct radeon_device *rdev)
6077 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]; 7096 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
6078 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET, 7097 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET,
6079 CP_HQD_PQ_RPTR, CP_HQD_PQ_WPTR, 7098 CP_HQD_PQ_RPTR, CP_HQD_PQ_WPTR,
6080 0, 0xfffff, PACKET3(PACKET3_NOP, 0x3FFF)); 7099 PACKET3(PACKET3_NOP, 0x3FFF));
6081 if (r) 7100 if (r)
6082 return r; 7101 return r;
6083 ring->me = 1; /* first MEC */ 7102 ring->me = 1; /* first MEC */
@@ -6089,7 +7108,7 @@ static int cik_startup(struct radeon_device *rdev)
6089 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]; 7108 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
6090 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET, 7109 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET,
6091 CP_HQD_PQ_RPTR, CP_HQD_PQ_WPTR, 7110 CP_HQD_PQ_RPTR, CP_HQD_PQ_WPTR,
6092 0, 0xffffffff, PACKET3(PACKET3_NOP, 0x3FFF)); 7111 PACKET3(PACKET3_NOP, 0x3FFF));
6093 if (r) 7112 if (r)
6094 return r; 7113 return r;
6095 /* dGPU only have 1 MEC */ 7114 /* dGPU only have 1 MEC */
@@ -6102,7 +7121,7 @@ static int cik_startup(struct radeon_device *rdev)
6102 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 7121 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
6103 SDMA0_GFX_RB_RPTR + SDMA0_REGISTER_OFFSET, 7122 SDMA0_GFX_RB_RPTR + SDMA0_REGISTER_OFFSET,
6104 SDMA0_GFX_RB_WPTR + SDMA0_REGISTER_OFFSET, 7123 SDMA0_GFX_RB_WPTR + SDMA0_REGISTER_OFFSET,
6105 2, 0xfffffffc, SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0)); 7124 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
6106 if (r) 7125 if (r)
6107 return r; 7126 return r;
6108 7127
@@ -6110,7 +7129,7 @@ static int cik_startup(struct radeon_device *rdev)
6110 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, 7129 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
6111 SDMA0_GFX_RB_RPTR + SDMA1_REGISTER_OFFSET, 7130 SDMA0_GFX_RB_RPTR + SDMA1_REGISTER_OFFSET,
6112 SDMA0_GFX_RB_WPTR + SDMA1_REGISTER_OFFSET, 7131 SDMA0_GFX_RB_WPTR + SDMA1_REGISTER_OFFSET,
6113 2, 0xfffffffc, SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0)); 7132 SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
6114 if (r) 7133 if (r)
6115 return r; 7134 return r;
6116 7135
@@ -6124,12 +7143,11 @@ static int cik_startup(struct radeon_device *rdev)
6124 7143
6125 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 7144 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
6126 if (ring->ring_size) { 7145 if (ring->ring_size) {
6127 r = radeon_ring_init(rdev, ring, ring->ring_size, 7146 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
6128 R600_WB_UVD_RPTR_OFFSET,
6129 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR, 7147 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
6130 0, 0xfffff, RADEON_CP_PACKET2); 7148 RADEON_CP_PACKET2);
6131 if (!r) 7149 if (!r)
6132 r = r600_uvd_init(rdev); 7150 r = uvd_v1_0_init(rdev);
6133 if (r) 7151 if (r)
6134 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r); 7152 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
6135 } 7153 }
@@ -6146,6 +7164,10 @@ static int cik_startup(struct radeon_device *rdev)
6146 return r; 7164 return r;
6147 } 7165 }
6148 7166
7167 r = dce6_audio_init(rdev);
7168 if (r)
7169 return r;
7170
6149 return 0; 7171 return 0;
6150} 7172}
6151 7173
@@ -6191,11 +7213,14 @@ int cik_resume(struct radeon_device *rdev)
6191 */ 7213 */
6192int cik_suspend(struct radeon_device *rdev) 7214int cik_suspend(struct radeon_device *rdev)
6193{ 7215{
7216 dce6_audio_fini(rdev);
6194 radeon_vm_manager_fini(rdev); 7217 radeon_vm_manager_fini(rdev);
6195 cik_cp_enable(rdev, false); 7218 cik_cp_enable(rdev, false);
6196 cik_sdma_enable(rdev, false); 7219 cik_sdma_enable(rdev, false);
6197 r600_uvd_rbc_stop(rdev); 7220 uvd_v1_0_fini(rdev);
6198 radeon_uvd_suspend(rdev); 7221 radeon_uvd_suspend(rdev);
7222 cik_fini_pg(rdev);
7223 cik_fini_cg(rdev);
6199 cik_irq_suspend(rdev); 7224 cik_irq_suspend(rdev);
6200 radeon_wb_disable(rdev); 7225 radeon_wb_disable(rdev);
6201 cik_pcie_gart_disable(rdev); 7226 cik_pcie_gart_disable(rdev);
@@ -6316,7 +7341,7 @@ int cik_init(struct radeon_device *rdev)
6316 cik_cp_fini(rdev); 7341 cik_cp_fini(rdev);
6317 cik_sdma_fini(rdev); 7342 cik_sdma_fini(rdev);
6318 cik_irq_fini(rdev); 7343 cik_irq_fini(rdev);
6319 si_rlc_fini(rdev); 7344 sumo_rlc_fini(rdev);
6320 cik_mec_fini(rdev); 7345 cik_mec_fini(rdev);
6321 radeon_wb_fini(rdev); 7346 radeon_wb_fini(rdev);
6322 radeon_ib_pool_fini(rdev); 7347 radeon_ib_pool_fini(rdev);
@@ -6351,13 +7376,16 @@ void cik_fini(struct radeon_device *rdev)
6351{ 7376{
6352 cik_cp_fini(rdev); 7377 cik_cp_fini(rdev);
6353 cik_sdma_fini(rdev); 7378 cik_sdma_fini(rdev);
7379 cik_fini_pg(rdev);
7380 cik_fini_cg(rdev);
6354 cik_irq_fini(rdev); 7381 cik_irq_fini(rdev);
6355 si_rlc_fini(rdev); 7382 sumo_rlc_fini(rdev);
6356 cik_mec_fini(rdev); 7383 cik_mec_fini(rdev);
6357 radeon_wb_fini(rdev); 7384 radeon_wb_fini(rdev);
6358 radeon_vm_manager_fini(rdev); 7385 radeon_vm_manager_fini(rdev);
6359 radeon_ib_pool_fini(rdev); 7386 radeon_ib_pool_fini(rdev);
6360 radeon_irq_kms_fini(rdev); 7387 radeon_irq_kms_fini(rdev);
7388 uvd_v1_0_fini(rdev);
6361 radeon_uvd_fini(rdev); 7389 radeon_uvd_fini(rdev);
6362 cik_pcie_gart_fini(rdev); 7390 cik_pcie_gart_fini(rdev);
6363 r600_vram_scratch_fini(rdev); 7391 r600_vram_scratch_fini(rdev);
@@ -6386,8 +7414,8 @@ static u32 dce8_line_buffer_adjust(struct radeon_device *rdev,
6386 struct radeon_crtc *radeon_crtc, 7414 struct radeon_crtc *radeon_crtc,
6387 struct drm_display_mode *mode) 7415 struct drm_display_mode *mode)
6388{ 7416{
6389 u32 tmp; 7417 u32 tmp, buffer_alloc, i;
6390 7418 u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
6391 /* 7419 /*
6392 * Line Buffer Setup 7420 * Line Buffer Setup
6393 * There are 6 line buffers, one for each display controllers. 7421 * There are 6 line buffers, one for each display controllers.
@@ -6397,22 +7425,37 @@ static u32 dce8_line_buffer_adjust(struct radeon_device *rdev,
6397 * them using the stereo blender. 7425 * them using the stereo blender.
6398 */ 7426 */
6399 if (radeon_crtc->base.enabled && mode) { 7427 if (radeon_crtc->base.enabled && mode) {
6400 if (mode->crtc_hdisplay < 1920) 7428 if (mode->crtc_hdisplay < 1920) {
6401 tmp = 1; 7429 tmp = 1;
6402 else if (mode->crtc_hdisplay < 2560) 7430 buffer_alloc = 2;
7431 } else if (mode->crtc_hdisplay < 2560) {
6403 tmp = 2; 7432 tmp = 2;
6404 else if (mode->crtc_hdisplay < 4096) 7433 buffer_alloc = 2;
7434 } else if (mode->crtc_hdisplay < 4096) {
6405 tmp = 0; 7435 tmp = 0;
6406 else { 7436 buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
7437 } else {
6407 DRM_DEBUG_KMS("Mode too big for LB!\n"); 7438 DRM_DEBUG_KMS("Mode too big for LB!\n");
6408 tmp = 0; 7439 tmp = 0;
7440 buffer_alloc = (rdev->flags & RADEON_IS_IGP) ? 2 : 4;
6409 } 7441 }
6410 } else 7442 } else {
6411 tmp = 1; 7443 tmp = 1;
7444 buffer_alloc = 0;
7445 }
6412 7446
6413 WREG32(LB_MEMORY_CTRL + radeon_crtc->crtc_offset, 7447 WREG32(LB_MEMORY_CTRL + radeon_crtc->crtc_offset,
6414 LB_MEMORY_CONFIG(tmp) | LB_MEMORY_SIZE(0x6B0)); 7448 LB_MEMORY_CONFIG(tmp) | LB_MEMORY_SIZE(0x6B0));
6415 7449
7450 WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
7451 DMIF_BUFFERS_ALLOCATED(buffer_alloc));
7452 for (i = 0; i < rdev->usec_timeout; i++) {
7453 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
7454 DMIF_BUFFERS_ALLOCATED_COMPLETED)
7455 break;
7456 udelay(1);
7457 }
7458
6416 if (radeon_crtc->base.enabled && mode) { 7459 if (radeon_crtc->base.enabled && mode) {
6417 switch (tmp) { 7460 switch (tmp) {
6418 case 0: 7461 case 0:
@@ -6814,7 +7857,7 @@ static void dce8_program_watermarks(struct radeon_device *rdev,
6814 u32 lb_size, u32 num_heads) 7857 u32 lb_size, u32 num_heads)
6815{ 7858{
6816 struct drm_display_mode *mode = &radeon_crtc->base.mode; 7859 struct drm_display_mode *mode = &radeon_crtc->base.mode;
6817 struct dce8_wm_params wm; 7860 struct dce8_wm_params wm_low, wm_high;
6818 u32 pixel_period; 7861 u32 pixel_period;
6819 u32 line_time = 0; 7862 u32 line_time = 0;
6820 u32 latency_watermark_a = 0, latency_watermark_b = 0; 7863 u32 latency_watermark_a = 0, latency_watermark_b = 0;
@@ -6824,35 +7867,82 @@ static void dce8_program_watermarks(struct radeon_device *rdev,
6824 pixel_period = 1000000 / (u32)mode->clock; 7867 pixel_period = 1000000 / (u32)mode->clock;
6825 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535); 7868 line_time = min((u32)mode->crtc_htotal * pixel_period, (u32)65535);
6826 7869
6827 wm.yclk = rdev->pm.current_mclk * 10; 7870 /* watermark for high clocks */
6828 wm.sclk = rdev->pm.current_sclk * 10; 7871 if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
6829 wm.disp_clk = mode->clock; 7872 rdev->pm.dpm_enabled) {
6830 wm.src_width = mode->crtc_hdisplay; 7873 wm_high.yclk =
6831 wm.active_time = mode->crtc_hdisplay * pixel_period; 7874 radeon_dpm_get_mclk(rdev, false) * 10;
6832 wm.blank_time = line_time - wm.active_time; 7875 wm_high.sclk =
6833 wm.interlaced = false; 7876 radeon_dpm_get_sclk(rdev, false) * 10;
7877 } else {
7878 wm_high.yclk = rdev->pm.current_mclk * 10;
7879 wm_high.sclk = rdev->pm.current_sclk * 10;
7880 }
7881
7882 wm_high.disp_clk = mode->clock;
7883 wm_high.src_width = mode->crtc_hdisplay;
7884 wm_high.active_time = mode->crtc_hdisplay * pixel_period;
7885 wm_high.blank_time = line_time - wm_high.active_time;
7886 wm_high.interlaced = false;
6834 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 7887 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
6835 wm.interlaced = true; 7888 wm_high.interlaced = true;
6836 wm.vsc = radeon_crtc->vsc; 7889 wm_high.vsc = radeon_crtc->vsc;
6837 wm.vtaps = 1; 7890 wm_high.vtaps = 1;
6838 if (radeon_crtc->rmx_type != RMX_OFF) 7891 if (radeon_crtc->rmx_type != RMX_OFF)
6839 wm.vtaps = 2; 7892 wm_high.vtaps = 2;
6840 wm.bytes_per_pixel = 4; /* XXX: get this from fb config */ 7893 wm_high.bytes_per_pixel = 4; /* XXX: get this from fb config */
6841 wm.lb_size = lb_size; 7894 wm_high.lb_size = lb_size;
6842 wm.dram_channels = cik_get_number_of_dram_channels(rdev); 7895 wm_high.dram_channels = cik_get_number_of_dram_channels(rdev);
6843 wm.num_heads = num_heads; 7896 wm_high.num_heads = num_heads;
6844 7897
6845 /* set for high clocks */ 7898 /* set for high clocks */
6846 latency_watermark_a = min(dce8_latency_watermark(&wm), (u32)65535); 7899 latency_watermark_a = min(dce8_latency_watermark(&wm_high), (u32)65535);
7900
7901 /* possibly force display priority to high */
7902 /* should really do this at mode validation time... */
7903 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_high) ||
7904 !dce8_average_bandwidth_vs_available_bandwidth(&wm_high) ||
7905 !dce8_check_latency_hiding(&wm_high) ||
7906 (rdev->disp_priority == 2)) {
7907 DRM_DEBUG_KMS("force priority to high\n");
7908 }
7909
7910 /* watermark for low clocks */
7911 if ((rdev->pm.pm_method == PM_METHOD_DPM) &&
7912 rdev->pm.dpm_enabled) {
7913 wm_low.yclk =
7914 radeon_dpm_get_mclk(rdev, true) * 10;
7915 wm_low.sclk =
7916 radeon_dpm_get_sclk(rdev, true) * 10;
7917 } else {
7918 wm_low.yclk = rdev->pm.current_mclk * 10;
7919 wm_low.sclk = rdev->pm.current_sclk * 10;
7920 }
7921
7922 wm_low.disp_clk = mode->clock;
7923 wm_low.src_width = mode->crtc_hdisplay;
7924 wm_low.active_time = mode->crtc_hdisplay * pixel_period;
7925 wm_low.blank_time = line_time - wm_low.active_time;
7926 wm_low.interlaced = false;
7927 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
7928 wm_low.interlaced = true;
7929 wm_low.vsc = radeon_crtc->vsc;
7930 wm_low.vtaps = 1;
7931 if (radeon_crtc->rmx_type != RMX_OFF)
7932 wm_low.vtaps = 2;
7933 wm_low.bytes_per_pixel = 4; /* XXX: get this from fb config */
7934 wm_low.lb_size = lb_size;
7935 wm_low.dram_channels = cik_get_number_of_dram_channels(rdev);
7936 wm_low.num_heads = num_heads;
7937
6847 /* set for low clocks */ 7938 /* set for low clocks */
6848 /* wm.yclk = low clk; wm.sclk = low clk */ 7939 latency_watermark_b = min(dce8_latency_watermark(&wm_low), (u32)65535);
6849 latency_watermark_b = min(dce8_latency_watermark(&wm), (u32)65535);
6850 7940
6851 /* possibly force display priority to high */ 7941 /* possibly force display priority to high */
6852 /* should really do this at mode validation time... */ 7942 /* should really do this at mode validation time... */
6853 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm) || 7943 if (!dce8_average_bandwidth_vs_dram_bandwidth_for_display(&wm_low) ||
6854 !dce8_average_bandwidth_vs_available_bandwidth(&wm) || 7944 !dce8_average_bandwidth_vs_available_bandwidth(&wm_low) ||
6855 !dce8_check_latency_hiding(&wm) || 7945 !dce8_check_latency_hiding(&wm_low) ||
6856 (rdev->disp_priority == 2)) { 7946 (rdev->disp_priority == 2)) {
6857 DRM_DEBUG_KMS("force priority to high\n"); 7947 DRM_DEBUG_KMS("force priority to high\n");
6858 } 7948 }
@@ -6877,6 +7967,11 @@ static void dce8_program_watermarks(struct radeon_device *rdev,
6877 LATENCY_HIGH_WATERMARK(line_time))); 7967 LATENCY_HIGH_WATERMARK(line_time)));
6878 /* restore original selection */ 7968 /* restore original selection */
6879 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, wm_mask); 7969 WREG32(DPG_WATERMARK_MASK_CONTROL + radeon_crtc->crtc_offset, wm_mask);
7970
7971 /* save values for DPM */
7972 radeon_crtc->line_time = line_time;
7973 radeon_crtc->wm_high = latency_watermark_a;
7974 radeon_crtc->wm_low = latency_watermark_b;
6880} 7975}
6881 7976
6882/** 7977/**
@@ -6966,39 +8061,307 @@ int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk)
6966 return r; 8061 return r;
6967} 8062}
6968 8063
6969int cik_uvd_resume(struct radeon_device *rdev) 8064static void cik_pcie_gen3_enable(struct radeon_device *rdev)
6970{ 8065{
6971 uint64_t addr; 8066 struct pci_dev *root = rdev->pdev->bus->self;
6972 uint32_t size; 8067 int bridge_pos, gpu_pos;
6973 int r; 8068 u32 speed_cntl, mask, current_data_rate;
8069 int ret, i;
8070 u16 tmp16;
6974 8071
6975 r = radeon_uvd_resume(rdev); 8072 if (radeon_pcie_gen2 == 0)
6976 if (r) 8073 return;
6977 return r; 8074
8075 if (rdev->flags & RADEON_IS_IGP)
8076 return;
6978 8077
6979 /* programm the VCPU memory controller bits 0-27 */ 8078 if (!(rdev->flags & RADEON_IS_PCIE))
6980 addr = rdev->uvd.gpu_addr >> 3; 8079 return;
6981 size = RADEON_GPU_PAGE_ALIGN(rdev->uvd.fw_size + 4) >> 3; 8080
6982 WREG32(UVD_VCPU_CACHE_OFFSET0, addr); 8081 ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask);
6983 WREG32(UVD_VCPU_CACHE_SIZE0, size); 8082 if (ret != 0)
8083 return;
6984 8084
6985 addr += size; 8085 if (!(mask & (DRM_PCIE_SPEED_50 | DRM_PCIE_SPEED_80)))
6986 size = RADEON_UVD_STACK_SIZE >> 3; 8086 return;
6987 WREG32(UVD_VCPU_CACHE_OFFSET1, addr); 8087
6988 WREG32(UVD_VCPU_CACHE_SIZE1, size); 8088 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
8089 current_data_rate = (speed_cntl & LC_CURRENT_DATA_RATE_MASK) >>
8090 LC_CURRENT_DATA_RATE_SHIFT;
8091 if (mask & DRM_PCIE_SPEED_80) {
8092 if (current_data_rate == 2) {
8093 DRM_INFO("PCIE gen 3 link speeds already enabled\n");
8094 return;
8095 }
8096 DRM_INFO("enabling PCIE gen 3 link speeds, disable with radeon.pcie_gen2=0\n");
8097 } else if (mask & DRM_PCIE_SPEED_50) {
8098 if (current_data_rate == 1) {
8099 DRM_INFO("PCIE gen 2 link speeds already enabled\n");
8100 return;
8101 }
8102 DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n");
8103 }
6989 8104
6990 addr += size; 8105 bridge_pos = pci_pcie_cap(root);
6991 size = RADEON_UVD_HEAP_SIZE >> 3; 8106 if (!bridge_pos)
6992 WREG32(UVD_VCPU_CACHE_OFFSET2, addr); 8107 return;
6993 WREG32(UVD_VCPU_CACHE_SIZE2, size);
6994 8108
6995 /* bits 28-31 */ 8109 gpu_pos = pci_pcie_cap(rdev->pdev);
6996 addr = (rdev->uvd.gpu_addr >> 28) & 0xF; 8110 if (!gpu_pos)
6997 WREG32(UVD_LMI_ADDR_EXT, (addr << 12) | (addr << 0)); 8111 return;
6998 8112
6999 /* bits 32-39 */ 8113 if (mask & DRM_PCIE_SPEED_80) {
7000 addr = (rdev->uvd.gpu_addr >> 32) & 0xFF; 8114 /* re-try equalization if gen3 is not already enabled */
7001 WREG32(UVD_LMI_EXT40_ADDR, addr | (0x9 << 16) | (0x1 << 31)); 8115 if (current_data_rate != 2) {
8116 u16 bridge_cfg, gpu_cfg;
8117 u16 bridge_cfg2, gpu_cfg2;
8118 u32 max_lw, current_lw, tmp;
8119
8120 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
8121 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
8122
8123 tmp16 = bridge_cfg | PCI_EXP_LNKCTL_HAWD;
8124 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
8125
8126 tmp16 = gpu_cfg | PCI_EXP_LNKCTL_HAWD;
8127 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
8128
8129 tmp = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
8130 max_lw = (tmp & LC_DETECTED_LINK_WIDTH_MASK) >> LC_DETECTED_LINK_WIDTH_SHIFT;
8131 current_lw = (tmp & LC_OPERATING_LINK_WIDTH_MASK) >> LC_OPERATING_LINK_WIDTH_SHIFT;
8132
8133 if (current_lw < max_lw) {
8134 tmp = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
8135 if (tmp & LC_RENEGOTIATION_SUPPORT) {
8136 tmp &= ~(LC_LINK_WIDTH_MASK | LC_UPCONFIGURE_DIS);
8137 tmp |= (max_lw << LC_LINK_WIDTH_SHIFT);
8138 tmp |= LC_UPCONFIGURE_SUPPORT | LC_RENEGOTIATE_EN | LC_RECONFIG_NOW;
8139 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, tmp);
8140 }
8141 }
7002 8142
7003 return 0; 8143 for (i = 0; i < 10; i++) {
8144 /* check status */
8145 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_DEVSTA, &tmp16);
8146 if (tmp16 & PCI_EXP_DEVSTA_TRPND)
8147 break;
8148
8149 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &bridge_cfg);
8150 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &gpu_cfg);
8151
8152 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &bridge_cfg2);
8153 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &gpu_cfg2);
8154
8155 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
8156 tmp |= LC_SET_QUIESCE;
8157 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
8158
8159 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
8160 tmp |= LC_REDO_EQ;
8161 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
8162
8163 mdelay(100);
8164
8165 /* linkctl */
8166 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL, &tmp16);
8167 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
8168 tmp16 |= (bridge_cfg & PCI_EXP_LNKCTL_HAWD);
8169 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL, tmp16);
8170
8171 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, &tmp16);
8172 tmp16 &= ~PCI_EXP_LNKCTL_HAWD;
8173 tmp16 |= (gpu_cfg & PCI_EXP_LNKCTL_HAWD);
8174 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL, tmp16);
8175
8176 /* linkctl2 */
8177 pci_read_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, &tmp16);
8178 tmp16 &= ~((1 << 4) | (7 << 9));
8179 tmp16 |= (bridge_cfg2 & ((1 << 4) | (7 << 9)));
8180 pci_write_config_word(root, bridge_pos + PCI_EXP_LNKCTL2, tmp16);
8181
8182 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
8183 tmp16 &= ~((1 << 4) | (7 << 9));
8184 tmp16 |= (gpu_cfg2 & ((1 << 4) | (7 << 9)));
8185 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
8186
8187 tmp = RREG32_PCIE_PORT(PCIE_LC_CNTL4);
8188 tmp &= ~LC_SET_QUIESCE;
8189 WREG32_PCIE_PORT(PCIE_LC_CNTL4, tmp);
8190 }
8191 }
8192 }
8193
8194 /* set the link speed */
8195 speed_cntl |= LC_FORCE_EN_SW_SPEED_CHANGE | LC_FORCE_DIS_HW_SPEED_CHANGE;
8196 speed_cntl &= ~LC_FORCE_DIS_SW_SPEED_CHANGE;
8197 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
8198
8199 pci_read_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, &tmp16);
8200 tmp16 &= ~0xf;
8201 if (mask & DRM_PCIE_SPEED_80)
8202 tmp16 |= 3; /* gen3 */
8203 else if (mask & DRM_PCIE_SPEED_50)
8204 tmp16 |= 2; /* gen2 */
8205 else
8206 tmp16 |= 1; /* gen1 */
8207 pci_write_config_word(rdev->pdev, gpu_pos + PCI_EXP_LNKCTL2, tmp16);
8208
8209 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
8210 speed_cntl |= LC_INITIATE_LINK_SPEED_CHANGE;
8211 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL, speed_cntl);
8212
8213 for (i = 0; i < rdev->usec_timeout; i++) {
8214 speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL);
8215 if ((speed_cntl & LC_INITIATE_LINK_SPEED_CHANGE) == 0)
8216 break;
8217 udelay(1);
8218 }
8219}
8220
8221static void cik_program_aspm(struct radeon_device *rdev)
8222{
8223 u32 data, orig;
8224 bool disable_l0s = false, disable_l1 = false, disable_plloff_in_l1 = false;
8225 bool disable_clkreq = false;
8226
8227 if (radeon_aspm == 0)
8228 return;
8229
8230 /* XXX double check IGPs */
8231 if (rdev->flags & RADEON_IS_IGP)
8232 return;
8233
8234 if (!(rdev->flags & RADEON_IS_PCIE))
8235 return;
8236
8237 orig = data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
8238 data &= ~LC_XMIT_N_FTS_MASK;
8239 data |= LC_XMIT_N_FTS(0x24) | LC_XMIT_N_FTS_OVERRIDE_EN;
8240 if (orig != data)
8241 WREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL, data);
8242
8243 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL3);
8244 data |= LC_GO_TO_RECOVERY;
8245 if (orig != data)
8246 WREG32_PCIE_PORT(PCIE_LC_CNTL3, data);
8247
8248 orig = data = RREG32_PCIE_PORT(PCIE_P_CNTL);
8249 data |= P_IGNORE_EDB_ERR;
8250 if (orig != data)
8251 WREG32_PCIE_PORT(PCIE_P_CNTL, data);
8252
8253 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
8254 data &= ~(LC_L0S_INACTIVITY_MASK | LC_L1_INACTIVITY_MASK);
8255 data |= LC_PMI_TO_L1_DIS;
8256 if (!disable_l0s)
8257 data |= LC_L0S_INACTIVITY(7);
8258
8259 if (!disable_l1) {
8260 data |= LC_L1_INACTIVITY(7);
8261 data &= ~LC_PMI_TO_L1_DIS;
8262 if (orig != data)
8263 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
8264
8265 if (!disable_plloff_in_l1) {
8266 bool clk_req_support;
8267
8268 orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0);
8269 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
8270 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
8271 if (orig != data)
8272 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_0, data);
8273
8274 orig = data = RREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1);
8275 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
8276 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
8277 if (orig != data)
8278 WREG32_PCIE_PORT(PB0_PIF_PWRDOWN_1, data);
8279
8280 orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0);
8281 data &= ~(PLL_POWER_STATE_IN_OFF_0_MASK | PLL_POWER_STATE_IN_TXS2_0_MASK);
8282 data |= PLL_POWER_STATE_IN_OFF_0(7) | PLL_POWER_STATE_IN_TXS2_0(7);
8283 if (orig != data)
8284 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_0, data);
8285
8286 orig = data = RREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1);
8287 data &= ~(PLL_POWER_STATE_IN_OFF_1_MASK | PLL_POWER_STATE_IN_TXS2_1_MASK);
8288 data |= PLL_POWER_STATE_IN_OFF_1(7) | PLL_POWER_STATE_IN_TXS2_1(7);
8289 if (orig != data)
8290 WREG32_PCIE_PORT(PB1_PIF_PWRDOWN_1, data);
8291
8292 orig = data = RREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL);
8293 data &= ~LC_DYN_LANES_PWR_STATE_MASK;
8294 data |= LC_DYN_LANES_PWR_STATE(3);
8295 if (orig != data)
8296 WREG32_PCIE_PORT(PCIE_LC_LINK_WIDTH_CNTL, data);
8297
8298 if (!disable_clkreq) {
8299 struct pci_dev *root = rdev->pdev->bus->self;
8300 u32 lnkcap;
8301
8302 clk_req_support = false;
8303 pcie_capability_read_dword(root, PCI_EXP_LNKCAP, &lnkcap);
8304 if (lnkcap & PCI_EXP_LNKCAP_CLKPM)
8305 clk_req_support = true;
8306 } else {
8307 clk_req_support = false;
8308 }
8309
8310 if (clk_req_support) {
8311 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL2);
8312 data |= LC_ALLOW_PDWN_IN_L1 | LC_ALLOW_PDWN_IN_L23;
8313 if (orig != data)
8314 WREG32_PCIE_PORT(PCIE_LC_CNTL2, data);
8315
8316 orig = data = RREG32_SMC(THM_CLK_CNTL);
8317 data &= ~(CMON_CLK_SEL_MASK | TMON_CLK_SEL_MASK);
8318 data |= CMON_CLK_SEL(1) | TMON_CLK_SEL(1);
8319 if (orig != data)
8320 WREG32_SMC(THM_CLK_CNTL, data);
8321
8322 orig = data = RREG32_SMC(MISC_CLK_CTRL);
8323 data &= ~(DEEP_SLEEP_CLK_SEL_MASK | ZCLK_SEL_MASK);
8324 data |= DEEP_SLEEP_CLK_SEL(1) | ZCLK_SEL(1);
8325 if (orig != data)
8326 WREG32_SMC(MISC_CLK_CTRL, data);
8327
8328 orig = data = RREG32_SMC(CG_CLKPIN_CNTL);
8329 data &= ~BCLK_AS_XCLK;
8330 if (orig != data)
8331 WREG32_SMC(CG_CLKPIN_CNTL, data);
8332
8333 orig = data = RREG32_SMC(CG_CLKPIN_CNTL_2);
8334 data &= ~FORCE_BIF_REFCLK_EN;
8335 if (orig != data)
8336 WREG32_SMC(CG_CLKPIN_CNTL_2, data);
8337
8338 orig = data = RREG32_SMC(MPLL_BYPASSCLK_SEL);
8339 data &= ~MPLL_CLKOUT_SEL_MASK;
8340 data |= MPLL_CLKOUT_SEL(4);
8341 if (orig != data)
8342 WREG32_SMC(MPLL_BYPASSCLK_SEL, data);
8343 }
8344 }
8345 } else {
8346 if (orig != data)
8347 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
8348 }
8349
8350 orig = data = RREG32_PCIE_PORT(PCIE_CNTL2);
8351 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN | REPLAY_MEM_LS_EN;
8352 if (orig != data)
8353 WREG32_PCIE_PORT(PCIE_CNTL2, data);
8354
8355 if (!disable_l0s) {
8356 data = RREG32_PCIE_PORT(PCIE_LC_N_FTS_CNTL);
8357 if((data & LC_N_FTS_MASK) == LC_N_FTS_MASK) {
8358 data = RREG32_PCIE_PORT(PCIE_LC_STATUS1);
8359 if ((data & LC_REVERSE_XMIT) && (data & LC_REVERSE_RCVR)) {
8360 orig = data = RREG32_PCIE_PORT(PCIE_LC_CNTL);
8361 data &= ~LC_L0S_INACTIVITY_MASK;
8362 if (orig != data)
8363 WREG32_PCIE_PORT(PCIE_LC_CNTL, data);
8364 }
8365 }
8366 }
7004} 8367}
diff --git a/drivers/gpu/drm/radeon/cik_reg.h b/drivers/gpu/drm/radeon/cik_reg.h
index d71e46d571f5..ca1bb6133580 100644
--- a/drivers/gpu/drm/radeon/cik_reg.h
+++ b/drivers/gpu/drm/radeon/cik_reg.h
@@ -24,6 +24,9 @@
24#ifndef __CIK_REG_H__ 24#ifndef __CIK_REG_H__
25#define __CIK_REG_H__ 25#define __CIK_REG_H__
26 26
27#define CIK_DIDT_IND_INDEX 0xca00
28#define CIK_DIDT_IND_DATA 0xca04
29
27#define CIK_DC_GPIO_HPD_MASK 0x65b0 30#define CIK_DC_GPIO_HPD_MASK 0x65b0
28#define CIK_DC_GPIO_HPD_A 0x65b4 31#define CIK_DC_GPIO_HPD_A 0x65b4
29#define CIK_DC_GPIO_HPD_EN 0x65b8 32#define CIK_DC_GPIO_HPD_EN 0x65b8
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c
new file mode 100644
index 000000000000..b6286068e111
--- /dev/null
+++ b/drivers/gpu/drm/radeon/cik_sdma.c
@@ -0,0 +1,785 @@
1/*
2 * Copyright 2013 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: Alex Deucher
23 */
24#include <linux/firmware.h>
25#include <drm/drmP.h>
26#include "radeon.h"
27#include "radeon_asic.h"
28#include "cikd.h"
29
30/* sdma */
31#define CIK_SDMA_UCODE_SIZE 1050
32#define CIK_SDMA_UCODE_VERSION 64
33
34u32 cik_gpu_check_soft_reset(struct radeon_device *rdev);
35
36/*
37 * sDMA - System DMA
38 * Starting with CIK, the GPU has new asynchronous
39 * DMA engines. These engines are used for compute
40 * and gfx. There are two DMA engines (SDMA0, SDMA1)
41 * and each one supports 1 ring buffer used for gfx
42 * and 2 queues used for compute.
43 *
44 * The programming model is very similar to the CP
45 * (ring buffer, IBs, etc.), but sDMA has it's own
46 * packet format that is different from the PM4 format
47 * used by the CP. sDMA supports copying data, writing
48 * embedded data, solid fills, and a number of other
49 * things. It also has support for tiling/detiling of
50 * buffers.
51 */
52
53/**
54 * cik_sdma_ring_ib_execute - Schedule an IB on the DMA engine
55 *
56 * @rdev: radeon_device pointer
57 * @ib: IB object to schedule
58 *
59 * Schedule an IB in the DMA ring (CIK).
60 */
61void cik_sdma_ring_ib_execute(struct radeon_device *rdev,
62 struct radeon_ib *ib)
63{
64 struct radeon_ring *ring = &rdev->ring[ib->ring];
65 u32 extra_bits = (ib->vm ? ib->vm->id : 0) & 0xf;
66
67 if (rdev->wb.enabled) {
68 u32 next_rptr = ring->wptr + 5;
69 while ((next_rptr & 7) != 4)
70 next_rptr++;
71 next_rptr += 4;
72 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0));
73 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
74 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xffffffff);
75 radeon_ring_write(ring, 1); /* number of DWs to follow */
76 radeon_ring_write(ring, next_rptr);
77 }
78
79 /* IB packet must end on a 8 DW boundary */
80 while ((ring->wptr & 7) != 4)
81 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
82 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_INDIRECT_BUFFER, 0, extra_bits));
83 radeon_ring_write(ring, ib->gpu_addr & 0xffffffe0); /* base must be 32 byte aligned */
84 radeon_ring_write(ring, upper_32_bits(ib->gpu_addr) & 0xffffffff);
85 radeon_ring_write(ring, ib->length_dw);
86
87}
88
89/**
90 * cik_sdma_fence_ring_emit - emit a fence on the DMA ring
91 *
92 * @rdev: radeon_device pointer
93 * @fence: radeon fence object
94 *
95 * Add a DMA fence packet to the ring to write
96 * the fence seq number and DMA trap packet to generate
97 * an interrupt if needed (CIK).
98 */
99void cik_sdma_fence_ring_emit(struct radeon_device *rdev,
100 struct radeon_fence *fence)
101{
102 struct radeon_ring *ring = &rdev->ring[fence->ring];
103 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
104 u32 extra_bits = (SDMA_POLL_REG_MEM_EXTRA_OP(1) |
105 SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */
106 u32 ref_and_mask;
107
108 if (fence->ring == R600_RING_TYPE_DMA_INDEX)
109 ref_and_mask = SDMA0;
110 else
111 ref_and_mask = SDMA1;
112
113 /* write the fence */
114 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_FENCE, 0, 0));
115 radeon_ring_write(ring, addr & 0xffffffff);
116 radeon_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
117 radeon_ring_write(ring, fence->seq);
118 /* generate an interrupt */
119 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_TRAP, 0, 0));
120 /* flush HDP */
121 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_POLL_REG_MEM, 0, extra_bits));
122 radeon_ring_write(ring, GPU_HDP_FLUSH_DONE);
123 radeon_ring_write(ring, GPU_HDP_FLUSH_REQ);
124 radeon_ring_write(ring, ref_and_mask); /* REFERENCE */
125 radeon_ring_write(ring, ref_and_mask); /* MASK */
126 radeon_ring_write(ring, (4 << 16) | 10); /* RETRY_COUNT, POLL_INTERVAL */
127}
128
129/**
130 * cik_sdma_semaphore_ring_emit - emit a semaphore on the dma ring
131 *
132 * @rdev: radeon_device pointer
133 * @ring: radeon_ring structure holding ring information
134 * @semaphore: radeon semaphore object
135 * @emit_wait: wait or signal semaphore
136 *
137 * Add a DMA semaphore packet to the ring wait on or signal
138 * other rings (CIK).
139 */
140void cik_sdma_semaphore_ring_emit(struct radeon_device *rdev,
141 struct radeon_ring *ring,
142 struct radeon_semaphore *semaphore,
143 bool emit_wait)
144{
145 u64 addr = semaphore->gpu_addr;
146 u32 extra_bits = emit_wait ? 0 : SDMA_SEMAPHORE_EXTRA_S;
147
148 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SEMAPHORE, 0, extra_bits));
149 radeon_ring_write(ring, addr & 0xfffffff8);
150 radeon_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
151}
152
153/**
154 * cik_sdma_gfx_stop - stop the gfx async dma engines
155 *
156 * @rdev: radeon_device pointer
157 *
158 * Stop the gfx async dma ring buffers (CIK).
159 */
160static void cik_sdma_gfx_stop(struct radeon_device *rdev)
161{
162 u32 rb_cntl, reg_offset;
163 int i;
164
165 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
166
167 for (i = 0; i < 2; i++) {
168 if (i == 0)
169 reg_offset = SDMA0_REGISTER_OFFSET;
170 else
171 reg_offset = SDMA1_REGISTER_OFFSET;
172 rb_cntl = RREG32(SDMA0_GFX_RB_CNTL + reg_offset);
173 rb_cntl &= ~SDMA_RB_ENABLE;
174 WREG32(SDMA0_GFX_RB_CNTL + reg_offset, rb_cntl);
175 WREG32(SDMA0_GFX_IB_CNTL + reg_offset, 0);
176 }
177}
178
179/**
180 * cik_sdma_rlc_stop - stop the compute async dma engines
181 *
182 * @rdev: radeon_device pointer
183 *
184 * Stop the compute async dma queues (CIK).
185 */
186static void cik_sdma_rlc_stop(struct radeon_device *rdev)
187{
188 /* XXX todo */
189}
190
191/**
192 * cik_sdma_enable - stop the async dma engines
193 *
194 * @rdev: radeon_device pointer
195 * @enable: enable/disable the DMA MEs.
196 *
197 * Halt or unhalt the async dma engines (CIK).
198 */
199void cik_sdma_enable(struct radeon_device *rdev, bool enable)
200{
201 u32 me_cntl, reg_offset;
202 int i;
203
204 for (i = 0; i < 2; i++) {
205 if (i == 0)
206 reg_offset = SDMA0_REGISTER_OFFSET;
207 else
208 reg_offset = SDMA1_REGISTER_OFFSET;
209 me_cntl = RREG32(SDMA0_ME_CNTL + reg_offset);
210 if (enable)
211 me_cntl &= ~SDMA_HALT;
212 else
213 me_cntl |= SDMA_HALT;
214 WREG32(SDMA0_ME_CNTL + reg_offset, me_cntl);
215 }
216}
217
218/**
219 * cik_sdma_gfx_resume - setup and start the async dma engines
220 *
221 * @rdev: radeon_device pointer
222 *
223 * Set up the gfx DMA ring buffers and enable them (CIK).
224 * Returns 0 for success, error for failure.
225 */
226static int cik_sdma_gfx_resume(struct radeon_device *rdev)
227{
228 struct radeon_ring *ring;
229 u32 rb_cntl, ib_cntl;
230 u32 rb_bufsz;
231 u32 reg_offset, wb_offset;
232 int i, r;
233
234 for (i = 0; i < 2; i++) {
235 if (i == 0) {
236 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
237 reg_offset = SDMA0_REGISTER_OFFSET;
238 wb_offset = R600_WB_DMA_RPTR_OFFSET;
239 } else {
240 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
241 reg_offset = SDMA1_REGISTER_OFFSET;
242 wb_offset = CAYMAN_WB_DMA1_RPTR_OFFSET;
243 }
244
245 WREG32(SDMA0_SEM_INCOMPLETE_TIMER_CNTL + reg_offset, 0);
246 WREG32(SDMA0_SEM_WAIT_FAIL_TIMER_CNTL + reg_offset, 0);
247
248 /* Set ring buffer size in dwords */
249 rb_bufsz = order_base_2(ring->ring_size / 4);
250 rb_cntl = rb_bufsz << 1;
251#ifdef __BIG_ENDIAN
252 rb_cntl |= SDMA_RB_SWAP_ENABLE | SDMA_RPTR_WRITEBACK_SWAP_ENABLE;
253#endif
254 WREG32(SDMA0_GFX_RB_CNTL + reg_offset, rb_cntl);
255
256 /* Initialize the ring buffer's read and write pointers */
257 WREG32(SDMA0_GFX_RB_RPTR + reg_offset, 0);
258 WREG32(SDMA0_GFX_RB_WPTR + reg_offset, 0);
259
260 /* set the wb address whether it's enabled or not */
261 WREG32(SDMA0_GFX_RB_RPTR_ADDR_HI + reg_offset,
262 upper_32_bits(rdev->wb.gpu_addr + wb_offset) & 0xFFFFFFFF);
263 WREG32(SDMA0_GFX_RB_RPTR_ADDR_LO + reg_offset,
264 ((rdev->wb.gpu_addr + wb_offset) & 0xFFFFFFFC));
265
266 if (rdev->wb.enabled)
267 rb_cntl |= SDMA_RPTR_WRITEBACK_ENABLE;
268
269 WREG32(SDMA0_GFX_RB_BASE + reg_offset, ring->gpu_addr >> 8);
270 WREG32(SDMA0_GFX_RB_BASE_HI + reg_offset, ring->gpu_addr >> 40);
271
272 ring->wptr = 0;
273 WREG32(SDMA0_GFX_RB_WPTR + reg_offset, ring->wptr << 2);
274
275 ring->rptr = RREG32(SDMA0_GFX_RB_RPTR + reg_offset) >> 2;
276
277 /* enable DMA RB */
278 WREG32(SDMA0_GFX_RB_CNTL + reg_offset, rb_cntl | SDMA_RB_ENABLE);
279
280 ib_cntl = SDMA_IB_ENABLE;
281#ifdef __BIG_ENDIAN
282 ib_cntl |= SDMA_IB_SWAP_ENABLE;
283#endif
284 /* enable DMA IBs */
285 WREG32(SDMA0_GFX_IB_CNTL + reg_offset, ib_cntl);
286
287 ring->ready = true;
288
289 r = radeon_ring_test(rdev, ring->idx, ring);
290 if (r) {
291 ring->ready = false;
292 return r;
293 }
294 }
295
296 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
297
298 return 0;
299}
300
301/**
302 * cik_sdma_rlc_resume - setup and start the async dma engines
303 *
304 * @rdev: radeon_device pointer
305 *
306 * Set up the compute DMA queues and enable them (CIK).
307 * Returns 0 for success, error for failure.
308 */
309static int cik_sdma_rlc_resume(struct radeon_device *rdev)
310{
311 /* XXX todo */
312 return 0;
313}
314
315/**
316 * cik_sdma_load_microcode - load the sDMA ME ucode
317 *
318 * @rdev: radeon_device pointer
319 *
320 * Loads the sDMA0/1 ucode.
321 * Returns 0 for success, -EINVAL if the ucode is not available.
322 */
323static int cik_sdma_load_microcode(struct radeon_device *rdev)
324{
325 const __be32 *fw_data;
326 int i;
327
328 if (!rdev->sdma_fw)
329 return -EINVAL;
330
331 /* stop the gfx rings and rlc compute queues */
332 cik_sdma_gfx_stop(rdev);
333 cik_sdma_rlc_stop(rdev);
334
335 /* halt the MEs */
336 cik_sdma_enable(rdev, false);
337
338 /* sdma0 */
339 fw_data = (const __be32 *)rdev->sdma_fw->data;
340 WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0);
341 for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++)
342 WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, be32_to_cpup(fw_data++));
343 WREG32(SDMA0_UCODE_DATA + SDMA0_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION);
344
345 /* sdma1 */
346 fw_data = (const __be32 *)rdev->sdma_fw->data;
347 WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0);
348 for (i = 0; i < CIK_SDMA_UCODE_SIZE; i++)
349 WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, be32_to_cpup(fw_data++));
350 WREG32(SDMA0_UCODE_DATA + SDMA1_REGISTER_OFFSET, CIK_SDMA_UCODE_VERSION);
351
352 WREG32(SDMA0_UCODE_ADDR + SDMA0_REGISTER_OFFSET, 0);
353 WREG32(SDMA0_UCODE_ADDR + SDMA1_REGISTER_OFFSET, 0);
354 return 0;
355}
356
357/**
358 * cik_sdma_resume - setup and start the async dma engines
359 *
360 * @rdev: radeon_device pointer
361 *
362 * Set up the DMA engines and enable them (CIK).
363 * Returns 0 for success, error for failure.
364 */
365int cik_sdma_resume(struct radeon_device *rdev)
366{
367 int r;
368
369 /* Reset dma */
370 WREG32(SRBM_SOFT_RESET, SOFT_RESET_SDMA | SOFT_RESET_SDMA1);
371 RREG32(SRBM_SOFT_RESET);
372 udelay(50);
373 WREG32(SRBM_SOFT_RESET, 0);
374 RREG32(SRBM_SOFT_RESET);
375
376 r = cik_sdma_load_microcode(rdev);
377 if (r)
378 return r;
379
380 /* unhalt the MEs */
381 cik_sdma_enable(rdev, true);
382
383 /* start the gfx rings and rlc compute queues */
384 r = cik_sdma_gfx_resume(rdev);
385 if (r)
386 return r;
387 r = cik_sdma_rlc_resume(rdev);
388 if (r)
389 return r;
390
391 return 0;
392}
393
394/**
395 * cik_sdma_fini - tear down the async dma engines
396 *
397 * @rdev: radeon_device pointer
398 *
399 * Stop the async dma engines and free the rings (CIK).
400 */
401void cik_sdma_fini(struct radeon_device *rdev)
402{
403 /* stop the gfx rings and rlc compute queues */
404 cik_sdma_gfx_stop(rdev);
405 cik_sdma_rlc_stop(rdev);
406 /* halt the MEs */
407 cik_sdma_enable(rdev, false);
408 radeon_ring_fini(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX]);
409 radeon_ring_fini(rdev, &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]);
410 /* XXX - compute dma queue tear down */
411}
412
413/**
414 * cik_copy_dma - copy pages using the DMA engine
415 *
416 * @rdev: radeon_device pointer
417 * @src_offset: src GPU address
418 * @dst_offset: dst GPU address
419 * @num_gpu_pages: number of GPU pages to xfer
420 * @fence: radeon fence object
421 *
422 * Copy GPU paging using the DMA engine (CIK).
423 * Used by the radeon ttm implementation to move pages if
424 * registered as the asic copy callback.
425 */
426int cik_copy_dma(struct radeon_device *rdev,
427 uint64_t src_offset, uint64_t dst_offset,
428 unsigned num_gpu_pages,
429 struct radeon_fence **fence)
430{
431 struct radeon_semaphore *sem = NULL;
432 int ring_index = rdev->asic->copy.dma_ring_index;
433 struct radeon_ring *ring = &rdev->ring[ring_index];
434 u32 size_in_bytes, cur_size_in_bytes;
435 int i, num_loops;
436 int r = 0;
437
438 r = radeon_semaphore_create(rdev, &sem);
439 if (r) {
440 DRM_ERROR("radeon: moving bo (%d).\n", r);
441 return r;
442 }
443
444 size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT);
445 num_loops = DIV_ROUND_UP(size_in_bytes, 0x1fffff);
446 r = radeon_ring_lock(rdev, ring, num_loops * 7 + 14);
447 if (r) {
448 DRM_ERROR("radeon: moving bo (%d).\n", r);
449 radeon_semaphore_free(rdev, &sem, NULL);
450 return r;
451 }
452
453 if (radeon_fence_need_sync(*fence, ring->idx)) {
454 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
455 ring->idx);
456 radeon_fence_note_sync(*fence, ring->idx);
457 } else {
458 radeon_semaphore_free(rdev, &sem, NULL);
459 }
460
461 for (i = 0; i < num_loops; i++) {
462 cur_size_in_bytes = size_in_bytes;
463 if (cur_size_in_bytes > 0x1fffff)
464 cur_size_in_bytes = 0x1fffff;
465 size_in_bytes -= cur_size_in_bytes;
466 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0));
467 radeon_ring_write(ring, cur_size_in_bytes);
468 radeon_ring_write(ring, 0); /* src/dst endian swap */
469 radeon_ring_write(ring, src_offset & 0xffffffff);
470 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xffffffff);
471 radeon_ring_write(ring, dst_offset & 0xfffffffc);
472 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xffffffff);
473 src_offset += cur_size_in_bytes;
474 dst_offset += cur_size_in_bytes;
475 }
476
477 r = radeon_fence_emit(rdev, fence, ring->idx);
478 if (r) {
479 radeon_ring_unlock_undo(rdev, ring);
480 return r;
481 }
482
483 radeon_ring_unlock_commit(rdev, ring);
484 radeon_semaphore_free(rdev, &sem, *fence);
485
486 return r;
487}
488
489/**
490 * cik_sdma_ring_test - simple async dma engine test
491 *
492 * @rdev: radeon_device pointer
493 * @ring: radeon_ring structure holding ring information
494 *
495 * Test the DMA engine by writing using it to write an
496 * value to memory. (CIK).
497 * Returns 0 for success, error for failure.
498 */
499int cik_sdma_ring_test(struct radeon_device *rdev,
500 struct radeon_ring *ring)
501{
502 unsigned i;
503 int r;
504 void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
505 u32 tmp;
506
507 if (!ptr) {
508 DRM_ERROR("invalid vram scratch pointer\n");
509 return -EINVAL;
510 }
511
512 tmp = 0xCAFEDEAD;
513 writel(tmp, ptr);
514
515 r = radeon_ring_lock(rdev, ring, 4);
516 if (r) {
517 DRM_ERROR("radeon: dma failed to lock ring %d (%d).\n", ring->idx, r);
518 return r;
519 }
520 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0));
521 radeon_ring_write(ring, rdev->vram_scratch.gpu_addr & 0xfffffffc);
522 radeon_ring_write(ring, upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xffffffff);
523 radeon_ring_write(ring, 1); /* number of DWs to follow */
524 radeon_ring_write(ring, 0xDEADBEEF);
525 radeon_ring_unlock_commit(rdev, ring);
526
527 for (i = 0; i < rdev->usec_timeout; i++) {
528 tmp = readl(ptr);
529 if (tmp == 0xDEADBEEF)
530 break;
531 DRM_UDELAY(1);
532 }
533
534 if (i < rdev->usec_timeout) {
535 DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
536 } else {
537 DRM_ERROR("radeon: ring %d test failed (0x%08X)\n",
538 ring->idx, tmp);
539 r = -EINVAL;
540 }
541 return r;
542}
543
544/**
545 * cik_sdma_ib_test - test an IB on the DMA engine
546 *
547 * @rdev: radeon_device pointer
548 * @ring: radeon_ring structure holding ring information
549 *
550 * Test a simple IB in the DMA ring (CIK).
551 * Returns 0 on success, error on failure.
552 */
553int cik_sdma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
554{
555 struct radeon_ib ib;
556 unsigned i;
557 int r;
558 void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
559 u32 tmp = 0;
560
561 if (!ptr) {
562 DRM_ERROR("invalid vram scratch pointer\n");
563 return -EINVAL;
564 }
565
566 tmp = 0xCAFEDEAD;
567 writel(tmp, ptr);
568
569 r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
570 if (r) {
571 DRM_ERROR("radeon: failed to get ib (%d).\n", r);
572 return r;
573 }
574
575 ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
576 ib.ptr[1] = rdev->vram_scratch.gpu_addr & 0xfffffffc;
577 ib.ptr[2] = upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xffffffff;
578 ib.ptr[3] = 1;
579 ib.ptr[4] = 0xDEADBEEF;
580 ib.length_dw = 5;
581
582 r = radeon_ib_schedule(rdev, &ib, NULL);
583 if (r) {
584 radeon_ib_free(rdev, &ib);
585 DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
586 return r;
587 }
588 r = radeon_fence_wait(ib.fence, false);
589 if (r) {
590 DRM_ERROR("radeon: fence wait failed (%d).\n", r);
591 return r;
592 }
593 for (i = 0; i < rdev->usec_timeout; i++) {
594 tmp = readl(ptr);
595 if (tmp == 0xDEADBEEF)
596 break;
597 DRM_UDELAY(1);
598 }
599 if (i < rdev->usec_timeout) {
600 DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i);
601 } else {
602 DRM_ERROR("radeon: ib test failed (0x%08X)\n", tmp);
603 r = -EINVAL;
604 }
605 radeon_ib_free(rdev, &ib);
606 return r;
607}
608
609/**
610 * cik_sdma_is_lockup - Check if the DMA engine is locked up
611 *
612 * @rdev: radeon_device pointer
613 * @ring: radeon_ring structure holding ring information
614 *
615 * Check if the async DMA engine is locked up (CIK).
616 * Returns true if the engine appears to be locked up, false if not.
617 */
618bool cik_sdma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
619{
620 u32 reset_mask = cik_gpu_check_soft_reset(rdev);
621 u32 mask;
622
623 if (ring->idx == R600_RING_TYPE_DMA_INDEX)
624 mask = RADEON_RESET_DMA;
625 else
626 mask = RADEON_RESET_DMA1;
627
628 if (!(reset_mask & mask)) {
629 radeon_ring_lockup_update(ring);
630 return false;
631 }
632 /* force ring activities */
633 radeon_ring_force_activity(rdev, ring);
634 return radeon_ring_test_lockup(rdev, ring);
635}
636
637/**
638 * cik_sdma_vm_set_page - update the page tables using sDMA
639 *
640 * @rdev: radeon_device pointer
641 * @ib: indirect buffer to fill with commands
642 * @pe: addr of the page entry
643 * @addr: dst addr to write into pe
644 * @count: number of page entries to update
645 * @incr: increase next addr by incr bytes
646 * @flags: access flags
647 *
648 * Update the page tables using sDMA (CIK).
649 */
650void cik_sdma_vm_set_page(struct radeon_device *rdev,
651 struct radeon_ib *ib,
652 uint64_t pe,
653 uint64_t addr, unsigned count,
654 uint32_t incr, uint32_t flags)
655{
656 uint32_t r600_flags = cayman_vm_page_flags(rdev, flags);
657 uint64_t value;
658 unsigned ndw;
659
660 if (flags & RADEON_VM_PAGE_SYSTEM) {
661 while (count) {
662 ndw = count * 2;
663 if (ndw > 0xFFFFE)
664 ndw = 0xFFFFE;
665
666 /* for non-physically contiguous pages (system) */
667 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
668 ib->ptr[ib->length_dw++] = pe;
669 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
670 ib->ptr[ib->length_dw++] = ndw;
671 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
672 if (flags & RADEON_VM_PAGE_SYSTEM) {
673 value = radeon_vm_map_gart(rdev, addr);
674 value &= 0xFFFFFFFFFFFFF000ULL;
675 } else if (flags & RADEON_VM_PAGE_VALID) {
676 value = addr;
677 } else {
678 value = 0;
679 }
680 addr += incr;
681 value |= r600_flags;
682 ib->ptr[ib->length_dw++] = value;
683 ib->ptr[ib->length_dw++] = upper_32_bits(value);
684 }
685 }
686 } else {
687 while (count) {
688 ndw = count;
689 if (ndw > 0x7FFFF)
690 ndw = 0x7FFFF;
691
692 if (flags & RADEON_VM_PAGE_VALID)
693 value = addr;
694 else
695 value = 0;
696 /* for physically contiguous pages (vram) */
697 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_GENERATE_PTE_PDE, 0, 0);
698 ib->ptr[ib->length_dw++] = pe; /* dst addr */
699 ib->ptr[ib->length_dw++] = upper_32_bits(pe);
700 ib->ptr[ib->length_dw++] = r600_flags; /* mask */
701 ib->ptr[ib->length_dw++] = 0;
702 ib->ptr[ib->length_dw++] = value; /* value */
703 ib->ptr[ib->length_dw++] = upper_32_bits(value);
704 ib->ptr[ib->length_dw++] = incr; /* increment size */
705 ib->ptr[ib->length_dw++] = 0;
706 ib->ptr[ib->length_dw++] = ndw; /* number of entries */
707 pe += ndw * 8;
708 addr += ndw * incr;
709 count -= ndw;
710 }
711 }
712 while (ib->length_dw & 0x7)
713 ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0);
714}
715
716/**
717 * cik_dma_vm_flush - cik vm flush using sDMA
718 *
719 * @rdev: radeon_device pointer
720 *
721 * Update the page table base and flush the VM TLB
722 * using sDMA (CIK).
723 */
724void cik_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
725{
726 struct radeon_ring *ring = &rdev->ring[ridx];
727 u32 extra_bits = (SDMA_POLL_REG_MEM_EXTRA_OP(1) |
728 SDMA_POLL_REG_MEM_EXTRA_FUNC(3)); /* == */
729 u32 ref_and_mask;
730
731 if (vm == NULL)
732 return;
733
734 if (ridx == R600_RING_TYPE_DMA_INDEX)
735 ref_and_mask = SDMA0;
736 else
737 ref_and_mask = SDMA1;
738
739 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
740 if (vm->id < 8) {
741 radeon_ring_write(ring, (VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2);
742 } else {
743 radeon_ring_write(ring, (VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2);
744 }
745 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
746
747 /* update SH_MEM_* regs */
748 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
749 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
750 radeon_ring_write(ring, VMID(vm->id));
751
752 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
753 radeon_ring_write(ring, SH_MEM_BASES >> 2);
754 radeon_ring_write(ring, 0);
755
756 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
757 radeon_ring_write(ring, SH_MEM_CONFIG >> 2);
758 radeon_ring_write(ring, 0);
759
760 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
761 radeon_ring_write(ring, SH_MEM_APE1_BASE >> 2);
762 radeon_ring_write(ring, 1);
763
764 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
765 radeon_ring_write(ring, SH_MEM_APE1_LIMIT >> 2);
766 radeon_ring_write(ring, 0);
767
768 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
769 radeon_ring_write(ring, SRBM_GFX_CNTL >> 2);
770 radeon_ring_write(ring, VMID(0));
771
772 /* flush HDP */
773 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_POLL_REG_MEM, 0, extra_bits));
774 radeon_ring_write(ring, GPU_HDP_FLUSH_DONE);
775 radeon_ring_write(ring, GPU_HDP_FLUSH_REQ);
776 radeon_ring_write(ring, ref_and_mask); /* REFERENCE */
777 radeon_ring_write(ring, ref_and_mask); /* MASK */
778 radeon_ring_write(ring, (4 << 16) | 10); /* RETRY_COUNT, POLL_INTERVAL */
779
780 /* flush TLB */
781 radeon_ring_write(ring, SDMA_PACKET(SDMA_OPCODE_SRBM_WRITE, 0, 0xf000));
782 radeon_ring_write(ring, VM_INVALIDATE_REQUEST >> 2);
783 radeon_ring_write(ring, 1 << vm->id);
784}
785
diff --git a/drivers/gpu/drm/radeon/cikd.h b/drivers/gpu/drm/radeon/cikd.h
index 7e9275eaef80..203d2a09a1f5 100644
--- a/drivers/gpu/drm/radeon/cikd.h
+++ b/drivers/gpu/drm/radeon/cikd.h
@@ -28,21 +28,375 @@
28 28
29#define CIK_RB_BITMAP_WIDTH_PER_SH 2 29#define CIK_RB_BITMAP_WIDTH_PER_SH 2
30 30
31/* DIDT IND registers */
32#define DIDT_SQ_CTRL0 0x0
33# define DIDT_CTRL_EN (1 << 0)
34#define DIDT_DB_CTRL0 0x20
35#define DIDT_TD_CTRL0 0x40
36#define DIDT_TCP_CTRL0 0x60
37
31/* SMC IND registers */ 38/* SMC IND registers */
39#define DPM_TABLE_475 0x3F768
40# define SamuBootLevel(x) ((x) << 0)
41# define SamuBootLevel_MASK 0x000000ff
42# define SamuBootLevel_SHIFT 0
43# define AcpBootLevel(x) ((x) << 8)
44# define AcpBootLevel_MASK 0x0000ff00
45# define AcpBootLevel_SHIFT 8
46# define VceBootLevel(x) ((x) << 16)
47# define VceBootLevel_MASK 0x00ff0000
48# define VceBootLevel_SHIFT 16
49# define UvdBootLevel(x) ((x) << 24)
50# define UvdBootLevel_MASK 0xff000000
51# define UvdBootLevel_SHIFT 24
52
53#define FIRMWARE_FLAGS 0x3F800
54# define INTERRUPTS_ENABLED (1 << 0)
55
56#define NB_DPM_CONFIG_1 0x3F9E8
57# define Dpm0PgNbPsLo(x) ((x) << 0)
58# define Dpm0PgNbPsLo_MASK 0x000000ff
59# define Dpm0PgNbPsLo_SHIFT 0
60# define Dpm0PgNbPsHi(x) ((x) << 8)
61# define Dpm0PgNbPsHi_MASK 0x0000ff00
62# define Dpm0PgNbPsHi_SHIFT 8
63# define DpmXNbPsLo(x) ((x) << 16)
64# define DpmXNbPsLo_MASK 0x00ff0000
65# define DpmXNbPsLo_SHIFT 16
66# define DpmXNbPsHi(x) ((x) << 24)
67# define DpmXNbPsHi_MASK 0xff000000
68# define DpmXNbPsHi_SHIFT 24
69
70#define SMC_SYSCON_RESET_CNTL 0x80000000
71# define RST_REG (1 << 0)
72#define SMC_SYSCON_CLOCK_CNTL_0 0x80000004
73# define CK_DISABLE (1 << 0)
74# define CKEN (1 << 24)
75
76#define SMC_SYSCON_MISC_CNTL 0x80000010
77
78#define SMC_SYSCON_MSG_ARG_0 0x80000068
79
80#define SMC_PC_C 0x80000370
81
82#define SMC_SCRATCH9 0x80000424
83
84#define RCU_UC_EVENTS 0xC0000004
85# define BOOT_SEQ_DONE (1 << 7)
86
32#define GENERAL_PWRMGT 0xC0200000 87#define GENERAL_PWRMGT 0xC0200000
88# define GLOBAL_PWRMGT_EN (1 << 0)
89# define STATIC_PM_EN (1 << 1)
90# define THERMAL_PROTECTION_DIS (1 << 2)
91# define THERMAL_PROTECTION_TYPE (1 << 3)
92# define SW_SMIO_INDEX(x) ((x) << 6)
93# define SW_SMIO_INDEX_MASK (1 << 6)
94# define SW_SMIO_INDEX_SHIFT 6
95# define VOLT_PWRMGT_EN (1 << 10)
33# define GPU_COUNTER_CLK (1 << 15) 96# define GPU_COUNTER_CLK (1 << 15)
34 97# define DYN_SPREAD_SPECTRUM_EN (1 << 23)
98
99#define CNB_PWRMGT_CNTL 0xC0200004
100# define GNB_SLOW_MODE(x) ((x) << 0)
101# define GNB_SLOW_MODE_MASK (3 << 0)
102# define GNB_SLOW_MODE_SHIFT 0
103# define GNB_SLOW (1 << 2)
104# define FORCE_NB_PS1 (1 << 3)
105# define DPM_ENABLED (1 << 4)
106
107#define SCLK_PWRMGT_CNTL 0xC0200008
108# define SCLK_PWRMGT_OFF (1 << 0)
109# define RESET_BUSY_CNT (1 << 4)
110# define RESET_SCLK_CNT (1 << 5)
111# define DYNAMIC_PM_EN (1 << 21)
112
113#define TARGET_AND_CURRENT_PROFILE_INDEX 0xC0200014
114# define CURRENT_STATE_MASK (0xf << 4)
115# define CURRENT_STATE_SHIFT 4
116# define CURR_MCLK_INDEX_MASK (0xf << 8)
117# define CURR_MCLK_INDEX_SHIFT 8
118# define CURR_SCLK_INDEX_MASK (0x1f << 16)
119# define CURR_SCLK_INDEX_SHIFT 16
120
121#define CG_SSP 0xC0200044
122# define SST(x) ((x) << 0)
123# define SST_MASK (0xffff << 0)
124# define SSTU(x) ((x) << 16)
125# define SSTU_MASK (0xf << 16)
126
127#define CG_DISPLAY_GAP_CNTL 0xC0200060
128# define DISP_GAP(x) ((x) << 0)
129# define DISP_GAP_MASK (3 << 0)
130# define VBI_TIMER_COUNT(x) ((x) << 4)
131# define VBI_TIMER_COUNT_MASK (0x3fff << 4)
132# define VBI_TIMER_UNIT(x) ((x) << 20)
133# define VBI_TIMER_UNIT_MASK (7 << 20)
134# define DISP_GAP_MCHG(x) ((x) << 24)
135# define DISP_GAP_MCHG_MASK (3 << 24)
136
137#define SMU_VOLTAGE_STATUS 0xC0200094
138# define SMU_VOLTAGE_CURRENT_LEVEL_MASK (0xff << 1)
139# define SMU_VOLTAGE_CURRENT_LEVEL_SHIFT 1
140
141#define TARGET_AND_CURRENT_PROFILE_INDEX_1 0xC02000F0
142# define CURR_PCIE_INDEX_MASK (0xf << 24)
143# define CURR_PCIE_INDEX_SHIFT 24
144
145#define CG_ULV_PARAMETER 0xC0200158
146
147#define CG_FTV_0 0xC02001A8
148#define CG_FTV_1 0xC02001AC
149#define CG_FTV_2 0xC02001B0
150#define CG_FTV_3 0xC02001B4
151#define CG_FTV_4 0xC02001B8
152#define CG_FTV_5 0xC02001BC
153#define CG_FTV_6 0xC02001C0
154#define CG_FTV_7 0xC02001C4
155
156#define CG_DISPLAY_GAP_CNTL2 0xC0200230
157
158#define LCAC_SX0_OVR_SEL 0xC0400D04
159#define LCAC_SX0_OVR_VAL 0xC0400D08
160
161#define LCAC_MC0_CNTL 0xC0400D30
162#define LCAC_MC0_OVR_SEL 0xC0400D34
163#define LCAC_MC0_OVR_VAL 0xC0400D38
164#define LCAC_MC1_CNTL 0xC0400D3C
165#define LCAC_MC1_OVR_SEL 0xC0400D40
166#define LCAC_MC1_OVR_VAL 0xC0400D44
167
168#define LCAC_MC2_OVR_SEL 0xC0400D4C
169#define LCAC_MC2_OVR_VAL 0xC0400D50
170
171#define LCAC_MC3_OVR_SEL 0xC0400D58
172#define LCAC_MC3_OVR_VAL 0xC0400D5C
173
174#define LCAC_CPL_CNTL 0xC0400D80
175#define LCAC_CPL_OVR_SEL 0xC0400D84
176#define LCAC_CPL_OVR_VAL 0xC0400D88
177
178/* dGPU */
179#define CG_THERMAL_CTRL 0xC0300004
180#define DPM_EVENT_SRC(x) ((x) << 0)
181#define DPM_EVENT_SRC_MASK (7 << 0)
182#define DIG_THERM_DPM(x) ((x) << 14)
183#define DIG_THERM_DPM_MASK 0x003FC000
184#define DIG_THERM_DPM_SHIFT 14
185
186#define CG_THERMAL_INT 0xC030000C
187#define CI_DIG_THERM_INTH(x) ((x) << 8)
188#define CI_DIG_THERM_INTH_MASK 0x0000FF00
189#define CI_DIG_THERM_INTH_SHIFT 8
190#define CI_DIG_THERM_INTL(x) ((x) << 16)
191#define CI_DIG_THERM_INTL_MASK 0x00FF0000
192#define CI_DIG_THERM_INTL_SHIFT 16
193#define THERM_INT_MASK_HIGH (1 << 24)
194#define THERM_INT_MASK_LOW (1 << 25)
195
196#define CG_MULT_THERMAL_STATUS 0xC0300014
197#define ASIC_MAX_TEMP(x) ((x) << 0)
198#define ASIC_MAX_TEMP_MASK 0x000001ff
199#define ASIC_MAX_TEMP_SHIFT 0
200#define CTF_TEMP(x) ((x) << 9)
201#define CTF_TEMP_MASK 0x0003fe00
202#define CTF_TEMP_SHIFT 9
203
204#define CG_SPLL_FUNC_CNTL 0xC0500140
205#define SPLL_RESET (1 << 0)
206#define SPLL_PWRON (1 << 1)
207#define SPLL_BYPASS_EN (1 << 3)
208#define SPLL_REF_DIV(x) ((x) << 5)
209#define SPLL_REF_DIV_MASK (0x3f << 5)
210#define SPLL_PDIV_A(x) ((x) << 20)
211#define SPLL_PDIV_A_MASK (0x7f << 20)
212#define SPLL_PDIV_A_SHIFT 20
213#define CG_SPLL_FUNC_CNTL_2 0xC0500144
214#define SCLK_MUX_SEL(x) ((x) << 0)
215#define SCLK_MUX_SEL_MASK (0x1ff << 0)
216#define CG_SPLL_FUNC_CNTL_3 0xC0500148
217#define SPLL_FB_DIV(x) ((x) << 0)
218#define SPLL_FB_DIV_MASK (0x3ffffff << 0)
219#define SPLL_FB_DIV_SHIFT 0
220#define SPLL_DITHEN (1 << 28)
221#define CG_SPLL_FUNC_CNTL_4 0xC050014C
222
223#define CG_SPLL_SPREAD_SPECTRUM 0xC0500164
224#define SSEN (1 << 0)
225#define CLK_S(x) ((x) << 4)
226#define CLK_S_MASK (0xfff << 4)
227#define CLK_S_SHIFT 4
228#define CG_SPLL_SPREAD_SPECTRUM_2 0xC0500168
229#define CLK_V(x) ((x) << 0)
230#define CLK_V_MASK (0x3ffffff << 0)
231#define CLK_V_SHIFT 0
232
233#define MPLL_BYPASSCLK_SEL 0xC050019C
234# define MPLL_CLKOUT_SEL(x) ((x) << 8)
235# define MPLL_CLKOUT_SEL_MASK 0xFF00
35#define CG_CLKPIN_CNTL 0xC05001A0 236#define CG_CLKPIN_CNTL 0xC05001A0
36# define XTALIN_DIVIDE (1 << 1) 237# define XTALIN_DIVIDE (1 << 1)
37 238# define BCLK_AS_XCLK (1 << 2)
239#define CG_CLKPIN_CNTL_2 0xC05001A4
240# define FORCE_BIF_REFCLK_EN (1 << 3)
241# define MUX_TCLK_TO_XCLK (1 << 8)
242#define THM_CLK_CNTL 0xC05001A8
243# define CMON_CLK_SEL(x) ((x) << 0)
244# define CMON_CLK_SEL_MASK 0xFF
245# define TMON_CLK_SEL(x) ((x) << 8)
246# define TMON_CLK_SEL_MASK 0xFF00
247#define MISC_CLK_CTRL 0xC05001AC
248# define DEEP_SLEEP_CLK_SEL(x) ((x) << 0)
249# define DEEP_SLEEP_CLK_SEL_MASK 0xFF
250# define ZCLK_SEL(x) ((x) << 8)
251# define ZCLK_SEL_MASK 0xFF00
252
253/* KV/KB */
254#define CG_THERMAL_INT_CTRL 0xC2100028
255#define DIG_THERM_INTH(x) ((x) << 0)
256#define DIG_THERM_INTH_MASK 0x000000FF
257#define DIG_THERM_INTH_SHIFT 0
258#define DIG_THERM_INTL(x) ((x) << 8)
259#define DIG_THERM_INTL_MASK 0x0000FF00
260#define DIG_THERM_INTL_SHIFT 8
261#define THERM_INTH_MASK (1 << 24)
262#define THERM_INTL_MASK (1 << 25)
263
264/* PCIE registers idx/data 0x38/0x3c */
265#define PB0_PIF_PWRDOWN_0 0x1100012 /* PCIE */
266# define PLL_POWER_STATE_IN_TXS2_0(x) ((x) << 7)
267# define PLL_POWER_STATE_IN_TXS2_0_MASK (0x7 << 7)
268# define PLL_POWER_STATE_IN_TXS2_0_SHIFT 7
269# define PLL_POWER_STATE_IN_OFF_0(x) ((x) << 10)
270# define PLL_POWER_STATE_IN_OFF_0_MASK (0x7 << 10)
271# define PLL_POWER_STATE_IN_OFF_0_SHIFT 10
272# define PLL_RAMP_UP_TIME_0(x) ((x) << 24)
273# define PLL_RAMP_UP_TIME_0_MASK (0x7 << 24)
274# define PLL_RAMP_UP_TIME_0_SHIFT 24
275#define PB0_PIF_PWRDOWN_1 0x1100013 /* PCIE */
276# define PLL_POWER_STATE_IN_TXS2_1(x) ((x) << 7)
277# define PLL_POWER_STATE_IN_TXS2_1_MASK (0x7 << 7)
278# define PLL_POWER_STATE_IN_TXS2_1_SHIFT 7
279# define PLL_POWER_STATE_IN_OFF_1(x) ((x) << 10)
280# define PLL_POWER_STATE_IN_OFF_1_MASK (0x7 << 10)
281# define PLL_POWER_STATE_IN_OFF_1_SHIFT 10
282# define PLL_RAMP_UP_TIME_1(x) ((x) << 24)
283# define PLL_RAMP_UP_TIME_1_MASK (0x7 << 24)
284# define PLL_RAMP_UP_TIME_1_SHIFT 24
285
286#define PCIE_CNTL2 0x1001001c /* PCIE */
287# define SLV_MEM_LS_EN (1 << 16)
288# define SLV_MEM_AGGRESSIVE_LS_EN (1 << 17)
289# define MST_MEM_LS_EN (1 << 18)
290# define REPLAY_MEM_LS_EN (1 << 19)
291
292#define PCIE_LC_STATUS1 0x1400028 /* PCIE */
293# define LC_REVERSE_RCVR (1 << 0)
294# define LC_REVERSE_XMIT (1 << 1)
295# define LC_OPERATING_LINK_WIDTH_MASK (0x7 << 2)
296# define LC_OPERATING_LINK_WIDTH_SHIFT 2
297# define LC_DETECTED_LINK_WIDTH_MASK (0x7 << 5)
298# define LC_DETECTED_LINK_WIDTH_SHIFT 5
299
300#define PCIE_P_CNTL 0x1400040 /* PCIE */
301# define P_IGNORE_EDB_ERR (1 << 6)
302
303#define PB1_PIF_PWRDOWN_0 0x2100012 /* PCIE */
304#define PB1_PIF_PWRDOWN_1 0x2100013 /* PCIE */
305
306#define PCIE_LC_CNTL 0x100100A0 /* PCIE */
307# define LC_L0S_INACTIVITY(x) ((x) << 8)
308# define LC_L0S_INACTIVITY_MASK (0xf << 8)
309# define LC_L0S_INACTIVITY_SHIFT 8
310# define LC_L1_INACTIVITY(x) ((x) << 12)
311# define LC_L1_INACTIVITY_MASK (0xf << 12)
312# define LC_L1_INACTIVITY_SHIFT 12
313# define LC_PMI_TO_L1_DIS (1 << 16)
314# define LC_ASPM_TO_L1_DIS (1 << 24)
315
316#define PCIE_LC_LINK_WIDTH_CNTL 0x100100A2 /* PCIE */
317# define LC_LINK_WIDTH_SHIFT 0
318# define LC_LINK_WIDTH_MASK 0x7
319# define LC_LINK_WIDTH_X0 0
320# define LC_LINK_WIDTH_X1 1
321# define LC_LINK_WIDTH_X2 2
322# define LC_LINK_WIDTH_X4 3
323# define LC_LINK_WIDTH_X8 4
324# define LC_LINK_WIDTH_X16 6
325# define LC_LINK_WIDTH_RD_SHIFT 4
326# define LC_LINK_WIDTH_RD_MASK 0x70
327# define LC_RECONFIG_ARC_MISSING_ESCAPE (1 << 7)
328# define LC_RECONFIG_NOW (1 << 8)
329# define LC_RENEGOTIATION_SUPPORT (1 << 9)
330# define LC_RENEGOTIATE_EN (1 << 10)
331# define LC_SHORT_RECONFIG_EN (1 << 11)
332# define LC_UPCONFIGURE_SUPPORT (1 << 12)
333# define LC_UPCONFIGURE_DIS (1 << 13)
334# define LC_DYN_LANES_PWR_STATE(x) ((x) << 21)
335# define LC_DYN_LANES_PWR_STATE_MASK (0x3 << 21)
336# define LC_DYN_LANES_PWR_STATE_SHIFT 21
337#define PCIE_LC_N_FTS_CNTL 0x100100a3 /* PCIE */
338# define LC_XMIT_N_FTS(x) ((x) << 0)
339# define LC_XMIT_N_FTS_MASK (0xff << 0)
340# define LC_XMIT_N_FTS_SHIFT 0
341# define LC_XMIT_N_FTS_OVERRIDE_EN (1 << 8)
342# define LC_N_FTS_MASK (0xff << 24)
343#define PCIE_LC_SPEED_CNTL 0x100100A4 /* PCIE */
344# define LC_GEN2_EN_STRAP (1 << 0)
345# define LC_GEN3_EN_STRAP (1 << 1)
346# define LC_TARGET_LINK_SPEED_OVERRIDE_EN (1 << 2)
347# define LC_TARGET_LINK_SPEED_OVERRIDE_MASK (0x3 << 3)
348# define LC_TARGET_LINK_SPEED_OVERRIDE_SHIFT 3
349# define LC_FORCE_EN_SW_SPEED_CHANGE (1 << 5)
350# define LC_FORCE_DIS_SW_SPEED_CHANGE (1 << 6)
351# define LC_FORCE_EN_HW_SPEED_CHANGE (1 << 7)
352# define LC_FORCE_DIS_HW_SPEED_CHANGE (1 << 8)
353# define LC_INITIATE_LINK_SPEED_CHANGE (1 << 9)
354# define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_MASK (0x3 << 10)
355# define LC_SPEED_CHANGE_ATTEMPTS_ALLOWED_SHIFT 10
356# define LC_CURRENT_DATA_RATE_MASK (0x3 << 13) /* 0/1/2 = gen1/2/3 */
357# define LC_CURRENT_DATA_RATE_SHIFT 13
358# define LC_CLR_FAILED_SPD_CHANGE_CNT (1 << 16)
359# define LC_OTHER_SIDE_EVER_SENT_GEN2 (1 << 18)
360# define LC_OTHER_SIDE_SUPPORTS_GEN2 (1 << 19)
361# define LC_OTHER_SIDE_EVER_SENT_GEN3 (1 << 20)
362# define LC_OTHER_SIDE_SUPPORTS_GEN3 (1 << 21)
363
364#define PCIE_LC_CNTL2 0x100100B1 /* PCIE */
365# define LC_ALLOW_PDWN_IN_L1 (1 << 17)
366# define LC_ALLOW_PDWN_IN_L23 (1 << 18)
367
368#define PCIE_LC_CNTL3 0x100100B5 /* PCIE */
369# define LC_GO_TO_RECOVERY (1 << 30)
370#define PCIE_LC_CNTL4 0x100100B6 /* PCIE */
371# define LC_REDO_EQ (1 << 5)
372# define LC_SET_QUIESCE (1 << 13)
373
374/* direct registers */
38#define PCIE_INDEX 0x38 375#define PCIE_INDEX 0x38
39#define PCIE_DATA 0x3C 376#define PCIE_DATA 0x3C
40 377
378#define SMC_IND_INDEX_0 0x200
379#define SMC_IND_DATA_0 0x204
380
381#define SMC_IND_ACCESS_CNTL 0x240
382#define AUTO_INCREMENT_IND_0 (1 << 0)
383
384#define SMC_MESSAGE_0 0x250
385#define SMC_MSG_MASK 0xffff
386#define SMC_RESP_0 0x254
387#define SMC_RESP_MASK 0xffff
388
389#define SMC_MSG_ARG_0 0x290
390
41#define VGA_HDP_CONTROL 0x328 391#define VGA_HDP_CONTROL 0x328
42#define VGA_MEMORY_DISABLE (1 << 4) 392#define VGA_MEMORY_DISABLE (1 << 4)
43 393
44#define DMIF_ADDR_CALC 0xC00 394#define DMIF_ADDR_CALC 0xC00
45 395
396#define PIPE0_DMIF_BUFFER_CONTROL 0x0ca0
397# define DMIF_BUFFERS_ALLOCATED(x) ((x) << 0)
398# define DMIF_BUFFERS_ALLOCATED_COMPLETED (1 << 4)
399
46#define SRBM_GFX_CNTL 0xE44 400#define SRBM_GFX_CNTL 0xE44
47#define PIPEID(x) ((x) << 0) 401#define PIPEID(x) ((x) << 0)
48#define MEID(x) ((x) << 2) 402#define MEID(x) ((x) << 2)
@@ -172,6 +526,10 @@
172#define VM_CONTEXT0_PAGE_TABLE_END_ADDR 0x157C 526#define VM_CONTEXT0_PAGE_TABLE_END_ADDR 0x157C
173#define VM_CONTEXT1_PAGE_TABLE_END_ADDR 0x1580 527#define VM_CONTEXT1_PAGE_TABLE_END_ADDR 0x1580
174 528
529#define VM_L2_CG 0x15c0
530#define MC_CG_ENABLE (1 << 18)
531#define MC_LS_ENABLE (1 << 19)
532
175#define MC_SHARED_CHMAP 0x2004 533#define MC_SHARED_CHMAP 0x2004
176#define NOOFCHAN_SHIFT 12 534#define NOOFCHAN_SHIFT 12
177#define NOOFCHAN_MASK 0x0000f000 535#define NOOFCHAN_MASK 0x0000f000
@@ -201,6 +559,17 @@
201 559
202#define MC_SHARED_BLACKOUT_CNTL 0x20ac 560#define MC_SHARED_BLACKOUT_CNTL 0x20ac
203 561
562#define MC_HUB_MISC_HUB_CG 0x20b8
563#define MC_HUB_MISC_VM_CG 0x20bc
564
565#define MC_HUB_MISC_SIP_CG 0x20c0
566
567#define MC_XPB_CLK_GAT 0x2478
568
569#define MC_CITF_MISC_RD_CG 0x2648
570#define MC_CITF_MISC_WR_CG 0x264c
571#define MC_CITF_MISC_VM_CG 0x2650
572
204#define MC_ARB_RAMCFG 0x2760 573#define MC_ARB_RAMCFG 0x2760
205#define NOOFBANK_SHIFT 0 574#define NOOFBANK_SHIFT 0
206#define NOOFBANK_MASK 0x00000003 575#define NOOFBANK_MASK 0x00000003
@@ -215,9 +584,37 @@
215#define NOOFGROUPS_SHIFT 12 584#define NOOFGROUPS_SHIFT 12
216#define NOOFGROUPS_MASK 0x00001000 585#define NOOFGROUPS_MASK 0x00001000
217 586
587#define MC_ARB_DRAM_TIMING 0x2774
588#define MC_ARB_DRAM_TIMING2 0x2778
589
590#define MC_ARB_BURST_TIME 0x2808
591#define STATE0(x) ((x) << 0)
592#define STATE0_MASK (0x1f << 0)
593#define STATE0_SHIFT 0
594#define STATE1(x) ((x) << 5)
595#define STATE1_MASK (0x1f << 5)
596#define STATE1_SHIFT 5
597#define STATE2(x) ((x) << 10)
598#define STATE2_MASK (0x1f << 10)
599#define STATE2_SHIFT 10
600#define STATE3(x) ((x) << 15)
601#define STATE3_MASK (0x1f << 15)
602#define STATE3_SHIFT 15
603
604#define MC_SEQ_RAS_TIMING 0x28a0
605#define MC_SEQ_CAS_TIMING 0x28a4
606#define MC_SEQ_MISC_TIMING 0x28a8
607#define MC_SEQ_MISC_TIMING2 0x28ac
608#define MC_SEQ_PMG_TIMING 0x28b0
609#define MC_SEQ_RD_CTL_D0 0x28b4
610#define MC_SEQ_RD_CTL_D1 0x28b8
611#define MC_SEQ_WR_CTL_D0 0x28bc
612#define MC_SEQ_WR_CTL_D1 0x28c0
613
218#define MC_SEQ_SUP_CNTL 0x28c8 614#define MC_SEQ_SUP_CNTL 0x28c8
219#define RUN_MASK (1 << 0) 615#define RUN_MASK (1 << 0)
220#define MC_SEQ_SUP_PGM 0x28cc 616#define MC_SEQ_SUP_PGM 0x28cc
617#define MC_PMG_AUTO_CMD 0x28d0
221 618
222#define MC_SEQ_TRAIN_WAKEUP_CNTL 0x28e8 619#define MC_SEQ_TRAIN_WAKEUP_CNTL 0x28e8
223#define TRAIN_DONE_D0 (1 << 30) 620#define TRAIN_DONE_D0 (1 << 30)
@@ -226,10 +623,92 @@
226#define MC_IO_PAD_CNTL_D0 0x29d0 623#define MC_IO_PAD_CNTL_D0 0x29d0
227#define MEM_FALL_OUT_CMD (1 << 8) 624#define MEM_FALL_OUT_CMD (1 << 8)
228 625
626#define MC_SEQ_MISC0 0x2a00
627#define MC_SEQ_MISC0_VEN_ID_SHIFT 8
628#define MC_SEQ_MISC0_VEN_ID_MASK 0x00000f00
629#define MC_SEQ_MISC0_VEN_ID_VALUE 3
630#define MC_SEQ_MISC0_REV_ID_SHIFT 12
631#define MC_SEQ_MISC0_REV_ID_MASK 0x0000f000
632#define MC_SEQ_MISC0_REV_ID_VALUE 1
633#define MC_SEQ_MISC0_GDDR5_SHIFT 28
634#define MC_SEQ_MISC0_GDDR5_MASK 0xf0000000
635#define MC_SEQ_MISC0_GDDR5_VALUE 5
636#define MC_SEQ_MISC1 0x2a04
637#define MC_SEQ_RESERVE_M 0x2a08
638#define MC_PMG_CMD_EMRS 0x2a0c
639
229#define MC_SEQ_IO_DEBUG_INDEX 0x2a44 640#define MC_SEQ_IO_DEBUG_INDEX 0x2a44
230#define MC_SEQ_IO_DEBUG_DATA 0x2a48 641#define MC_SEQ_IO_DEBUG_DATA 0x2a48
231 642
643#define MC_SEQ_MISC5 0x2a54
644#define MC_SEQ_MISC6 0x2a58
645
646#define MC_SEQ_MISC7 0x2a64
647
648#define MC_SEQ_RAS_TIMING_LP 0x2a6c
649#define MC_SEQ_CAS_TIMING_LP 0x2a70
650#define MC_SEQ_MISC_TIMING_LP 0x2a74
651#define MC_SEQ_MISC_TIMING2_LP 0x2a78
652#define MC_SEQ_WR_CTL_D0_LP 0x2a7c
653#define MC_SEQ_WR_CTL_D1_LP 0x2a80
654#define MC_SEQ_PMG_CMD_EMRS_LP 0x2a84
655#define MC_SEQ_PMG_CMD_MRS_LP 0x2a88
656
657#define MC_PMG_CMD_MRS 0x2aac
658
659#define MC_SEQ_RD_CTL_D0_LP 0x2b1c
660#define MC_SEQ_RD_CTL_D1_LP 0x2b20
661
662#define MC_PMG_CMD_MRS1 0x2b44
663#define MC_SEQ_PMG_CMD_MRS1_LP 0x2b48
664#define MC_SEQ_PMG_TIMING_LP 0x2b4c
665
666#define MC_SEQ_WR_CTL_2 0x2b54
667#define MC_SEQ_WR_CTL_2_LP 0x2b58
668#define MC_PMG_CMD_MRS2 0x2b5c
669#define MC_SEQ_PMG_CMD_MRS2_LP 0x2b60
670
671#define MCLK_PWRMGT_CNTL 0x2ba0
672# define DLL_SPEED(x) ((x) << 0)
673# define DLL_SPEED_MASK (0x1f << 0)
674# define DLL_READY (1 << 6)
675# define MC_INT_CNTL (1 << 7)
676# define MRDCK0_PDNB (1 << 8)
677# define MRDCK1_PDNB (1 << 9)
678# define MRDCK0_RESET (1 << 16)
679# define MRDCK1_RESET (1 << 17)
680# define DLL_READY_READ (1 << 24)
681#define DLL_CNTL 0x2ba4
682# define MRDCK0_BYPASS (1 << 24)
683# define MRDCK1_BYPASS (1 << 25)
684
685#define MPLL_FUNC_CNTL 0x2bb4
686#define BWCTRL(x) ((x) << 20)
687#define BWCTRL_MASK (0xff << 20)
688#define MPLL_FUNC_CNTL_1 0x2bb8
689#define VCO_MODE(x) ((x) << 0)
690#define VCO_MODE_MASK (3 << 0)
691#define CLKFRAC(x) ((x) << 4)
692#define CLKFRAC_MASK (0xfff << 4)
693#define CLKF(x) ((x) << 16)
694#define CLKF_MASK (0xfff << 16)
695#define MPLL_FUNC_CNTL_2 0x2bbc
696#define MPLL_AD_FUNC_CNTL 0x2bc0
697#define YCLK_POST_DIV(x) ((x) << 0)
698#define YCLK_POST_DIV_MASK (7 << 0)
699#define MPLL_DQ_FUNC_CNTL 0x2bc4
700#define YCLK_SEL(x) ((x) << 4)
701#define YCLK_SEL_MASK (1 << 4)
702
703#define MPLL_SS1 0x2bcc
704#define CLKV(x) ((x) << 0)
705#define CLKV_MASK (0x3ffffff << 0)
706#define MPLL_SS2 0x2bd0
707#define CLKS(x) ((x) << 0)
708#define CLKS_MASK (0xfff << 0)
709
232#define HDP_HOST_PATH_CNTL 0x2C00 710#define HDP_HOST_PATH_CNTL 0x2C00
711#define CLOCK_GATING_DIS (1 << 23)
233#define HDP_NONSURFACE_BASE 0x2C04 712#define HDP_NONSURFACE_BASE 0x2C04
234#define HDP_NONSURFACE_INFO 0x2C08 713#define HDP_NONSURFACE_INFO 0x2C08
235#define HDP_NONSURFACE_SIZE 0x2C0C 714#define HDP_NONSURFACE_SIZE 0x2C0C
@@ -237,6 +716,26 @@
237#define HDP_ADDR_CONFIG 0x2F48 716#define HDP_ADDR_CONFIG 0x2F48
238#define HDP_MISC_CNTL 0x2F4C 717#define HDP_MISC_CNTL 0x2F4C
239#define HDP_FLUSH_INVALIDATE_CACHE (1 << 0) 718#define HDP_FLUSH_INVALIDATE_CACHE (1 << 0)
719#define HDP_MEM_POWER_LS 0x2F50
720#define HDP_LS_ENABLE (1 << 0)
721
722#define ATC_MISC_CG 0x3350
723
724#define MC_SEQ_CNTL_3 0x3600
725# define CAC_EN (1 << 31)
726#define MC_SEQ_G5PDX_CTRL 0x3604
727#define MC_SEQ_G5PDX_CTRL_LP 0x3608
728#define MC_SEQ_G5PDX_CMD0 0x360c
729#define MC_SEQ_G5PDX_CMD0_LP 0x3610
730#define MC_SEQ_G5PDX_CMD1 0x3614
731#define MC_SEQ_G5PDX_CMD1_LP 0x3618
732
733#define MC_SEQ_PMG_DVS_CTL 0x3628
734#define MC_SEQ_PMG_DVS_CTL_LP 0x362c
735#define MC_SEQ_PMG_DVS_CMD 0x3630
736#define MC_SEQ_PMG_DVS_CMD_LP 0x3634
737#define MC_SEQ_DLL_STBY 0x3638
738#define MC_SEQ_DLL_STBY_LP 0x363c
240 739
241#define IH_RB_CNTL 0x3e00 740#define IH_RB_CNTL 0x3e00
242# define IH_RB_ENABLE (1 << 0) 741# define IH_RB_ENABLE (1 << 0)
@@ -265,6 +764,9 @@
265# define MC_WR_CLEAN_CNT(x) ((x) << 20) 764# define MC_WR_CLEAN_CNT(x) ((x) << 20)
266# define MC_VMID(x) ((x) << 25) 765# define MC_VMID(x) ((x) << 25)
267 766
767#define BIF_LNCNT_RESET 0x5220
768# define RESET_LNCNT_EN (1 << 0)
769
268#define CONFIG_MEMSIZE 0x5428 770#define CONFIG_MEMSIZE 0x5428
269 771
270#define INTERRUPT_CNTL 0x5468 772#define INTERRUPT_CNTL 0x5468
@@ -401,6 +903,9 @@
401# define DC_HPDx_RX_INT_TIMER(x) ((x) << 16) 903# define DC_HPDx_RX_INT_TIMER(x) ((x) << 16)
402# define DC_HPDx_EN (1 << 28) 904# define DC_HPDx_EN (1 << 28)
403 905
906#define DPG_PIPE_STUTTER_CONTROL 0x6cd4
907# define STUTTER_ENABLE (1 << 0)
908
404#define GRBM_CNTL 0x8000 909#define GRBM_CNTL 0x8000
405#define GRBM_READ_TIMEOUT(x) ((x) << 0) 910#define GRBM_READ_TIMEOUT(x) ((x) << 0)
406 911
@@ -504,6 +1009,9 @@
504 1009
505#define CP_RB0_RPTR 0x8700 1010#define CP_RB0_RPTR 0x8700
506#define CP_RB_WPTR_DELAY 0x8704 1011#define CP_RB_WPTR_DELAY 0x8704
1012#define CP_RB_WPTR_POLL_CNTL 0x8708
1013#define IDLE_POLL_COUNT(x) ((x) << 16)
1014#define IDLE_POLL_COUNT_MASK (0xffff << 16)
507 1015
508#define CP_MEQ_THRESHOLDS 0x8764 1016#define CP_MEQ_THRESHOLDS 0x8764
509#define MEQ1_START(x) ((x) << 0) 1017#define MEQ1_START(x) ((x) << 0)
@@ -730,6 +1238,9 @@
730# define CP_RINGID1_INT_STAT (1 << 30) 1238# define CP_RINGID1_INT_STAT (1 << 30)
731# define CP_RINGID0_INT_STAT (1 << 31) 1239# define CP_RINGID0_INT_STAT (1 << 31)
732 1240
1241#define CP_MEM_SLP_CNTL 0xC1E4
1242# define CP_MEM_LS_EN (1 << 0)
1243
733#define CP_CPF_DEBUG 0xC200 1244#define CP_CPF_DEBUG 0xC200
734 1245
735#define CP_PQ_WPTR_POLL_CNTL 0xC20C 1246#define CP_PQ_WPTR_POLL_CNTL 0xC20C
@@ -775,14 +1286,20 @@
775 1286
776#define RLC_MC_CNTL 0xC30C 1287#define RLC_MC_CNTL 0xC30C
777 1288
1289#define RLC_MEM_SLP_CNTL 0xC318
1290# define RLC_MEM_LS_EN (1 << 0)
1291
778#define RLC_LB_CNTR_MAX 0xC348 1292#define RLC_LB_CNTR_MAX 0xC348
779 1293
780#define RLC_LB_CNTL 0xC364 1294#define RLC_LB_CNTL 0xC364
1295# define LOAD_BALANCE_ENABLE (1 << 0)
781 1296
782#define RLC_LB_CNTR_INIT 0xC36C 1297#define RLC_LB_CNTR_INIT 0xC36C
783 1298
784#define RLC_SAVE_AND_RESTORE_BASE 0xC374 1299#define RLC_SAVE_AND_RESTORE_BASE 0xC374
785#define RLC_DRIVER_DMA_STATUS 0xC378 1300#define RLC_DRIVER_DMA_STATUS 0xC378 /* dGPU */
1301#define RLC_CP_TABLE_RESTORE 0xC378 /* APU */
1302#define RLC_PG_DELAY_2 0xC37C
786 1303
787#define RLC_GPM_UCODE_ADDR 0xC388 1304#define RLC_GPM_UCODE_ADDR 0xC388
788#define RLC_GPM_UCODE_DATA 0xC38C 1305#define RLC_GPM_UCODE_DATA 0xC38C
@@ -791,12 +1308,52 @@
791#define RLC_CAPTURE_GPU_CLOCK_COUNT 0xC398 1308#define RLC_CAPTURE_GPU_CLOCK_COUNT 0xC398
792#define RLC_UCODE_CNTL 0xC39C 1309#define RLC_UCODE_CNTL 0xC39C
793 1310
1311#define RLC_GPM_STAT 0xC400
1312# define RLC_GPM_BUSY (1 << 0)
1313# define GFX_POWER_STATUS (1 << 1)
1314# define GFX_CLOCK_STATUS (1 << 2)
1315
1316#define RLC_PG_CNTL 0xC40C
1317# define GFX_PG_ENABLE (1 << 0)
1318# define GFX_PG_SRC (1 << 1)
1319# define DYN_PER_CU_PG_ENABLE (1 << 2)
1320# define STATIC_PER_CU_PG_ENABLE (1 << 3)
1321# define DISABLE_GDS_PG (1 << 13)
1322# define DISABLE_CP_PG (1 << 15)
1323# define SMU_CLK_SLOWDOWN_ON_PU_ENABLE (1 << 17)
1324# define SMU_CLK_SLOWDOWN_ON_PD_ENABLE (1 << 18)
1325
1326#define RLC_CGTT_MGCG_OVERRIDE 0xC420
794#define RLC_CGCG_CGLS_CTRL 0xC424 1327#define RLC_CGCG_CGLS_CTRL 0xC424
1328# define CGCG_EN (1 << 0)
1329# define CGLS_EN (1 << 1)
1330
1331#define RLC_PG_DELAY 0xC434
795 1332
796#define RLC_LB_INIT_CU_MASK 0xC43C 1333#define RLC_LB_INIT_CU_MASK 0xC43C
797 1334
798#define RLC_LB_PARAMS 0xC444 1335#define RLC_LB_PARAMS 0xC444
799 1336
1337#define RLC_PG_AO_CU_MASK 0xC44C
1338
1339#define RLC_MAX_PG_CU 0xC450
1340# define MAX_PU_CU(x) ((x) << 0)
1341# define MAX_PU_CU_MASK (0xff << 0)
1342#define RLC_AUTO_PG_CTRL 0xC454
1343# define AUTO_PG_EN (1 << 0)
1344# define GRBM_REG_SGIT(x) ((x) << 3)
1345# define GRBM_REG_SGIT_MASK (0xffff << 3)
1346
1347#define RLC_SERDES_WR_CU_MASTER_MASK 0xC474
1348#define RLC_SERDES_WR_NONCU_MASTER_MASK 0xC478
1349#define RLC_SERDES_WR_CTRL 0xC47C
1350#define BPM_ADDR(x) ((x) << 0)
1351#define BPM_ADDR_MASK (0xff << 0)
1352#define CGLS_ENABLE (1 << 16)
1353#define CGCG_OVERRIDE_0 (1 << 20)
1354#define MGCG_OVERRIDE_0 (1 << 22)
1355#define MGCG_OVERRIDE_1 (1 << 23)
1356
800#define RLC_SERDES_CU_MASTER_BUSY 0xC484 1357#define RLC_SERDES_CU_MASTER_BUSY 0xC484
801#define RLC_SERDES_NONCU_MASTER_BUSY 0xC488 1358#define RLC_SERDES_NONCU_MASTER_BUSY 0xC488
802# define SE_MASTER_BUSY_MASK 0x0000ffff 1359# define SE_MASTER_BUSY_MASK 0x0000ffff
@@ -807,6 +1364,13 @@
807#define RLC_GPM_SCRATCH_ADDR 0xC4B0 1364#define RLC_GPM_SCRATCH_ADDR 0xC4B0
808#define RLC_GPM_SCRATCH_DATA 0xC4B4 1365#define RLC_GPM_SCRATCH_DATA 0xC4B4
809 1366
1367#define RLC_GPR_REG2 0xC4E8
1368#define REQ 0x00000001
1369#define MESSAGE(x) ((x) << 1)
1370#define MESSAGE_MASK 0x0000001e
1371#define MSG_ENTER_RLC_SAFE_MODE 1
1372#define MSG_EXIT_RLC_SAFE_MODE 0
1373
810#define CP_HPD_EOP_BASE_ADDR 0xC904 1374#define CP_HPD_EOP_BASE_ADDR 0xC904
811#define CP_HPD_EOP_BASE_ADDR_HI 0xC908 1375#define CP_HPD_EOP_BASE_ADDR_HI 0xC908
812#define CP_HPD_EOP_VMID 0xC90C 1376#define CP_HPD_EOP_VMID 0xC90C
@@ -851,6 +1415,8 @@
851#define MQD_VMID(x) ((x) << 0) 1415#define MQD_VMID(x) ((x) << 0)
852#define MQD_VMID_MASK (0xf << 0) 1416#define MQD_VMID_MASK (0xf << 0)
853 1417
1418#define DB_RENDER_CONTROL 0x28000
1419
854#define PA_SC_RASTER_CONFIG 0x28350 1420#define PA_SC_RASTER_CONFIG 0x28350
855# define RASTER_CONFIG_RB_MAP_0 0 1421# define RASTER_CONFIG_RB_MAP_0 0
856# define RASTER_CONFIG_RB_MAP_1 1 1422# define RASTER_CONFIG_RB_MAP_1 1
@@ -944,6 +1510,16 @@
944 1510
945#define CP_PERFMON_CNTL 0x36020 1511#define CP_PERFMON_CNTL 0x36020
946 1512
1513#define CGTS_SM_CTRL_REG 0x3c000
1514#define SM_MODE(x) ((x) << 17)
1515#define SM_MODE_MASK (0x7 << 17)
1516#define SM_MODE_ENABLE (1 << 20)
1517#define CGTS_OVERRIDE (1 << 21)
1518#define CGTS_LS_OVERRIDE (1 << 22)
1519#define ON_MONITOR_ADD_EN (1 << 23)
1520#define ON_MONITOR_ADD(x) ((x) << 24)
1521#define ON_MONITOR_ADD_MASK (0xff << 24)
1522
947#define CGTS_TCC_DISABLE 0x3c00c 1523#define CGTS_TCC_DISABLE 0x3c00c
948#define CGTS_USER_TCC_DISABLE 0x3c010 1524#define CGTS_USER_TCC_DISABLE 0x3c010
949#define TCC_DISABLE_MASK 0xFFFF0000 1525#define TCC_DISABLE_MASK 0xFFFF0000
@@ -1176,6 +1752,8 @@
1176 1752
1177#define SDMA0_UCODE_ADDR 0xD000 1753#define SDMA0_UCODE_ADDR 0xD000
1178#define SDMA0_UCODE_DATA 0xD004 1754#define SDMA0_UCODE_DATA 0xD004
1755#define SDMA0_POWER_CNTL 0xD008
1756#define SDMA0_CLK_CTRL 0xD00C
1179 1757
1180#define SDMA0_CNTL 0xD010 1758#define SDMA0_CNTL 0xD010
1181# define TRAP_ENABLE (1 << 0) 1759# define TRAP_ENABLE (1 << 0)
@@ -1300,6 +1878,13 @@
1300#define UVD_RBC_RB_RPTR 0xf690 1878#define UVD_RBC_RB_RPTR 0xf690
1301#define UVD_RBC_RB_WPTR 0xf694 1879#define UVD_RBC_RB_WPTR 0xf694
1302 1880
1881#define UVD_CGC_CTRL 0xF4B0
1882# define DCM (1 << 0)
1883# define CG_DT(x) ((x) << 2)
1884# define CG_DT_MASK (0xf << 2)
1885# define CLK_OD(x) ((x) << 6)
1886# define CLK_OD_MASK (0x1f << 6)
1887
1303/* UVD clocks */ 1888/* UVD clocks */
1304 1889
1305#define CG_DCLK_CNTL 0xC050009C 1890#define CG_DCLK_CNTL 0xC050009C
@@ -1310,4 +1895,7 @@
1310#define CG_VCLK_CNTL 0xC05000A4 1895#define CG_VCLK_CNTL 0xC05000A4
1311#define CG_VCLK_STATUS 0xC05000A8 1896#define CG_VCLK_STATUS 0xC05000A8
1312 1897
1898/* UVD CTX indirect */
1899#define UVD_CGC_MEM_CTRL 0xC0
1900
1313#endif 1901#endif
diff --git a/drivers/gpu/drm/radeon/clearstate_cayman.h b/drivers/gpu/drm/radeon/clearstate_cayman.h
index c00339440c5e..aa908c55a513 100644
--- a/drivers/gpu/drm/radeon/clearstate_cayman.h
+++ b/drivers/gpu/drm/radeon/clearstate_cayman.h
@@ -1073,7 +1073,7 @@ static const struct cs_extent_def SECT_CTRLCONST_defs[] =
1073 {SECT_CTRLCONST_def_1, 0x0000f3fc, 2 }, 1073 {SECT_CTRLCONST_def_1, 0x0000f3fc, 2 },
1074 { 0, 0, 0 } 1074 { 0, 0, 0 }
1075}; 1075};
1076struct cs_section_def cayman_cs_data[] = { 1076static const struct cs_section_def cayman_cs_data[] = {
1077 { SECT_CONTEXT_defs, SECT_CONTEXT }, 1077 { SECT_CONTEXT_defs, SECT_CONTEXT },
1078 { SECT_CLEAR_defs, SECT_CLEAR }, 1078 { SECT_CLEAR_defs, SECT_CLEAR },
1079 { SECT_CTRLCONST_defs, SECT_CTRLCONST }, 1079 { SECT_CTRLCONST_defs, SECT_CTRLCONST },
diff --git a/drivers/gpu/drm/radeon/clearstate_ci.h b/drivers/gpu/drm/radeon/clearstate_ci.h
new file mode 100644
index 000000000000..c3982f9475fb
--- /dev/null
+++ b/drivers/gpu/drm/radeon/clearstate_ci.h
@@ -0,0 +1,944 @@
1/*
2 * Copyright 2013 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
24static const unsigned int ci_SECT_CONTEXT_def_1[] =
25{
26 0x00000000, // DB_RENDER_CONTROL
27 0x00000000, // DB_COUNT_CONTROL
28 0x00000000, // DB_DEPTH_VIEW
29 0x00000000, // DB_RENDER_OVERRIDE
30 0x00000000, // DB_RENDER_OVERRIDE2
31 0x00000000, // DB_HTILE_DATA_BASE
32 0, // HOLE
33 0, // HOLE
34 0x00000000, // DB_DEPTH_BOUNDS_MIN
35 0x00000000, // DB_DEPTH_BOUNDS_MAX
36 0x00000000, // DB_STENCIL_CLEAR
37 0x00000000, // DB_DEPTH_CLEAR
38 0x00000000, // PA_SC_SCREEN_SCISSOR_TL
39 0x40004000, // PA_SC_SCREEN_SCISSOR_BR
40 0, // HOLE
41 0x00000000, // DB_DEPTH_INFO
42 0x00000000, // DB_Z_INFO
43 0x00000000, // DB_STENCIL_INFO
44 0x00000000, // DB_Z_READ_BASE
45 0x00000000, // DB_STENCIL_READ_BASE
46 0x00000000, // DB_Z_WRITE_BASE
47 0x00000000, // DB_STENCIL_WRITE_BASE
48 0x00000000, // DB_DEPTH_SIZE
49 0x00000000, // DB_DEPTH_SLICE
50 0, // HOLE
51 0, // HOLE
52 0, // HOLE
53 0, // HOLE
54 0, // HOLE
55 0, // HOLE
56 0, // HOLE
57 0, // HOLE
58 0x00000000, // TA_BC_BASE_ADDR
59 0x00000000, // TA_BC_BASE_ADDR_HI
60 0, // HOLE
61 0, // HOLE
62 0, // HOLE
63 0, // HOLE
64 0, // HOLE
65 0, // HOLE
66 0, // HOLE
67 0, // HOLE
68 0, // HOLE
69 0, // HOLE
70 0, // HOLE
71 0, // HOLE
72 0, // HOLE
73 0, // HOLE
74 0, // HOLE
75 0, // HOLE
76 0, // HOLE
77 0, // HOLE
78 0, // HOLE
79 0, // HOLE
80 0, // HOLE
81 0, // HOLE
82 0, // HOLE
83 0, // HOLE
84 0, // HOLE
85 0, // HOLE
86 0, // HOLE
87 0, // HOLE
88 0, // HOLE
89 0, // HOLE
90 0, // HOLE
91 0, // HOLE
92 0, // HOLE
93 0, // HOLE
94 0, // HOLE
95 0, // HOLE
96 0, // HOLE
97 0, // HOLE
98 0, // HOLE
99 0, // HOLE
100 0, // HOLE
101 0, // HOLE
102 0, // HOLE
103 0, // HOLE
104 0, // HOLE
105 0, // HOLE
106 0, // HOLE
107 0, // HOLE
108 0, // HOLE
109 0, // HOLE
110 0, // HOLE
111 0, // HOLE
112 0, // HOLE
113 0, // HOLE
114 0, // HOLE
115 0, // HOLE
116 0, // HOLE
117 0, // HOLE
118 0, // HOLE
119 0, // HOLE
120 0, // HOLE
121 0, // HOLE
122 0, // HOLE
123 0, // HOLE
124 0, // HOLE
125 0, // HOLE
126 0, // HOLE
127 0, // HOLE
128 0, // HOLE
129 0, // HOLE
130 0, // HOLE
131 0, // HOLE
132 0, // HOLE
133 0, // HOLE
134 0, // HOLE
135 0, // HOLE
136 0, // HOLE
137 0, // HOLE
138 0, // HOLE
139 0, // HOLE
140 0, // HOLE
141 0, // HOLE
142 0, // HOLE
143 0, // HOLE
144 0, // HOLE
145 0, // HOLE
146 0, // HOLE
147 0, // HOLE
148 0x00000000, // COHER_DEST_BASE_HI_0
149 0x00000000, // COHER_DEST_BASE_HI_1
150 0x00000000, // COHER_DEST_BASE_HI_2
151 0x00000000, // COHER_DEST_BASE_HI_3
152 0x00000000, // COHER_DEST_BASE_2
153 0x00000000, // COHER_DEST_BASE_3
154 0x00000000, // PA_SC_WINDOW_OFFSET
155 0x80000000, // PA_SC_WINDOW_SCISSOR_TL
156 0x40004000, // PA_SC_WINDOW_SCISSOR_BR
157 0x0000ffff, // PA_SC_CLIPRECT_RULE
158 0x00000000, // PA_SC_CLIPRECT_0_TL
159 0x40004000, // PA_SC_CLIPRECT_0_BR
160 0x00000000, // PA_SC_CLIPRECT_1_TL
161 0x40004000, // PA_SC_CLIPRECT_1_BR
162 0x00000000, // PA_SC_CLIPRECT_2_TL
163 0x40004000, // PA_SC_CLIPRECT_2_BR
164 0x00000000, // PA_SC_CLIPRECT_3_TL
165 0x40004000, // PA_SC_CLIPRECT_3_BR
166 0xaa99aaaa, // PA_SC_EDGERULE
167 0x00000000, // PA_SU_HARDWARE_SCREEN_OFFSET
168 0xffffffff, // CB_TARGET_MASK
169 0xffffffff, // CB_SHADER_MASK
170 0x80000000, // PA_SC_GENERIC_SCISSOR_TL
171 0x40004000, // PA_SC_GENERIC_SCISSOR_BR
172 0x00000000, // COHER_DEST_BASE_0
173 0x00000000, // COHER_DEST_BASE_1
174 0x80000000, // PA_SC_VPORT_SCISSOR_0_TL
175 0x40004000, // PA_SC_VPORT_SCISSOR_0_BR
176 0x80000000, // PA_SC_VPORT_SCISSOR_1_TL
177 0x40004000, // PA_SC_VPORT_SCISSOR_1_BR
178 0x80000000, // PA_SC_VPORT_SCISSOR_2_TL
179 0x40004000, // PA_SC_VPORT_SCISSOR_2_BR
180 0x80000000, // PA_SC_VPORT_SCISSOR_3_TL
181 0x40004000, // PA_SC_VPORT_SCISSOR_3_BR
182 0x80000000, // PA_SC_VPORT_SCISSOR_4_TL
183 0x40004000, // PA_SC_VPORT_SCISSOR_4_BR
184 0x80000000, // PA_SC_VPORT_SCISSOR_5_TL
185 0x40004000, // PA_SC_VPORT_SCISSOR_5_BR
186 0x80000000, // PA_SC_VPORT_SCISSOR_6_TL
187 0x40004000, // PA_SC_VPORT_SCISSOR_6_BR
188 0x80000000, // PA_SC_VPORT_SCISSOR_7_TL
189 0x40004000, // PA_SC_VPORT_SCISSOR_7_BR
190 0x80000000, // PA_SC_VPORT_SCISSOR_8_TL
191 0x40004000, // PA_SC_VPORT_SCISSOR_8_BR
192 0x80000000, // PA_SC_VPORT_SCISSOR_9_TL
193 0x40004000, // PA_SC_VPORT_SCISSOR_9_BR
194 0x80000000, // PA_SC_VPORT_SCISSOR_10_TL
195 0x40004000, // PA_SC_VPORT_SCISSOR_10_BR
196 0x80000000, // PA_SC_VPORT_SCISSOR_11_TL
197 0x40004000, // PA_SC_VPORT_SCISSOR_11_BR
198 0x80000000, // PA_SC_VPORT_SCISSOR_12_TL
199 0x40004000, // PA_SC_VPORT_SCISSOR_12_BR
200 0x80000000, // PA_SC_VPORT_SCISSOR_13_TL
201 0x40004000, // PA_SC_VPORT_SCISSOR_13_BR
202 0x80000000, // PA_SC_VPORT_SCISSOR_14_TL
203 0x40004000, // PA_SC_VPORT_SCISSOR_14_BR
204 0x80000000, // PA_SC_VPORT_SCISSOR_15_TL
205 0x40004000, // PA_SC_VPORT_SCISSOR_15_BR
206 0x00000000, // PA_SC_VPORT_ZMIN_0
207 0x3f800000, // PA_SC_VPORT_ZMAX_0
208 0x00000000, // PA_SC_VPORT_ZMIN_1
209 0x3f800000, // PA_SC_VPORT_ZMAX_1
210 0x00000000, // PA_SC_VPORT_ZMIN_2
211 0x3f800000, // PA_SC_VPORT_ZMAX_2
212 0x00000000, // PA_SC_VPORT_ZMIN_3
213 0x3f800000, // PA_SC_VPORT_ZMAX_3
214 0x00000000, // PA_SC_VPORT_ZMIN_4
215 0x3f800000, // PA_SC_VPORT_ZMAX_4
216 0x00000000, // PA_SC_VPORT_ZMIN_5
217 0x3f800000, // PA_SC_VPORT_ZMAX_5
218 0x00000000, // PA_SC_VPORT_ZMIN_6
219 0x3f800000, // PA_SC_VPORT_ZMAX_6
220 0x00000000, // PA_SC_VPORT_ZMIN_7
221 0x3f800000, // PA_SC_VPORT_ZMAX_7
222 0x00000000, // PA_SC_VPORT_ZMIN_8
223 0x3f800000, // PA_SC_VPORT_ZMAX_8
224 0x00000000, // PA_SC_VPORT_ZMIN_9
225 0x3f800000, // PA_SC_VPORT_ZMAX_9
226 0x00000000, // PA_SC_VPORT_ZMIN_10
227 0x3f800000, // PA_SC_VPORT_ZMAX_10
228 0x00000000, // PA_SC_VPORT_ZMIN_11
229 0x3f800000, // PA_SC_VPORT_ZMAX_11
230 0x00000000, // PA_SC_VPORT_ZMIN_12
231 0x3f800000, // PA_SC_VPORT_ZMAX_12
232 0x00000000, // PA_SC_VPORT_ZMIN_13
233 0x3f800000, // PA_SC_VPORT_ZMAX_13
234 0x00000000, // PA_SC_VPORT_ZMIN_14
235 0x3f800000, // PA_SC_VPORT_ZMAX_14
236 0x00000000, // PA_SC_VPORT_ZMIN_15
237 0x3f800000, // PA_SC_VPORT_ZMAX_15
238};
239static const unsigned int ci_SECT_CONTEXT_def_2[] =
240{
241 0x00000000, // PA_SC_SCREEN_EXTENT_CONTROL
242 0, // HOLE
243 0x00000000, // CP_PERFMON_CNTX_CNTL
244 0x00000000, // CP_RINGID
245 0x00000000, // CP_VMID
246 0, // HOLE
247 0, // HOLE
248 0, // HOLE
249 0, // HOLE
250 0, // HOLE
251 0, // HOLE
252 0, // HOLE
253 0, // HOLE
254 0, // HOLE
255 0, // HOLE
256 0, // HOLE
257 0, // HOLE
258 0, // HOLE
259 0, // HOLE
260 0, // HOLE
261 0, // HOLE
262 0, // HOLE
263 0, // HOLE
264 0, // HOLE
265 0, // HOLE
266 0, // HOLE
267 0, // HOLE
268 0, // HOLE
269 0, // HOLE
270 0, // HOLE
271 0, // HOLE
272 0, // HOLE
273 0, // HOLE
274 0, // HOLE
275 0, // HOLE
276 0, // HOLE
277 0, // HOLE
278 0, // HOLE
279 0, // HOLE
280 0, // HOLE
281 0, // HOLE
282 0, // HOLE
283 0xffffffff, // VGT_MAX_VTX_INDX
284 0x00000000, // VGT_MIN_VTX_INDX
285 0x00000000, // VGT_INDX_OFFSET
286 0x00000000, // VGT_MULTI_PRIM_IB_RESET_INDX
287 0, // HOLE
288 0x00000000, // CB_BLEND_RED
289 0x00000000, // CB_BLEND_GREEN
290 0x00000000, // CB_BLEND_BLUE
291 0x00000000, // CB_BLEND_ALPHA
292 0, // HOLE
293 0, // HOLE
294 0x00000000, // DB_STENCIL_CONTROL
295 0x00000000, // DB_STENCILREFMASK
296 0x00000000, // DB_STENCILREFMASK_BF
297 0, // HOLE
298 0x00000000, // PA_CL_VPORT_XSCALE
299 0x00000000, // PA_CL_VPORT_XOFFSET
300 0x00000000, // PA_CL_VPORT_YSCALE
301 0x00000000, // PA_CL_VPORT_YOFFSET
302 0x00000000, // PA_CL_VPORT_ZSCALE
303 0x00000000, // PA_CL_VPORT_ZOFFSET
304 0x00000000, // PA_CL_VPORT_XSCALE_1
305 0x00000000, // PA_CL_VPORT_XOFFSET_1
306 0x00000000, // PA_CL_VPORT_YSCALE_1
307 0x00000000, // PA_CL_VPORT_YOFFSET_1
308 0x00000000, // PA_CL_VPORT_ZSCALE_1
309 0x00000000, // PA_CL_VPORT_ZOFFSET_1
310 0x00000000, // PA_CL_VPORT_XSCALE_2
311 0x00000000, // PA_CL_VPORT_XOFFSET_2
312 0x00000000, // PA_CL_VPORT_YSCALE_2
313 0x00000000, // PA_CL_VPORT_YOFFSET_2
314 0x00000000, // PA_CL_VPORT_ZSCALE_2
315 0x00000000, // PA_CL_VPORT_ZOFFSET_2
316 0x00000000, // PA_CL_VPORT_XSCALE_3
317 0x00000000, // PA_CL_VPORT_XOFFSET_3
318 0x00000000, // PA_CL_VPORT_YSCALE_3
319 0x00000000, // PA_CL_VPORT_YOFFSET_3
320 0x00000000, // PA_CL_VPORT_ZSCALE_3
321 0x00000000, // PA_CL_VPORT_ZOFFSET_3
322 0x00000000, // PA_CL_VPORT_XSCALE_4
323 0x00000000, // PA_CL_VPORT_XOFFSET_4
324 0x00000000, // PA_CL_VPORT_YSCALE_4
325 0x00000000, // PA_CL_VPORT_YOFFSET_4
326 0x00000000, // PA_CL_VPORT_ZSCALE_4
327 0x00000000, // PA_CL_VPORT_ZOFFSET_4
328 0x00000000, // PA_CL_VPORT_XSCALE_5
329 0x00000000, // PA_CL_VPORT_XOFFSET_5
330 0x00000000, // PA_CL_VPORT_YSCALE_5
331 0x00000000, // PA_CL_VPORT_YOFFSET_5
332 0x00000000, // PA_CL_VPORT_ZSCALE_5
333 0x00000000, // PA_CL_VPORT_ZOFFSET_5
334 0x00000000, // PA_CL_VPORT_XSCALE_6
335 0x00000000, // PA_CL_VPORT_XOFFSET_6
336 0x00000000, // PA_CL_VPORT_YSCALE_6
337 0x00000000, // PA_CL_VPORT_YOFFSET_6
338 0x00000000, // PA_CL_VPORT_ZSCALE_6
339 0x00000000, // PA_CL_VPORT_ZOFFSET_6
340 0x00000000, // PA_CL_VPORT_XSCALE_7
341 0x00000000, // PA_CL_VPORT_XOFFSET_7
342 0x00000000, // PA_CL_VPORT_YSCALE_7
343 0x00000000, // PA_CL_VPORT_YOFFSET_7
344 0x00000000, // PA_CL_VPORT_ZSCALE_7
345 0x00000000, // PA_CL_VPORT_ZOFFSET_7
346 0x00000000, // PA_CL_VPORT_XSCALE_8
347 0x00000000, // PA_CL_VPORT_XOFFSET_8
348 0x00000000, // PA_CL_VPORT_YSCALE_8
349 0x00000000, // PA_CL_VPORT_YOFFSET_8
350 0x00000000, // PA_CL_VPORT_ZSCALE_8
351 0x00000000, // PA_CL_VPORT_ZOFFSET_8
352 0x00000000, // PA_CL_VPORT_XSCALE_9
353 0x00000000, // PA_CL_VPORT_XOFFSET_9
354 0x00000000, // PA_CL_VPORT_YSCALE_9
355 0x00000000, // PA_CL_VPORT_YOFFSET_9
356 0x00000000, // PA_CL_VPORT_ZSCALE_9
357 0x00000000, // PA_CL_VPORT_ZOFFSET_9
358 0x00000000, // PA_CL_VPORT_XSCALE_10
359 0x00000000, // PA_CL_VPORT_XOFFSET_10
360 0x00000000, // PA_CL_VPORT_YSCALE_10
361 0x00000000, // PA_CL_VPORT_YOFFSET_10
362 0x00000000, // PA_CL_VPORT_ZSCALE_10
363 0x00000000, // PA_CL_VPORT_ZOFFSET_10
364 0x00000000, // PA_CL_VPORT_XSCALE_11
365 0x00000000, // PA_CL_VPORT_XOFFSET_11
366 0x00000000, // PA_CL_VPORT_YSCALE_11
367 0x00000000, // PA_CL_VPORT_YOFFSET_11
368 0x00000000, // PA_CL_VPORT_ZSCALE_11
369 0x00000000, // PA_CL_VPORT_ZOFFSET_11
370 0x00000000, // PA_CL_VPORT_XSCALE_12
371 0x00000000, // PA_CL_VPORT_XOFFSET_12
372 0x00000000, // PA_CL_VPORT_YSCALE_12
373 0x00000000, // PA_CL_VPORT_YOFFSET_12
374 0x00000000, // PA_CL_VPORT_ZSCALE_12
375 0x00000000, // PA_CL_VPORT_ZOFFSET_12
376 0x00000000, // PA_CL_VPORT_XSCALE_13
377 0x00000000, // PA_CL_VPORT_XOFFSET_13
378 0x00000000, // PA_CL_VPORT_YSCALE_13
379 0x00000000, // PA_CL_VPORT_YOFFSET_13
380 0x00000000, // PA_CL_VPORT_ZSCALE_13
381 0x00000000, // PA_CL_VPORT_ZOFFSET_13
382 0x00000000, // PA_CL_VPORT_XSCALE_14
383 0x00000000, // PA_CL_VPORT_XOFFSET_14
384 0x00000000, // PA_CL_VPORT_YSCALE_14
385 0x00000000, // PA_CL_VPORT_YOFFSET_14
386 0x00000000, // PA_CL_VPORT_ZSCALE_14
387 0x00000000, // PA_CL_VPORT_ZOFFSET_14
388 0x00000000, // PA_CL_VPORT_XSCALE_15
389 0x00000000, // PA_CL_VPORT_XOFFSET_15
390 0x00000000, // PA_CL_VPORT_YSCALE_15
391 0x00000000, // PA_CL_VPORT_YOFFSET_15
392 0x00000000, // PA_CL_VPORT_ZSCALE_15
393 0x00000000, // PA_CL_VPORT_ZOFFSET_15
394 0x00000000, // PA_CL_UCP_0_X
395 0x00000000, // PA_CL_UCP_0_Y
396 0x00000000, // PA_CL_UCP_0_Z
397 0x00000000, // PA_CL_UCP_0_W
398 0x00000000, // PA_CL_UCP_1_X
399 0x00000000, // PA_CL_UCP_1_Y
400 0x00000000, // PA_CL_UCP_1_Z
401 0x00000000, // PA_CL_UCP_1_W
402 0x00000000, // PA_CL_UCP_2_X
403 0x00000000, // PA_CL_UCP_2_Y
404 0x00000000, // PA_CL_UCP_2_Z
405 0x00000000, // PA_CL_UCP_2_W
406 0x00000000, // PA_CL_UCP_3_X
407 0x00000000, // PA_CL_UCP_3_Y
408 0x00000000, // PA_CL_UCP_3_Z
409 0x00000000, // PA_CL_UCP_3_W
410 0x00000000, // PA_CL_UCP_4_X
411 0x00000000, // PA_CL_UCP_4_Y
412 0x00000000, // PA_CL_UCP_4_Z
413 0x00000000, // PA_CL_UCP_4_W
414 0x00000000, // PA_CL_UCP_5_X
415 0x00000000, // PA_CL_UCP_5_Y
416 0x00000000, // PA_CL_UCP_5_Z
417 0x00000000, // PA_CL_UCP_5_W
418 0, // HOLE
419 0, // HOLE
420 0, // HOLE
421 0, // HOLE
422 0, // HOLE
423 0, // HOLE
424 0, // HOLE
425 0, // HOLE
426 0, // HOLE
427 0, // HOLE
428 0x00000000, // SPI_PS_INPUT_CNTL_0
429 0x00000000, // SPI_PS_INPUT_CNTL_1
430 0x00000000, // SPI_PS_INPUT_CNTL_2
431 0x00000000, // SPI_PS_INPUT_CNTL_3
432 0x00000000, // SPI_PS_INPUT_CNTL_4
433 0x00000000, // SPI_PS_INPUT_CNTL_5
434 0x00000000, // SPI_PS_INPUT_CNTL_6
435 0x00000000, // SPI_PS_INPUT_CNTL_7
436 0x00000000, // SPI_PS_INPUT_CNTL_8
437 0x00000000, // SPI_PS_INPUT_CNTL_9
438 0x00000000, // SPI_PS_INPUT_CNTL_10
439 0x00000000, // SPI_PS_INPUT_CNTL_11
440 0x00000000, // SPI_PS_INPUT_CNTL_12
441 0x00000000, // SPI_PS_INPUT_CNTL_13
442 0x00000000, // SPI_PS_INPUT_CNTL_14
443 0x00000000, // SPI_PS_INPUT_CNTL_15
444 0x00000000, // SPI_PS_INPUT_CNTL_16
445 0x00000000, // SPI_PS_INPUT_CNTL_17
446 0x00000000, // SPI_PS_INPUT_CNTL_18
447 0x00000000, // SPI_PS_INPUT_CNTL_19
448 0x00000000, // SPI_PS_INPUT_CNTL_20
449 0x00000000, // SPI_PS_INPUT_CNTL_21
450 0x00000000, // SPI_PS_INPUT_CNTL_22
451 0x00000000, // SPI_PS_INPUT_CNTL_23
452 0x00000000, // SPI_PS_INPUT_CNTL_24
453 0x00000000, // SPI_PS_INPUT_CNTL_25
454 0x00000000, // SPI_PS_INPUT_CNTL_26
455 0x00000000, // SPI_PS_INPUT_CNTL_27
456 0x00000000, // SPI_PS_INPUT_CNTL_28
457 0x00000000, // SPI_PS_INPUT_CNTL_29
458 0x00000000, // SPI_PS_INPUT_CNTL_30
459 0x00000000, // SPI_PS_INPUT_CNTL_31
460 0x00000000, // SPI_VS_OUT_CONFIG
461 0, // HOLE
462 0x00000000, // SPI_PS_INPUT_ENA
463 0x00000000, // SPI_PS_INPUT_ADDR
464 0x00000000, // SPI_INTERP_CONTROL_0
465 0x00000002, // SPI_PS_IN_CONTROL
466 0, // HOLE
467 0x00000000, // SPI_BARYC_CNTL
468 0, // HOLE
469 0x00000000, // SPI_TMPRING_SIZE
470 0, // HOLE
471 0, // HOLE
472 0, // HOLE
473 0, // HOLE
474 0, // HOLE
475 0, // HOLE
476 0, // HOLE
477 0, // HOLE
478 0x00000000, // SPI_SHADER_POS_FORMAT
479 0x00000000, // SPI_SHADER_Z_FORMAT
480 0x00000000, // SPI_SHADER_COL_FORMAT
481 0, // HOLE
482 0, // HOLE
483 0, // HOLE
484 0, // HOLE
485 0, // HOLE
486 0, // HOLE
487 0, // HOLE
488 0, // HOLE
489 0, // HOLE
490 0, // HOLE
491 0, // HOLE
492 0, // HOLE
493 0, // HOLE
494 0, // HOLE
495 0, // HOLE
496 0, // HOLE
497 0, // HOLE
498 0, // HOLE
499 0, // HOLE
500 0, // HOLE
501 0, // HOLE
502 0, // HOLE
503 0, // HOLE
504 0, // HOLE
505 0, // HOLE
506 0, // HOLE
507 0x00000000, // CB_BLEND0_CONTROL
508 0x00000000, // CB_BLEND1_CONTROL
509 0x00000000, // CB_BLEND2_CONTROL
510 0x00000000, // CB_BLEND3_CONTROL
511 0x00000000, // CB_BLEND4_CONTROL
512 0x00000000, // CB_BLEND5_CONTROL
513 0x00000000, // CB_BLEND6_CONTROL
514 0x00000000, // CB_BLEND7_CONTROL
515};
516static const unsigned int ci_SECT_CONTEXT_def_3[] =
517{
518 0x00000000, // PA_CL_POINT_X_RAD
519 0x00000000, // PA_CL_POINT_Y_RAD
520 0x00000000, // PA_CL_POINT_SIZE
521 0x00000000, // PA_CL_POINT_CULL_RAD
522 0x00000000, // VGT_DMA_BASE_HI
523 0x00000000, // VGT_DMA_BASE
524};
525static const unsigned int ci_SECT_CONTEXT_def_4[] =
526{
527 0x00000000, // DB_DEPTH_CONTROL
528 0x00000000, // DB_EQAA
529 0x00000000, // CB_COLOR_CONTROL
530 0x00000000, // DB_SHADER_CONTROL
531 0x00090000, // PA_CL_CLIP_CNTL
532 0x00000004, // PA_SU_SC_MODE_CNTL
533 0x00000000, // PA_CL_VTE_CNTL
534 0x00000000, // PA_CL_VS_OUT_CNTL
535 0x00000000, // PA_CL_NANINF_CNTL
536 0x00000000, // PA_SU_LINE_STIPPLE_CNTL
537 0x00000000, // PA_SU_LINE_STIPPLE_SCALE
538 0x00000000, // PA_SU_PRIM_FILTER_CNTL
539 0, // HOLE
540 0, // HOLE
541 0, // HOLE
542 0, // HOLE
543 0, // HOLE
544 0, // HOLE
545 0, // HOLE
546 0, // HOLE
547 0, // HOLE
548 0, // HOLE
549 0, // HOLE
550 0, // HOLE
551 0, // HOLE
552 0, // HOLE
553 0, // HOLE
554 0, // HOLE
555 0, // HOLE
556 0, // HOLE
557 0, // HOLE
558 0, // HOLE
559 0, // HOLE
560 0, // HOLE
561 0, // HOLE
562 0, // HOLE
563 0, // HOLE
564 0, // HOLE
565 0, // HOLE
566 0, // HOLE
567 0, // HOLE
568 0, // HOLE
569 0, // HOLE
570 0, // HOLE
571 0, // HOLE
572 0, // HOLE
573 0, // HOLE
574 0, // HOLE
575 0, // HOLE
576 0, // HOLE
577 0, // HOLE
578 0, // HOLE
579 0, // HOLE
580 0, // HOLE
581 0, // HOLE
582 0, // HOLE
583 0, // HOLE
584 0, // HOLE
585 0, // HOLE
586 0, // HOLE
587 0, // HOLE
588 0, // HOLE
589 0, // HOLE
590 0, // HOLE
591 0, // HOLE
592 0, // HOLE
593 0, // HOLE
594 0, // HOLE
595 0, // HOLE
596 0, // HOLE
597 0, // HOLE
598 0, // HOLE
599 0, // HOLE
600 0, // HOLE
601 0, // HOLE
602 0, // HOLE
603 0, // HOLE
604 0, // HOLE
605 0, // HOLE
606 0, // HOLE
607 0, // HOLE
608 0, // HOLE
609 0, // HOLE
610 0, // HOLE
611 0, // HOLE
612 0, // HOLE
613 0, // HOLE
614 0, // HOLE
615 0, // HOLE
616 0, // HOLE
617 0, // HOLE
618 0, // HOLE
619 0, // HOLE
620 0, // HOLE
621 0, // HOLE
622 0, // HOLE
623 0, // HOLE
624 0, // HOLE
625 0, // HOLE
626 0, // HOLE
627 0, // HOLE
628 0, // HOLE
629 0, // HOLE
630 0, // HOLE
631 0, // HOLE
632 0, // HOLE
633 0, // HOLE
634 0, // HOLE
635 0, // HOLE
636 0, // HOLE
637 0, // HOLE
638 0, // HOLE
639 0, // HOLE
640 0, // HOLE
641 0, // HOLE
642 0, // HOLE
643 0, // HOLE
644 0, // HOLE
645 0, // HOLE
646 0, // HOLE
647 0, // HOLE
648 0, // HOLE
649 0, // HOLE
650 0, // HOLE
651 0, // HOLE
652 0, // HOLE
653 0, // HOLE
654 0, // HOLE
655 0x00000000, // PA_SU_POINT_SIZE
656 0x00000000, // PA_SU_POINT_MINMAX
657 0x00000000, // PA_SU_LINE_CNTL
658 0x00000000, // PA_SC_LINE_STIPPLE
659 0x00000000, // VGT_OUTPUT_PATH_CNTL
660 0x00000000, // VGT_HOS_CNTL
661 0x00000000, // VGT_HOS_MAX_TESS_LEVEL
662 0x00000000, // VGT_HOS_MIN_TESS_LEVEL
663 0x00000000, // VGT_HOS_REUSE_DEPTH
664 0x00000000, // VGT_GROUP_PRIM_TYPE
665 0x00000000, // VGT_GROUP_FIRST_DECR
666 0x00000000, // VGT_GROUP_DECR
667 0x00000000, // VGT_GROUP_VECT_0_CNTL
668 0x00000000, // VGT_GROUP_VECT_1_CNTL
669 0x00000000, // VGT_GROUP_VECT_0_FMT_CNTL
670 0x00000000, // VGT_GROUP_VECT_1_FMT_CNTL
671 0x00000000, // VGT_GS_MODE
672 0x00000000, // VGT_GS_ONCHIP_CNTL
673 0x00000000, // PA_SC_MODE_CNTL_0
674 0x00000000, // PA_SC_MODE_CNTL_1
675 0x00000000, // VGT_ENHANCE
676 0x00000100, // VGT_GS_PER_ES
677 0x00000080, // VGT_ES_PER_GS
678 0x00000002, // VGT_GS_PER_VS
679 0x00000000, // VGT_GSVS_RING_OFFSET_1
680 0x00000000, // VGT_GSVS_RING_OFFSET_2
681 0x00000000, // VGT_GSVS_RING_OFFSET_3
682 0x00000000, // VGT_GS_OUT_PRIM_TYPE
683 0x00000000, // IA_ENHANCE
684};
685static const unsigned int ci_SECT_CONTEXT_def_5[] =
686{
687 0x00000000, // WD_ENHANCE
688 0x00000000, // VGT_PRIMITIVEID_EN
689};
690static const unsigned int ci_SECT_CONTEXT_def_6[] =
691{
692 0x00000000, // VGT_PRIMITIVEID_RESET
693};
694static const unsigned int ci_SECT_CONTEXT_def_7[] =
695{
696 0x00000000, // VGT_MULTI_PRIM_IB_RESET_EN
697 0, // HOLE
698 0, // HOLE
699 0x00000000, // VGT_INSTANCE_STEP_RATE_0
700 0x00000000, // VGT_INSTANCE_STEP_RATE_1
701 0x000000ff, // IA_MULTI_VGT_PARAM
702 0x00000000, // VGT_ESGS_RING_ITEMSIZE
703 0x00000000, // VGT_GSVS_RING_ITEMSIZE
704 0x00000000, // VGT_REUSE_OFF
705 0x00000000, // VGT_VTX_CNT_EN
706 0x00000000, // DB_HTILE_SURFACE
707 0x00000000, // DB_SRESULTS_COMPARE_STATE0
708 0x00000000, // DB_SRESULTS_COMPARE_STATE1
709 0x00000000, // DB_PRELOAD_CONTROL
710 0, // HOLE
711 0x00000000, // VGT_STRMOUT_BUFFER_SIZE_0
712 0x00000000, // VGT_STRMOUT_VTX_STRIDE_0
713 0, // HOLE
714 0x00000000, // VGT_STRMOUT_BUFFER_OFFSET_0
715 0x00000000, // VGT_STRMOUT_BUFFER_SIZE_1
716 0x00000000, // VGT_STRMOUT_VTX_STRIDE_1
717 0, // HOLE
718 0x00000000, // VGT_STRMOUT_BUFFER_OFFSET_1
719 0x00000000, // VGT_STRMOUT_BUFFER_SIZE_2
720 0x00000000, // VGT_STRMOUT_VTX_STRIDE_2
721 0, // HOLE
722 0x00000000, // VGT_STRMOUT_BUFFER_OFFSET_2
723 0x00000000, // VGT_STRMOUT_BUFFER_SIZE_3
724 0x00000000, // VGT_STRMOUT_VTX_STRIDE_3
725 0, // HOLE
726 0x00000000, // VGT_STRMOUT_BUFFER_OFFSET_3
727 0, // HOLE
728 0, // HOLE
729 0, // HOLE
730 0, // HOLE
731 0, // HOLE
732 0, // HOLE
733 0x00000000, // VGT_STRMOUT_DRAW_OPAQUE_OFFSET
734 0x00000000, // VGT_STRMOUT_DRAW_OPAQUE_BUFFER_FILLED_SIZE
735 0x00000000, // VGT_STRMOUT_DRAW_OPAQUE_VERTEX_STRIDE
736 0, // HOLE
737 0x00000000, // VGT_GS_MAX_VERT_OUT
738 0, // HOLE
739 0, // HOLE
740 0, // HOLE
741 0, // HOLE
742 0, // HOLE
743 0, // HOLE
744 0x00000000, // VGT_SHADER_STAGES_EN
745 0x00000000, // VGT_LS_HS_CONFIG
746 0x00000000, // VGT_GS_VERT_ITEMSIZE
747 0x00000000, // VGT_GS_VERT_ITEMSIZE_1
748 0x00000000, // VGT_GS_VERT_ITEMSIZE_2
749 0x00000000, // VGT_GS_VERT_ITEMSIZE_3
750 0x00000000, // VGT_TF_PARAM
751 0x00000000, // DB_ALPHA_TO_MASK
752 0, // HOLE
753 0x00000000, // PA_SU_POLY_OFFSET_DB_FMT_CNTL
754 0x00000000, // PA_SU_POLY_OFFSET_CLAMP
755 0x00000000, // PA_SU_POLY_OFFSET_FRONT_SCALE
756 0x00000000, // PA_SU_POLY_OFFSET_FRONT_OFFSET
757 0x00000000, // PA_SU_POLY_OFFSET_BACK_SCALE
758 0x00000000, // PA_SU_POLY_OFFSET_BACK_OFFSET
759 0x00000000, // VGT_GS_INSTANCE_CNT
760 0x00000000, // VGT_STRMOUT_CONFIG
761 0x00000000, // VGT_STRMOUT_BUFFER_CONFIG
762 0, // HOLE
763 0, // HOLE
764 0, // HOLE
765 0, // HOLE
766 0, // HOLE
767 0, // HOLE
768 0, // HOLE
769 0, // HOLE
770 0, // HOLE
771 0, // HOLE
772 0, // HOLE
773 0, // HOLE
774 0, // HOLE
775 0, // HOLE
776 0x00000000, // PA_SC_CENTROID_PRIORITY_0
777 0x00000000, // PA_SC_CENTROID_PRIORITY_1
778 0x00001000, // PA_SC_LINE_CNTL
779 0x00000000, // PA_SC_AA_CONFIG
780 0x00000005, // PA_SU_VTX_CNTL
781 0x3f800000, // PA_CL_GB_VERT_CLIP_ADJ
782 0x3f800000, // PA_CL_GB_VERT_DISC_ADJ
783 0x3f800000, // PA_CL_GB_HORZ_CLIP_ADJ
784 0x3f800000, // PA_CL_GB_HORZ_DISC_ADJ
785 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0
786 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_1
787 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_2
788 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_3
789 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0
790 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_1
791 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_2
792 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_3
793 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_0
794 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_1
795 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_2
796 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_3
797 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_0
798 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_1
799 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_2
800 0x00000000, // PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_3
801 0xffffffff, // PA_SC_AA_MASK_X0Y0_X1Y0
802 0xffffffff, // PA_SC_AA_MASK_X0Y1_X1Y1
803 0, // HOLE
804 0, // HOLE
805 0, // HOLE
806 0, // HOLE
807 0, // HOLE
808 0, // HOLE
809 0x0000000e, // VGT_VERTEX_REUSE_BLOCK_CNTL
810 0x00000010, // VGT_OUT_DEALLOC_CNTL
811 0x00000000, // CB_COLOR0_BASE
812 0x00000000, // CB_COLOR0_PITCH
813 0x00000000, // CB_COLOR0_SLICE
814 0x00000000, // CB_COLOR0_VIEW
815 0x00000000, // CB_COLOR0_INFO
816 0x00000000, // CB_COLOR0_ATTRIB
817 0, // HOLE
818 0x00000000, // CB_COLOR0_CMASK
819 0x00000000, // CB_COLOR0_CMASK_SLICE
820 0x00000000, // CB_COLOR0_FMASK
821 0x00000000, // CB_COLOR0_FMASK_SLICE
822 0x00000000, // CB_COLOR0_CLEAR_WORD0
823 0x00000000, // CB_COLOR0_CLEAR_WORD1
824 0, // HOLE
825 0, // HOLE
826 0x00000000, // CB_COLOR1_BASE
827 0x00000000, // CB_COLOR1_PITCH
828 0x00000000, // CB_COLOR1_SLICE
829 0x00000000, // CB_COLOR1_VIEW
830 0x00000000, // CB_COLOR1_INFO
831 0x00000000, // CB_COLOR1_ATTRIB
832 0, // HOLE
833 0x00000000, // CB_COLOR1_CMASK
834 0x00000000, // CB_COLOR1_CMASK_SLICE
835 0x00000000, // CB_COLOR1_FMASK
836 0x00000000, // CB_COLOR1_FMASK_SLICE
837 0x00000000, // CB_COLOR1_CLEAR_WORD0
838 0x00000000, // CB_COLOR1_CLEAR_WORD1
839 0, // HOLE
840 0, // HOLE
841 0x00000000, // CB_COLOR2_BASE
842 0x00000000, // CB_COLOR2_PITCH
843 0x00000000, // CB_COLOR2_SLICE
844 0x00000000, // CB_COLOR2_VIEW
845 0x00000000, // CB_COLOR2_INFO
846 0x00000000, // CB_COLOR2_ATTRIB
847 0, // HOLE
848 0x00000000, // CB_COLOR2_CMASK
849 0x00000000, // CB_COLOR2_CMASK_SLICE
850 0x00000000, // CB_COLOR2_FMASK
851 0x00000000, // CB_COLOR2_FMASK_SLICE
852 0x00000000, // CB_COLOR2_CLEAR_WORD0
853 0x00000000, // CB_COLOR2_CLEAR_WORD1
854 0, // HOLE
855 0, // HOLE
856 0x00000000, // CB_COLOR3_BASE
857 0x00000000, // CB_COLOR3_PITCH
858 0x00000000, // CB_COLOR3_SLICE
859 0x00000000, // CB_COLOR3_VIEW
860 0x00000000, // CB_COLOR3_INFO
861 0x00000000, // CB_COLOR3_ATTRIB
862 0, // HOLE
863 0x00000000, // CB_COLOR3_CMASK
864 0x00000000, // CB_COLOR3_CMASK_SLICE
865 0x00000000, // CB_COLOR3_FMASK
866 0x00000000, // CB_COLOR3_FMASK_SLICE
867 0x00000000, // CB_COLOR3_CLEAR_WORD0
868 0x00000000, // CB_COLOR3_CLEAR_WORD1
869 0, // HOLE
870 0, // HOLE
871 0x00000000, // CB_COLOR4_BASE
872 0x00000000, // CB_COLOR4_PITCH
873 0x00000000, // CB_COLOR4_SLICE
874 0x00000000, // CB_COLOR4_VIEW
875 0x00000000, // CB_COLOR4_INFO
876 0x00000000, // CB_COLOR4_ATTRIB
877 0, // HOLE
878 0x00000000, // CB_COLOR4_CMASK
879 0x00000000, // CB_COLOR4_CMASK_SLICE
880 0x00000000, // CB_COLOR4_FMASK
881 0x00000000, // CB_COLOR4_FMASK_SLICE
882 0x00000000, // CB_COLOR4_CLEAR_WORD0
883 0x00000000, // CB_COLOR4_CLEAR_WORD1
884 0, // HOLE
885 0, // HOLE
886 0x00000000, // CB_COLOR5_BASE
887 0x00000000, // CB_COLOR5_PITCH
888 0x00000000, // CB_COLOR5_SLICE
889 0x00000000, // CB_COLOR5_VIEW
890 0x00000000, // CB_COLOR5_INFO
891 0x00000000, // CB_COLOR5_ATTRIB
892 0, // HOLE
893 0x00000000, // CB_COLOR5_CMASK
894 0x00000000, // CB_COLOR5_CMASK_SLICE
895 0x00000000, // CB_COLOR5_FMASK
896 0x00000000, // CB_COLOR5_FMASK_SLICE
897 0x00000000, // CB_COLOR5_CLEAR_WORD0
898 0x00000000, // CB_COLOR5_CLEAR_WORD1
899 0, // HOLE
900 0, // HOLE
901 0x00000000, // CB_COLOR6_BASE
902 0x00000000, // CB_COLOR6_PITCH
903 0x00000000, // CB_COLOR6_SLICE
904 0x00000000, // CB_COLOR6_VIEW
905 0x00000000, // CB_COLOR6_INFO
906 0x00000000, // CB_COLOR6_ATTRIB
907 0, // HOLE
908 0x00000000, // CB_COLOR6_CMASK
909 0x00000000, // CB_COLOR6_CMASK_SLICE
910 0x00000000, // CB_COLOR6_FMASK
911 0x00000000, // CB_COLOR6_FMASK_SLICE
912 0x00000000, // CB_COLOR6_CLEAR_WORD0
913 0x00000000, // CB_COLOR6_CLEAR_WORD1
914 0, // HOLE
915 0, // HOLE
916 0x00000000, // CB_COLOR7_BASE
917 0x00000000, // CB_COLOR7_PITCH
918 0x00000000, // CB_COLOR7_SLICE
919 0x00000000, // CB_COLOR7_VIEW
920 0x00000000, // CB_COLOR7_INFO
921 0x00000000, // CB_COLOR7_ATTRIB
922 0, // HOLE
923 0x00000000, // CB_COLOR7_CMASK
924 0x00000000, // CB_COLOR7_CMASK_SLICE
925 0x00000000, // CB_COLOR7_FMASK
926 0x00000000, // CB_COLOR7_FMASK_SLICE
927 0x00000000, // CB_COLOR7_CLEAR_WORD0
928 0x00000000, // CB_COLOR7_CLEAR_WORD1
929};
930static const struct cs_extent_def ci_SECT_CONTEXT_defs[] =
931{
932 {ci_SECT_CONTEXT_def_1, 0x0000a000, 212 },
933 {ci_SECT_CONTEXT_def_2, 0x0000a0d6, 274 },
934 {ci_SECT_CONTEXT_def_3, 0x0000a1f5, 6 },
935 {ci_SECT_CONTEXT_def_4, 0x0000a200, 157 },
936 {ci_SECT_CONTEXT_def_5, 0x0000a2a0, 2 },
937 {ci_SECT_CONTEXT_def_6, 0x0000a2a3, 1 },
938 {ci_SECT_CONTEXT_def_7, 0x0000a2a5, 233 },
939 { 0, 0, 0 }
940};
941static const struct cs_section_def ci_cs_data[] = {
942 { ci_SECT_CONTEXT_defs, SECT_CONTEXT },
943 { 0, SECT_NONE }
944};
diff --git a/drivers/gpu/drm/radeon/clearstate_evergreen.h b/drivers/gpu/drm/radeon/clearstate_evergreen.h
index 4791d856b7fd..63a1ffbb3ced 100644
--- a/drivers/gpu/drm/radeon/clearstate_evergreen.h
+++ b/drivers/gpu/drm/radeon/clearstate_evergreen.h
@@ -1072,7 +1072,7 @@ static const struct cs_extent_def SECT_CTRLCONST_defs[] =
1072 {SECT_CTRLCONST_def_1, 0x0000f3fc, 2 }, 1072 {SECT_CTRLCONST_def_1, 0x0000f3fc, 2 },
1073 { 0, 0, 0 } 1073 { 0, 0, 0 }
1074}; 1074};
1075struct cs_section_def evergreen_cs_data[] = { 1075static const struct cs_section_def evergreen_cs_data[] = {
1076 { SECT_CONTEXT_defs, SECT_CONTEXT }, 1076 { SECT_CONTEXT_defs, SECT_CONTEXT },
1077 { SECT_CLEAR_defs, SECT_CLEAR }, 1077 { SECT_CLEAR_defs, SECT_CLEAR },
1078 { SECT_CTRLCONST_defs, SECT_CTRLCONST }, 1078 { SECT_CTRLCONST_defs, SECT_CTRLCONST },
diff --git a/drivers/gpu/drm/radeon/cypress_dpm.c b/drivers/gpu/drm/radeon/cypress_dpm.c
index 9bcdd174780f..95a66db08d9b 100644
--- a/drivers/gpu/drm/radeon/cypress_dpm.c
+++ b/drivers/gpu/drm/radeon/cypress_dpm.c
@@ -2038,9 +2038,6 @@ int cypress_dpm_init(struct radeon_device *rdev)
2038{ 2038{
2039 struct rv7xx_power_info *pi; 2039 struct rv7xx_power_info *pi;
2040 struct evergreen_power_info *eg_pi; 2040 struct evergreen_power_info *eg_pi;
2041 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
2042 uint16_t data_offset, size;
2043 uint8_t frev, crev;
2044 struct atom_clock_dividers dividers; 2041 struct atom_clock_dividers dividers;
2045 int ret; 2042 int ret;
2046 2043
@@ -2092,16 +2089,7 @@ int cypress_dpm_init(struct radeon_device *rdev)
2092 eg_pi->vddci_control = 2089 eg_pi->vddci_control =
2093 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0); 2090 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0);
2094 2091
2095 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 2092 rv770_get_engine_memory_ss(rdev);
2096 &frev, &crev, &data_offset)) {
2097 pi->sclk_ss = true;
2098 pi->mclk_ss = true;
2099 pi->dynamic_ss = true;
2100 } else {
2101 pi->sclk_ss = false;
2102 pi->mclk_ss = false;
2103 pi->dynamic_ss = true;
2104 }
2105 2093
2106 pi->asi = RV770_ASI_DFLT; 2094 pi->asi = RV770_ASI_DFLT;
2107 pi->pasi = CYPRESS_HASI_DFLT; 2095 pi->pasi = CYPRESS_HASI_DFLT;
@@ -2122,8 +2110,7 @@ int cypress_dpm_init(struct radeon_device *rdev)
2122 2110
2123 pi->dynamic_pcie_gen2 = true; 2111 pi->dynamic_pcie_gen2 = true;
2124 2112
2125 if (pi->gfx_clock_gating && 2113 if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
2126 (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE))
2127 pi->thermal_protection = true; 2114 pi->thermal_protection = true;
2128 else 2115 else
2129 pi->thermal_protection = false; 2116 pi->thermal_protection = false;
@@ -2179,7 +2166,8 @@ bool cypress_dpm_vblank_too_short(struct radeon_device *rdev)
2179{ 2166{
2180 struct rv7xx_power_info *pi = rv770_get_pi(rdev); 2167 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2181 u32 vblank_time = r600_dpm_get_vblank_time(rdev); 2168 u32 vblank_time = r600_dpm_get_vblank_time(rdev);
2182 u32 switch_limit = pi->mem_gddr5 ? 450 : 300; 2169 /* we never hit the non-gddr5 limit so disable it */
2170 u32 switch_limit = pi->mem_gddr5 ? 450 : 0;
2183 2171
2184 if (vblank_time < switch_limit) 2172 if (vblank_time < switch_limit)
2185 return true; 2173 return true;
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c
new file mode 100644
index 000000000000..8953255e894b
--- /dev/null
+++ b/drivers/gpu/drm/radeon/dce6_afmt.c
@@ -0,0 +1,278 @@
1/*
2 * Copyright 2013 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#include <linux/hdmi.h>
24#include <drm/drmP.h>
25#include "radeon.h"
26#include "sid.h"
27
28static u32 dce6_endpoint_rreg(struct radeon_device *rdev,
29 u32 block_offset, u32 reg)
30{
31 u32 r;
32
33 WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset, reg);
34 r = RREG32(AZ_F0_CODEC_ENDPOINT_DATA + block_offset);
35 return r;
36}
37
38static void dce6_endpoint_wreg(struct radeon_device *rdev,
39 u32 block_offset, u32 reg, u32 v)
40{
41 if (ASIC_IS_DCE8(rdev))
42 WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset, reg);
43 else
44 WREG32(AZ_F0_CODEC_ENDPOINT_INDEX + block_offset,
45 AZ_ENDPOINT_REG_WRITE_EN | AZ_ENDPOINT_REG_INDEX(reg));
46 WREG32(AZ_F0_CODEC_ENDPOINT_DATA + block_offset, v);
47}
48
49#define RREG32_ENDPOINT(block, reg) dce6_endpoint_rreg(rdev, (block), (reg))
50#define WREG32_ENDPOINT(block, reg, v) dce6_endpoint_wreg(rdev, (block), (reg), (v))
51
52
53static void dce6_afmt_get_connected_pins(struct radeon_device *rdev)
54{
55 int i;
56 u32 offset, tmp;
57
58 for (i = 0; i < rdev->audio.num_pins; i++) {
59 offset = rdev->audio.pin[i].offset;
60 tmp = RREG32_ENDPOINT(offset,
61 AZ_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT);
62 if (((tmp & PORT_CONNECTIVITY_MASK) >> PORT_CONNECTIVITY_SHIFT) == 1)
63 rdev->audio.pin[i].connected = false;
64 else
65 rdev->audio.pin[i].connected = true;
66 }
67}
68
69struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev)
70{
71 int i;
72
73 dce6_afmt_get_connected_pins(rdev);
74
75 for (i = 0; i < rdev->audio.num_pins; i++) {
76 if (rdev->audio.pin[i].connected)
77 return &rdev->audio.pin[i];
78 }
79 DRM_ERROR("No connected audio pins found!\n");
80 return NULL;
81}
82
83void dce6_afmt_select_pin(struct drm_encoder *encoder)
84{
85 struct radeon_device *rdev = encoder->dev->dev_private;
86 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
87 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
88 u32 offset = dig->afmt->offset;
89 u32 id = dig->afmt->pin->id;
90
91 if (!dig->afmt->pin)
92 return;
93
94 WREG32(AFMT_AUDIO_SRC_CONTROL + offset, AFMT_AUDIO_SRC_SELECT(id));
95}
96
97void dce6_afmt_write_speaker_allocation(struct drm_encoder *encoder)
98{
99 struct radeon_device *rdev = encoder->dev->dev_private;
100 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
101 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
102 struct drm_connector *connector;
103 struct radeon_connector *radeon_connector = NULL;
104 u32 offset, tmp;
105 u8 *sadb;
106 int sad_count;
107
108 if (!dig->afmt->pin)
109 return;
110
111 offset = dig->afmt->pin->offset;
112
113 list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
114 if (connector->encoder == encoder)
115 radeon_connector = to_radeon_connector(connector);
116 }
117
118 if (!radeon_connector) {
119 DRM_ERROR("Couldn't find encoder's connector\n");
120 return;
121 }
122
123 sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb);
124 if (sad_count < 0) {
125 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
126 return;
127 }
128
129 /* program the speaker allocation */
130 tmp = RREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER);
131 tmp &= ~(DP_CONNECTION | SPEAKER_ALLOCATION_MASK);
132 /* set HDMI mode */
133 tmp |= HDMI_CONNECTION;
134 if (sad_count)
135 tmp |= SPEAKER_ALLOCATION(sadb[0]);
136 else
137 tmp |= SPEAKER_ALLOCATION(5); /* stereo */
138 WREG32_ENDPOINT(offset, AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER, tmp);
139
140 kfree(sadb);
141}
142
143void dce6_afmt_write_sad_regs(struct drm_encoder *encoder)
144{
145 struct radeon_device *rdev = encoder->dev->dev_private;
146 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
147 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
148 u32 offset;
149 struct drm_connector *connector;
150 struct radeon_connector *radeon_connector = NULL;
151 struct cea_sad *sads;
152 int i, sad_count;
153
154 static const u16 eld_reg_to_type[][2] = {
155 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0, HDMI_AUDIO_CODING_TYPE_PCM },
156 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR1, HDMI_AUDIO_CODING_TYPE_AC3 },
157 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR2, HDMI_AUDIO_CODING_TYPE_MPEG1 },
158 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR3, HDMI_AUDIO_CODING_TYPE_MP3 },
159 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR4, HDMI_AUDIO_CODING_TYPE_MPEG2 },
160 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR5, HDMI_AUDIO_CODING_TYPE_AAC_LC },
161 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR6, HDMI_AUDIO_CODING_TYPE_DTS },
162 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR7, HDMI_AUDIO_CODING_TYPE_ATRAC },
163 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR9, HDMI_AUDIO_CODING_TYPE_EAC3 },
164 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR10, HDMI_AUDIO_CODING_TYPE_DTS_HD },
165 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR11, HDMI_AUDIO_CODING_TYPE_MLP },
166 { AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO },
167 };
168
169 if (!dig->afmt->pin)
170 return;
171
172 offset = dig->afmt->pin->offset;
173
174 list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
175 if (connector->encoder == encoder)
176 radeon_connector = to_radeon_connector(connector);
177 }
178
179 if (!radeon_connector) {
180 DRM_ERROR("Couldn't find encoder's connector\n");
181 return;
182 }
183
184 sad_count = drm_edid_to_sad(radeon_connector->edid, &sads);
185 if (sad_count < 0) {
186 DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
187 return;
188 }
189 BUG_ON(!sads);
190
191 for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) {
192 u32 value = 0;
193 int j;
194
195 for (j = 0; j < sad_count; j++) {
196 struct cea_sad *sad = &sads[j];
197
198 if (sad->format == eld_reg_to_type[i][1]) {
199 value = MAX_CHANNELS(sad->channels) |
200 DESCRIPTOR_BYTE_2(sad->byte2) |
201 SUPPORTED_FREQUENCIES(sad->freq);
202 if (sad->format == HDMI_AUDIO_CODING_TYPE_PCM)
203 value |= SUPPORTED_FREQUENCIES_STEREO(sad->freq);
204 break;
205 }
206 }
207 WREG32_ENDPOINT(offset, eld_reg_to_type[i][0], value);
208 }
209
210 kfree(sads);
211}
212
213static int dce6_audio_chipset_supported(struct radeon_device *rdev)
214{
215 return !ASIC_IS_NODCE(rdev);
216}
217
218static void dce6_audio_enable(struct radeon_device *rdev,
219 struct r600_audio_pin *pin,
220 bool enable)
221{
222 WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL,
223 AUDIO_ENABLED);
224 DRM_INFO("%s audio %d support\n", enable ? "Enabling" : "Disabling", pin->id);
225}
226
227static const u32 pin_offsets[7] =
228{
229 (0x5e00 - 0x5e00),
230 (0x5e18 - 0x5e00),
231 (0x5e30 - 0x5e00),
232 (0x5e48 - 0x5e00),
233 (0x5e60 - 0x5e00),
234 (0x5e78 - 0x5e00),
235 (0x5e90 - 0x5e00),
236};
237
238int dce6_audio_init(struct radeon_device *rdev)
239{
240 int i;
241
242 if (!radeon_audio || !dce6_audio_chipset_supported(rdev))
243 return 0;
244
245 rdev->audio.enabled = true;
246
247 if (ASIC_IS_DCE8(rdev))
248 rdev->audio.num_pins = 7;
249 else
250 rdev->audio.num_pins = 6;
251
252 for (i = 0; i < rdev->audio.num_pins; i++) {
253 rdev->audio.pin[i].channels = -1;
254 rdev->audio.pin[i].rate = -1;
255 rdev->audio.pin[i].bits_per_sample = -1;
256 rdev->audio.pin[i].status_bits = 0;
257 rdev->audio.pin[i].category_code = 0;
258 rdev->audio.pin[i].connected = false;
259 rdev->audio.pin[i].offset = pin_offsets[i];
260 rdev->audio.pin[i].id = i;
261 dce6_audio_enable(rdev, &rdev->audio.pin[i], true);
262 }
263
264 return 0;
265}
266
267void dce6_audio_fini(struct radeon_device *rdev)
268{
269 int i;
270
271 if (!rdev->audio.enabled)
272 return;
273
274 for (i = 0; i < rdev->audio.num_pins; i++)
275 dce6_audio_enable(rdev, &rdev->audio.pin[i], false);
276
277 rdev->audio.enabled = false;
278}
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index b67c9ec7f690..555164e270a7 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -47,7 +47,7 @@ static const u32 crtc_offsets[6] =
47 47
48#include "clearstate_evergreen.h" 48#include "clearstate_evergreen.h"
49 49
50static u32 sumo_rlc_save_restore_register_list[] = 50static const u32 sumo_rlc_save_restore_register_list[] =
51{ 51{
52 0x98fc, 52 0x98fc,
53 0x9830, 53 0x9830,
@@ -131,7 +131,6 @@ static u32 sumo_rlc_save_restore_register_list[] =
131 0x9150, 131 0x9150,
132 0x802c, 132 0x802c,
133}; 133};
134static u32 sumo_rlc_save_restore_register_list_size = ARRAY_SIZE(sumo_rlc_save_restore_register_list);
135 134
136static void evergreen_gpu_init(struct radeon_device *rdev); 135static void evergreen_gpu_init(struct radeon_device *rdev);
137void evergreen_fini(struct radeon_device *rdev); 136void evergreen_fini(struct radeon_device *rdev);
@@ -141,6 +140,12 @@ extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
141 int ring, u32 cp_int_cntl); 140 int ring, u32 cp_int_cntl);
142extern void cayman_vm_decode_fault(struct radeon_device *rdev, 141extern void cayman_vm_decode_fault(struct radeon_device *rdev,
143 u32 status, u32 addr); 142 u32 status, u32 addr);
143void cik_init_cp_pg_table(struct radeon_device *rdev);
144
145extern u32 si_get_csb_size(struct radeon_device *rdev);
146extern void si_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer);
147extern u32 cik_get_csb_size(struct radeon_device *rdev);
148extern void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer);
144 149
145static const u32 evergreen_golden_registers[] = 150static const u32 evergreen_golden_registers[] =
146{ 151{
@@ -1807,7 +1812,8 @@ static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,
1807 struct drm_display_mode *mode, 1812 struct drm_display_mode *mode,
1808 struct drm_display_mode *other_mode) 1813 struct drm_display_mode *other_mode)
1809{ 1814{
1810 u32 tmp; 1815 u32 tmp, buffer_alloc, i;
1816 u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
1811 /* 1817 /*
1812 * Line Buffer Setup 1818 * Line Buffer Setup
1813 * There are 3 line buffers, each one shared by 2 display controllers. 1819 * There are 3 line buffers, each one shared by 2 display controllers.
@@ -1830,18 +1836,34 @@ static u32 evergreen_line_buffer_adjust(struct radeon_device *rdev,
1830 * non-linked crtcs for maximum line buffer allocation. 1836 * non-linked crtcs for maximum line buffer allocation.
1831 */ 1837 */
1832 if (radeon_crtc->base.enabled && mode) { 1838 if (radeon_crtc->base.enabled && mode) {
1833 if (other_mode) 1839 if (other_mode) {
1834 tmp = 0; /* 1/2 */ 1840 tmp = 0; /* 1/2 */
1835 else 1841 buffer_alloc = 1;
1842 } else {
1836 tmp = 2; /* whole */ 1843 tmp = 2; /* whole */
1837 } else 1844 buffer_alloc = 2;
1845 }
1846 } else {
1838 tmp = 0; 1847 tmp = 0;
1848 buffer_alloc = 0;
1849 }
1839 1850
1840 /* second controller of the pair uses second half of the lb */ 1851 /* second controller of the pair uses second half of the lb */
1841 if (radeon_crtc->crtc_id % 2) 1852 if (radeon_crtc->crtc_id % 2)
1842 tmp += 4; 1853 tmp += 4;
1843 WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp); 1854 WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, tmp);
1844 1855
1856 if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
1857 WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
1858 DMIF_BUFFERS_ALLOCATED(buffer_alloc));
1859 for (i = 0; i < rdev->usec_timeout; i++) {
1860 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
1861 DMIF_BUFFERS_ALLOCATED_COMPLETED)
1862 break;
1863 udelay(1);
1864 }
1865 }
1866
1845 if (radeon_crtc->base.enabled && mode) { 1867 if (radeon_crtc->base.enabled && mode) {
1846 switch (tmp) { 1868 switch (tmp) {
1847 case 0: 1869 case 0:
@@ -3613,7 +3635,7 @@ bool evergreen_is_display_hung(struct radeon_device *rdev)
3613 return true; 3635 return true;
3614} 3636}
3615 3637
3616static u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev) 3638u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev)
3617{ 3639{
3618 u32 reset_mask = 0; 3640 u32 reset_mask = 0;
3619 u32 tmp; 3641 u32 tmp;
@@ -3839,28 +3861,6 @@ bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *rin
3839 return radeon_ring_test_lockup(rdev, ring); 3861 return radeon_ring_test_lockup(rdev, ring);
3840} 3862}
3841 3863
3842/**
3843 * evergreen_dma_is_lockup - Check if the DMA engine is locked up
3844 *
3845 * @rdev: radeon_device pointer
3846 * @ring: radeon_ring structure holding ring information
3847 *
3848 * Check if the async DMA engine is locked up.
3849 * Returns true if the engine appears to be locked up, false if not.
3850 */
3851bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
3852{
3853 u32 reset_mask = evergreen_gpu_check_soft_reset(rdev);
3854
3855 if (!(reset_mask & RADEON_RESET_DMA)) {
3856 radeon_ring_lockup_update(ring);
3857 return false;
3858 }
3859 /* force ring activities */
3860 radeon_ring_force_activity(rdev, ring);
3861 return radeon_ring_test_lockup(rdev, ring);
3862}
3863
3864/* 3864/*
3865 * RLC 3865 * RLC
3866 */ 3866 */
@@ -3894,147 +3894,231 @@ void sumo_rlc_fini(struct radeon_device *rdev)
3894 radeon_bo_unref(&rdev->rlc.clear_state_obj); 3894 radeon_bo_unref(&rdev->rlc.clear_state_obj);
3895 rdev->rlc.clear_state_obj = NULL; 3895 rdev->rlc.clear_state_obj = NULL;
3896 } 3896 }
3897
3898 /* clear state block */
3899 if (rdev->rlc.cp_table_obj) {
3900 r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
3901 if (unlikely(r != 0))
3902 dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
3903 radeon_bo_unpin(rdev->rlc.cp_table_obj);
3904 radeon_bo_unreserve(rdev->rlc.cp_table_obj);
3905
3906 radeon_bo_unref(&rdev->rlc.cp_table_obj);
3907 rdev->rlc.cp_table_obj = NULL;
3908 }
3897} 3909}
3898 3910
3911#define CP_ME_TABLE_SIZE 96
3912
3899int sumo_rlc_init(struct radeon_device *rdev) 3913int sumo_rlc_init(struct radeon_device *rdev)
3900{ 3914{
3901 u32 *src_ptr; 3915 const u32 *src_ptr;
3902 volatile u32 *dst_ptr; 3916 volatile u32 *dst_ptr;
3903 u32 dws, data, i, j, k, reg_num; 3917 u32 dws, data, i, j, k, reg_num;
3904 u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index; 3918 u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index = 0;
3905 u64 reg_list_mc_addr; 3919 u64 reg_list_mc_addr;
3906 struct cs_section_def *cs_data; 3920 const struct cs_section_def *cs_data;
3907 int r; 3921 int r;
3908 3922
3909 src_ptr = rdev->rlc.reg_list; 3923 src_ptr = rdev->rlc.reg_list;
3910 dws = rdev->rlc.reg_list_size; 3924 dws = rdev->rlc.reg_list_size;
3925 if (rdev->family >= CHIP_BONAIRE) {
3926 dws += (5 * 16) + 48 + 48 + 64;
3927 }
3911 cs_data = rdev->rlc.cs_data; 3928 cs_data = rdev->rlc.cs_data;
3912 3929
3913 /* save restore block */ 3930 if (src_ptr) {
3914 if (rdev->rlc.save_restore_obj == NULL) { 3931 /* save restore block */
3915 r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, 3932 if (rdev->rlc.save_restore_obj == NULL) {
3916 RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.save_restore_obj); 3933 r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
3934 RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.save_restore_obj);
3935 if (r) {
3936 dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
3937 return r;
3938 }
3939 }
3940
3941 r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
3942 if (unlikely(r != 0)) {
3943 sumo_rlc_fini(rdev);
3944 return r;
3945 }
3946 r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM,
3947 &rdev->rlc.save_restore_gpu_addr);
3917 if (r) { 3948 if (r) {
3918 dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r); 3949 radeon_bo_unreserve(rdev->rlc.save_restore_obj);
3950 dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r);
3951 sumo_rlc_fini(rdev);
3919 return r; 3952 return r;
3920 } 3953 }
3921 }
3922 3954
3923 r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false); 3955 r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)&rdev->rlc.sr_ptr);
3924 if (unlikely(r != 0)) { 3956 if (r) {
3925 sumo_rlc_fini(rdev); 3957 dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r);
3926 return r; 3958 sumo_rlc_fini(rdev);
3927 } 3959 return r;
3928 r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM, 3960 }
3929 &rdev->rlc.save_restore_gpu_addr); 3961 /* write the sr buffer */
3930 if (r) { 3962 dst_ptr = rdev->rlc.sr_ptr;
3963 if (rdev->family >= CHIP_TAHITI) {
3964 /* SI */
3965 for (i = 0; i < rdev->rlc.reg_list_size; i++)
3966 dst_ptr[i] = src_ptr[i];
3967 } else {
3968 /* ON/LN/TN */
3969 /* format:
3970 * dw0: (reg2 << 16) | reg1
3971 * dw1: reg1 save space
3972 * dw2: reg2 save space
3973 */
3974 for (i = 0; i < dws; i++) {
3975 data = src_ptr[i] >> 2;
3976 i++;
3977 if (i < dws)
3978 data |= (src_ptr[i] >> 2) << 16;
3979 j = (((i - 1) * 3) / 2);
3980 dst_ptr[j] = data;
3981 }
3982 j = ((i * 3) / 2);
3983 dst_ptr[j] = RLC_SAVE_RESTORE_LIST_END_MARKER;
3984 }
3985 radeon_bo_kunmap(rdev->rlc.save_restore_obj);
3931 radeon_bo_unreserve(rdev->rlc.save_restore_obj); 3986 radeon_bo_unreserve(rdev->rlc.save_restore_obj);
3932 dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r);
3933 sumo_rlc_fini(rdev);
3934 return r;
3935 } 3987 }
3936 r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)&rdev->rlc.sr_ptr);
3937 if (r) {
3938 dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r);
3939 sumo_rlc_fini(rdev);
3940 return r;
3941 }
3942 /* write the sr buffer */
3943 dst_ptr = rdev->rlc.sr_ptr;
3944 /* format:
3945 * dw0: (reg2 << 16) | reg1
3946 * dw1: reg1 save space
3947 * dw2: reg2 save space
3948 */
3949 for (i = 0; i < dws; i++) {
3950 data = src_ptr[i] >> 2;
3951 i++;
3952 if (i < dws)
3953 data |= (src_ptr[i] >> 2) << 16;
3954 j = (((i - 1) * 3) / 2);
3955 dst_ptr[j] = data;
3956 }
3957 j = ((i * 3) / 2);
3958 dst_ptr[j] = RLC_SAVE_RESTORE_LIST_END_MARKER;
3959
3960 radeon_bo_kunmap(rdev->rlc.save_restore_obj);
3961 radeon_bo_unreserve(rdev->rlc.save_restore_obj);
3962 3988
3963 /* clear state block */ 3989 if (cs_data) {
3964 reg_list_num = 0; 3990 /* clear state block */
3965 dws = 0; 3991 if (rdev->family >= CHIP_BONAIRE) {
3966 for (i = 0; cs_data[i].section != NULL; i++) { 3992 rdev->rlc.clear_state_size = dws = cik_get_csb_size(rdev);
3967 for (j = 0; cs_data[i].section[j].extent != NULL; j++) { 3993 } else if (rdev->family >= CHIP_TAHITI) {
3968 reg_list_num++; 3994 rdev->rlc.clear_state_size = si_get_csb_size(rdev);
3969 dws += cs_data[i].section[j].reg_count; 3995 dws = rdev->rlc.clear_state_size + (256 / 4);
3996 } else {
3997 reg_list_num = 0;
3998 dws = 0;
3999 for (i = 0; cs_data[i].section != NULL; i++) {
4000 for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
4001 reg_list_num++;
4002 dws += cs_data[i].section[j].reg_count;
4003 }
4004 }
4005 reg_list_blk_index = (3 * reg_list_num + 2);
4006 dws += reg_list_blk_index;
4007 rdev->rlc.clear_state_size = dws;
3970 } 4008 }
3971 }
3972 reg_list_blk_index = (3 * reg_list_num + 2);
3973 dws += reg_list_blk_index;
3974 4009
3975 if (rdev->rlc.clear_state_obj == NULL) { 4010 if (rdev->rlc.clear_state_obj == NULL) {
3976 r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, 4011 r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
3977 RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.clear_state_obj); 4012 RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.clear_state_obj);
4013 if (r) {
4014 dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
4015 sumo_rlc_fini(rdev);
4016 return r;
4017 }
4018 }
4019 r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
4020 if (unlikely(r != 0)) {
4021 sumo_rlc_fini(rdev);
4022 return r;
4023 }
4024 r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM,
4025 &rdev->rlc.clear_state_gpu_addr);
3978 if (r) { 4026 if (r) {
3979 dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r); 4027 radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4028 dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r);
3980 sumo_rlc_fini(rdev); 4029 sumo_rlc_fini(rdev);
3981 return r; 4030 return r;
3982 } 4031 }
3983 }
3984 r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false);
3985 if (unlikely(r != 0)) {
3986 sumo_rlc_fini(rdev);
3987 return r;
3988 }
3989 r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM,
3990 &rdev->rlc.clear_state_gpu_addr);
3991 if (r) {
3992 4032
3993 radeon_bo_unreserve(rdev->rlc.clear_state_obj); 4033 r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)&rdev->rlc.cs_ptr);
3994 dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r); 4034 if (r) {
3995 sumo_rlc_fini(rdev); 4035 dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r);
3996 return r; 4036 sumo_rlc_fini(rdev);
3997 } 4037 return r;
3998 r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)&rdev->rlc.cs_ptr); 4038 }
3999 if (r) { 4039 /* set up the cs buffer */
4000 dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r); 4040 dst_ptr = rdev->rlc.cs_ptr;
4001 sumo_rlc_fini(rdev); 4041 if (rdev->family >= CHIP_BONAIRE) {
4002 return r; 4042 cik_get_csb_buffer(rdev, dst_ptr);
4003 } 4043 } else if (rdev->family >= CHIP_TAHITI) {
4004 /* set up the cs buffer */ 4044 reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + 256;
4005 dst_ptr = rdev->rlc.cs_ptr; 4045 dst_ptr[0] = upper_32_bits(reg_list_mc_addr);
4006 reg_list_hdr_blk_index = 0; 4046 dst_ptr[1] = lower_32_bits(reg_list_mc_addr);
4007 reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4); 4047 dst_ptr[2] = rdev->rlc.clear_state_size;
4008 data = upper_32_bits(reg_list_mc_addr); 4048 si_get_csb_buffer(rdev, &dst_ptr[(256/4)]);
4009 dst_ptr[reg_list_hdr_blk_index] = data; 4049 } else {
4010 reg_list_hdr_blk_index++; 4050 reg_list_hdr_blk_index = 0;
4011 for (i = 0; cs_data[i].section != NULL; i++) { 4051 reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4);
4012 for (j = 0; cs_data[i].section[j].extent != NULL; j++) { 4052 data = upper_32_bits(reg_list_mc_addr);
4013 reg_num = cs_data[i].section[j].reg_count;
4014 data = reg_list_mc_addr & 0xffffffff;
4015 dst_ptr[reg_list_hdr_blk_index] = data;
4016 reg_list_hdr_blk_index++;
4017
4018 data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff;
4019 dst_ptr[reg_list_hdr_blk_index] = data;
4020 reg_list_hdr_blk_index++;
4021
4022 data = 0x08000000 | (reg_num * 4);
4023 dst_ptr[reg_list_hdr_blk_index] = data; 4053 dst_ptr[reg_list_hdr_blk_index] = data;
4024 reg_list_hdr_blk_index++; 4054 reg_list_hdr_blk_index++;
4025 4055 for (i = 0; cs_data[i].section != NULL; i++) {
4026 for (k = 0; k < reg_num; k++) { 4056 for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
4027 data = cs_data[i].section[j].extent[k]; 4057 reg_num = cs_data[i].section[j].reg_count;
4028 dst_ptr[reg_list_blk_index + k] = data; 4058 data = reg_list_mc_addr & 0xffffffff;
4059 dst_ptr[reg_list_hdr_blk_index] = data;
4060 reg_list_hdr_blk_index++;
4061
4062 data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff;
4063 dst_ptr[reg_list_hdr_blk_index] = data;
4064 reg_list_hdr_blk_index++;
4065
4066 data = 0x08000000 | (reg_num * 4);
4067 dst_ptr[reg_list_hdr_blk_index] = data;
4068 reg_list_hdr_blk_index++;
4069
4070 for (k = 0; k < reg_num; k++) {
4071 data = cs_data[i].section[j].extent[k];
4072 dst_ptr[reg_list_blk_index + k] = data;
4073 }
4074 reg_list_mc_addr += reg_num * 4;
4075 reg_list_blk_index += reg_num;
4076 }
4029 } 4077 }
4030 reg_list_mc_addr += reg_num * 4; 4078 dst_ptr[reg_list_hdr_blk_index] = RLC_CLEAR_STATE_END_MARKER;
4031 reg_list_blk_index += reg_num;
4032 } 4079 }
4080 radeon_bo_kunmap(rdev->rlc.clear_state_obj);
4081 radeon_bo_unreserve(rdev->rlc.clear_state_obj);
4033 } 4082 }
4034 dst_ptr[reg_list_hdr_blk_index] = RLC_CLEAR_STATE_END_MARKER;
4035 4083
4036 radeon_bo_kunmap(rdev->rlc.clear_state_obj); 4084 if (rdev->rlc.cp_table_size) {
4037 radeon_bo_unreserve(rdev->rlc.clear_state_obj); 4085 if (rdev->rlc.cp_table_obj == NULL) {
4086 r = radeon_bo_create(rdev, rdev->rlc.cp_table_size, PAGE_SIZE, true,
4087 RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.cp_table_obj);
4088 if (r) {
4089 dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
4090 sumo_rlc_fini(rdev);
4091 return r;
4092 }
4093 }
4094
4095 r = radeon_bo_reserve(rdev->rlc.cp_table_obj, false);
4096 if (unlikely(r != 0)) {
4097 dev_warn(rdev->dev, "(%d) reserve RLC cp table bo failed\n", r);
4098 sumo_rlc_fini(rdev);
4099 return r;
4100 }
4101 r = radeon_bo_pin(rdev->rlc.cp_table_obj, RADEON_GEM_DOMAIN_VRAM,
4102 &rdev->rlc.cp_table_gpu_addr);
4103 if (r) {
4104 radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4105 dev_warn(rdev->dev, "(%d) pin RLC cp_table bo failed\n", r);
4106 sumo_rlc_fini(rdev);
4107 return r;
4108 }
4109 r = radeon_bo_kmap(rdev->rlc.cp_table_obj, (void **)&rdev->rlc.cp_table_ptr);
4110 if (r) {
4111 dev_warn(rdev->dev, "(%d) map RLC cp table bo failed\n", r);
4112 sumo_rlc_fini(rdev);
4113 return r;
4114 }
4115
4116 cik_init_cp_pg_table(rdev);
4117
4118 radeon_bo_kunmap(rdev->rlc.cp_table_obj);
4119 radeon_bo_unreserve(rdev->rlc.cp_table_obj);
4120
4121 }
4038 4122
4039 return 0; 4123 return 0;
4040} 4124}
@@ -4959,143 +5043,6 @@ restart_ih:
4959 return IRQ_HANDLED; 5043 return IRQ_HANDLED;
4960} 5044}
4961 5045
4962/**
4963 * evergreen_dma_fence_ring_emit - emit a fence on the DMA ring
4964 *
4965 * @rdev: radeon_device pointer
4966 * @fence: radeon fence object
4967 *
4968 * Add a DMA fence packet to the ring to write
4969 * the fence seq number and DMA trap packet to generate
4970 * an interrupt if needed (evergreen-SI).
4971 */
4972void evergreen_dma_fence_ring_emit(struct radeon_device *rdev,
4973 struct radeon_fence *fence)
4974{
4975 struct radeon_ring *ring = &rdev->ring[fence->ring];
4976 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
4977 /* write the fence */
4978 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_FENCE, 0, 0));
4979 radeon_ring_write(ring, addr & 0xfffffffc);
4980 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff));
4981 radeon_ring_write(ring, fence->seq);
4982 /* generate an interrupt */
4983 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0));
4984 /* flush HDP */
4985 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0));
4986 radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2));
4987 radeon_ring_write(ring, 1);
4988}
4989
4990/**
4991 * evergreen_dma_ring_ib_execute - schedule an IB on the DMA engine
4992 *
4993 * @rdev: radeon_device pointer
4994 * @ib: IB object to schedule
4995 *
4996 * Schedule an IB in the DMA ring (evergreen).
4997 */
4998void evergreen_dma_ring_ib_execute(struct radeon_device *rdev,
4999 struct radeon_ib *ib)
5000{
5001 struct radeon_ring *ring = &rdev->ring[ib->ring];
5002
5003 if (rdev->wb.enabled) {
5004 u32 next_rptr = ring->wptr + 4;
5005 while ((next_rptr & 7) != 5)
5006 next_rptr++;
5007 next_rptr += 3;
5008 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 1));
5009 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
5010 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xff);
5011 radeon_ring_write(ring, next_rptr);
5012 }
5013
5014 /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring.
5015 * Pad as necessary with NOPs.
5016 */
5017 while ((ring->wptr & 7) != 5)
5018 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0));
5019 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_INDIRECT_BUFFER, 0, 0));
5020 radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0));
5021 radeon_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF));
5022
5023}
5024
5025/**
5026 * evergreen_copy_dma - copy pages using the DMA engine
5027 *
5028 * @rdev: radeon_device pointer
5029 * @src_offset: src GPU address
5030 * @dst_offset: dst GPU address
5031 * @num_gpu_pages: number of GPU pages to xfer
5032 * @fence: radeon fence object
5033 *
5034 * Copy GPU paging using the DMA engine (evergreen-cayman).
5035 * Used by the radeon ttm implementation to move pages if
5036 * registered as the asic copy callback.
5037 */
5038int evergreen_copy_dma(struct radeon_device *rdev,
5039 uint64_t src_offset, uint64_t dst_offset,
5040 unsigned num_gpu_pages,
5041 struct radeon_fence **fence)
5042{
5043 struct radeon_semaphore *sem = NULL;
5044 int ring_index = rdev->asic->copy.dma_ring_index;
5045 struct radeon_ring *ring = &rdev->ring[ring_index];
5046 u32 size_in_dw, cur_size_in_dw;
5047 int i, num_loops;
5048 int r = 0;
5049
5050 r = radeon_semaphore_create(rdev, &sem);
5051 if (r) {
5052 DRM_ERROR("radeon: moving bo (%d).\n", r);
5053 return r;
5054 }
5055
5056 size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
5057 num_loops = DIV_ROUND_UP(size_in_dw, 0xfffff);
5058 r = radeon_ring_lock(rdev, ring, num_loops * 5 + 11);
5059 if (r) {
5060 DRM_ERROR("radeon: moving bo (%d).\n", r);
5061 radeon_semaphore_free(rdev, &sem, NULL);
5062 return r;
5063 }
5064
5065 if (radeon_fence_need_sync(*fence, ring->idx)) {
5066 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
5067 ring->idx);
5068 radeon_fence_note_sync(*fence, ring->idx);
5069 } else {
5070 radeon_semaphore_free(rdev, &sem, NULL);
5071 }
5072
5073 for (i = 0; i < num_loops; i++) {
5074 cur_size_in_dw = size_in_dw;
5075 if (cur_size_in_dw > 0xFFFFF)
5076 cur_size_in_dw = 0xFFFFF;
5077 size_in_dw -= cur_size_in_dw;
5078 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, cur_size_in_dw));
5079 radeon_ring_write(ring, dst_offset & 0xfffffffc);
5080 radeon_ring_write(ring, src_offset & 0xfffffffc);
5081 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
5082 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
5083 src_offset += cur_size_in_dw * 4;
5084 dst_offset += cur_size_in_dw * 4;
5085 }
5086
5087 r = radeon_fence_emit(rdev, fence, ring->idx);
5088 if (r) {
5089 radeon_ring_unlock_undo(rdev, ring);
5090 return r;
5091 }
5092
5093 radeon_ring_unlock_commit(rdev, ring);
5094 radeon_semaphore_free(rdev, &sem, *fence);
5095
5096 return r;
5097}
5098
5099static int evergreen_startup(struct radeon_device *rdev) 5046static int evergreen_startup(struct radeon_device *rdev)
5100{ 5047{
5101 struct radeon_ring *ring; 5048 struct radeon_ring *ring;
@@ -5106,6 +5053,13 @@ static int evergreen_startup(struct radeon_device *rdev)
5106 /* enable aspm */ 5053 /* enable aspm */
5107 evergreen_program_aspm(rdev); 5054 evergreen_program_aspm(rdev);
5108 5055
5056 /* scratch needs to be initialized before MC */
5057 r = r600_vram_scratch_init(rdev);
5058 if (r)
5059 return r;
5060
5061 evergreen_mc_program(rdev);
5062
5109 if (ASIC_IS_DCE5(rdev)) { 5063 if (ASIC_IS_DCE5(rdev)) {
5110 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) { 5064 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw || !rdev->mc_fw) {
5111 r = ni_init_microcode(rdev); 5065 r = ni_init_microcode(rdev);
@@ -5129,11 +5083,6 @@ static int evergreen_startup(struct radeon_device *rdev)
5129 } 5083 }
5130 } 5084 }
5131 5085
5132 r = r600_vram_scratch_init(rdev);
5133 if (r)
5134 return r;
5135
5136 evergreen_mc_program(rdev);
5137 if (rdev->flags & RADEON_IS_AGP) { 5086 if (rdev->flags & RADEON_IS_AGP) {
5138 evergreen_agp_enable(rdev); 5087 evergreen_agp_enable(rdev);
5139 } else { 5088 } else {
@@ -5143,17 +5092,11 @@ static int evergreen_startup(struct radeon_device *rdev)
5143 } 5092 }
5144 evergreen_gpu_init(rdev); 5093 evergreen_gpu_init(rdev);
5145 5094
5146 r = evergreen_blit_init(rdev);
5147 if (r) {
5148 r600_blit_fini(rdev);
5149 rdev->asic->copy.copy = NULL;
5150 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
5151 }
5152
5153 /* allocate rlc buffers */ 5095 /* allocate rlc buffers */
5154 if (rdev->flags & RADEON_IS_IGP) { 5096 if (rdev->flags & RADEON_IS_IGP) {
5155 rdev->rlc.reg_list = sumo_rlc_save_restore_register_list; 5097 rdev->rlc.reg_list = sumo_rlc_save_restore_register_list;
5156 rdev->rlc.reg_list_size = sumo_rlc_save_restore_register_list_size; 5098 rdev->rlc.reg_list_size =
5099 (u32)ARRAY_SIZE(sumo_rlc_save_restore_register_list);
5157 rdev->rlc.cs_data = evergreen_cs_data; 5100 rdev->rlc.cs_data = evergreen_cs_data;
5158 r = sumo_rlc_init(rdev); 5101 r = sumo_rlc_init(rdev);
5159 if (r) { 5102 if (r) {
@@ -5179,7 +5122,7 @@ static int evergreen_startup(struct radeon_device *rdev)
5179 return r; 5122 return r;
5180 } 5123 }
5181 5124
5182 r = rv770_uvd_resume(rdev); 5125 r = uvd_v2_2_resume(rdev);
5183 if (!r) { 5126 if (!r) {
5184 r = radeon_fence_driver_start_ring(rdev, 5127 r = radeon_fence_driver_start_ring(rdev,
5185 R600_RING_TYPE_UVD_INDEX); 5128 R600_RING_TYPE_UVD_INDEX);
@@ -5208,14 +5151,14 @@ static int evergreen_startup(struct radeon_device *rdev)
5208 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 5151 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
5209 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 5152 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
5210 R600_CP_RB_RPTR, R600_CP_RB_WPTR, 5153 R600_CP_RB_RPTR, R600_CP_RB_WPTR,
5211 0, 0xfffff, RADEON_CP_PACKET2); 5154 RADEON_CP_PACKET2);
5212 if (r) 5155 if (r)
5213 return r; 5156 return r;
5214 5157
5215 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 5158 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
5216 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 5159 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
5217 DMA_RB_RPTR, DMA_RB_WPTR, 5160 DMA_RB_RPTR, DMA_RB_WPTR,
5218 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0)); 5161 DMA_PACKET(DMA_PACKET_NOP, 0, 0));
5219 if (r) 5162 if (r)
5220 return r; 5163 return r;
5221 5164
@@ -5231,12 +5174,11 @@ static int evergreen_startup(struct radeon_device *rdev)
5231 5174
5232 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 5175 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
5233 if (ring->ring_size) { 5176 if (ring->ring_size) {
5234 r = radeon_ring_init(rdev, ring, ring->ring_size, 5177 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
5235 R600_WB_UVD_RPTR_OFFSET,
5236 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR, 5178 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
5237 0, 0xfffff, RADEON_CP_PACKET2); 5179 RADEON_CP_PACKET2);
5238 if (!r) 5180 if (!r)
5239 r = r600_uvd_init(rdev); 5181 r = uvd_v1_0_init(rdev);
5240 5182
5241 if (r) 5183 if (r)
5242 DRM_ERROR("radeon: error initializing UVD (%d).\n", r); 5184 DRM_ERROR("radeon: error initializing UVD (%d).\n", r);
@@ -5291,10 +5233,10 @@ int evergreen_resume(struct radeon_device *rdev)
5291int evergreen_suspend(struct radeon_device *rdev) 5233int evergreen_suspend(struct radeon_device *rdev)
5292{ 5234{
5293 r600_audio_fini(rdev); 5235 r600_audio_fini(rdev);
5236 uvd_v1_0_fini(rdev);
5294 radeon_uvd_suspend(rdev); 5237 radeon_uvd_suspend(rdev);
5295 r700_cp_stop(rdev); 5238 r700_cp_stop(rdev);
5296 r600_dma_stop(rdev); 5239 r600_dma_stop(rdev);
5297 r600_uvd_rbc_stop(rdev);
5298 evergreen_irq_suspend(rdev); 5240 evergreen_irq_suspend(rdev);
5299 radeon_wb_disable(rdev); 5241 radeon_wb_disable(rdev);
5300 evergreen_pcie_gart_disable(rdev); 5242 evergreen_pcie_gart_disable(rdev);
@@ -5419,7 +5361,6 @@ int evergreen_init(struct radeon_device *rdev)
5419void evergreen_fini(struct radeon_device *rdev) 5361void evergreen_fini(struct radeon_device *rdev)
5420{ 5362{
5421 r600_audio_fini(rdev); 5363 r600_audio_fini(rdev);
5422 r600_blit_fini(rdev);
5423 r700_cp_fini(rdev); 5364 r700_cp_fini(rdev);
5424 r600_dma_fini(rdev); 5365 r600_dma_fini(rdev);
5425 r600_irq_fini(rdev); 5366 r600_irq_fini(rdev);
@@ -5429,6 +5370,7 @@ void evergreen_fini(struct radeon_device *rdev)
5429 radeon_ib_pool_fini(rdev); 5370 radeon_ib_pool_fini(rdev);
5430 radeon_irq_kms_fini(rdev); 5371 radeon_irq_kms_fini(rdev);
5431 evergreen_pcie_gart_fini(rdev); 5372 evergreen_pcie_gart_fini(rdev);
5373 uvd_v1_0_fini(rdev);
5432 radeon_uvd_fini(rdev); 5374 radeon_uvd_fini(rdev);
5433 r600_vram_scratch_fini(rdev); 5375 r600_vram_scratch_fini(rdev);
5434 radeon_gem_fini(rdev); 5376 radeon_gem_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
deleted file mode 100644
index 057c87b6515a..000000000000
--- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
+++ /dev/null
@@ -1,729 +0,0 @@
1/*
2 * Copyright 2010 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 (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE COPYRIGHT HOLDER(S) AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 *
23 * Authors:
24 * Alex Deucher <alexander.deucher@amd.com>
25 */
26
27#include <drm/drmP.h>
28#include <drm/radeon_drm.h>
29#include "radeon.h"
30
31#include "evergreend.h"
32#include "evergreen_blit_shaders.h"
33#include "cayman_blit_shaders.h"
34#include "radeon_blit_common.h"
35
36/* emits 17 */
37static void
38set_render_target(struct radeon_device *rdev, int format,
39 int w, int h, u64 gpu_addr)
40{
41 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
42 u32 cb_color_info;
43 int pitch, slice;
44
45 h = ALIGN(h, 8);
46 if (h < 8)
47 h = 8;
48
49 cb_color_info = CB_FORMAT(format) |
50 CB_SOURCE_FORMAT(CB_SF_EXPORT_NORM) |
51 CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
52 pitch = (w / 8) - 1;
53 slice = ((w * h) / 64) - 1;
54
55 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 15));
56 radeon_ring_write(ring, (CB_COLOR0_BASE - PACKET3_SET_CONTEXT_REG_START) >> 2);
57 radeon_ring_write(ring, gpu_addr >> 8);
58 radeon_ring_write(ring, pitch);
59 radeon_ring_write(ring, slice);
60 radeon_ring_write(ring, 0);
61 radeon_ring_write(ring, cb_color_info);
62 radeon_ring_write(ring, 0);
63 radeon_ring_write(ring, (w - 1) | ((h - 1) << 16));
64 radeon_ring_write(ring, 0);
65 radeon_ring_write(ring, 0);
66 radeon_ring_write(ring, 0);
67 radeon_ring_write(ring, 0);
68 radeon_ring_write(ring, 0);
69 radeon_ring_write(ring, 0);
70 radeon_ring_write(ring, 0);
71 radeon_ring_write(ring, 0);
72}
73
74/* emits 5dw */
75static void
76cp_set_surface_sync(struct radeon_device *rdev,
77 u32 sync_type, u32 size,
78 u64 mc_addr)
79{
80 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
81 u32 cp_coher_size;
82
83 if (size == 0xffffffff)
84 cp_coher_size = 0xffffffff;
85 else
86 cp_coher_size = ((size + 255) >> 8);
87
88 if (rdev->family >= CHIP_CAYMAN) {
89 /* CP_COHER_CNTL2 has to be set manually when submitting a surface_sync
90 * to the RB directly. For IBs, the CP programs this as part of the
91 * surface_sync packet.
92 */
93 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
94 radeon_ring_write(ring, (0x85e8 - PACKET3_SET_CONFIG_REG_START) >> 2);
95 radeon_ring_write(ring, 0); /* CP_COHER_CNTL2 */
96 }
97 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
98 radeon_ring_write(ring, sync_type);
99 radeon_ring_write(ring, cp_coher_size);
100 radeon_ring_write(ring, mc_addr >> 8);
101 radeon_ring_write(ring, 10); /* poll interval */
102}
103
104/* emits 11dw + 1 surface sync = 16dw */
105static void
106set_shaders(struct radeon_device *rdev)
107{
108 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
109 u64 gpu_addr;
110
111 /* VS */
112 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.vs_offset;
113 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 3));
114 radeon_ring_write(ring, (SQ_PGM_START_VS - PACKET3_SET_CONTEXT_REG_START) >> 2);
115 radeon_ring_write(ring, gpu_addr >> 8);
116 radeon_ring_write(ring, 2);
117 radeon_ring_write(ring, 0);
118
119 /* PS */
120 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.ps_offset;
121 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 4));
122 radeon_ring_write(ring, (SQ_PGM_START_PS - PACKET3_SET_CONTEXT_REG_START) >> 2);
123 radeon_ring_write(ring, gpu_addr >> 8);
124 radeon_ring_write(ring, 1);
125 radeon_ring_write(ring, 0);
126 radeon_ring_write(ring, 2);
127
128 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.vs_offset;
129 cp_set_surface_sync(rdev, PACKET3_SH_ACTION_ENA, 512, gpu_addr);
130}
131
132/* emits 10 + 1 sync (5) = 15 */
133static void
134set_vtx_resource(struct radeon_device *rdev, u64 gpu_addr)
135{
136 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
137 u32 sq_vtx_constant_word2, sq_vtx_constant_word3;
138
139 /* high addr, stride */
140 sq_vtx_constant_word2 = SQ_VTXC_BASE_ADDR_HI(upper_32_bits(gpu_addr) & 0xff) |
141 SQ_VTXC_STRIDE(16);
142#ifdef __BIG_ENDIAN
143 sq_vtx_constant_word2 |= SQ_VTXC_ENDIAN_SWAP(SQ_ENDIAN_8IN32);
144#endif
145 /* xyzw swizzles */
146 sq_vtx_constant_word3 = SQ_VTCX_SEL_X(SQ_SEL_X) |
147 SQ_VTCX_SEL_Y(SQ_SEL_Y) |
148 SQ_VTCX_SEL_Z(SQ_SEL_Z) |
149 SQ_VTCX_SEL_W(SQ_SEL_W);
150
151 radeon_ring_write(ring, PACKET3(PACKET3_SET_RESOURCE, 8));
152 radeon_ring_write(ring, 0x580);
153 radeon_ring_write(ring, gpu_addr & 0xffffffff);
154 radeon_ring_write(ring, 48 - 1); /* size */
155 radeon_ring_write(ring, sq_vtx_constant_word2);
156 radeon_ring_write(ring, sq_vtx_constant_word3);
157 radeon_ring_write(ring, 0);
158 radeon_ring_write(ring, 0);
159 radeon_ring_write(ring, 0);
160 radeon_ring_write(ring, S__SQ_CONSTANT_TYPE(SQ_TEX_VTX_VALID_BUFFER));
161
162 if ((rdev->family == CHIP_CEDAR) ||
163 (rdev->family == CHIP_PALM) ||
164 (rdev->family == CHIP_SUMO) ||
165 (rdev->family == CHIP_SUMO2) ||
166 (rdev->family == CHIP_CAICOS))
167 cp_set_surface_sync(rdev,
168 PACKET3_TC_ACTION_ENA, 48, gpu_addr);
169 else
170 cp_set_surface_sync(rdev,
171 PACKET3_VC_ACTION_ENA, 48, gpu_addr);
172
173}
174
175/* emits 10 */
176static void
177set_tex_resource(struct radeon_device *rdev,
178 int format, int w, int h, int pitch,
179 u64 gpu_addr, u32 size)
180{
181 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
182 u32 sq_tex_resource_word0, sq_tex_resource_word1;
183 u32 sq_tex_resource_word4, sq_tex_resource_word7;
184
185 if (h < 1)
186 h = 1;
187
188 sq_tex_resource_word0 = TEX_DIM(SQ_TEX_DIM_2D);
189 sq_tex_resource_word0 |= ((((pitch >> 3) - 1) << 6) |
190 ((w - 1) << 18));
191 sq_tex_resource_word1 = ((h - 1) << 0) |
192 TEX_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
193 /* xyzw swizzles */
194 sq_tex_resource_word4 = TEX_DST_SEL_X(SQ_SEL_X) |
195 TEX_DST_SEL_Y(SQ_SEL_Y) |
196 TEX_DST_SEL_Z(SQ_SEL_Z) |
197 TEX_DST_SEL_W(SQ_SEL_W);
198
199 sq_tex_resource_word7 = format |
200 S__SQ_CONSTANT_TYPE(SQ_TEX_VTX_VALID_TEXTURE);
201
202 cp_set_surface_sync(rdev,
203 PACKET3_TC_ACTION_ENA, size, gpu_addr);
204
205 radeon_ring_write(ring, PACKET3(PACKET3_SET_RESOURCE, 8));
206 radeon_ring_write(ring, 0);
207 radeon_ring_write(ring, sq_tex_resource_word0);
208 radeon_ring_write(ring, sq_tex_resource_word1);
209 radeon_ring_write(ring, gpu_addr >> 8);
210 radeon_ring_write(ring, gpu_addr >> 8);
211 radeon_ring_write(ring, sq_tex_resource_word4);
212 radeon_ring_write(ring, 0);
213 radeon_ring_write(ring, 0);
214 radeon_ring_write(ring, sq_tex_resource_word7);
215}
216
217/* emits 12 */
218static void
219set_scissors(struct radeon_device *rdev, int x1, int y1,
220 int x2, int y2)
221{
222 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
223 /* workaround some hw bugs */
224 if (x2 == 0)
225 x1 = 1;
226 if (y2 == 0)
227 y1 = 1;
228 if (rdev->family >= CHIP_CAYMAN) {
229 if ((x2 == 1) && (y2 == 1))
230 x2 = 2;
231 }
232
233 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
234 radeon_ring_write(ring, (PA_SC_SCREEN_SCISSOR_TL - PACKET3_SET_CONTEXT_REG_START) >> 2);
235 radeon_ring_write(ring, (x1 << 0) | (y1 << 16));
236 radeon_ring_write(ring, (x2 << 0) | (y2 << 16));
237
238 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
239 radeon_ring_write(ring, (PA_SC_GENERIC_SCISSOR_TL - PACKET3_SET_CONTEXT_REG_START) >> 2);
240 radeon_ring_write(ring, (x1 << 0) | (y1 << 16) | (1 << 31));
241 radeon_ring_write(ring, (x2 << 0) | (y2 << 16));
242
243 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
244 radeon_ring_write(ring, (PA_SC_WINDOW_SCISSOR_TL - PACKET3_SET_CONTEXT_REG_START) >> 2);
245 radeon_ring_write(ring, (x1 << 0) | (y1 << 16) | (1 << 31));
246 radeon_ring_write(ring, (x2 << 0) | (y2 << 16));
247}
248
249/* emits 10 */
250static void
251draw_auto(struct radeon_device *rdev)
252{
253 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
254 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
255 radeon_ring_write(ring, (VGT_PRIMITIVE_TYPE - PACKET3_SET_CONFIG_REG_START) >> 2);
256 radeon_ring_write(ring, DI_PT_RECTLIST);
257
258 radeon_ring_write(ring, PACKET3(PACKET3_INDEX_TYPE, 0));
259 radeon_ring_write(ring,
260#ifdef __BIG_ENDIAN
261 (2 << 2) |
262#endif
263 DI_INDEX_SIZE_16_BIT);
264
265 radeon_ring_write(ring, PACKET3(PACKET3_NUM_INSTANCES, 0));
266 radeon_ring_write(ring, 1);
267
268 radeon_ring_write(ring, PACKET3(PACKET3_DRAW_INDEX_AUTO, 1));
269 radeon_ring_write(ring, 3);
270 radeon_ring_write(ring, DI_SRC_SEL_AUTO_INDEX);
271
272}
273
274/* emits 39 */
275static void
276set_default_state(struct radeon_device *rdev)
277{
278 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
279 u32 sq_config, sq_gpr_resource_mgmt_1, sq_gpr_resource_mgmt_2, sq_gpr_resource_mgmt_3;
280 u32 sq_thread_resource_mgmt, sq_thread_resource_mgmt_2;
281 u32 sq_stack_resource_mgmt_1, sq_stack_resource_mgmt_2, sq_stack_resource_mgmt_3;
282 int num_ps_gprs, num_vs_gprs, num_temp_gprs;
283 int num_gs_gprs, num_es_gprs, num_hs_gprs, num_ls_gprs;
284 int num_ps_threads, num_vs_threads, num_gs_threads, num_es_threads;
285 int num_hs_threads, num_ls_threads;
286 int num_ps_stack_entries, num_vs_stack_entries, num_gs_stack_entries, num_es_stack_entries;
287 int num_hs_stack_entries, num_ls_stack_entries;
288 u64 gpu_addr;
289 int dwords;
290
291 /* set clear context state */
292 radeon_ring_write(ring, PACKET3(PACKET3_CLEAR_STATE, 0));
293 radeon_ring_write(ring, 0);
294
295 if (rdev->family < CHIP_CAYMAN) {
296 switch (rdev->family) {
297 case CHIP_CEDAR:
298 default:
299 num_ps_gprs = 93;
300 num_vs_gprs = 46;
301 num_temp_gprs = 4;
302 num_gs_gprs = 31;
303 num_es_gprs = 31;
304 num_hs_gprs = 23;
305 num_ls_gprs = 23;
306 num_ps_threads = 96;
307 num_vs_threads = 16;
308 num_gs_threads = 16;
309 num_es_threads = 16;
310 num_hs_threads = 16;
311 num_ls_threads = 16;
312 num_ps_stack_entries = 42;
313 num_vs_stack_entries = 42;
314 num_gs_stack_entries = 42;
315 num_es_stack_entries = 42;
316 num_hs_stack_entries = 42;
317 num_ls_stack_entries = 42;
318 break;
319 case CHIP_REDWOOD:
320 num_ps_gprs = 93;
321 num_vs_gprs = 46;
322 num_temp_gprs = 4;
323 num_gs_gprs = 31;
324 num_es_gprs = 31;
325 num_hs_gprs = 23;
326 num_ls_gprs = 23;
327 num_ps_threads = 128;
328 num_vs_threads = 20;
329 num_gs_threads = 20;
330 num_es_threads = 20;
331 num_hs_threads = 20;
332 num_ls_threads = 20;
333 num_ps_stack_entries = 42;
334 num_vs_stack_entries = 42;
335 num_gs_stack_entries = 42;
336 num_es_stack_entries = 42;
337 num_hs_stack_entries = 42;
338 num_ls_stack_entries = 42;
339 break;
340 case CHIP_JUNIPER:
341 num_ps_gprs = 93;
342 num_vs_gprs = 46;
343 num_temp_gprs = 4;
344 num_gs_gprs = 31;
345 num_es_gprs = 31;
346 num_hs_gprs = 23;
347 num_ls_gprs = 23;
348 num_ps_threads = 128;
349 num_vs_threads = 20;
350 num_gs_threads = 20;
351 num_es_threads = 20;
352 num_hs_threads = 20;
353 num_ls_threads = 20;
354 num_ps_stack_entries = 85;
355 num_vs_stack_entries = 85;
356 num_gs_stack_entries = 85;
357 num_es_stack_entries = 85;
358 num_hs_stack_entries = 85;
359 num_ls_stack_entries = 85;
360 break;
361 case CHIP_CYPRESS:
362 case CHIP_HEMLOCK:
363 num_ps_gprs = 93;
364 num_vs_gprs = 46;
365 num_temp_gprs = 4;
366 num_gs_gprs = 31;
367 num_es_gprs = 31;
368 num_hs_gprs = 23;
369 num_ls_gprs = 23;
370 num_ps_threads = 128;
371 num_vs_threads = 20;
372 num_gs_threads = 20;
373 num_es_threads = 20;
374 num_hs_threads = 20;
375 num_ls_threads = 20;
376 num_ps_stack_entries = 85;
377 num_vs_stack_entries = 85;
378 num_gs_stack_entries = 85;
379 num_es_stack_entries = 85;
380 num_hs_stack_entries = 85;
381 num_ls_stack_entries = 85;
382 break;
383 case CHIP_PALM:
384 num_ps_gprs = 93;
385 num_vs_gprs = 46;
386 num_temp_gprs = 4;
387 num_gs_gprs = 31;
388 num_es_gprs = 31;
389 num_hs_gprs = 23;
390 num_ls_gprs = 23;
391 num_ps_threads = 96;
392 num_vs_threads = 16;
393 num_gs_threads = 16;
394 num_es_threads = 16;
395 num_hs_threads = 16;
396 num_ls_threads = 16;
397 num_ps_stack_entries = 42;
398 num_vs_stack_entries = 42;
399 num_gs_stack_entries = 42;
400 num_es_stack_entries = 42;
401 num_hs_stack_entries = 42;
402 num_ls_stack_entries = 42;
403 break;
404 case CHIP_SUMO:
405 num_ps_gprs = 93;
406 num_vs_gprs = 46;
407 num_temp_gprs = 4;
408 num_gs_gprs = 31;
409 num_es_gprs = 31;
410 num_hs_gprs = 23;
411 num_ls_gprs = 23;
412 num_ps_threads = 96;
413 num_vs_threads = 25;
414 num_gs_threads = 25;
415 num_es_threads = 25;
416 num_hs_threads = 25;
417 num_ls_threads = 25;
418 num_ps_stack_entries = 42;
419 num_vs_stack_entries = 42;
420 num_gs_stack_entries = 42;
421 num_es_stack_entries = 42;
422 num_hs_stack_entries = 42;
423 num_ls_stack_entries = 42;
424 break;
425 case CHIP_SUMO2:
426 num_ps_gprs = 93;
427 num_vs_gprs = 46;
428 num_temp_gprs = 4;
429 num_gs_gprs = 31;
430 num_es_gprs = 31;
431 num_hs_gprs = 23;
432 num_ls_gprs = 23;
433 num_ps_threads = 96;
434 num_vs_threads = 25;
435 num_gs_threads = 25;
436 num_es_threads = 25;
437 num_hs_threads = 25;
438 num_ls_threads = 25;
439 num_ps_stack_entries = 85;
440 num_vs_stack_entries = 85;
441 num_gs_stack_entries = 85;
442 num_es_stack_entries = 85;
443 num_hs_stack_entries = 85;
444 num_ls_stack_entries = 85;
445 break;
446 case CHIP_BARTS:
447 num_ps_gprs = 93;
448 num_vs_gprs = 46;
449 num_temp_gprs = 4;
450 num_gs_gprs = 31;
451 num_es_gprs = 31;
452 num_hs_gprs = 23;
453 num_ls_gprs = 23;
454 num_ps_threads = 128;
455 num_vs_threads = 20;
456 num_gs_threads = 20;
457 num_es_threads = 20;
458 num_hs_threads = 20;
459 num_ls_threads = 20;
460 num_ps_stack_entries = 85;
461 num_vs_stack_entries = 85;
462 num_gs_stack_entries = 85;
463 num_es_stack_entries = 85;
464 num_hs_stack_entries = 85;
465 num_ls_stack_entries = 85;
466 break;
467 case CHIP_TURKS:
468 num_ps_gprs = 93;
469 num_vs_gprs = 46;
470 num_temp_gprs = 4;
471 num_gs_gprs = 31;
472 num_es_gprs = 31;
473 num_hs_gprs = 23;
474 num_ls_gprs = 23;
475 num_ps_threads = 128;
476 num_vs_threads = 20;
477 num_gs_threads = 20;
478 num_es_threads = 20;
479 num_hs_threads = 20;
480 num_ls_threads = 20;
481 num_ps_stack_entries = 42;
482 num_vs_stack_entries = 42;
483 num_gs_stack_entries = 42;
484 num_es_stack_entries = 42;
485 num_hs_stack_entries = 42;
486 num_ls_stack_entries = 42;
487 break;
488 case CHIP_CAICOS:
489 num_ps_gprs = 93;
490 num_vs_gprs = 46;
491 num_temp_gprs = 4;
492 num_gs_gprs = 31;
493 num_es_gprs = 31;
494 num_hs_gprs = 23;
495 num_ls_gprs = 23;
496 num_ps_threads = 128;
497 num_vs_threads = 10;
498 num_gs_threads = 10;
499 num_es_threads = 10;
500 num_hs_threads = 10;
501 num_ls_threads = 10;
502 num_ps_stack_entries = 42;
503 num_vs_stack_entries = 42;
504 num_gs_stack_entries = 42;
505 num_es_stack_entries = 42;
506 num_hs_stack_entries = 42;
507 num_ls_stack_entries = 42;
508 break;
509 }
510
511 if ((rdev->family == CHIP_CEDAR) ||
512 (rdev->family == CHIP_PALM) ||
513 (rdev->family == CHIP_SUMO) ||
514 (rdev->family == CHIP_SUMO2) ||
515 (rdev->family == CHIP_CAICOS))
516 sq_config = 0;
517 else
518 sq_config = VC_ENABLE;
519
520 sq_config |= (EXPORT_SRC_C |
521 CS_PRIO(0) |
522 LS_PRIO(0) |
523 HS_PRIO(0) |
524 PS_PRIO(0) |
525 VS_PRIO(1) |
526 GS_PRIO(2) |
527 ES_PRIO(3));
528
529 sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(num_ps_gprs) |
530 NUM_VS_GPRS(num_vs_gprs) |
531 NUM_CLAUSE_TEMP_GPRS(num_temp_gprs));
532 sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(num_gs_gprs) |
533 NUM_ES_GPRS(num_es_gprs));
534 sq_gpr_resource_mgmt_3 = (NUM_HS_GPRS(num_hs_gprs) |
535 NUM_LS_GPRS(num_ls_gprs));
536 sq_thread_resource_mgmt = (NUM_PS_THREADS(num_ps_threads) |
537 NUM_VS_THREADS(num_vs_threads) |
538 NUM_GS_THREADS(num_gs_threads) |
539 NUM_ES_THREADS(num_es_threads));
540 sq_thread_resource_mgmt_2 = (NUM_HS_THREADS(num_hs_threads) |
541 NUM_LS_THREADS(num_ls_threads));
542 sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(num_ps_stack_entries) |
543 NUM_VS_STACK_ENTRIES(num_vs_stack_entries));
544 sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(num_gs_stack_entries) |
545 NUM_ES_STACK_ENTRIES(num_es_stack_entries));
546 sq_stack_resource_mgmt_3 = (NUM_HS_STACK_ENTRIES(num_hs_stack_entries) |
547 NUM_LS_STACK_ENTRIES(num_ls_stack_entries));
548
549 /* disable dyn gprs */
550 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
551 radeon_ring_write(ring, (SQ_DYN_GPR_CNTL_PS_FLUSH_REQ - PACKET3_SET_CONFIG_REG_START) >> 2);
552 radeon_ring_write(ring, 0);
553
554 /* setup LDS */
555 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
556 radeon_ring_write(ring, (SQ_LDS_RESOURCE_MGMT - PACKET3_SET_CONFIG_REG_START) >> 2);
557 radeon_ring_write(ring, 0x10001000);
558
559 /* SQ config */
560 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 11));
561 radeon_ring_write(ring, (SQ_CONFIG - PACKET3_SET_CONFIG_REG_START) >> 2);
562 radeon_ring_write(ring, sq_config);
563 radeon_ring_write(ring, sq_gpr_resource_mgmt_1);
564 radeon_ring_write(ring, sq_gpr_resource_mgmt_2);
565 radeon_ring_write(ring, sq_gpr_resource_mgmt_3);
566 radeon_ring_write(ring, 0);
567 radeon_ring_write(ring, 0);
568 radeon_ring_write(ring, sq_thread_resource_mgmt);
569 radeon_ring_write(ring, sq_thread_resource_mgmt_2);
570 radeon_ring_write(ring, sq_stack_resource_mgmt_1);
571 radeon_ring_write(ring, sq_stack_resource_mgmt_2);
572 radeon_ring_write(ring, sq_stack_resource_mgmt_3);
573 }
574
575 /* CONTEXT_CONTROL */
576 radeon_ring_write(ring, 0xc0012800);
577 radeon_ring_write(ring, 0x80000000);
578 radeon_ring_write(ring, 0x80000000);
579
580 /* SQ_VTX_BASE_VTX_LOC */
581 radeon_ring_write(ring, 0xc0026f00);
582 radeon_ring_write(ring, 0x00000000);
583 radeon_ring_write(ring, 0x00000000);
584 radeon_ring_write(ring, 0x00000000);
585
586 /* SET_SAMPLER */
587 radeon_ring_write(ring, 0xc0036e00);
588 radeon_ring_write(ring, 0x00000000);
589 radeon_ring_write(ring, 0x00000012);
590 radeon_ring_write(ring, 0x00000000);
591 radeon_ring_write(ring, 0x00000000);
592
593 /* set to DX10/11 mode */
594 radeon_ring_write(ring, PACKET3(PACKET3_MODE_CONTROL, 0));
595 radeon_ring_write(ring, 1);
596
597 /* emit an IB pointing at default state */
598 dwords = ALIGN(rdev->r600_blit.state_len, 0x10);
599 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.state_offset;
600 radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
601 radeon_ring_write(ring, gpu_addr & 0xFFFFFFFC);
602 radeon_ring_write(ring, upper_32_bits(gpu_addr) & 0xFF);
603 radeon_ring_write(ring, dwords);
604
605}
606
607int evergreen_blit_init(struct radeon_device *rdev)
608{
609 u32 obj_size;
610 int i, r, dwords;
611 void *ptr;
612 u32 packet2s[16];
613 int num_packet2s = 0;
614
615 rdev->r600_blit.primitives.set_render_target = set_render_target;
616 rdev->r600_blit.primitives.cp_set_surface_sync = cp_set_surface_sync;
617 rdev->r600_blit.primitives.set_shaders = set_shaders;
618 rdev->r600_blit.primitives.set_vtx_resource = set_vtx_resource;
619 rdev->r600_blit.primitives.set_tex_resource = set_tex_resource;
620 rdev->r600_blit.primitives.set_scissors = set_scissors;
621 rdev->r600_blit.primitives.draw_auto = draw_auto;
622 rdev->r600_blit.primitives.set_default_state = set_default_state;
623
624 rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
625 rdev->r600_blit.ring_size_common += 55; /* shaders + def state */
626 rdev->r600_blit.ring_size_common += 16; /* fence emit for VB IB */
627 rdev->r600_blit.ring_size_common += 5; /* done copy */
628 rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */
629
630 rdev->r600_blit.ring_size_per_loop = 74;
631 if (rdev->family >= CHIP_CAYMAN)
632 rdev->r600_blit.ring_size_per_loop += 9; /* additional DWs for surface sync */
633
634 rdev->r600_blit.max_dim = 16384;
635
636 rdev->r600_blit.state_offset = 0;
637
638 if (rdev->family < CHIP_CAYMAN)
639 rdev->r600_blit.state_len = evergreen_default_size;
640 else
641 rdev->r600_blit.state_len = cayman_default_size;
642
643 dwords = rdev->r600_blit.state_len;
644 while (dwords & 0xf) {
645 packet2s[num_packet2s++] = cpu_to_le32(PACKET2(0));
646 dwords++;
647 }
648
649 obj_size = dwords * 4;
650 obj_size = ALIGN(obj_size, 256);
651
652 rdev->r600_blit.vs_offset = obj_size;
653 if (rdev->family < CHIP_CAYMAN)
654 obj_size += evergreen_vs_size * 4;
655 else
656 obj_size += cayman_vs_size * 4;
657 obj_size = ALIGN(obj_size, 256);
658
659 rdev->r600_blit.ps_offset = obj_size;
660 if (rdev->family < CHIP_CAYMAN)
661 obj_size += evergreen_ps_size * 4;
662 else
663 obj_size += cayman_ps_size * 4;
664 obj_size = ALIGN(obj_size, 256);
665
666 /* pin copy shader into vram if not already initialized */
667 if (!rdev->r600_blit.shader_obj) {
668 r = radeon_bo_create(rdev, obj_size, PAGE_SIZE, true,
669 RADEON_GEM_DOMAIN_VRAM,
670 NULL, &rdev->r600_blit.shader_obj);
671 if (r) {
672 DRM_ERROR("evergreen failed to allocate shader\n");
673 return r;
674 }
675
676 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
677 if (unlikely(r != 0))
678 return r;
679 r = radeon_bo_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
680 &rdev->r600_blit.shader_gpu_addr);
681 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
682 if (r) {
683 dev_err(rdev->dev, "(%d) pin blit object failed\n", r);
684 return r;
685 }
686 }
687
688 DRM_DEBUG("evergreen blit allocated bo %08x vs %08x ps %08x\n",
689 obj_size,
690 rdev->r600_blit.vs_offset, rdev->r600_blit.ps_offset);
691
692 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
693 if (unlikely(r != 0))
694 return r;
695 r = radeon_bo_kmap(rdev->r600_blit.shader_obj, &ptr);
696 if (r) {
697 DRM_ERROR("failed to map blit object %d\n", r);
698 return r;
699 }
700
701 if (rdev->family < CHIP_CAYMAN) {
702 memcpy_toio(ptr + rdev->r600_blit.state_offset,
703 evergreen_default_state, rdev->r600_blit.state_len * 4);
704
705 if (num_packet2s)
706 memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4),
707 packet2s, num_packet2s * 4);
708 for (i = 0; i < evergreen_vs_size; i++)
709 *(u32 *)((unsigned long)ptr + rdev->r600_blit.vs_offset + i * 4) = cpu_to_le32(evergreen_vs[i]);
710 for (i = 0; i < evergreen_ps_size; i++)
711 *(u32 *)((unsigned long)ptr + rdev->r600_blit.ps_offset + i * 4) = cpu_to_le32(evergreen_ps[i]);
712 } else {
713 memcpy_toio(ptr + rdev->r600_blit.state_offset,
714 cayman_default_state, rdev->r600_blit.state_len * 4);
715
716 if (num_packet2s)
717 memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4),
718 packet2s, num_packet2s * 4);
719 for (i = 0; i < cayman_vs_size; i++)
720 *(u32 *)((unsigned long)ptr + rdev->r600_blit.vs_offset + i * 4) = cpu_to_le32(cayman_vs[i]);
721 for (i = 0; i < cayman_ps_size; i++)
722 *(u32 *)((unsigned long)ptr + rdev->r600_blit.ps_offset + i * 4) = cpu_to_le32(cayman_ps[i]);
723 }
724 radeon_bo_kunmap(rdev->r600_blit.shader_obj);
725 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
726
727 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
728 return 0;
729}
diff --git a/drivers/gpu/drm/radeon/evergreen_blit_shaders.c b/drivers/gpu/drm/radeon/evergreen_blit_shaders.c
index f85c0af115b5..d43383470cdf 100644
--- a/drivers/gpu/drm/radeon/evergreen_blit_shaders.c
+++ b/drivers/gpu/drm/radeon/evergreen_blit_shaders.c
@@ -300,58 +300,4 @@ const u32 evergreen_default_state[] =
300 0x00000010, /* */ 300 0x00000010, /* */
301}; 301};
302 302
303const u32 evergreen_vs[] =
304{
305 0x00000004,
306 0x80800400,
307 0x0000a03c,
308 0x95000688,
309 0x00004000,
310 0x15200688,
311 0x00000000,
312 0x00000000,
313 0x3c000000,
314 0x67961001,
315#ifdef __BIG_ENDIAN
316 0x000a0000,
317#else
318 0x00080000,
319#endif
320 0x00000000,
321 0x1c000000,
322 0x67961000,
323#ifdef __BIG_ENDIAN
324 0x00020008,
325#else
326 0x00000008,
327#endif
328 0x00000000,
329};
330
331const u32 evergreen_ps[] =
332{
333 0x00000003,
334 0xa00c0000,
335 0x00000008,
336 0x80400000,
337 0x00000000,
338 0x95200688,
339 0x00380400,
340 0x00146b10,
341 0x00380000,
342 0x20146b10,
343 0x00380400,
344 0x40146b00,
345 0x80380000,
346 0x60146b00,
347 0x00000000,
348 0x00000000,
349 0x00000010,
350 0x000d1000,
351 0xb0800000,
352 0x00000000,
353};
354
355const u32 evergreen_ps_size = ARRAY_SIZE(evergreen_ps);
356const u32 evergreen_vs_size = ARRAY_SIZE(evergreen_vs);
357const u32 evergreen_default_size = ARRAY_SIZE(evergreen_default_state); 303const u32 evergreen_default_size = ARRAY_SIZE(evergreen_default_state);
diff --git a/drivers/gpu/drm/radeon/evergreen_dma.c b/drivers/gpu/drm/radeon/evergreen_dma.c
new file mode 100644
index 000000000000..6a0656d00ed0
--- /dev/null
+++ b/drivers/gpu/drm/radeon/evergreen_dma.c
@@ -0,0 +1,190 @@
1/*
2 * Copyright 2010 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: Alex Deucher
23 */
24#include <drm/drmP.h>
25#include "radeon.h"
26#include "radeon_asic.h"
27#include "evergreend.h"
28
29u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev);
30
31/**
32 * evergreen_dma_fence_ring_emit - emit a fence on the DMA ring
33 *
34 * @rdev: radeon_device pointer
35 * @fence: radeon fence object
36 *
37 * Add a DMA fence packet to the ring to write
38 * the fence seq number and DMA trap packet to generate
39 * an interrupt if needed (evergreen-SI).
40 */
41void evergreen_dma_fence_ring_emit(struct radeon_device *rdev,
42 struct radeon_fence *fence)
43{
44 struct radeon_ring *ring = &rdev->ring[fence->ring];
45 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
46 /* write the fence */
47 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_FENCE, 0, 0));
48 radeon_ring_write(ring, addr & 0xfffffffc);
49 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff));
50 radeon_ring_write(ring, fence->seq);
51 /* generate an interrupt */
52 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0));
53 /* flush HDP */
54 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0));
55 radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2));
56 radeon_ring_write(ring, 1);
57}
58
59/**
60 * evergreen_dma_ring_ib_execute - schedule an IB on the DMA engine
61 *
62 * @rdev: radeon_device pointer
63 * @ib: IB object to schedule
64 *
65 * Schedule an IB in the DMA ring (evergreen).
66 */
67void evergreen_dma_ring_ib_execute(struct radeon_device *rdev,
68 struct radeon_ib *ib)
69{
70 struct radeon_ring *ring = &rdev->ring[ib->ring];
71
72 if (rdev->wb.enabled) {
73 u32 next_rptr = ring->wptr + 4;
74 while ((next_rptr & 7) != 5)
75 next_rptr++;
76 next_rptr += 3;
77 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 1));
78 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
79 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xff);
80 radeon_ring_write(ring, next_rptr);
81 }
82
83 /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring.
84 * Pad as necessary with NOPs.
85 */
86 while ((ring->wptr & 7) != 5)
87 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0));
88 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_INDIRECT_BUFFER, 0, 0));
89 radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0));
90 radeon_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF));
91
92}
93
94/**
95 * evergreen_copy_dma - copy pages using the DMA engine
96 *
97 * @rdev: radeon_device pointer
98 * @src_offset: src GPU address
99 * @dst_offset: dst GPU address
100 * @num_gpu_pages: number of GPU pages to xfer
101 * @fence: radeon fence object
102 *
103 * Copy GPU paging using the DMA engine (evergreen-cayman).
104 * Used by the radeon ttm implementation to move pages if
105 * registered as the asic copy callback.
106 */
107int evergreen_copy_dma(struct radeon_device *rdev,
108 uint64_t src_offset, uint64_t dst_offset,
109 unsigned num_gpu_pages,
110 struct radeon_fence **fence)
111{
112 struct radeon_semaphore *sem = NULL;
113 int ring_index = rdev->asic->copy.dma_ring_index;
114 struct radeon_ring *ring = &rdev->ring[ring_index];
115 u32 size_in_dw, cur_size_in_dw;
116 int i, num_loops;
117 int r = 0;
118
119 r = radeon_semaphore_create(rdev, &sem);
120 if (r) {
121 DRM_ERROR("radeon: moving bo (%d).\n", r);
122 return r;
123 }
124
125 size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
126 num_loops = DIV_ROUND_UP(size_in_dw, 0xfffff);
127 r = radeon_ring_lock(rdev, ring, num_loops * 5 + 11);
128 if (r) {
129 DRM_ERROR("radeon: moving bo (%d).\n", r);
130 radeon_semaphore_free(rdev, &sem, NULL);
131 return r;
132 }
133
134 if (radeon_fence_need_sync(*fence, ring->idx)) {
135 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
136 ring->idx);
137 radeon_fence_note_sync(*fence, ring->idx);
138 } else {
139 radeon_semaphore_free(rdev, &sem, NULL);
140 }
141
142 for (i = 0; i < num_loops; i++) {
143 cur_size_in_dw = size_in_dw;
144 if (cur_size_in_dw > 0xFFFFF)
145 cur_size_in_dw = 0xFFFFF;
146 size_in_dw -= cur_size_in_dw;
147 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, cur_size_in_dw));
148 radeon_ring_write(ring, dst_offset & 0xfffffffc);
149 radeon_ring_write(ring, src_offset & 0xfffffffc);
150 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
151 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
152 src_offset += cur_size_in_dw * 4;
153 dst_offset += cur_size_in_dw * 4;
154 }
155
156 r = radeon_fence_emit(rdev, fence, ring->idx);
157 if (r) {
158 radeon_ring_unlock_undo(rdev, ring);
159 return r;
160 }
161
162 radeon_ring_unlock_commit(rdev, ring);
163 radeon_semaphore_free(rdev, &sem, *fence);
164
165 return r;
166}
167
168/**
169 * evergreen_dma_is_lockup - Check if the DMA engine is locked up
170 *
171 * @rdev: radeon_device pointer
172 * @ring: radeon_ring structure holding ring information
173 *
174 * Check if the async DMA engine is locked up.
175 * Returns true if the engine appears to be locked up, false if not.
176 */
177bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
178{
179 u32 reset_mask = evergreen_gpu_check_soft_reset(rdev);
180
181 if (!(reset_mask & RADEON_RESET_DMA)) {
182 radeon_ring_lockup_update(ring);
183 return false;
184 }
185 /* force ring activities */
186 radeon_ring_force_activity(rdev, ring);
187 return radeon_ring_test_lockup(rdev, ring);
188}
189
190
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c
index b0d3fb341417..f71ce390aebe 100644
--- a/drivers/gpu/drm/radeon/evergreen_hdmi.c
+++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c
@@ -32,6 +32,10 @@
32#include "evergreend.h" 32#include "evergreend.h"
33#include "atom.h" 33#include "atom.h"
34 34
35extern void dce6_afmt_write_speaker_allocation(struct drm_encoder *encoder);
36extern void dce6_afmt_write_sad_regs(struct drm_encoder *encoder);
37extern void dce6_afmt_select_pin(struct drm_encoder *encoder);
38
35/* 39/*
36 * update the N and CTS parameters for a given pixel clock rate 40 * update the N and CTS parameters for a given pixel clock rate
37 */ 41 */
@@ -54,6 +58,45 @@ static void evergreen_hdmi_update_ACR(struct drm_encoder *encoder, uint32_t cloc
54 WREG32(HDMI_ACR_48_1 + offset, acr.n_48khz); 58 WREG32(HDMI_ACR_48_1 + offset, acr.n_48khz);
55} 59}
56 60
61static void dce4_afmt_write_speaker_allocation(struct drm_encoder *encoder)
62{
63 struct radeon_device *rdev = encoder->dev->dev_private;
64 struct drm_connector *connector;
65 struct radeon_connector *radeon_connector = NULL;
66 u32 tmp;
67 u8 *sadb;
68 int sad_count;
69
70 list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
71 if (connector->encoder == encoder)
72 radeon_connector = to_radeon_connector(connector);
73 }
74
75 if (!radeon_connector) {
76 DRM_ERROR("Couldn't find encoder's connector\n");
77 return;
78 }
79
80 sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb);
81 if (sad_count < 0) {
82 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
83 return;
84 }
85
86 /* program the speaker allocation */
87 tmp = RREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER);
88 tmp &= ~(DP_CONNECTION | SPEAKER_ALLOCATION_MASK);
89 /* set HDMI mode */
90 tmp |= HDMI_CONNECTION;
91 if (sad_count)
92 tmp |= SPEAKER_ALLOCATION(sadb[0]);
93 else
94 tmp |= SPEAKER_ALLOCATION(5); /* stereo */
95 WREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER, tmp);
96
97 kfree(sadb);
98}
99
57static void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder) 100static void evergreen_hdmi_write_sad_regs(struct drm_encoder *encoder)
58{ 101{
59 struct radeon_device *rdev = encoder->dev->dev_private; 102 struct radeon_device *rdev = encoder->dev->dev_private;
@@ -148,18 +191,44 @@ static void evergreen_audio_set_dto(struct drm_encoder *encoder, u32 clock)
148 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 191 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
149 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 192 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
150 u32 base_rate = 24000; 193 u32 base_rate = 24000;
194 u32 max_ratio = clock / base_rate;
195 u32 dto_phase;
196 u32 dto_modulo = clock;
197 u32 wallclock_ratio;
198 u32 dto_cntl;
151 199
152 if (!dig || !dig->afmt) 200 if (!dig || !dig->afmt)
153 return; 201 return;
154 202
203 if (ASIC_IS_DCE6(rdev)) {
204 dto_phase = 24 * 1000;
205 } else {
206 if (max_ratio >= 8) {
207 dto_phase = 192 * 1000;
208 wallclock_ratio = 3;
209 } else if (max_ratio >= 4) {
210 dto_phase = 96 * 1000;
211 wallclock_ratio = 2;
212 } else if (max_ratio >= 2) {
213 dto_phase = 48 * 1000;
214 wallclock_ratio = 1;
215 } else {
216 dto_phase = 24 * 1000;
217 wallclock_ratio = 0;
218 }
219 dto_cntl = RREG32(DCCG_AUDIO_DTO0_CNTL) & ~DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK;
220 dto_cntl |= DCCG_AUDIO_DTO_WALLCLOCK_RATIO(wallclock_ratio);
221 WREG32(DCCG_AUDIO_DTO0_CNTL, dto_cntl);
222 }
223
155 /* XXX two dtos; generally use dto0 for hdmi */ 224 /* XXX two dtos; generally use dto0 for hdmi */
156 /* Express [24MHz / target pixel clock] as an exact rational 225 /* Express [24MHz / target pixel clock] as an exact rational
157 * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE 226 * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE
158 * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator 227 * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator
159 */ 228 */
160 WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100);
161 WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100);
162 WREG32(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL(radeon_crtc->crtc_id)); 229 WREG32(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL(radeon_crtc->crtc_id));
230 WREG32(DCCG_AUDIO_DTO0_PHASE, dto_phase);
231 WREG32(DCCG_AUDIO_DTO0_MODULE, dto_modulo);
163} 232}
164 233
165 234
@@ -238,13 +307,23 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
238 AFMT_60958_CS_CHANNEL_NUMBER_6(7) | 307 AFMT_60958_CS_CHANNEL_NUMBER_6(7) |
239 AFMT_60958_CS_CHANNEL_NUMBER_7(8)); 308 AFMT_60958_CS_CHANNEL_NUMBER_7(8));
240 309
241 /* fglrx sets 0x0001005f | (x & 0x00fc0000) in 0x5f78 here */ 310 if (ASIC_IS_DCE6(rdev)) {
311 dce6_afmt_write_speaker_allocation(encoder);
312 } else {
313 dce4_afmt_write_speaker_allocation(encoder);
314 }
242 315
243 WREG32(AFMT_AUDIO_PACKET_CONTROL2 + offset, 316 WREG32(AFMT_AUDIO_PACKET_CONTROL2 + offset,
244 AFMT_AUDIO_CHANNEL_ENABLE(0xff)); 317 AFMT_AUDIO_CHANNEL_ENABLE(0xff));
245 318
246 /* fglrx sets 0x40 in 0x5f80 here */ 319 /* fglrx sets 0x40 in 0x5f80 here */
247 evergreen_hdmi_write_sad_regs(encoder); 320
321 if (ASIC_IS_DCE6(rdev)) {
322 dce6_afmt_select_pin(encoder);
323 dce6_afmt_write_sad_regs(encoder);
324 } else {
325 evergreen_hdmi_write_sad_regs(encoder);
326 }
248 327
249 err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode); 328 err = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
250 if (err < 0) { 329 if (err < 0) {
@@ -280,6 +359,8 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode
280 359
281void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) 360void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable)
282{ 361{
362 struct drm_device *dev = encoder->dev;
363 struct radeon_device *rdev = dev->dev_private;
283 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 364 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
284 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 365 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
285 366
@@ -292,6 +373,15 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable)
292 if (!enable && !dig->afmt->enabled) 373 if (!enable && !dig->afmt->enabled)
293 return; 374 return;
294 375
376 if (enable) {
377 if (ASIC_IS_DCE6(rdev))
378 dig->afmt->pin = dce6_audio_get_pin(rdev);
379 else
380 dig->afmt->pin = r600_audio_get_pin(rdev);
381 } else {
382 dig->afmt->pin = NULL;
383 }
384
295 dig->afmt->enabled = enable; 385 dig->afmt->enabled = enable;
296 386
297 DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n", 387 DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n",
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h
index a7baf67aef6c..8768fd6a1e27 100644
--- a/drivers/gpu/drm/radeon/evergreend.h
+++ b/drivers/gpu/drm/radeon/evergreend.h
@@ -497,6 +497,9 @@
497#define DCCG_AUDIO_DTO0_MODULE 0x05b4 497#define DCCG_AUDIO_DTO0_MODULE 0x05b4
498#define DCCG_AUDIO_DTO0_LOAD 0x05b8 498#define DCCG_AUDIO_DTO0_LOAD 0x05b8
499#define DCCG_AUDIO_DTO0_CNTL 0x05bc 499#define DCCG_AUDIO_DTO0_CNTL 0x05bc
500# define DCCG_AUDIO_DTO_WALLCLOCK_RATIO(x) (((x) & 7) << 0)
501# define DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK 7
502# define DCCG_AUDIO_DTO_WALLCLOCK_RATIO_SHIFT 0
500 503
501#define DCCG_AUDIO_DTO1_PHASE 0x05c0 504#define DCCG_AUDIO_DTO1_PHASE 0x05c0
502#define DCCG_AUDIO_DTO1_MODULE 0x05c4 505#define DCCG_AUDIO_DTO1_MODULE 0x05c4
@@ -711,6 +714,13 @@
711#define AFMT_GENERIC0_7 0x7138 714#define AFMT_GENERIC0_7 0x7138
712 715
713/* DCE4/5 ELD audio interface */ 716/* DCE4/5 ELD audio interface */
717#define AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER 0x5f78
718#define SPEAKER_ALLOCATION(x) (((x) & 0x7f) << 0)
719#define SPEAKER_ALLOCATION_MASK (0x7f << 0)
720#define SPEAKER_ALLOCATION_SHIFT 0
721#define HDMI_CONNECTION (1 << 16)
722#define DP_CONNECTION (1 << 17)
723
714#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR0 0x5f84 /* LPCM */ 724#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR0 0x5f84 /* LPCM */
715#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR1 0x5f88 /* AC3 */ 725#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR1 0x5f88 /* AC3 */
716#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR2 0x5f8c /* MPEG1 */ 726#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR2 0x5f8c /* MPEG1 */
@@ -1150,6 +1160,10 @@
1150# define LATENCY_LOW_WATERMARK(x) ((x) << 0) 1160# define LATENCY_LOW_WATERMARK(x) ((x) << 0)
1151# define LATENCY_HIGH_WATERMARK(x) ((x) << 16) 1161# define LATENCY_HIGH_WATERMARK(x) ((x) << 16)
1152 1162
1163#define PIPE0_DMIF_BUFFER_CONTROL 0x0ca0
1164# define DMIF_BUFFERS_ALLOCATED(x) ((x) << 0)
1165# define DMIF_BUFFERS_ALLOCATED_COMPLETED (1 << 4)
1166
1153#define IH_RB_CNTL 0x3e00 1167#define IH_RB_CNTL 0x3e00
1154# define IH_RB_ENABLE (1 << 0) 1168# define IH_RB_ENABLE (1 << 0)
1155# define IH_IB_SIZE(x) ((x) << 1) /* log2 */ 1169# define IH_IB_SIZE(x) ((x) << 1) /* log2 */
diff --git a/drivers/gpu/drm/radeon/kv_dpm.c b/drivers/gpu/drm/radeon/kv_dpm.c
new file mode 100644
index 000000000000..ecd60809db4e
--- /dev/null
+++ b/drivers/gpu/drm/radeon/kv_dpm.c
@@ -0,0 +1,2645 @@
1/*
2 * Copyright 2013 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#include "drmP.h"
25#include "radeon.h"
26#include "cikd.h"
27#include "r600_dpm.h"
28#include "kv_dpm.h"
29#include "radeon_asic.h"
30#include <linux/seq_file.h>
31
32#define KV_MAX_DEEPSLEEP_DIVIDER_ID 5
33#define KV_MINIMUM_ENGINE_CLOCK 800
34#define SMC_RAM_END 0x40000
35
36static void kv_init_graphics_levels(struct radeon_device *rdev);
37static int kv_calculate_ds_divider(struct radeon_device *rdev);
38static int kv_calculate_nbps_level_settings(struct radeon_device *rdev);
39static int kv_calculate_dpm_settings(struct radeon_device *rdev);
40static void kv_enable_new_levels(struct radeon_device *rdev);
41static void kv_program_nbps_index_settings(struct radeon_device *rdev,
42 struct radeon_ps *new_rps);
43static int kv_set_enabled_levels(struct radeon_device *rdev);
44static int kv_force_dpm_highest(struct radeon_device *rdev);
45static int kv_force_dpm_lowest(struct radeon_device *rdev);
46static void kv_apply_state_adjust_rules(struct radeon_device *rdev,
47 struct radeon_ps *new_rps,
48 struct radeon_ps *old_rps);
49static int kv_set_thermal_temperature_range(struct radeon_device *rdev,
50 int min_temp, int max_temp);
51static int kv_init_fps_limits(struct radeon_device *rdev);
52
53void kv_dpm_powergate_uvd(struct radeon_device *rdev, bool gate);
54static void kv_dpm_powergate_vce(struct radeon_device *rdev, bool gate);
55static void kv_dpm_powergate_samu(struct radeon_device *rdev, bool gate);
56static void kv_dpm_powergate_acp(struct radeon_device *rdev, bool gate);
57
58extern void cik_enter_rlc_safe_mode(struct radeon_device *rdev);
59extern void cik_exit_rlc_safe_mode(struct radeon_device *rdev);
60extern void cik_update_cg(struct radeon_device *rdev,
61 u32 block, bool enable);
62
63static const struct kv_lcac_config_values sx_local_cac_cfg_kv[] =
64{
65 { 0, 4, 1 },
66 { 1, 4, 1 },
67 { 2, 5, 1 },
68 { 3, 4, 2 },
69 { 4, 1, 1 },
70 { 5, 5, 2 },
71 { 6, 6, 1 },
72 { 7, 9, 2 },
73 { 0xffffffff }
74};
75
76static const struct kv_lcac_config_values mc0_local_cac_cfg_kv[] =
77{
78 { 0, 4, 1 },
79 { 0xffffffff }
80};
81
82static const struct kv_lcac_config_values mc1_local_cac_cfg_kv[] =
83{
84 { 0, 4, 1 },
85 { 0xffffffff }
86};
87
88static const struct kv_lcac_config_values mc2_local_cac_cfg_kv[] =
89{
90 { 0, 4, 1 },
91 { 0xffffffff }
92};
93
94static const struct kv_lcac_config_values mc3_local_cac_cfg_kv[] =
95{
96 { 0, 4, 1 },
97 { 0xffffffff }
98};
99
100static const struct kv_lcac_config_values cpl_local_cac_cfg_kv[] =
101{
102 { 0, 4, 1 },
103 { 1, 4, 1 },
104 { 2, 5, 1 },
105 { 3, 4, 1 },
106 { 4, 1, 1 },
107 { 5, 5, 1 },
108 { 6, 6, 1 },
109 { 7, 9, 1 },
110 { 8, 4, 1 },
111 { 9, 2, 1 },
112 { 10, 3, 1 },
113 { 11, 6, 1 },
114 { 12, 8, 2 },
115 { 13, 1, 1 },
116 { 14, 2, 1 },
117 { 15, 3, 1 },
118 { 16, 1, 1 },
119 { 17, 4, 1 },
120 { 18, 3, 1 },
121 { 19, 1, 1 },
122 { 20, 8, 1 },
123 { 21, 5, 1 },
124 { 22, 1, 1 },
125 { 23, 1, 1 },
126 { 24, 4, 1 },
127 { 27, 6, 1 },
128 { 28, 1, 1 },
129 { 0xffffffff }
130};
131
132static const struct kv_lcac_config_reg sx0_cac_config_reg[] =
133{
134 { 0xc0400d00, 0x003e0000, 17, 0x3fc00000, 22, 0x0001fffe, 1, 0x00000001, 0 }
135};
136
137static const struct kv_lcac_config_reg mc0_cac_config_reg[] =
138{
139 { 0xc0400d30, 0x003e0000, 17, 0x3fc00000, 22, 0x0001fffe, 1, 0x00000001, 0 }
140};
141
142static const struct kv_lcac_config_reg mc1_cac_config_reg[] =
143{
144 { 0xc0400d3c, 0x003e0000, 17, 0x3fc00000, 22, 0x0001fffe, 1, 0x00000001, 0 }
145};
146
147static const struct kv_lcac_config_reg mc2_cac_config_reg[] =
148{
149 { 0xc0400d48, 0x003e0000, 17, 0x3fc00000, 22, 0x0001fffe, 1, 0x00000001, 0 }
150};
151
152static const struct kv_lcac_config_reg mc3_cac_config_reg[] =
153{
154 { 0xc0400d54, 0x003e0000, 17, 0x3fc00000, 22, 0x0001fffe, 1, 0x00000001, 0 }
155};
156
157static const struct kv_lcac_config_reg cpl_cac_config_reg[] =
158{
159 { 0xc0400d80, 0x003e0000, 17, 0x3fc00000, 22, 0x0001fffe, 1, 0x00000001, 0 }
160};
161
162static const struct kv_pt_config_reg didt_config_kv[] =
163{
164 { 0x10, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
165 { 0x10, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
166 { 0x10, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
167 { 0x10, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
168 { 0x11, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
169 { 0x11, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
170 { 0x11, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
171 { 0x11, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
172 { 0x12, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
173 { 0x12, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
174 { 0x12, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
175 { 0x12, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
176 { 0x2, 0x00003fff, 0, 0x4, KV_CONFIGREG_DIDT_IND },
177 { 0x2, 0x03ff0000, 16, 0x80, KV_CONFIGREG_DIDT_IND },
178 { 0x2, 0x78000000, 27, 0x3, KV_CONFIGREG_DIDT_IND },
179 { 0x1, 0x0000ffff, 0, 0x3FFF, KV_CONFIGREG_DIDT_IND },
180 { 0x1, 0xffff0000, 16, 0x3FFF, KV_CONFIGREG_DIDT_IND },
181 { 0x0, 0x00000001, 0, 0x0, KV_CONFIGREG_DIDT_IND },
182 { 0x30, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
183 { 0x30, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
184 { 0x30, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
185 { 0x30, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
186 { 0x31, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
187 { 0x31, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
188 { 0x31, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
189 { 0x31, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
190 { 0x32, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
191 { 0x32, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
192 { 0x32, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
193 { 0x32, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
194 { 0x22, 0x00003fff, 0, 0x4, KV_CONFIGREG_DIDT_IND },
195 { 0x22, 0x03ff0000, 16, 0x80, KV_CONFIGREG_DIDT_IND },
196 { 0x22, 0x78000000, 27, 0x3, KV_CONFIGREG_DIDT_IND },
197 { 0x21, 0x0000ffff, 0, 0x3FFF, KV_CONFIGREG_DIDT_IND },
198 { 0x21, 0xffff0000, 16, 0x3FFF, KV_CONFIGREG_DIDT_IND },
199 { 0x20, 0x00000001, 0, 0x0, KV_CONFIGREG_DIDT_IND },
200 { 0x50, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
201 { 0x50, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
202 { 0x50, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
203 { 0x50, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
204 { 0x51, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
205 { 0x51, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
206 { 0x51, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
207 { 0x51, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
208 { 0x52, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
209 { 0x52, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
210 { 0x52, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
211 { 0x52, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
212 { 0x42, 0x00003fff, 0, 0x4, KV_CONFIGREG_DIDT_IND },
213 { 0x42, 0x03ff0000, 16, 0x80, KV_CONFIGREG_DIDT_IND },
214 { 0x42, 0x78000000, 27, 0x3, KV_CONFIGREG_DIDT_IND },
215 { 0x41, 0x0000ffff, 0, 0x3FFF, KV_CONFIGREG_DIDT_IND },
216 { 0x41, 0xffff0000, 16, 0x3FFF, KV_CONFIGREG_DIDT_IND },
217 { 0x40, 0x00000001, 0, 0x0, KV_CONFIGREG_DIDT_IND },
218 { 0x70, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
219 { 0x70, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
220 { 0x70, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
221 { 0x70, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
222 { 0x71, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
223 { 0x71, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
224 { 0x71, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
225 { 0x71, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
226 { 0x72, 0x000000ff, 0, 0x0, KV_CONFIGREG_DIDT_IND },
227 { 0x72, 0x0000ff00, 8, 0x0, KV_CONFIGREG_DIDT_IND },
228 { 0x72, 0x00ff0000, 16, 0x0, KV_CONFIGREG_DIDT_IND },
229 { 0x72, 0xff000000, 24, 0x0, KV_CONFIGREG_DIDT_IND },
230 { 0x62, 0x00003fff, 0, 0x4, KV_CONFIGREG_DIDT_IND },
231 { 0x62, 0x03ff0000, 16, 0x80, KV_CONFIGREG_DIDT_IND },
232 { 0x62, 0x78000000, 27, 0x3, KV_CONFIGREG_DIDT_IND },
233 { 0x61, 0x0000ffff, 0, 0x3FFF, KV_CONFIGREG_DIDT_IND },
234 { 0x61, 0xffff0000, 16, 0x3FFF, KV_CONFIGREG_DIDT_IND },
235 { 0x60, 0x00000001, 0, 0x0, KV_CONFIGREG_DIDT_IND },
236 { 0xFFFFFFFF }
237};
238
239static struct kv_ps *kv_get_ps(struct radeon_ps *rps)
240{
241 struct kv_ps *ps = rps->ps_priv;
242
243 return ps;
244}
245
246static struct kv_power_info *kv_get_pi(struct radeon_device *rdev)
247{
248 struct kv_power_info *pi = rdev->pm.dpm.priv;
249
250 return pi;
251}
252
253#if 0
254static void kv_program_local_cac_table(struct radeon_device *rdev,
255 const struct kv_lcac_config_values *local_cac_table,
256 const struct kv_lcac_config_reg *local_cac_reg)
257{
258 u32 i, count, data;
259 const struct kv_lcac_config_values *values = local_cac_table;
260
261 while (values->block_id != 0xffffffff) {
262 count = values->signal_id;
263 for (i = 0; i < count; i++) {
264 data = ((values->block_id << local_cac_reg->block_shift) &
265 local_cac_reg->block_mask);
266 data |= ((i << local_cac_reg->signal_shift) &
267 local_cac_reg->signal_mask);
268 data |= ((values->t << local_cac_reg->t_shift) &
269 local_cac_reg->t_mask);
270 data |= ((1 << local_cac_reg->enable_shift) &
271 local_cac_reg->enable_mask);
272 WREG32_SMC(local_cac_reg->cntl, data);
273 }
274 values++;
275 }
276}
277#endif
278
279static int kv_program_pt_config_registers(struct radeon_device *rdev,
280 const struct kv_pt_config_reg *cac_config_regs)
281{
282 const struct kv_pt_config_reg *config_regs = cac_config_regs;
283 u32 data;
284 u32 cache = 0;
285
286 if (config_regs == NULL)
287 return -EINVAL;
288
289 while (config_regs->offset != 0xFFFFFFFF) {
290 if (config_regs->type == KV_CONFIGREG_CACHE) {
291 cache |= ((config_regs->value << config_regs->shift) & config_regs->mask);
292 } else {
293 switch (config_regs->type) {
294 case KV_CONFIGREG_SMC_IND:
295 data = RREG32_SMC(config_regs->offset);
296 break;
297 case KV_CONFIGREG_DIDT_IND:
298 data = RREG32_DIDT(config_regs->offset);
299 break;
300 default:
301 data = RREG32(config_regs->offset << 2);
302 break;
303 }
304
305 data &= ~config_regs->mask;
306 data |= ((config_regs->value << config_regs->shift) & config_regs->mask);
307 data |= cache;
308 cache = 0;
309
310 switch (config_regs->type) {
311 case KV_CONFIGREG_SMC_IND:
312 WREG32_SMC(config_regs->offset, data);
313 break;
314 case KV_CONFIGREG_DIDT_IND:
315 WREG32_DIDT(config_regs->offset, data);
316 break;
317 default:
318 WREG32(config_regs->offset << 2, data);
319 break;
320 }
321 }
322 config_regs++;
323 }
324
325 return 0;
326}
327
328static void kv_do_enable_didt(struct radeon_device *rdev, bool enable)
329{
330 struct kv_power_info *pi = kv_get_pi(rdev);
331 u32 data;
332
333 if (pi->caps_sq_ramping) {
334 data = RREG32_DIDT(DIDT_SQ_CTRL0);
335 if (enable)
336 data |= DIDT_CTRL_EN;
337 else
338 data &= ~DIDT_CTRL_EN;
339 WREG32_DIDT(DIDT_SQ_CTRL0, data);
340 }
341
342 if (pi->caps_db_ramping) {
343 data = RREG32_DIDT(DIDT_DB_CTRL0);
344 if (enable)
345 data |= DIDT_CTRL_EN;
346 else
347 data &= ~DIDT_CTRL_EN;
348 WREG32_DIDT(DIDT_DB_CTRL0, data);
349 }
350
351 if (pi->caps_td_ramping) {
352 data = RREG32_DIDT(DIDT_TD_CTRL0);
353 if (enable)
354 data |= DIDT_CTRL_EN;
355 else
356 data &= ~DIDT_CTRL_EN;
357 WREG32_DIDT(DIDT_TD_CTRL0, data);
358 }
359
360 if (pi->caps_tcp_ramping) {
361 data = RREG32_DIDT(DIDT_TCP_CTRL0);
362 if (enable)
363 data |= DIDT_CTRL_EN;
364 else
365 data &= ~DIDT_CTRL_EN;
366 WREG32_DIDT(DIDT_TCP_CTRL0, data);
367 }
368}
369
370static int kv_enable_didt(struct radeon_device *rdev, bool enable)
371{
372 struct kv_power_info *pi = kv_get_pi(rdev);
373 int ret;
374
375 if (pi->caps_sq_ramping ||
376 pi->caps_db_ramping ||
377 pi->caps_td_ramping ||
378 pi->caps_tcp_ramping) {
379 cik_enter_rlc_safe_mode(rdev);
380
381 if (enable) {
382 ret = kv_program_pt_config_registers(rdev, didt_config_kv);
383 if (ret) {
384 cik_exit_rlc_safe_mode(rdev);
385 return ret;
386 }
387 }
388
389 kv_do_enable_didt(rdev, enable);
390
391 cik_exit_rlc_safe_mode(rdev);
392 }
393
394 return 0;
395}
396
397#if 0
398static void kv_initialize_hardware_cac_manager(struct radeon_device *rdev)
399{
400 struct kv_power_info *pi = kv_get_pi(rdev);
401
402 if (pi->caps_cac) {
403 WREG32_SMC(LCAC_SX0_OVR_SEL, 0);
404 WREG32_SMC(LCAC_SX0_OVR_VAL, 0);
405 kv_program_local_cac_table(rdev, sx_local_cac_cfg_kv, sx0_cac_config_reg);
406
407 WREG32_SMC(LCAC_MC0_OVR_SEL, 0);
408 WREG32_SMC(LCAC_MC0_OVR_VAL, 0);
409 kv_program_local_cac_table(rdev, mc0_local_cac_cfg_kv, mc0_cac_config_reg);
410
411 WREG32_SMC(LCAC_MC1_OVR_SEL, 0);
412 WREG32_SMC(LCAC_MC1_OVR_VAL, 0);
413 kv_program_local_cac_table(rdev, mc1_local_cac_cfg_kv, mc1_cac_config_reg);
414
415 WREG32_SMC(LCAC_MC2_OVR_SEL, 0);
416 WREG32_SMC(LCAC_MC2_OVR_VAL, 0);
417 kv_program_local_cac_table(rdev, mc2_local_cac_cfg_kv, mc2_cac_config_reg);
418
419 WREG32_SMC(LCAC_MC3_OVR_SEL, 0);
420 WREG32_SMC(LCAC_MC3_OVR_VAL, 0);
421 kv_program_local_cac_table(rdev, mc3_local_cac_cfg_kv, mc3_cac_config_reg);
422
423 WREG32_SMC(LCAC_CPL_OVR_SEL, 0);
424 WREG32_SMC(LCAC_CPL_OVR_VAL, 0);
425 kv_program_local_cac_table(rdev, cpl_local_cac_cfg_kv, cpl_cac_config_reg);
426 }
427}
428#endif
429
430static int kv_enable_smc_cac(struct radeon_device *rdev, bool enable)
431{
432 struct kv_power_info *pi = kv_get_pi(rdev);
433 int ret = 0;
434
435 if (pi->caps_cac) {
436 if (enable) {
437 ret = kv_notify_message_to_smu(rdev, PPSMC_MSG_EnableCac);
438 if (ret)
439 pi->cac_enabled = false;
440 else
441 pi->cac_enabled = true;
442 } else if (pi->cac_enabled) {
443 kv_notify_message_to_smu(rdev, PPSMC_MSG_DisableCac);
444 pi->cac_enabled = false;
445 }
446 }
447
448 return ret;
449}
450
451static int kv_process_firmware_header(struct radeon_device *rdev)
452{
453 struct kv_power_info *pi = kv_get_pi(rdev);
454 u32 tmp;
455 int ret;
456
457 ret = kv_read_smc_sram_dword(rdev, SMU7_FIRMWARE_HEADER_LOCATION +
458 offsetof(SMU7_Firmware_Header, DpmTable),
459 &tmp, pi->sram_end);
460
461 if (ret == 0)
462 pi->dpm_table_start = tmp;
463
464 ret = kv_read_smc_sram_dword(rdev, SMU7_FIRMWARE_HEADER_LOCATION +
465 offsetof(SMU7_Firmware_Header, SoftRegisters),
466 &tmp, pi->sram_end);
467
468 if (ret == 0)
469 pi->soft_regs_start = tmp;
470
471 return ret;
472}
473
474static int kv_enable_dpm_voltage_scaling(struct radeon_device *rdev)
475{
476 struct kv_power_info *pi = kv_get_pi(rdev);
477 int ret;
478
479 pi->graphics_voltage_change_enable = 1;
480
481 ret = kv_copy_bytes_to_smc(rdev,
482 pi->dpm_table_start +
483 offsetof(SMU7_Fusion_DpmTable, GraphicsVoltageChangeEnable),
484 &pi->graphics_voltage_change_enable,
485 sizeof(u8), pi->sram_end);
486
487 return ret;
488}
489
490static int kv_set_dpm_interval(struct radeon_device *rdev)
491{
492 struct kv_power_info *pi = kv_get_pi(rdev);
493 int ret;
494
495 pi->graphics_interval = 1;
496
497 ret = kv_copy_bytes_to_smc(rdev,
498 pi->dpm_table_start +
499 offsetof(SMU7_Fusion_DpmTable, GraphicsInterval),
500 &pi->graphics_interval,
501 sizeof(u8), pi->sram_end);
502
503 return ret;
504}
505
506static int kv_set_dpm_boot_state(struct radeon_device *rdev)
507{
508 struct kv_power_info *pi = kv_get_pi(rdev);
509 int ret;
510
511 ret = kv_copy_bytes_to_smc(rdev,
512 pi->dpm_table_start +
513 offsetof(SMU7_Fusion_DpmTable, GraphicsBootLevel),
514 &pi->graphics_boot_level,
515 sizeof(u8), pi->sram_end);
516
517 return ret;
518}
519
520static void kv_program_vc(struct radeon_device *rdev)
521{
522 WREG32_SMC(CG_FTV_0, 0x3FFFC000);
523}
524
525static void kv_clear_vc(struct radeon_device *rdev)
526{
527 WREG32_SMC(CG_FTV_0, 0);
528}
529
530static int kv_set_divider_value(struct radeon_device *rdev,
531 u32 index, u32 sclk)
532{
533 struct kv_power_info *pi = kv_get_pi(rdev);
534 struct atom_clock_dividers dividers;
535 int ret;
536
537 ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
538 sclk, false, &dividers);
539 if (ret)
540 return ret;
541
542 pi->graphics_level[index].SclkDid = (u8)dividers.post_div;
543 pi->graphics_level[index].SclkFrequency = cpu_to_be32(sclk);
544
545 return 0;
546}
547
548static u16 kv_convert_8bit_index_to_voltage(struct radeon_device *rdev,
549 u16 voltage)
550{
551 return 6200 - (voltage * 25);
552}
553
554static u16 kv_convert_2bit_index_to_voltage(struct radeon_device *rdev,
555 u32 vid_2bit)
556{
557 struct kv_power_info *pi = kv_get_pi(rdev);
558 u32 vid_8bit = sumo_convert_vid2_to_vid7(rdev,
559 &pi->sys_info.vid_mapping_table,
560 vid_2bit);
561
562 return kv_convert_8bit_index_to_voltage(rdev, (u16)vid_8bit);
563}
564
565
566static int kv_set_vid(struct radeon_device *rdev, u32 index, u32 vid)
567{
568 struct kv_power_info *pi = kv_get_pi(rdev);
569
570 pi->graphics_level[index].VoltageDownH = (u8)pi->voltage_drop_t;
571 pi->graphics_level[index].MinVddNb =
572 cpu_to_be32(kv_convert_2bit_index_to_voltage(rdev, vid));
573
574 return 0;
575}
576
577static int kv_set_at(struct radeon_device *rdev, u32 index, u32 at)
578{
579 struct kv_power_info *pi = kv_get_pi(rdev);
580
581 pi->graphics_level[index].AT = cpu_to_be16((u16)at);
582
583 return 0;
584}
585
586static void kv_dpm_power_level_enable(struct radeon_device *rdev,
587 u32 index, bool enable)
588{
589 struct kv_power_info *pi = kv_get_pi(rdev);
590
591 pi->graphics_level[index].EnabledForActivity = enable ? 1 : 0;
592}
593
594static void kv_start_dpm(struct radeon_device *rdev)
595{
596 u32 tmp = RREG32_SMC(GENERAL_PWRMGT);
597
598 tmp |= GLOBAL_PWRMGT_EN;
599 WREG32_SMC(GENERAL_PWRMGT, tmp);
600
601 kv_smc_dpm_enable(rdev, true);
602}
603
604static void kv_stop_dpm(struct radeon_device *rdev)
605{
606 kv_smc_dpm_enable(rdev, false);
607}
608
609static void kv_start_am(struct radeon_device *rdev)
610{
611 u32 sclk_pwrmgt_cntl = RREG32_SMC(SCLK_PWRMGT_CNTL);
612
613 sclk_pwrmgt_cntl &= ~(RESET_SCLK_CNT | RESET_BUSY_CNT);
614 sclk_pwrmgt_cntl |= DYNAMIC_PM_EN;
615
616 WREG32_SMC(SCLK_PWRMGT_CNTL, sclk_pwrmgt_cntl);
617}
618
619static void kv_reset_am(struct radeon_device *rdev)
620{
621 u32 sclk_pwrmgt_cntl = RREG32_SMC(SCLK_PWRMGT_CNTL);
622
623 sclk_pwrmgt_cntl |= (RESET_SCLK_CNT | RESET_BUSY_CNT);
624
625 WREG32_SMC(SCLK_PWRMGT_CNTL, sclk_pwrmgt_cntl);
626}
627
628static int kv_freeze_sclk_dpm(struct radeon_device *rdev, bool freeze)
629{
630 return kv_notify_message_to_smu(rdev, freeze ?
631 PPSMC_MSG_SCLKDPM_FreezeLevel : PPSMC_MSG_SCLKDPM_UnfreezeLevel);
632}
633
634static int kv_force_lowest_valid(struct radeon_device *rdev)
635{
636 return kv_force_dpm_lowest(rdev);
637}
638
639static int kv_unforce_levels(struct radeon_device *rdev)
640{
641 return kv_notify_message_to_smu(rdev, PPSMC_MSG_NoForcedLevel);
642}
643
644static int kv_update_sclk_t(struct radeon_device *rdev)
645{
646 struct kv_power_info *pi = kv_get_pi(rdev);
647 u32 low_sclk_interrupt_t = 0;
648 int ret = 0;
649
650 if (pi->caps_sclk_throttle_low_notification) {
651 low_sclk_interrupt_t = cpu_to_be32(pi->low_sclk_interrupt_t);
652
653 ret = kv_copy_bytes_to_smc(rdev,
654 pi->dpm_table_start +
655 offsetof(SMU7_Fusion_DpmTable, LowSclkInterruptT),
656 (u8 *)&low_sclk_interrupt_t,
657 sizeof(u32), pi->sram_end);
658 }
659 return ret;
660}
661
662static int kv_program_bootup_state(struct radeon_device *rdev)
663{
664 struct kv_power_info *pi = kv_get_pi(rdev);
665 u32 i;
666 struct radeon_clock_voltage_dependency_table *table =
667 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
668
669 if (table && table->count) {
670 for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) {
671 if ((table->entries[i].clk == pi->boot_pl.sclk) ||
672 (i == 0))
673 break;
674 }
675
676 pi->graphics_boot_level = (u8)i;
677 kv_dpm_power_level_enable(rdev, i, true);
678 } else {
679 struct sumo_sclk_voltage_mapping_table *table =
680 &pi->sys_info.sclk_voltage_mapping_table;
681
682 if (table->num_max_dpm_entries == 0)
683 return -EINVAL;
684
685 for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) {
686 if ((table->entries[i].sclk_frequency == pi->boot_pl.sclk) ||
687 (i == 0))
688 break;
689 }
690
691 pi->graphics_boot_level = (u8)i;
692 kv_dpm_power_level_enable(rdev, i, true);
693 }
694 return 0;
695}
696
697static int kv_enable_auto_thermal_throttling(struct radeon_device *rdev)
698{
699 struct kv_power_info *pi = kv_get_pi(rdev);
700 int ret;
701
702 pi->graphics_therm_throttle_enable = 1;
703
704 ret = kv_copy_bytes_to_smc(rdev,
705 pi->dpm_table_start +
706 offsetof(SMU7_Fusion_DpmTable, GraphicsThermThrottleEnable),
707 &pi->graphics_therm_throttle_enable,
708 sizeof(u8), pi->sram_end);
709
710 return ret;
711}
712
713static int kv_upload_dpm_settings(struct radeon_device *rdev)
714{
715 struct kv_power_info *pi = kv_get_pi(rdev);
716 int ret;
717
718 ret = kv_copy_bytes_to_smc(rdev,
719 pi->dpm_table_start +
720 offsetof(SMU7_Fusion_DpmTable, GraphicsLevel),
721 (u8 *)&pi->graphics_level,
722 sizeof(SMU7_Fusion_GraphicsLevel) * SMU7_MAX_LEVELS_GRAPHICS,
723 pi->sram_end);
724
725 if (ret)
726 return ret;
727
728 ret = kv_copy_bytes_to_smc(rdev,
729 pi->dpm_table_start +
730 offsetof(SMU7_Fusion_DpmTable, GraphicsDpmLevelCount),
731 &pi->graphics_dpm_level_count,
732 sizeof(u8), pi->sram_end);
733
734 return ret;
735}
736
737static u32 kv_get_clock_difference(u32 a, u32 b)
738{
739 return (a >= b) ? a - b : b - a;
740}
741
742static u32 kv_get_clk_bypass(struct radeon_device *rdev, u32 clk)
743{
744 struct kv_power_info *pi = kv_get_pi(rdev);
745 u32 value;
746
747 if (pi->caps_enable_dfs_bypass) {
748 if (kv_get_clock_difference(clk, 40000) < 200)
749 value = 3;
750 else if (kv_get_clock_difference(clk, 30000) < 200)
751 value = 2;
752 else if (kv_get_clock_difference(clk, 20000) < 200)
753 value = 7;
754 else if (kv_get_clock_difference(clk, 15000) < 200)
755 value = 6;
756 else if (kv_get_clock_difference(clk, 10000) < 200)
757 value = 8;
758 else
759 value = 0;
760 } else {
761 value = 0;
762 }
763
764 return value;
765}
766
767static int kv_populate_uvd_table(struct radeon_device *rdev)
768{
769 struct kv_power_info *pi = kv_get_pi(rdev);
770 struct radeon_uvd_clock_voltage_dependency_table *table =
771 &rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table;
772 struct atom_clock_dividers dividers;
773 int ret;
774 u32 i;
775
776 if (table == NULL || table->count == 0)
777 return 0;
778
779 pi->uvd_level_count = 0;
780 for (i = 0; i < table->count; i++) {
781 if (pi->high_voltage_t &&
782 (pi->high_voltage_t < table->entries[i].v))
783 break;
784
785 pi->uvd_level[i].VclkFrequency = cpu_to_be32(table->entries[i].vclk);
786 pi->uvd_level[i].DclkFrequency = cpu_to_be32(table->entries[i].dclk);
787 pi->uvd_level[i].MinVddNb = cpu_to_be16(table->entries[i].v);
788
789 pi->uvd_level[i].VClkBypassCntl =
790 (u8)kv_get_clk_bypass(rdev, table->entries[i].vclk);
791 pi->uvd_level[i].DClkBypassCntl =
792 (u8)kv_get_clk_bypass(rdev, table->entries[i].dclk);
793
794 ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
795 table->entries[i].vclk, false, &dividers);
796 if (ret)
797 return ret;
798 pi->uvd_level[i].VclkDivider = (u8)dividers.post_div;
799
800 ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
801 table->entries[i].dclk, false, &dividers);
802 if (ret)
803 return ret;
804 pi->uvd_level[i].DclkDivider = (u8)dividers.post_div;
805
806 pi->uvd_level_count++;
807 }
808
809 ret = kv_copy_bytes_to_smc(rdev,
810 pi->dpm_table_start +
811 offsetof(SMU7_Fusion_DpmTable, UvdLevelCount),
812 (u8 *)&pi->uvd_level_count,
813 sizeof(u8), pi->sram_end);
814 if (ret)
815 return ret;
816
817 pi->uvd_interval = 1;
818
819 ret = kv_copy_bytes_to_smc(rdev,
820 pi->dpm_table_start +
821 offsetof(SMU7_Fusion_DpmTable, UVDInterval),
822 &pi->uvd_interval,
823 sizeof(u8), pi->sram_end);
824 if (ret)
825 return ret;
826
827 ret = kv_copy_bytes_to_smc(rdev,
828 pi->dpm_table_start +
829 offsetof(SMU7_Fusion_DpmTable, UvdLevel),
830 (u8 *)&pi->uvd_level,
831 sizeof(SMU7_Fusion_UvdLevel) * SMU7_MAX_LEVELS_UVD,
832 pi->sram_end);
833
834 return ret;
835
836}
837
838static int kv_populate_vce_table(struct radeon_device *rdev)
839{
840 struct kv_power_info *pi = kv_get_pi(rdev);
841 int ret;
842 u32 i;
843 struct radeon_vce_clock_voltage_dependency_table *table =
844 &rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table;
845 struct atom_clock_dividers dividers;
846
847 if (table == NULL || table->count == 0)
848 return 0;
849
850 pi->vce_level_count = 0;
851 for (i = 0; i < table->count; i++) {
852 if (pi->high_voltage_t &&
853 pi->high_voltage_t < table->entries[i].v)
854 break;
855
856 pi->vce_level[i].Frequency = cpu_to_be32(table->entries[i].evclk);
857 pi->vce_level[i].MinVoltage = cpu_to_be16(table->entries[i].v);
858
859 pi->vce_level[i].ClkBypassCntl =
860 (u8)kv_get_clk_bypass(rdev, table->entries[i].evclk);
861
862 ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
863 table->entries[i].evclk, false, &dividers);
864 if (ret)
865 return ret;
866 pi->vce_level[i].Divider = (u8)dividers.post_div;
867
868 pi->vce_level_count++;
869 }
870
871 ret = kv_copy_bytes_to_smc(rdev,
872 pi->dpm_table_start +
873 offsetof(SMU7_Fusion_DpmTable, VceLevelCount),
874 (u8 *)&pi->vce_level_count,
875 sizeof(u8),
876 pi->sram_end);
877 if (ret)
878 return ret;
879
880 pi->vce_interval = 1;
881
882 ret = kv_copy_bytes_to_smc(rdev,
883 pi->dpm_table_start +
884 offsetof(SMU7_Fusion_DpmTable, VCEInterval),
885 (u8 *)&pi->vce_interval,
886 sizeof(u8),
887 pi->sram_end);
888 if (ret)
889 return ret;
890
891 ret = kv_copy_bytes_to_smc(rdev,
892 pi->dpm_table_start +
893 offsetof(SMU7_Fusion_DpmTable, VceLevel),
894 (u8 *)&pi->vce_level,
895 sizeof(SMU7_Fusion_ExtClkLevel) * SMU7_MAX_LEVELS_VCE,
896 pi->sram_end);
897
898 return ret;
899}
900
901static int kv_populate_samu_table(struct radeon_device *rdev)
902{
903 struct kv_power_info *pi = kv_get_pi(rdev);
904 struct radeon_clock_voltage_dependency_table *table =
905 &rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table;
906 struct atom_clock_dividers dividers;
907 int ret;
908 u32 i;
909
910 if (table == NULL || table->count == 0)
911 return 0;
912
913 pi->samu_level_count = 0;
914 for (i = 0; i < table->count; i++) {
915 if (pi->high_voltage_t &&
916 pi->high_voltage_t < table->entries[i].v)
917 break;
918
919 pi->samu_level[i].Frequency = cpu_to_be32(table->entries[i].clk);
920 pi->samu_level[i].MinVoltage = cpu_to_be16(table->entries[i].v);
921
922 pi->samu_level[i].ClkBypassCntl =
923 (u8)kv_get_clk_bypass(rdev, table->entries[i].clk);
924
925 ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
926 table->entries[i].clk, false, &dividers);
927 if (ret)
928 return ret;
929 pi->samu_level[i].Divider = (u8)dividers.post_div;
930
931 pi->samu_level_count++;
932 }
933
934 ret = kv_copy_bytes_to_smc(rdev,
935 pi->dpm_table_start +
936 offsetof(SMU7_Fusion_DpmTable, SamuLevelCount),
937 (u8 *)&pi->samu_level_count,
938 sizeof(u8),
939 pi->sram_end);
940 if (ret)
941 return ret;
942
943 pi->samu_interval = 1;
944
945 ret = kv_copy_bytes_to_smc(rdev,
946 pi->dpm_table_start +
947 offsetof(SMU7_Fusion_DpmTable, SAMUInterval),
948 (u8 *)&pi->samu_interval,
949 sizeof(u8),
950 pi->sram_end);
951 if (ret)
952 return ret;
953
954 ret = kv_copy_bytes_to_smc(rdev,
955 pi->dpm_table_start +
956 offsetof(SMU7_Fusion_DpmTable, SamuLevel),
957 (u8 *)&pi->samu_level,
958 sizeof(SMU7_Fusion_ExtClkLevel) * SMU7_MAX_LEVELS_SAMU,
959 pi->sram_end);
960 if (ret)
961 return ret;
962
963 return ret;
964}
965
966
967static int kv_populate_acp_table(struct radeon_device *rdev)
968{
969 struct kv_power_info *pi = kv_get_pi(rdev);
970 struct radeon_clock_voltage_dependency_table *table =
971 &rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table;
972 struct atom_clock_dividers dividers;
973 int ret;
974 u32 i;
975
976 if (table == NULL || table->count == 0)
977 return 0;
978
979 pi->acp_level_count = 0;
980 for (i = 0; i < table->count; i++) {
981 pi->acp_level[i].Frequency = cpu_to_be32(table->entries[i].clk);
982 pi->acp_level[i].MinVoltage = cpu_to_be16(table->entries[i].v);
983
984 ret = radeon_atom_get_clock_dividers(rdev, COMPUTE_ENGINE_PLL_PARAM,
985 table->entries[i].clk, false, &dividers);
986 if (ret)
987 return ret;
988 pi->acp_level[i].Divider = (u8)dividers.post_div;
989
990 pi->acp_level_count++;
991 }
992
993 ret = kv_copy_bytes_to_smc(rdev,
994 pi->dpm_table_start +
995 offsetof(SMU7_Fusion_DpmTable, AcpLevelCount),
996 (u8 *)&pi->acp_level_count,
997 sizeof(u8),
998 pi->sram_end);
999 if (ret)
1000 return ret;
1001
1002 pi->acp_interval = 1;
1003
1004 ret = kv_copy_bytes_to_smc(rdev,
1005 pi->dpm_table_start +
1006 offsetof(SMU7_Fusion_DpmTable, ACPInterval),
1007 (u8 *)&pi->acp_interval,
1008 sizeof(u8),
1009 pi->sram_end);
1010 if (ret)
1011 return ret;
1012
1013 ret = kv_copy_bytes_to_smc(rdev,
1014 pi->dpm_table_start +
1015 offsetof(SMU7_Fusion_DpmTable, AcpLevel),
1016 (u8 *)&pi->acp_level,
1017 sizeof(SMU7_Fusion_ExtClkLevel) * SMU7_MAX_LEVELS_ACP,
1018 pi->sram_end);
1019 if (ret)
1020 return ret;
1021
1022 return ret;
1023}
1024
1025static void kv_calculate_dfs_bypass_settings(struct radeon_device *rdev)
1026{
1027 struct kv_power_info *pi = kv_get_pi(rdev);
1028 u32 i;
1029 struct radeon_clock_voltage_dependency_table *table =
1030 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
1031
1032 if (table && table->count) {
1033 for (i = 0; i < pi->graphics_dpm_level_count; i++) {
1034 if (pi->caps_enable_dfs_bypass) {
1035 if (kv_get_clock_difference(table->entries[i].clk, 40000) < 200)
1036 pi->graphics_level[i].ClkBypassCntl = 3;
1037 else if (kv_get_clock_difference(table->entries[i].clk, 30000) < 200)
1038 pi->graphics_level[i].ClkBypassCntl = 2;
1039 else if (kv_get_clock_difference(table->entries[i].clk, 26600) < 200)
1040 pi->graphics_level[i].ClkBypassCntl = 7;
1041 else if (kv_get_clock_difference(table->entries[i].clk , 20000) < 200)
1042 pi->graphics_level[i].ClkBypassCntl = 6;
1043 else if (kv_get_clock_difference(table->entries[i].clk , 10000) < 200)
1044 pi->graphics_level[i].ClkBypassCntl = 8;
1045 else
1046 pi->graphics_level[i].ClkBypassCntl = 0;
1047 } else {
1048 pi->graphics_level[i].ClkBypassCntl = 0;
1049 }
1050 }
1051 } else {
1052 struct sumo_sclk_voltage_mapping_table *table =
1053 &pi->sys_info.sclk_voltage_mapping_table;
1054 for (i = 0; i < pi->graphics_dpm_level_count; i++) {
1055 if (pi->caps_enable_dfs_bypass) {
1056 if (kv_get_clock_difference(table->entries[i].sclk_frequency, 40000) < 200)
1057 pi->graphics_level[i].ClkBypassCntl = 3;
1058 else if (kv_get_clock_difference(table->entries[i].sclk_frequency, 30000) < 200)
1059 pi->graphics_level[i].ClkBypassCntl = 2;
1060 else if (kv_get_clock_difference(table->entries[i].sclk_frequency, 26600) < 200)
1061 pi->graphics_level[i].ClkBypassCntl = 7;
1062 else if (kv_get_clock_difference(table->entries[i].sclk_frequency, 20000) < 200)
1063 pi->graphics_level[i].ClkBypassCntl = 6;
1064 else if (kv_get_clock_difference(table->entries[i].sclk_frequency, 10000) < 200)
1065 pi->graphics_level[i].ClkBypassCntl = 8;
1066 else
1067 pi->graphics_level[i].ClkBypassCntl = 0;
1068 } else {
1069 pi->graphics_level[i].ClkBypassCntl = 0;
1070 }
1071 }
1072 }
1073}
1074
1075static int kv_enable_ulv(struct radeon_device *rdev, bool enable)
1076{
1077 return kv_notify_message_to_smu(rdev, enable ?
1078 PPSMC_MSG_EnableULV : PPSMC_MSG_DisableULV);
1079}
1080
1081static void kv_update_current_ps(struct radeon_device *rdev,
1082 struct radeon_ps *rps)
1083{
1084 struct kv_ps *new_ps = kv_get_ps(rps);
1085 struct kv_power_info *pi = kv_get_pi(rdev);
1086
1087 pi->current_rps = *rps;
1088 pi->current_ps = *new_ps;
1089 pi->current_rps.ps_priv = &pi->current_ps;
1090}
1091
1092static void kv_update_requested_ps(struct radeon_device *rdev,
1093 struct radeon_ps *rps)
1094{
1095 struct kv_ps *new_ps = kv_get_ps(rps);
1096 struct kv_power_info *pi = kv_get_pi(rdev);
1097
1098 pi->requested_rps = *rps;
1099 pi->requested_ps = *new_ps;
1100 pi->requested_rps.ps_priv = &pi->requested_ps;
1101}
1102
1103int kv_dpm_enable(struct radeon_device *rdev)
1104{
1105 struct kv_power_info *pi = kv_get_pi(rdev);
1106 int ret;
1107
1108 cik_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
1109 RADEON_CG_BLOCK_SDMA |
1110 RADEON_CG_BLOCK_BIF |
1111 RADEON_CG_BLOCK_HDP), false);
1112
1113 ret = kv_process_firmware_header(rdev);
1114 if (ret) {
1115 DRM_ERROR("kv_process_firmware_header failed\n");
1116 return ret;
1117 }
1118 kv_init_fps_limits(rdev);
1119 kv_init_graphics_levels(rdev);
1120 ret = kv_program_bootup_state(rdev);
1121 if (ret) {
1122 DRM_ERROR("kv_program_bootup_state failed\n");
1123 return ret;
1124 }
1125 kv_calculate_dfs_bypass_settings(rdev);
1126 ret = kv_upload_dpm_settings(rdev);
1127 if (ret) {
1128 DRM_ERROR("kv_upload_dpm_settings failed\n");
1129 return ret;
1130 }
1131 ret = kv_populate_uvd_table(rdev);
1132 if (ret) {
1133 DRM_ERROR("kv_populate_uvd_table failed\n");
1134 return ret;
1135 }
1136 ret = kv_populate_vce_table(rdev);
1137 if (ret) {
1138 DRM_ERROR("kv_populate_vce_table failed\n");
1139 return ret;
1140 }
1141 ret = kv_populate_samu_table(rdev);
1142 if (ret) {
1143 DRM_ERROR("kv_populate_samu_table failed\n");
1144 return ret;
1145 }
1146 ret = kv_populate_acp_table(rdev);
1147 if (ret) {
1148 DRM_ERROR("kv_populate_acp_table failed\n");
1149 return ret;
1150 }
1151 kv_program_vc(rdev);
1152#if 0
1153 kv_initialize_hardware_cac_manager(rdev);
1154#endif
1155 kv_start_am(rdev);
1156 if (pi->enable_auto_thermal_throttling) {
1157 ret = kv_enable_auto_thermal_throttling(rdev);
1158 if (ret) {
1159 DRM_ERROR("kv_enable_auto_thermal_throttling failed\n");
1160 return ret;
1161 }
1162 }
1163 ret = kv_enable_dpm_voltage_scaling(rdev);
1164 if (ret) {
1165 DRM_ERROR("kv_enable_dpm_voltage_scaling failed\n");
1166 return ret;
1167 }
1168 ret = kv_set_dpm_interval(rdev);
1169 if (ret) {
1170 DRM_ERROR("kv_set_dpm_interval failed\n");
1171 return ret;
1172 }
1173 ret = kv_set_dpm_boot_state(rdev);
1174 if (ret) {
1175 DRM_ERROR("kv_set_dpm_boot_state failed\n");
1176 return ret;
1177 }
1178 ret = kv_enable_ulv(rdev, true);
1179 if (ret) {
1180 DRM_ERROR("kv_enable_ulv failed\n");
1181 return ret;
1182 }
1183 kv_start_dpm(rdev);
1184 ret = kv_enable_didt(rdev, true);
1185 if (ret) {
1186 DRM_ERROR("kv_enable_didt failed\n");
1187 return ret;
1188 }
1189 ret = kv_enable_smc_cac(rdev, true);
1190 if (ret) {
1191 DRM_ERROR("kv_enable_smc_cac failed\n");
1192 return ret;
1193 }
1194
1195 if (rdev->irq.installed &&
1196 r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) {
1197 ret = kv_set_thermal_temperature_range(rdev, R600_TEMP_RANGE_MIN, R600_TEMP_RANGE_MAX);
1198 if (ret) {
1199 DRM_ERROR("kv_set_thermal_temperature_range failed\n");
1200 return ret;
1201 }
1202 rdev->irq.dpm_thermal = true;
1203 radeon_irq_set(rdev);
1204 }
1205
1206 /* powerdown unused blocks for now */
1207 kv_dpm_powergate_acp(rdev, true);
1208 kv_dpm_powergate_samu(rdev, true);
1209 kv_dpm_powergate_vce(rdev, true);
1210 kv_dpm_powergate_uvd(rdev, true);
1211
1212 cik_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
1213 RADEON_CG_BLOCK_SDMA |
1214 RADEON_CG_BLOCK_BIF |
1215 RADEON_CG_BLOCK_HDP), true);
1216
1217 kv_update_current_ps(rdev, rdev->pm.dpm.boot_ps);
1218
1219 return ret;
1220}
1221
1222void kv_dpm_disable(struct radeon_device *rdev)
1223{
1224 cik_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
1225 RADEON_CG_BLOCK_SDMA |
1226 RADEON_CG_BLOCK_BIF |
1227 RADEON_CG_BLOCK_HDP), false);
1228
1229 /* powerup blocks */
1230 kv_dpm_powergate_acp(rdev, false);
1231 kv_dpm_powergate_samu(rdev, false);
1232 kv_dpm_powergate_vce(rdev, false);
1233 kv_dpm_powergate_uvd(rdev, false);
1234
1235 kv_enable_smc_cac(rdev, false);
1236 kv_enable_didt(rdev, false);
1237 kv_clear_vc(rdev);
1238 kv_stop_dpm(rdev);
1239 kv_enable_ulv(rdev, false);
1240 kv_reset_am(rdev);
1241
1242 kv_update_current_ps(rdev, rdev->pm.dpm.boot_ps);
1243}
1244
1245#if 0
1246static int kv_write_smc_soft_register(struct radeon_device *rdev,
1247 u16 reg_offset, u32 value)
1248{
1249 struct kv_power_info *pi = kv_get_pi(rdev);
1250
1251 return kv_copy_bytes_to_smc(rdev, pi->soft_regs_start + reg_offset,
1252 (u8 *)&value, sizeof(u16), pi->sram_end);
1253}
1254
1255static int kv_read_smc_soft_register(struct radeon_device *rdev,
1256 u16 reg_offset, u32 *value)
1257{
1258 struct kv_power_info *pi = kv_get_pi(rdev);
1259
1260 return kv_read_smc_sram_dword(rdev, pi->soft_regs_start + reg_offset,
1261 value, pi->sram_end);
1262}
1263#endif
1264
1265static void kv_init_sclk_t(struct radeon_device *rdev)
1266{
1267 struct kv_power_info *pi = kv_get_pi(rdev);
1268
1269 pi->low_sclk_interrupt_t = 0;
1270}
1271
1272static int kv_init_fps_limits(struct radeon_device *rdev)
1273{
1274 struct kv_power_info *pi = kv_get_pi(rdev);
1275 int ret = 0;
1276
1277 if (pi->caps_fps) {
1278 u16 tmp;
1279
1280 tmp = 45;
1281 pi->fps_high_t = cpu_to_be16(tmp);
1282 ret = kv_copy_bytes_to_smc(rdev,
1283 pi->dpm_table_start +
1284 offsetof(SMU7_Fusion_DpmTable, FpsHighT),
1285 (u8 *)&pi->fps_high_t,
1286 sizeof(u16), pi->sram_end);
1287
1288 tmp = 30;
1289 pi->fps_low_t = cpu_to_be16(tmp);
1290
1291 ret = kv_copy_bytes_to_smc(rdev,
1292 pi->dpm_table_start +
1293 offsetof(SMU7_Fusion_DpmTable, FpsLowT),
1294 (u8 *)&pi->fps_low_t,
1295 sizeof(u16), pi->sram_end);
1296
1297 }
1298 return ret;
1299}
1300
1301static void kv_init_powergate_state(struct radeon_device *rdev)
1302{
1303 struct kv_power_info *pi = kv_get_pi(rdev);
1304
1305 pi->uvd_power_gated = false;
1306 pi->vce_power_gated = false;
1307 pi->samu_power_gated = false;
1308 pi->acp_power_gated = false;
1309
1310}
1311
1312static int kv_enable_uvd_dpm(struct radeon_device *rdev, bool enable)
1313{
1314 return kv_notify_message_to_smu(rdev, enable ?
1315 PPSMC_MSG_UVDDPM_Enable : PPSMC_MSG_UVDDPM_Disable);
1316}
1317
1318#if 0
1319static int kv_enable_vce_dpm(struct radeon_device *rdev, bool enable)
1320{
1321 return kv_notify_message_to_smu(rdev, enable ?
1322 PPSMC_MSG_VCEDPM_Enable : PPSMC_MSG_VCEDPM_Disable);
1323}
1324#endif
1325
1326static int kv_enable_samu_dpm(struct radeon_device *rdev, bool enable)
1327{
1328 return kv_notify_message_to_smu(rdev, enable ?
1329 PPSMC_MSG_SAMUDPM_Enable : PPSMC_MSG_SAMUDPM_Disable);
1330}
1331
1332static int kv_enable_acp_dpm(struct radeon_device *rdev, bool enable)
1333{
1334 return kv_notify_message_to_smu(rdev, enable ?
1335 PPSMC_MSG_ACPDPM_Enable : PPSMC_MSG_ACPDPM_Disable);
1336}
1337
1338static int kv_update_uvd_dpm(struct radeon_device *rdev, bool gate)
1339{
1340 struct kv_power_info *pi = kv_get_pi(rdev);
1341 struct radeon_uvd_clock_voltage_dependency_table *table =
1342 &rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table;
1343 int ret;
1344
1345 if (!gate) {
1346 if (!pi->caps_uvd_dpm || table->count || pi->caps_stable_p_state)
1347 pi->uvd_boot_level = table->count - 1;
1348 else
1349 pi->uvd_boot_level = 0;
1350
1351 ret = kv_copy_bytes_to_smc(rdev,
1352 pi->dpm_table_start +
1353 offsetof(SMU7_Fusion_DpmTable, UvdBootLevel),
1354 (uint8_t *)&pi->uvd_boot_level,
1355 sizeof(u8), pi->sram_end);
1356 if (ret)
1357 return ret;
1358
1359 if (!pi->caps_uvd_dpm ||
1360 pi->caps_stable_p_state)
1361 kv_send_msg_to_smc_with_parameter(rdev,
1362 PPSMC_MSG_UVDDPM_SetEnabledMask,
1363 (1 << pi->uvd_boot_level));
1364 }
1365
1366 return kv_enable_uvd_dpm(rdev, !gate);
1367}
1368
1369#if 0
1370static u8 kv_get_vce_boot_level(struct radeon_device *rdev)
1371{
1372 u8 i;
1373 struct radeon_vce_clock_voltage_dependency_table *table =
1374 &rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table;
1375
1376 for (i = 0; i < table->count; i++) {
1377 if (table->entries[i].evclk >= 0) /* XXX */
1378 break;
1379 }
1380
1381 return i;
1382}
1383
1384static int kv_update_vce_dpm(struct radeon_device *rdev,
1385 struct radeon_ps *radeon_new_state,
1386 struct radeon_ps *radeon_current_state)
1387{
1388 struct kv_power_info *pi = kv_get_pi(rdev);
1389 struct radeon_vce_clock_voltage_dependency_table *table =
1390 &rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table;
1391 int ret;
1392
1393 if (radeon_new_state->evclk > 0 && radeon_current_state->evclk == 0) {
1394 if (pi->caps_stable_p_state)
1395 pi->vce_boot_level = table->count - 1;
1396 else
1397 pi->vce_boot_level = kv_get_vce_boot_level(rdev);
1398
1399 ret = kv_copy_bytes_to_smc(rdev,
1400 pi->dpm_table_start +
1401 offsetof(SMU7_Fusion_DpmTable, VceBootLevel),
1402 (u8 *)&pi->vce_boot_level,
1403 sizeof(u8),
1404 pi->sram_end);
1405 if (ret)
1406 return ret;
1407
1408 if (pi->caps_stable_p_state)
1409 kv_send_msg_to_smc_with_parameter(rdev,
1410 PPSMC_MSG_VCEDPM_SetEnabledMask,
1411 (1 << pi->vce_boot_level));
1412
1413 kv_enable_vce_dpm(rdev, true);
1414 } else if (radeon_new_state->evclk == 0 && radeon_current_state->evclk > 0) {
1415 kv_enable_vce_dpm(rdev, false);
1416 }
1417
1418 return 0;
1419}
1420#endif
1421
1422static int kv_update_samu_dpm(struct radeon_device *rdev, bool gate)
1423{
1424 struct kv_power_info *pi = kv_get_pi(rdev);
1425 struct radeon_clock_voltage_dependency_table *table =
1426 &rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table;
1427 int ret;
1428
1429 if (!gate) {
1430 if (pi->caps_stable_p_state)
1431 pi->samu_boot_level = table->count - 1;
1432 else
1433 pi->samu_boot_level = 0;
1434
1435 ret = kv_copy_bytes_to_smc(rdev,
1436 pi->dpm_table_start +
1437 offsetof(SMU7_Fusion_DpmTable, SamuBootLevel),
1438 (u8 *)&pi->samu_boot_level,
1439 sizeof(u8),
1440 pi->sram_end);
1441 if (ret)
1442 return ret;
1443
1444 if (pi->caps_stable_p_state)
1445 kv_send_msg_to_smc_with_parameter(rdev,
1446 PPSMC_MSG_SAMUDPM_SetEnabledMask,
1447 (1 << pi->samu_boot_level));
1448 }
1449
1450 return kv_enable_samu_dpm(rdev, !gate);
1451}
1452
1453static int kv_update_acp_dpm(struct radeon_device *rdev, bool gate)
1454{
1455 struct kv_power_info *pi = kv_get_pi(rdev);
1456 struct radeon_clock_voltage_dependency_table *table =
1457 &rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table;
1458 int ret;
1459
1460 if (!gate) {
1461 if (pi->caps_stable_p_state)
1462 pi->acp_boot_level = table->count - 1;
1463 else
1464 pi->acp_boot_level = 0;
1465
1466 ret = kv_copy_bytes_to_smc(rdev,
1467 pi->dpm_table_start +
1468 offsetof(SMU7_Fusion_DpmTable, AcpBootLevel),
1469 (u8 *)&pi->acp_boot_level,
1470 sizeof(u8),
1471 pi->sram_end);
1472 if (ret)
1473 return ret;
1474
1475 if (pi->caps_stable_p_state)
1476 kv_send_msg_to_smc_with_parameter(rdev,
1477 PPSMC_MSG_ACPDPM_SetEnabledMask,
1478 (1 << pi->acp_boot_level));
1479 }
1480
1481 return kv_enable_acp_dpm(rdev, !gate);
1482}
1483
1484void kv_dpm_powergate_uvd(struct radeon_device *rdev, bool gate)
1485{
1486 struct kv_power_info *pi = kv_get_pi(rdev);
1487
1488 if (pi->uvd_power_gated == gate)
1489 return;
1490
1491 pi->uvd_power_gated = gate;
1492
1493 if (gate) {
1494 if (pi->caps_uvd_pg) {
1495 uvd_v1_0_stop(rdev);
1496 cik_update_cg(rdev, RADEON_CG_BLOCK_UVD, false);
1497 }
1498 kv_update_uvd_dpm(rdev, gate);
1499 if (pi->caps_uvd_pg)
1500 kv_notify_message_to_smu(rdev, PPSMC_MSG_UVDPowerOFF);
1501 } else {
1502 if (pi->caps_uvd_pg) {
1503 kv_notify_message_to_smu(rdev, PPSMC_MSG_UVDPowerON);
1504 uvd_v4_2_resume(rdev);
1505 uvd_v1_0_start(rdev);
1506 cik_update_cg(rdev, RADEON_CG_BLOCK_UVD, true);
1507 }
1508 kv_update_uvd_dpm(rdev, gate);
1509 }
1510}
1511
1512static void kv_dpm_powergate_vce(struct radeon_device *rdev, bool gate)
1513{
1514 struct kv_power_info *pi = kv_get_pi(rdev);
1515
1516 if (pi->vce_power_gated == gate)
1517 return;
1518
1519 pi->vce_power_gated = gate;
1520
1521 if (gate) {
1522 if (pi->caps_vce_pg)
1523 kv_notify_message_to_smu(rdev, PPSMC_MSG_VCEPowerOFF);
1524 } else {
1525 if (pi->caps_vce_pg)
1526 kv_notify_message_to_smu(rdev, PPSMC_MSG_VCEPowerON);
1527 }
1528}
1529
1530static void kv_dpm_powergate_samu(struct radeon_device *rdev, bool gate)
1531{
1532 struct kv_power_info *pi = kv_get_pi(rdev);
1533
1534 if (pi->samu_power_gated == gate)
1535 return;
1536
1537 pi->samu_power_gated = gate;
1538
1539 if (gate) {
1540 kv_update_samu_dpm(rdev, true);
1541 if (pi->caps_samu_pg)
1542 kv_notify_message_to_smu(rdev, PPSMC_MSG_SAMPowerOFF);
1543 } else {
1544 if (pi->caps_samu_pg)
1545 kv_notify_message_to_smu(rdev, PPSMC_MSG_SAMPowerON);
1546 kv_update_samu_dpm(rdev, false);
1547 }
1548}
1549
1550static void kv_dpm_powergate_acp(struct radeon_device *rdev, bool gate)
1551{
1552 struct kv_power_info *pi = kv_get_pi(rdev);
1553
1554 if (pi->acp_power_gated == gate)
1555 return;
1556
1557 if (rdev->family == CHIP_KABINI)
1558 return;
1559
1560 pi->acp_power_gated = gate;
1561
1562 if (gate) {
1563 kv_update_acp_dpm(rdev, true);
1564 if (pi->caps_acp_pg)
1565 kv_notify_message_to_smu(rdev, PPSMC_MSG_ACPPowerOFF);
1566 } else {
1567 if (pi->caps_acp_pg)
1568 kv_notify_message_to_smu(rdev, PPSMC_MSG_ACPPowerON);
1569 kv_update_acp_dpm(rdev, false);
1570 }
1571}
1572
1573static void kv_set_valid_clock_range(struct radeon_device *rdev,
1574 struct radeon_ps *new_rps)
1575{
1576 struct kv_ps *new_ps = kv_get_ps(new_rps);
1577 struct kv_power_info *pi = kv_get_pi(rdev);
1578 u32 i;
1579 struct radeon_clock_voltage_dependency_table *table =
1580 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
1581
1582 if (table && table->count) {
1583 for (i = 0; i < pi->graphics_dpm_level_count; i++) {
1584 if ((table->entries[i].clk >= new_ps->levels[0].sclk) ||
1585 (i == (pi->graphics_dpm_level_count - 1))) {
1586 pi->lowest_valid = i;
1587 break;
1588 }
1589 }
1590
1591 for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) {
1592 if ((table->entries[i].clk <= new_ps->levels[new_ps->num_levels -1].sclk) ||
1593 (i == 0)) {
1594 pi->highest_valid = i;
1595 break;
1596 }
1597 }
1598
1599 if (pi->lowest_valid > pi->highest_valid) {
1600 if ((new_ps->levels[0].sclk - table->entries[pi->highest_valid].clk) >
1601 (table->entries[pi->lowest_valid].clk - new_ps->levels[new_ps->num_levels - 1].sclk))
1602 pi->highest_valid = pi->lowest_valid;
1603 else
1604 pi->lowest_valid = pi->highest_valid;
1605 }
1606 } else {
1607 struct sumo_sclk_voltage_mapping_table *table =
1608 &pi->sys_info.sclk_voltage_mapping_table;
1609
1610 for (i = 0; i < (int)pi->graphics_dpm_level_count; i++) {
1611 if (table->entries[i].sclk_frequency >= new_ps->levels[0].sclk ||
1612 i == (int)(pi->graphics_dpm_level_count - 1)) {
1613 pi->lowest_valid = i;
1614 break;
1615 }
1616 }
1617
1618 for (i = pi->graphics_dpm_level_count - 1; i >= 0; i--) {
1619 if (table->entries[i].sclk_frequency <=
1620 new_ps->levels[new_ps->num_levels - 1].sclk ||
1621 i == 0) {
1622 pi->highest_valid = i;
1623 break;
1624 }
1625 }
1626
1627 if (pi->lowest_valid > pi->highest_valid) {
1628 if ((new_ps->levels[0].sclk -
1629 table->entries[pi->highest_valid].sclk_frequency) >
1630 (table->entries[pi->lowest_valid].sclk_frequency -
1631 new_ps->levels[new_ps->num_levels -1].sclk))
1632 pi->highest_valid = pi->lowest_valid;
1633 else
1634 pi->lowest_valid = pi->highest_valid;
1635 }
1636 }
1637}
1638
1639static int kv_update_dfs_bypass_settings(struct radeon_device *rdev,
1640 struct radeon_ps *new_rps)
1641{
1642 struct kv_ps *new_ps = kv_get_ps(new_rps);
1643 struct kv_power_info *pi = kv_get_pi(rdev);
1644 int ret = 0;
1645 u8 clk_bypass_cntl;
1646
1647 if (pi->caps_enable_dfs_bypass) {
1648 clk_bypass_cntl = new_ps->need_dfs_bypass ?
1649 pi->graphics_level[pi->graphics_boot_level].ClkBypassCntl : 0;
1650 ret = kv_copy_bytes_to_smc(rdev,
1651 (pi->dpm_table_start +
1652 offsetof(SMU7_Fusion_DpmTable, GraphicsLevel) +
1653 (pi->graphics_boot_level * sizeof(SMU7_Fusion_GraphicsLevel)) +
1654 offsetof(SMU7_Fusion_GraphicsLevel, ClkBypassCntl)),
1655 &clk_bypass_cntl,
1656 sizeof(u8), pi->sram_end);
1657 }
1658
1659 return ret;
1660}
1661
1662static int kv_enable_nb_dpm(struct radeon_device *rdev)
1663{
1664 struct kv_power_info *pi = kv_get_pi(rdev);
1665 int ret = 0;
1666
1667 if (pi->enable_nb_dpm && !pi->nb_dpm_enabled) {
1668 ret = kv_notify_message_to_smu(rdev, PPSMC_MSG_NBDPM_Enable);
1669 if (ret == 0)
1670 pi->nb_dpm_enabled = true;
1671 }
1672
1673 return ret;
1674}
1675
1676int kv_dpm_force_performance_level(struct radeon_device *rdev,
1677 enum radeon_dpm_forced_level level)
1678{
1679 int ret;
1680
1681 if (level == RADEON_DPM_FORCED_LEVEL_HIGH) {
1682 ret = kv_force_dpm_highest(rdev);
1683 if (ret)
1684 return ret;
1685 } else if (level == RADEON_DPM_FORCED_LEVEL_LOW) {
1686 ret = kv_force_dpm_lowest(rdev);
1687 if (ret)
1688 return ret;
1689 } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) {
1690 ret = kv_unforce_levels(rdev);
1691 if (ret)
1692 return ret;
1693 }
1694
1695 rdev->pm.dpm.forced_level = level;
1696
1697 return 0;
1698}
1699
1700int kv_dpm_pre_set_power_state(struct radeon_device *rdev)
1701{
1702 struct kv_power_info *pi = kv_get_pi(rdev);
1703 struct radeon_ps requested_ps = *rdev->pm.dpm.requested_ps;
1704 struct radeon_ps *new_ps = &requested_ps;
1705
1706 kv_update_requested_ps(rdev, new_ps);
1707
1708 kv_apply_state_adjust_rules(rdev,
1709 &pi->requested_rps,
1710 &pi->current_rps);
1711
1712 return 0;
1713}
1714
1715int kv_dpm_set_power_state(struct radeon_device *rdev)
1716{
1717 struct kv_power_info *pi = kv_get_pi(rdev);
1718 struct radeon_ps *new_ps = &pi->requested_rps;
1719 /*struct radeon_ps *old_ps = &pi->current_rps;*/
1720 int ret;
1721
1722 cik_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
1723 RADEON_CG_BLOCK_SDMA |
1724 RADEON_CG_BLOCK_BIF |
1725 RADEON_CG_BLOCK_HDP), false);
1726
1727 if (rdev->family == CHIP_KABINI) {
1728 if (pi->enable_dpm) {
1729 kv_set_valid_clock_range(rdev, new_ps);
1730 kv_update_dfs_bypass_settings(rdev, new_ps);
1731 ret = kv_calculate_ds_divider(rdev);
1732 if (ret) {
1733 DRM_ERROR("kv_calculate_ds_divider failed\n");
1734 return ret;
1735 }
1736 kv_calculate_nbps_level_settings(rdev);
1737 kv_calculate_dpm_settings(rdev);
1738 kv_force_lowest_valid(rdev);
1739 kv_enable_new_levels(rdev);
1740 kv_upload_dpm_settings(rdev);
1741 kv_program_nbps_index_settings(rdev, new_ps);
1742 kv_unforce_levels(rdev);
1743 kv_set_enabled_levels(rdev);
1744 kv_force_lowest_valid(rdev);
1745 kv_unforce_levels(rdev);
1746#if 0
1747 ret = kv_update_vce_dpm(rdev, new_ps, old_ps);
1748 if (ret) {
1749 DRM_ERROR("kv_update_vce_dpm failed\n");
1750 return ret;
1751 }
1752#endif
1753 kv_update_sclk_t(rdev);
1754 }
1755 } else {
1756 if (pi->enable_dpm) {
1757 kv_set_valid_clock_range(rdev, new_ps);
1758 kv_update_dfs_bypass_settings(rdev, new_ps);
1759 ret = kv_calculate_ds_divider(rdev);
1760 if (ret) {
1761 DRM_ERROR("kv_calculate_ds_divider failed\n");
1762 return ret;
1763 }
1764 kv_calculate_nbps_level_settings(rdev);
1765 kv_calculate_dpm_settings(rdev);
1766 kv_freeze_sclk_dpm(rdev, true);
1767 kv_upload_dpm_settings(rdev);
1768 kv_program_nbps_index_settings(rdev, new_ps);
1769 kv_freeze_sclk_dpm(rdev, false);
1770 kv_set_enabled_levels(rdev);
1771#if 0
1772 ret = kv_update_vce_dpm(rdev, new_ps, old_ps);
1773 if (ret) {
1774 DRM_ERROR("kv_update_vce_dpm failed\n");
1775 return ret;
1776 }
1777#endif
1778 kv_update_sclk_t(rdev);
1779 kv_enable_nb_dpm(rdev);
1780 }
1781 }
1782
1783 cik_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
1784 RADEON_CG_BLOCK_SDMA |
1785 RADEON_CG_BLOCK_BIF |
1786 RADEON_CG_BLOCK_HDP), true);
1787
1788 rdev->pm.dpm.forced_level = RADEON_DPM_FORCED_LEVEL_AUTO;
1789 return 0;
1790}
1791
1792void kv_dpm_post_set_power_state(struct radeon_device *rdev)
1793{
1794 struct kv_power_info *pi = kv_get_pi(rdev);
1795 struct radeon_ps *new_ps = &pi->requested_rps;
1796
1797 kv_update_current_ps(rdev, new_ps);
1798}
1799
1800void kv_dpm_setup_asic(struct radeon_device *rdev)
1801{
1802 sumo_take_smu_control(rdev, true);
1803 kv_init_powergate_state(rdev);
1804 kv_init_sclk_t(rdev);
1805}
1806
1807void kv_dpm_reset_asic(struct radeon_device *rdev)
1808{
1809 kv_force_lowest_valid(rdev);
1810 kv_init_graphics_levels(rdev);
1811 kv_program_bootup_state(rdev);
1812 kv_upload_dpm_settings(rdev);
1813 kv_force_lowest_valid(rdev);
1814 kv_unforce_levels(rdev);
1815}
1816
1817//XXX use sumo_dpm_display_configuration_changed
1818
1819static void kv_construct_max_power_limits_table(struct radeon_device *rdev,
1820 struct radeon_clock_and_voltage_limits *table)
1821{
1822 struct kv_power_info *pi = kv_get_pi(rdev);
1823
1824 if (pi->sys_info.sclk_voltage_mapping_table.num_max_dpm_entries > 0) {
1825 int idx = pi->sys_info.sclk_voltage_mapping_table.num_max_dpm_entries - 1;
1826 table->sclk =
1827 pi->sys_info.sclk_voltage_mapping_table.entries[idx].sclk_frequency;
1828 table->vddc =
1829 kv_convert_2bit_index_to_voltage(rdev,
1830 pi->sys_info.sclk_voltage_mapping_table.entries[idx].vid_2bit);
1831 }
1832
1833 table->mclk = pi->sys_info.nbp_memory_clock[0];
1834}
1835
1836static void kv_patch_voltage_values(struct radeon_device *rdev)
1837{
1838 int i;
1839 struct radeon_uvd_clock_voltage_dependency_table *table =
1840 &rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table;
1841
1842 if (table->count) {
1843 for (i = 0; i < table->count; i++)
1844 table->entries[i].v =
1845 kv_convert_8bit_index_to_voltage(rdev,
1846 table->entries[i].v);
1847 }
1848
1849}
1850
1851static void kv_construct_boot_state(struct radeon_device *rdev)
1852{
1853 struct kv_power_info *pi = kv_get_pi(rdev);
1854
1855 pi->boot_pl.sclk = pi->sys_info.bootup_sclk;
1856 pi->boot_pl.vddc_index = pi->sys_info.bootup_nb_voltage_index;
1857 pi->boot_pl.ds_divider_index = 0;
1858 pi->boot_pl.ss_divider_index = 0;
1859 pi->boot_pl.allow_gnb_slow = 1;
1860 pi->boot_pl.force_nbp_state = 0;
1861 pi->boot_pl.display_wm = 0;
1862 pi->boot_pl.vce_wm = 0;
1863}
1864
1865static int kv_force_dpm_highest(struct radeon_device *rdev)
1866{
1867 int ret;
1868 u32 enable_mask, i;
1869
1870 ret = kv_dpm_get_enable_mask(rdev, &enable_mask);
1871 if (ret)
1872 return ret;
1873
1874 for (i = SMU7_MAX_LEVELS_GRAPHICS - 1; i >= 0; i--) {
1875 if (enable_mask & (1 << i))
1876 break;
1877 }
1878
1879 return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i);
1880}
1881
1882static int kv_force_dpm_lowest(struct radeon_device *rdev)
1883{
1884 int ret;
1885 u32 enable_mask, i;
1886
1887 ret = kv_dpm_get_enable_mask(rdev, &enable_mask);
1888 if (ret)
1889 return ret;
1890
1891 for (i = 0; i < SMU7_MAX_LEVELS_GRAPHICS; i++) {
1892 if (enable_mask & (1 << i))
1893 break;
1894 }
1895
1896 return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i);
1897}
1898
1899static u8 kv_get_sleep_divider_id_from_clock(struct radeon_device *rdev,
1900 u32 sclk, u32 min_sclk_in_sr)
1901{
1902 struct kv_power_info *pi = kv_get_pi(rdev);
1903 u32 i;
1904 u32 temp;
1905 u32 min = (min_sclk_in_sr > KV_MINIMUM_ENGINE_CLOCK) ?
1906 min_sclk_in_sr : KV_MINIMUM_ENGINE_CLOCK;
1907
1908 if (sclk < min)
1909 return 0;
1910
1911 if (!pi->caps_sclk_ds)
1912 return 0;
1913
1914 for (i = KV_MAX_DEEPSLEEP_DIVIDER_ID; i <= 0; i--) {
1915 temp = sclk / sumo_get_sleep_divider_from_id(i);
1916 if ((temp >= min) || (i == 0))
1917 break;
1918 }
1919
1920 return (u8)i;
1921}
1922
1923static int kv_get_high_voltage_limit(struct radeon_device *rdev, int *limit)
1924{
1925 struct kv_power_info *pi = kv_get_pi(rdev);
1926 struct radeon_clock_voltage_dependency_table *table =
1927 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
1928 int i;
1929
1930 if (table && table->count) {
1931 for (i = table->count - 1; i >= 0; i--) {
1932 if (pi->high_voltage_t &&
1933 (kv_convert_8bit_index_to_voltage(rdev, table->entries[i].v) <=
1934 pi->high_voltage_t)) {
1935 *limit = i;
1936 return 0;
1937 }
1938 }
1939 } else {
1940 struct sumo_sclk_voltage_mapping_table *table =
1941 &pi->sys_info.sclk_voltage_mapping_table;
1942
1943 for (i = table->num_max_dpm_entries - 1; i >= 0; i--) {
1944 if (pi->high_voltage_t &&
1945 (kv_convert_2bit_index_to_voltage(rdev, table->entries[i].vid_2bit) <=
1946 pi->high_voltage_t)) {
1947 *limit = i;
1948 return 0;
1949 }
1950 }
1951 }
1952
1953 *limit = 0;
1954 return 0;
1955}
1956
1957static void kv_apply_state_adjust_rules(struct radeon_device *rdev,
1958 struct radeon_ps *new_rps,
1959 struct radeon_ps *old_rps)
1960{
1961 struct kv_ps *ps = kv_get_ps(new_rps);
1962 struct kv_power_info *pi = kv_get_pi(rdev);
1963 u32 min_sclk = 10000; /* ??? */
1964 u32 sclk, mclk = 0;
1965 int i, limit;
1966 bool force_high;
1967 struct radeon_clock_voltage_dependency_table *table =
1968 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
1969 u32 stable_p_state_sclk = 0;
1970 struct radeon_clock_and_voltage_limits *max_limits =
1971 &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
1972
1973 mclk = max_limits->mclk;
1974 sclk = min_sclk;
1975
1976 if (pi->caps_stable_p_state) {
1977 stable_p_state_sclk = (max_limits->sclk * 75) / 100;
1978
1979 for (i = table->count - 1; i >= 0; i++) {
1980 if (stable_p_state_sclk >= table->entries[i].clk) {
1981 stable_p_state_sclk = table->entries[i].clk;
1982 break;
1983 }
1984 }
1985
1986 if (i > 0)
1987 stable_p_state_sclk = table->entries[0].clk;
1988
1989 sclk = stable_p_state_sclk;
1990 }
1991
1992 ps->need_dfs_bypass = true;
1993
1994 for (i = 0; i < ps->num_levels; i++) {
1995 if (ps->levels[i].sclk < sclk)
1996 ps->levels[i].sclk = sclk;
1997 }
1998
1999 if (table && table->count) {
2000 for (i = 0; i < ps->num_levels; i++) {
2001 if (pi->high_voltage_t &&
2002 (pi->high_voltage_t <
2003 kv_convert_8bit_index_to_voltage(rdev, ps->levels[i].vddc_index))) {
2004 kv_get_high_voltage_limit(rdev, &limit);
2005 ps->levels[i].sclk = table->entries[limit].clk;
2006 }
2007 }
2008 } else {
2009 struct sumo_sclk_voltage_mapping_table *table =
2010 &pi->sys_info.sclk_voltage_mapping_table;
2011
2012 for (i = 0; i < ps->num_levels; i++) {
2013 if (pi->high_voltage_t &&
2014 (pi->high_voltage_t <
2015 kv_convert_8bit_index_to_voltage(rdev, ps->levels[i].vddc_index))) {
2016 kv_get_high_voltage_limit(rdev, &limit);
2017 ps->levels[i].sclk = table->entries[limit].sclk_frequency;
2018 }
2019 }
2020 }
2021
2022 if (pi->caps_stable_p_state) {
2023 for (i = 0; i < ps->num_levels; i++) {
2024 ps->levels[i].sclk = stable_p_state_sclk;
2025 }
2026 }
2027
2028 pi->video_start = new_rps->dclk || new_rps->vclk;
2029
2030 if ((new_rps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK) ==
2031 ATOM_PPLIB_CLASSIFICATION_UI_BATTERY)
2032 pi->battery_state = true;
2033 else
2034 pi->battery_state = false;
2035
2036 if (rdev->family == CHIP_KABINI) {
2037 ps->dpm0_pg_nb_ps_lo = 0x1;
2038 ps->dpm0_pg_nb_ps_hi = 0x0;
2039 ps->dpmx_nb_ps_lo = 0x1;
2040 ps->dpmx_nb_ps_hi = 0x0;
2041 } else {
2042 ps->dpm0_pg_nb_ps_lo = 0x1;
2043 ps->dpm0_pg_nb_ps_hi = 0x0;
2044 ps->dpmx_nb_ps_lo = 0x2;
2045 ps->dpmx_nb_ps_hi = 0x1;
2046
2047 if (pi->sys_info.nb_dpm_enable && pi->battery_state) {
2048 force_high = (mclk >= pi->sys_info.nbp_memory_clock[3]) ||
2049 pi->video_start || (rdev->pm.dpm.new_active_crtc_count >= 3) ||
2050 pi->disable_nb_ps3_in_battery;
2051 ps->dpm0_pg_nb_ps_lo = force_high ? 0x2 : 0x3;
2052 ps->dpm0_pg_nb_ps_hi = 0x2;
2053 ps->dpmx_nb_ps_lo = force_high ? 0x2 : 0x3;
2054 ps->dpmx_nb_ps_hi = 0x2;
2055 }
2056 }
2057}
2058
2059static void kv_dpm_power_level_enabled_for_throttle(struct radeon_device *rdev,
2060 u32 index, bool enable)
2061{
2062 struct kv_power_info *pi = kv_get_pi(rdev);
2063
2064 pi->graphics_level[index].EnabledForThrottle = enable ? 1 : 0;
2065}
2066
2067static int kv_calculate_ds_divider(struct radeon_device *rdev)
2068{
2069 struct kv_power_info *pi = kv_get_pi(rdev);
2070 u32 sclk_in_sr = 10000; /* ??? */
2071 u32 i;
2072
2073 if (pi->lowest_valid > pi->highest_valid)
2074 return -EINVAL;
2075
2076 for (i = pi->lowest_valid; i <= pi->highest_valid; i++) {
2077 pi->graphics_level[i].DeepSleepDivId =
2078 kv_get_sleep_divider_id_from_clock(rdev,
2079 be32_to_cpu(pi->graphics_level[i].SclkFrequency),
2080 sclk_in_sr);
2081 }
2082 return 0;
2083}
2084
2085static int kv_calculate_nbps_level_settings(struct radeon_device *rdev)
2086{
2087 struct kv_power_info *pi = kv_get_pi(rdev);
2088 u32 i;
2089 bool force_high;
2090 struct radeon_clock_and_voltage_limits *max_limits =
2091 &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
2092 u32 mclk = max_limits->mclk;
2093
2094 if (pi->lowest_valid > pi->highest_valid)
2095 return -EINVAL;
2096
2097 if (rdev->family == CHIP_KABINI) {
2098 for (i = pi->lowest_valid; i <= pi->highest_valid; i++) {
2099 pi->graphics_level[i].GnbSlow = 1;
2100 pi->graphics_level[i].ForceNbPs1 = 0;
2101 pi->graphics_level[i].UpH = 0;
2102 }
2103
2104 if (!pi->sys_info.nb_dpm_enable)
2105 return 0;
2106
2107 force_high = ((mclk >= pi->sys_info.nbp_memory_clock[3]) ||
2108 (rdev->pm.dpm.new_active_crtc_count >= 3) || pi->video_start);
2109
2110 if (force_high) {
2111 for (i = pi->lowest_valid; i <= pi->highest_valid; i++)
2112 pi->graphics_level[i].GnbSlow = 0;
2113 } else {
2114 if (pi->battery_state)
2115 pi->graphics_level[0].ForceNbPs1 = 1;
2116
2117 pi->graphics_level[1].GnbSlow = 0;
2118 pi->graphics_level[2].GnbSlow = 0;
2119 pi->graphics_level[3].GnbSlow = 0;
2120 pi->graphics_level[4].GnbSlow = 0;
2121 }
2122 } else {
2123 for (i = pi->lowest_valid; i <= pi->highest_valid; i++) {
2124 pi->graphics_level[i].GnbSlow = 1;
2125 pi->graphics_level[i].ForceNbPs1 = 0;
2126 pi->graphics_level[i].UpH = 0;
2127 }
2128
2129 if (pi->sys_info.nb_dpm_enable && pi->battery_state) {
2130 pi->graphics_level[pi->lowest_valid].UpH = 0x28;
2131 pi->graphics_level[pi->lowest_valid].GnbSlow = 0;
2132 if (pi->lowest_valid != pi->highest_valid)
2133 pi->graphics_level[pi->lowest_valid].ForceNbPs1 = 1;
2134 }
2135 }
2136 return 0;
2137}
2138
2139static int kv_calculate_dpm_settings(struct radeon_device *rdev)
2140{
2141 struct kv_power_info *pi = kv_get_pi(rdev);
2142 u32 i;
2143
2144 if (pi->lowest_valid > pi->highest_valid)
2145 return -EINVAL;
2146
2147 for (i = pi->lowest_valid; i <= pi->highest_valid; i++)
2148 pi->graphics_level[i].DisplayWatermark = (i == pi->highest_valid) ? 1 : 0;
2149
2150 return 0;
2151}
2152
2153static void kv_init_graphics_levels(struct radeon_device *rdev)
2154{
2155 struct kv_power_info *pi = kv_get_pi(rdev);
2156 u32 i;
2157 struct radeon_clock_voltage_dependency_table *table =
2158 &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
2159
2160 if (table && table->count) {
2161 u32 vid_2bit;
2162
2163 pi->graphics_dpm_level_count = 0;
2164 for (i = 0; i < table->count; i++) {
2165 if (pi->high_voltage_t &&
2166 (pi->high_voltage_t <
2167 kv_convert_8bit_index_to_voltage(rdev, table->entries[i].v)))
2168 break;
2169
2170 kv_set_divider_value(rdev, i, table->entries[i].clk);
2171 vid_2bit = sumo_convert_vid7_to_vid2(rdev,
2172 &pi->sys_info.vid_mapping_table,
2173 table->entries[i].v);
2174 kv_set_vid(rdev, i, vid_2bit);
2175 kv_set_at(rdev, i, pi->at[i]);
2176 kv_dpm_power_level_enabled_for_throttle(rdev, i, true);
2177 pi->graphics_dpm_level_count++;
2178 }
2179 } else {
2180 struct sumo_sclk_voltage_mapping_table *table =
2181 &pi->sys_info.sclk_voltage_mapping_table;
2182
2183 pi->graphics_dpm_level_count = 0;
2184 for (i = 0; i < table->num_max_dpm_entries; i++) {
2185 if (pi->high_voltage_t &&
2186 pi->high_voltage_t <
2187 kv_convert_2bit_index_to_voltage(rdev, table->entries[i].vid_2bit))
2188 break;
2189
2190 kv_set_divider_value(rdev, i, table->entries[i].sclk_frequency);
2191 kv_set_vid(rdev, i, table->entries[i].vid_2bit);
2192 kv_set_at(rdev, i, pi->at[i]);
2193 kv_dpm_power_level_enabled_for_throttle(rdev, i, true);
2194 pi->graphics_dpm_level_count++;
2195 }
2196 }
2197
2198 for (i = 0; i < SMU7_MAX_LEVELS_GRAPHICS; i++)
2199 kv_dpm_power_level_enable(rdev, i, false);
2200}
2201
2202static void kv_enable_new_levels(struct radeon_device *rdev)
2203{
2204 struct kv_power_info *pi = kv_get_pi(rdev);
2205 u32 i;
2206
2207 for (i = 0; i < SMU7_MAX_LEVELS_GRAPHICS; i++) {
2208 if (i >= pi->lowest_valid && i <= pi->highest_valid)
2209 kv_dpm_power_level_enable(rdev, i, true);
2210 }
2211}
2212
2213static int kv_set_enabled_levels(struct radeon_device *rdev)
2214{
2215 struct kv_power_info *pi = kv_get_pi(rdev);
2216 u32 i, new_mask = 0;
2217
2218 for (i = pi->lowest_valid; i <= pi->highest_valid; i++)
2219 new_mask |= (1 << i);
2220
2221 return kv_send_msg_to_smc_with_parameter(rdev,
2222 PPSMC_MSG_SCLKDPM_SetEnabledMask,
2223 new_mask);
2224}
2225
2226static void kv_program_nbps_index_settings(struct radeon_device *rdev,
2227 struct radeon_ps *new_rps)
2228{
2229 struct kv_ps *new_ps = kv_get_ps(new_rps);
2230 struct kv_power_info *pi = kv_get_pi(rdev);
2231 u32 nbdpmconfig1;
2232
2233 if (rdev->family == CHIP_KABINI)
2234 return;
2235
2236 if (pi->sys_info.nb_dpm_enable) {
2237 nbdpmconfig1 = RREG32_SMC(NB_DPM_CONFIG_1);
2238 nbdpmconfig1 &= ~(Dpm0PgNbPsLo_MASK | Dpm0PgNbPsHi_MASK |
2239 DpmXNbPsLo_MASK | DpmXNbPsHi_MASK);
2240 nbdpmconfig1 |= (Dpm0PgNbPsLo(new_ps->dpm0_pg_nb_ps_lo) |
2241 Dpm0PgNbPsHi(new_ps->dpm0_pg_nb_ps_hi) |
2242 DpmXNbPsLo(new_ps->dpmx_nb_ps_lo) |
2243 DpmXNbPsHi(new_ps->dpmx_nb_ps_hi));
2244 WREG32_SMC(NB_DPM_CONFIG_1, nbdpmconfig1);
2245 }
2246}
2247
2248static int kv_set_thermal_temperature_range(struct radeon_device *rdev,
2249 int min_temp, int max_temp)
2250{
2251 int low_temp = 0 * 1000;
2252 int high_temp = 255 * 1000;
2253 u32 tmp;
2254
2255 if (low_temp < min_temp)
2256 low_temp = min_temp;
2257 if (high_temp > max_temp)
2258 high_temp = max_temp;
2259 if (high_temp < low_temp) {
2260 DRM_ERROR("invalid thermal range: %d - %d\n", low_temp, high_temp);
2261 return -EINVAL;
2262 }
2263
2264 tmp = RREG32_SMC(CG_THERMAL_INT_CTRL);
2265 tmp &= ~(DIG_THERM_INTH_MASK | DIG_THERM_INTL_MASK);
2266 tmp |= (DIG_THERM_INTH(49 + (high_temp / 1000)) |
2267 DIG_THERM_INTL(49 + (low_temp / 1000)));
2268 WREG32_SMC(CG_THERMAL_INT_CTRL, tmp);
2269
2270 rdev->pm.dpm.thermal.min_temp = low_temp;
2271 rdev->pm.dpm.thermal.max_temp = high_temp;
2272
2273 return 0;
2274}
2275
2276union igp_info {
2277 struct _ATOM_INTEGRATED_SYSTEM_INFO info;
2278 struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
2279 struct _ATOM_INTEGRATED_SYSTEM_INFO_V5 info_5;
2280 struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6;
2281 struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7;
2282 struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_8 info_8;
2283};
2284
2285static int kv_parse_sys_info_table(struct radeon_device *rdev)
2286{
2287 struct kv_power_info *pi = kv_get_pi(rdev);
2288 struct radeon_mode_info *mode_info = &rdev->mode_info;
2289 int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
2290 union igp_info *igp_info;
2291 u8 frev, crev;
2292 u16 data_offset;
2293 int i;
2294
2295 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2296 &frev, &crev, &data_offset)) {
2297 igp_info = (union igp_info *)(mode_info->atom_context->bios +
2298 data_offset);
2299
2300 if (crev != 8) {
2301 DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev);
2302 return -EINVAL;
2303 }
2304 pi->sys_info.bootup_sclk = le32_to_cpu(igp_info->info_8.ulBootUpEngineClock);
2305 pi->sys_info.bootup_uma_clk = le32_to_cpu(igp_info->info_8.ulBootUpUMAClock);
2306 pi->sys_info.bootup_nb_voltage_index =
2307 le16_to_cpu(igp_info->info_8.usBootUpNBVoltage);
2308 if (igp_info->info_8.ucHtcTmpLmt == 0)
2309 pi->sys_info.htc_tmp_lmt = 203;
2310 else
2311 pi->sys_info.htc_tmp_lmt = igp_info->info_8.ucHtcTmpLmt;
2312 if (igp_info->info_8.ucHtcHystLmt == 0)
2313 pi->sys_info.htc_hyst_lmt = 5;
2314 else
2315 pi->sys_info.htc_hyst_lmt = igp_info->info_8.ucHtcHystLmt;
2316 if (pi->sys_info.htc_tmp_lmt <= pi->sys_info.htc_hyst_lmt) {
2317 DRM_ERROR("The htcTmpLmt should be larger than htcHystLmt.\n");
2318 }
2319
2320 if (le32_to_cpu(igp_info->info_8.ulSystemConfig) & (1 << 3))
2321 pi->sys_info.nb_dpm_enable = true;
2322 else
2323 pi->sys_info.nb_dpm_enable = false;
2324
2325 for (i = 0; i < KV_NUM_NBPSTATES; i++) {
2326 pi->sys_info.nbp_memory_clock[i] =
2327 le32_to_cpu(igp_info->info_8.ulNbpStateMemclkFreq[i]);
2328 pi->sys_info.nbp_n_clock[i] =
2329 le32_to_cpu(igp_info->info_8.ulNbpStateNClkFreq[i]);
2330 }
2331 if (le32_to_cpu(igp_info->info_8.ulGPUCapInfo) &
2332 SYS_INFO_GPUCAPS__ENABEL_DFS_BYPASS)
2333 pi->caps_enable_dfs_bypass = true;
2334
2335 sumo_construct_sclk_voltage_mapping_table(rdev,
2336 &pi->sys_info.sclk_voltage_mapping_table,
2337 igp_info->info_8.sAvail_SCLK);
2338
2339 sumo_construct_vid_mapping_table(rdev,
2340 &pi->sys_info.vid_mapping_table,
2341 igp_info->info_8.sAvail_SCLK);
2342
2343 kv_construct_max_power_limits_table(rdev,
2344 &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac);
2345 }
2346 return 0;
2347}
2348
2349union power_info {
2350 struct _ATOM_POWERPLAY_INFO info;
2351 struct _ATOM_POWERPLAY_INFO_V2 info_2;
2352 struct _ATOM_POWERPLAY_INFO_V3 info_3;
2353 struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
2354 struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
2355 struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
2356};
2357
2358union pplib_clock_info {
2359 struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
2360 struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
2361 struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
2362 struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
2363};
2364
2365union pplib_power_state {
2366 struct _ATOM_PPLIB_STATE v1;
2367 struct _ATOM_PPLIB_STATE_V2 v2;
2368};
2369
2370static void kv_patch_boot_state(struct radeon_device *rdev,
2371 struct kv_ps *ps)
2372{
2373 struct kv_power_info *pi = kv_get_pi(rdev);
2374
2375 ps->num_levels = 1;
2376 ps->levels[0] = pi->boot_pl;
2377}
2378
2379static void kv_parse_pplib_non_clock_info(struct radeon_device *rdev,
2380 struct radeon_ps *rps,
2381 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info,
2382 u8 table_rev)
2383{
2384 struct kv_ps *ps = kv_get_ps(rps);
2385
2386 rps->caps = le32_to_cpu(non_clock_info->ulCapsAndSettings);
2387 rps->class = le16_to_cpu(non_clock_info->usClassification);
2388 rps->class2 = le16_to_cpu(non_clock_info->usClassification2);
2389
2390 if (ATOM_PPLIB_NONCLOCKINFO_VER1 < table_rev) {
2391 rps->vclk = le32_to_cpu(non_clock_info->ulVCLK);
2392 rps->dclk = le32_to_cpu(non_clock_info->ulDCLK);
2393 } else {
2394 rps->vclk = 0;
2395 rps->dclk = 0;
2396 }
2397
2398 if (rps->class & ATOM_PPLIB_CLASSIFICATION_BOOT) {
2399 rdev->pm.dpm.boot_ps = rps;
2400 kv_patch_boot_state(rdev, ps);
2401 }
2402 if (rps->class & ATOM_PPLIB_CLASSIFICATION_UVDSTATE)
2403 rdev->pm.dpm.uvd_ps = rps;
2404}
2405
2406static void kv_parse_pplib_clock_info(struct radeon_device *rdev,
2407 struct radeon_ps *rps, int index,
2408 union pplib_clock_info *clock_info)
2409{
2410 struct kv_power_info *pi = kv_get_pi(rdev);
2411 struct kv_ps *ps = kv_get_ps(rps);
2412 struct kv_pl *pl = &ps->levels[index];
2413 u32 sclk;
2414
2415 sclk = le16_to_cpu(clock_info->sumo.usEngineClockLow);
2416 sclk |= clock_info->sumo.ucEngineClockHigh << 16;
2417 pl->sclk = sclk;
2418 pl->vddc_index = clock_info->sumo.vddcIndex;
2419
2420 ps->num_levels = index + 1;
2421
2422 if (pi->caps_sclk_ds) {
2423 pl->ds_divider_index = 5;
2424 pl->ss_divider_index = 5;
2425 }
2426}
2427
2428static int kv_parse_power_table(struct radeon_device *rdev)
2429{
2430 struct radeon_mode_info *mode_info = &rdev->mode_info;
2431 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2432 union pplib_power_state *power_state;
2433 int i, j, k, non_clock_array_index, clock_array_index;
2434 union pplib_clock_info *clock_info;
2435 struct _StateArray *state_array;
2436 struct _ClockInfoArray *clock_info_array;
2437 struct _NonClockInfoArray *non_clock_info_array;
2438 union power_info *power_info;
2439 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2440 u16 data_offset;
2441 u8 frev, crev;
2442 u8 *power_state_offset;
2443 struct kv_ps *ps;
2444
2445 if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2446 &frev, &crev, &data_offset))
2447 return -EINVAL;
2448 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2449
2450 state_array = (struct _StateArray *)
2451 (mode_info->atom_context->bios + data_offset +
2452 le16_to_cpu(power_info->pplib.usStateArrayOffset));
2453 clock_info_array = (struct _ClockInfoArray *)
2454 (mode_info->atom_context->bios + data_offset +
2455 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
2456 non_clock_info_array = (struct _NonClockInfoArray *)
2457 (mode_info->atom_context->bios + data_offset +
2458 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
2459
2460 rdev->pm.dpm.ps = kzalloc(sizeof(struct radeon_ps) *
2461 state_array->ucNumEntries, GFP_KERNEL);
2462 if (!rdev->pm.dpm.ps)
2463 return -ENOMEM;
2464 power_state_offset = (u8 *)state_array->states;
2465 rdev->pm.dpm.platform_caps = le32_to_cpu(power_info->pplib.ulPlatformCaps);
2466 rdev->pm.dpm.backbias_response_time = le16_to_cpu(power_info->pplib.usBackbiasTime);
2467 rdev->pm.dpm.voltage_response_time = le16_to_cpu(power_info->pplib.usVoltageTime);
2468 for (i = 0; i < state_array->ucNumEntries; i++) {
2469 u8 *idx;
2470 power_state = (union pplib_power_state *)power_state_offset;
2471 non_clock_array_index = power_state->v2.nonClockInfoIndex;
2472 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2473 &non_clock_info_array->nonClockInfo[non_clock_array_index];
2474 if (!rdev->pm.power_state[i].clock_info)
2475 return -EINVAL;
2476 ps = kzalloc(sizeof(struct kv_ps), GFP_KERNEL);
2477 if (ps == NULL) {
2478 kfree(rdev->pm.dpm.ps);
2479 return -ENOMEM;
2480 }
2481 rdev->pm.dpm.ps[i].ps_priv = ps;
2482 k = 0;
2483 idx = (u8 *)&power_state->v2.clockInfoIndex[0];
2484 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
2485 clock_array_index = idx[j];
2486 if (clock_array_index >= clock_info_array->ucNumEntries)
2487 continue;
2488 if (k >= SUMO_MAX_HARDWARE_POWERLEVELS)
2489 break;
2490 clock_info = (union pplib_clock_info *)
2491 ((u8 *)&clock_info_array->clockInfo[0] +
2492 (clock_array_index * clock_info_array->ucEntrySize));
2493 kv_parse_pplib_clock_info(rdev,
2494 &rdev->pm.dpm.ps[i], k,
2495 clock_info);
2496 k++;
2497 }
2498 kv_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i],
2499 non_clock_info,
2500 non_clock_info_array->ucEntrySize);
2501 power_state_offset += 2 + power_state->v2.ucNumDPMLevels;
2502 }
2503 rdev->pm.dpm.num_ps = state_array->ucNumEntries;
2504 return 0;
2505}
2506
2507int kv_dpm_init(struct radeon_device *rdev)
2508{
2509 struct kv_power_info *pi;
2510 int ret, i;
2511
2512 pi = kzalloc(sizeof(struct kv_power_info), GFP_KERNEL);
2513 if (pi == NULL)
2514 return -ENOMEM;
2515 rdev->pm.dpm.priv = pi;
2516
2517 ret = r600_parse_extended_power_table(rdev);
2518 if (ret)
2519 return ret;
2520
2521 for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++)
2522 pi->at[i] = TRINITY_AT_DFLT;
2523
2524 pi->sram_end = SMC_RAM_END;
2525
2526 if (rdev->family == CHIP_KABINI)
2527 pi->high_voltage_t = 4001;
2528
2529 pi->enable_nb_dpm = true;
2530
2531 pi->caps_power_containment = true;
2532 pi->caps_cac = true;
2533 pi->enable_didt = false;
2534 if (pi->enable_didt) {
2535 pi->caps_sq_ramping = true;
2536 pi->caps_db_ramping = true;
2537 pi->caps_td_ramping = true;
2538 pi->caps_tcp_ramping = true;
2539 }
2540
2541 pi->caps_sclk_ds = true;
2542 pi->enable_auto_thermal_throttling = true;
2543 pi->disable_nb_ps3_in_battery = false;
2544 pi->bapm_enable = true;
2545 pi->voltage_drop_t = 0;
2546 pi->caps_sclk_throttle_low_notification = false;
2547 pi->caps_fps = false; /* true? */
2548 pi->caps_uvd_pg = true;
2549 pi->caps_uvd_dpm = true;
2550 pi->caps_vce_pg = false;
2551 pi->caps_samu_pg = false;
2552 pi->caps_acp_pg = false;
2553 pi->caps_stable_p_state = false;
2554
2555 ret = kv_parse_sys_info_table(rdev);
2556 if (ret)
2557 return ret;
2558
2559 kv_patch_voltage_values(rdev);
2560 kv_construct_boot_state(rdev);
2561
2562 ret = kv_parse_power_table(rdev);
2563 if (ret)
2564 return ret;
2565
2566 pi->enable_dpm = true;
2567
2568 return 0;
2569}
2570
2571void kv_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
2572 struct seq_file *m)
2573{
2574 struct kv_power_info *pi = kv_get_pi(rdev);
2575 u32 current_index =
2576 (RREG32_SMC(TARGET_AND_CURRENT_PROFILE_INDEX) & CURR_SCLK_INDEX_MASK) >>
2577 CURR_SCLK_INDEX_SHIFT;
2578 u32 sclk, tmp;
2579 u16 vddc;
2580
2581 if (current_index >= SMU__NUM_SCLK_DPM_STATE) {
2582 seq_printf(m, "invalid dpm profile %d\n", current_index);
2583 } else {
2584 sclk = be32_to_cpu(pi->graphics_level[current_index].SclkFrequency);
2585 tmp = (RREG32_SMC(SMU_VOLTAGE_STATUS) & SMU_VOLTAGE_CURRENT_LEVEL_MASK) >>
2586 SMU_VOLTAGE_CURRENT_LEVEL_SHIFT;
2587 vddc = kv_convert_8bit_index_to_voltage(rdev, (u16)tmp);
2588 seq_printf(m, "power level %d sclk: %u vddc: %u\n",
2589 current_index, sclk, vddc);
2590 }
2591}
2592
2593void kv_dpm_print_power_state(struct radeon_device *rdev,
2594 struct radeon_ps *rps)
2595{
2596 int i;
2597 struct kv_ps *ps = kv_get_ps(rps);
2598
2599 r600_dpm_print_class_info(rps->class, rps->class2);
2600 r600_dpm_print_cap_info(rps->caps);
2601 printk("\tuvd vclk: %d dclk: %d\n", rps->vclk, rps->dclk);
2602 for (i = 0; i < ps->num_levels; i++) {
2603 struct kv_pl *pl = &ps->levels[i];
2604 printk("\t\tpower level %d sclk: %u vddc: %u\n",
2605 i, pl->sclk,
2606 kv_convert_8bit_index_to_voltage(rdev, pl->vddc_index));
2607 }
2608 r600_dpm_print_ps_status(rdev, rps);
2609}
2610
2611void kv_dpm_fini(struct radeon_device *rdev)
2612{
2613 int i;
2614
2615 for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
2616 kfree(rdev->pm.dpm.ps[i].ps_priv);
2617 }
2618 kfree(rdev->pm.dpm.ps);
2619 kfree(rdev->pm.dpm.priv);
2620 r600_free_extended_power_table(rdev);
2621}
2622
2623void kv_dpm_display_configuration_changed(struct radeon_device *rdev)
2624{
2625
2626}
2627
2628u32 kv_dpm_get_sclk(struct radeon_device *rdev, bool low)
2629{
2630 struct kv_power_info *pi = kv_get_pi(rdev);
2631 struct kv_ps *requested_state = kv_get_ps(&pi->requested_rps);
2632
2633 if (low)
2634 return requested_state->levels[0].sclk;
2635 else
2636 return requested_state->levels[requested_state->num_levels - 1].sclk;
2637}
2638
2639u32 kv_dpm_get_mclk(struct radeon_device *rdev, bool low)
2640{
2641 struct kv_power_info *pi = kv_get_pi(rdev);
2642
2643 return pi->sys_info.bootup_uma_clk;
2644}
2645
diff --git a/drivers/gpu/drm/radeon/kv_dpm.h b/drivers/gpu/drm/radeon/kv_dpm.h
new file mode 100644
index 000000000000..32bb079572d7
--- /dev/null
+++ b/drivers/gpu/drm/radeon/kv_dpm.h
@@ -0,0 +1,199 @@
1/*
2 * Copyright 2013 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#ifndef __KV_DPM_H__
24#define __KV_DPM_H__
25
26#define SMU__NUM_SCLK_DPM_STATE 8
27#define SMU__NUM_MCLK_DPM_LEVELS 4
28#define SMU__NUM_LCLK_DPM_LEVELS 8
29#define SMU__NUM_PCIE_DPM_LEVELS 0 /* ??? */
30#include "smu7_fusion.h"
31#include "trinity_dpm.h"
32#include "ppsmc.h"
33
34#define KV_NUM_NBPSTATES 4
35
36enum kv_pt_config_reg_type {
37 KV_CONFIGREG_MMR = 0,
38 KV_CONFIGREG_SMC_IND,
39 KV_CONFIGREG_DIDT_IND,
40 KV_CONFIGREG_CACHE,
41 KV_CONFIGREG_MAX
42};
43
44struct kv_pt_config_reg {
45 u32 offset;
46 u32 mask;
47 u32 shift;
48 u32 value;
49 enum kv_pt_config_reg_type type;
50};
51
52struct kv_lcac_config_values {
53 u32 block_id;
54 u32 signal_id;
55 u32 t;
56};
57
58struct kv_lcac_config_reg {
59 u32 cntl;
60 u32 block_mask;
61 u32 block_shift;
62 u32 signal_mask;
63 u32 signal_shift;
64 u32 t_mask;
65 u32 t_shift;
66 u32 enable_mask;
67 u32 enable_shift;
68};
69
70struct kv_pl {
71 u32 sclk;
72 u8 vddc_index;
73 u8 ds_divider_index;
74 u8 ss_divider_index;
75 u8 allow_gnb_slow;
76 u8 force_nbp_state;
77 u8 display_wm;
78 u8 vce_wm;
79};
80
81struct kv_ps {
82 struct kv_pl levels[SUMO_MAX_HARDWARE_POWERLEVELS];
83 u32 num_levels;
84 bool need_dfs_bypass;
85 u8 dpm0_pg_nb_ps_lo;
86 u8 dpm0_pg_nb_ps_hi;
87 u8 dpmx_nb_ps_lo;
88 u8 dpmx_nb_ps_hi;
89};
90
91struct kv_sys_info {
92 u32 bootup_uma_clk;
93 u32 bootup_sclk;
94 u32 dentist_vco_freq;
95 u32 nb_dpm_enable;
96 u32 nbp_memory_clock[KV_NUM_NBPSTATES];
97 u32 nbp_n_clock[KV_NUM_NBPSTATES];
98 u16 bootup_nb_voltage_index;
99 u8 htc_tmp_lmt;
100 u8 htc_hyst_lmt;
101 struct sumo_sclk_voltage_mapping_table sclk_voltage_mapping_table;
102 struct sumo_vid_mapping_table vid_mapping_table;
103 u32 uma_channel_number;
104};
105
106struct kv_power_info {
107 u32 at[SUMO_MAX_HARDWARE_POWERLEVELS];
108 u32 voltage_drop_t;
109 struct kv_sys_info sys_info;
110 struct kv_pl boot_pl;
111 bool enable_nb_ps_policy;
112 bool disable_nb_ps3_in_battery;
113 bool video_start;
114 bool battery_state;
115 u32 lowest_valid;
116 u32 highest_valid;
117 u16 high_voltage_t;
118 bool cac_enabled;
119 bool bapm_enable;
120 /* smc offsets */
121 u32 sram_end;
122 u32 dpm_table_start;
123 u32 soft_regs_start;
124 /* dpm SMU tables */
125 u8 graphics_dpm_level_count;
126 u8 uvd_level_count;
127 u8 vce_level_count;
128 u8 acp_level_count;
129 u8 samu_level_count;
130 u16 fps_high_t;
131 SMU7_Fusion_GraphicsLevel graphics_level[SMU__NUM_SCLK_DPM_STATE];
132 SMU7_Fusion_ACPILevel acpi_level;
133 SMU7_Fusion_UvdLevel uvd_level[SMU7_MAX_LEVELS_UVD];
134 SMU7_Fusion_ExtClkLevel vce_level[SMU7_MAX_LEVELS_VCE];
135 SMU7_Fusion_ExtClkLevel acp_level[SMU7_MAX_LEVELS_ACP];
136 SMU7_Fusion_ExtClkLevel samu_level[SMU7_MAX_LEVELS_SAMU];
137 u8 uvd_boot_level;
138 u8 vce_boot_level;
139 u8 acp_boot_level;
140 u8 samu_boot_level;
141 u8 uvd_interval;
142 u8 vce_interval;
143 u8 acp_interval;
144 u8 samu_interval;
145 u8 graphics_boot_level;
146 u8 graphics_interval;
147 u8 graphics_therm_throttle_enable;
148 u8 graphics_voltage_change_enable;
149 u8 graphics_clk_slow_enable;
150 u8 graphics_clk_slow_divider;
151 u8 fps_low_t;
152 u32 low_sclk_interrupt_t;
153 bool uvd_power_gated;
154 bool vce_power_gated;
155 bool acp_power_gated;
156 bool samu_power_gated;
157 bool nb_dpm_enabled;
158 /* flags */
159 bool enable_didt;
160 bool enable_dpm;
161 bool enable_auto_thermal_throttling;
162 bool enable_nb_dpm;
163 /* caps */
164 bool caps_cac;
165 bool caps_power_containment;
166 bool caps_sq_ramping;
167 bool caps_db_ramping;
168 bool caps_td_ramping;
169 bool caps_tcp_ramping;
170 bool caps_sclk_throttle_low_notification;
171 bool caps_fps;
172 bool caps_uvd_dpm;
173 bool caps_uvd_pg;
174 bool caps_vce_pg;
175 bool caps_samu_pg;
176 bool caps_acp_pg;
177 bool caps_stable_p_state;
178 bool caps_enable_dfs_bypass;
179 bool caps_sclk_ds;
180 struct radeon_ps current_rps;
181 struct kv_ps current_ps;
182 struct radeon_ps requested_rps;
183 struct kv_ps requested_ps;
184};
185
186
187/* kv_smc.c */
188int kv_notify_message_to_smu(struct radeon_device *rdev, u32 id);
189int kv_dpm_get_enable_mask(struct radeon_device *rdev, u32 *enable_mask);
190int kv_send_msg_to_smc_with_parameter(struct radeon_device *rdev,
191 PPSMC_Msg msg, u32 parameter);
192int kv_read_smc_sram_dword(struct radeon_device *rdev, u32 smc_address,
193 u32 *value, u32 limit);
194int kv_smc_dpm_enable(struct radeon_device *rdev, bool enable);
195int kv_copy_bytes_to_smc(struct radeon_device *rdev,
196 u32 smc_start_address,
197 const u8 *src, u32 byte_count, u32 limit);
198
199#endif
diff --git a/drivers/gpu/drm/radeon/kv_smc.c b/drivers/gpu/drm/radeon/kv_smc.c
new file mode 100644
index 000000000000..34a226d7e34a
--- /dev/null
+++ b/drivers/gpu/drm/radeon/kv_smc.c
@@ -0,0 +1,207 @@
1/*
2 * Copyright 2013 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: Alex Deucher
23 */
24
25#include "drmP.h"
26#include "radeon.h"
27#include "cikd.h"
28#include "kv_dpm.h"
29
30int kv_notify_message_to_smu(struct radeon_device *rdev, u32 id)
31{
32 u32 i;
33 u32 tmp = 0;
34
35 WREG32(SMC_MESSAGE_0, id & SMC_MSG_MASK);
36
37 for (i = 0; i < rdev->usec_timeout; i++) {
38 if ((RREG32(SMC_RESP_0) & SMC_RESP_MASK) != 0)
39 break;
40 udelay(1);
41 }
42 tmp = RREG32(SMC_RESP_0) & SMC_RESP_MASK;
43
44 if (tmp != 1) {
45 if (tmp == 0xFF)
46 return -EINVAL;
47 else if (tmp == 0xFE)
48 return -EINVAL;
49 }
50
51 return 0;
52}
53
54int kv_dpm_get_enable_mask(struct radeon_device *rdev, u32 *enable_mask)
55{
56 int ret;
57
58 ret = kv_notify_message_to_smu(rdev, PPSMC_MSG_SCLKDPM_GetEnabledMask);
59
60 if (ret == 0)
61 *enable_mask = RREG32_SMC(SMC_SYSCON_MSG_ARG_0);
62
63 return ret;
64}
65
66int kv_send_msg_to_smc_with_parameter(struct radeon_device *rdev,
67 PPSMC_Msg msg, u32 parameter)
68{
69
70 WREG32(SMC_MSG_ARG_0, parameter);
71
72 return kv_notify_message_to_smu(rdev, msg);
73}
74
75static int kv_set_smc_sram_address(struct radeon_device *rdev,
76 u32 smc_address, u32 limit)
77{
78 if (smc_address & 3)
79 return -EINVAL;
80 if ((smc_address + 3) > limit)
81 return -EINVAL;
82
83 WREG32(SMC_IND_INDEX_0, smc_address);
84 WREG32_P(SMC_IND_ACCESS_CNTL, 0, ~AUTO_INCREMENT_IND_0);
85
86 return 0;
87}
88
89int kv_read_smc_sram_dword(struct radeon_device *rdev, u32 smc_address,
90 u32 *value, u32 limit)
91{
92 int ret;
93
94 ret = kv_set_smc_sram_address(rdev, smc_address, limit);
95 if (ret)
96 return ret;
97
98 *value = RREG32(SMC_IND_DATA_0);
99 return 0;
100}
101
102int kv_smc_dpm_enable(struct radeon_device *rdev, bool enable)
103{
104 if (enable)
105 return kv_notify_message_to_smu(rdev, PPSMC_MSG_DPM_Enable);
106 else
107 return kv_notify_message_to_smu(rdev, PPSMC_MSG_DPM_Disable);
108}
109
110int kv_copy_bytes_to_smc(struct radeon_device *rdev,
111 u32 smc_start_address,
112 const u8 *src, u32 byte_count, u32 limit)
113{
114 int ret;
115 u32 data, original_data, addr, extra_shift, t_byte, count, mask;
116
117 if ((smc_start_address + byte_count) > limit)
118 return -EINVAL;
119
120 addr = smc_start_address;
121 t_byte = addr & 3;
122
123 /* RMW for the initial bytes */
124 if (t_byte != 0) {
125 addr -= t_byte;
126
127 ret = kv_set_smc_sram_address(rdev, addr, limit);
128 if (ret)
129 return ret;
130
131 original_data = RREG32(SMC_IND_DATA_0);
132
133 data = 0;
134 mask = 0;
135 count = 4;
136 while (count > 0) {
137 if (t_byte > 0) {
138 mask = (mask << 8) | 0xff;
139 t_byte--;
140 } else if (byte_count > 0) {
141 data = (data << 8) + *src++;
142 byte_count--;
143 mask <<= 8;
144 } else {
145 data <<= 8;
146 mask = (mask << 8) | 0xff;
147 }
148 count--;
149 }
150
151 data |= original_data & mask;
152
153 ret = kv_set_smc_sram_address(rdev, addr, limit);
154 if (ret)
155 return ret;
156
157 WREG32(SMC_IND_DATA_0, data);
158
159 addr += 4;
160 }
161
162 while (byte_count >= 4) {
163 /* SMC address space is BE */
164 data = (src[0] << 24) + (src[1] << 16) + (src[2] << 8) + src[3];
165
166 ret = kv_set_smc_sram_address(rdev, addr, limit);
167 if (ret)
168 return ret;
169
170 WREG32(SMC_IND_DATA_0, data);
171
172 src += 4;
173 byte_count -= 4;
174 addr += 4;
175 }
176
177 /* RMW for the final bytes */
178 if (byte_count > 0) {
179 data = 0;
180
181 ret = kv_set_smc_sram_address(rdev, addr, limit);
182 if (ret)
183 return ret;
184
185 original_data= RREG32(SMC_IND_DATA_0);
186
187 extra_shift = 8 * (4 - byte_count);
188
189 while (byte_count > 0) {
190 /* SMC address space is BE */
191 data = (data << 8) + *src++;
192 byte_count--;
193 }
194
195 data <<= extra_shift;
196
197 data |= (original_data & ~((~0UL) << extra_shift));
198
199 ret = kv_set_smc_sram_address(rdev, addr, limit);
200 if (ret)
201 return ret;
202
203 WREG32(SMC_IND_DATA_0, data);
204 }
205 return 0;
206}
207
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index 5b6e47765656..93c1f9ef5da9 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -35,7 +35,7 @@
35#include "radeon_ucode.h" 35#include "radeon_ucode.h"
36#include "clearstate_cayman.h" 36#include "clearstate_cayman.h"
37 37
38static u32 tn_rlc_save_restore_register_list[] = 38static const u32 tn_rlc_save_restore_register_list[] =
39{ 39{
40 0x98fc, 40 0x98fc,
41 0x98f0, 41 0x98f0,
@@ -160,7 +160,6 @@ static u32 tn_rlc_save_restore_register_list[] =
160 0x9830, 160 0x9830,
161 0x802c, 161 0x802c,
162}; 162};
163static u32 tn_rlc_save_restore_register_list_size = ARRAY_SIZE(tn_rlc_save_restore_register_list);
164 163
165extern bool evergreen_is_display_hung(struct radeon_device *rdev); 164extern bool evergreen_is_display_hung(struct radeon_device *rdev);
166extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev); 165extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
@@ -175,6 +174,11 @@ extern void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
175extern void evergreen_program_aspm(struct radeon_device *rdev); 174extern void evergreen_program_aspm(struct radeon_device *rdev);
176extern void sumo_rlc_fini(struct radeon_device *rdev); 175extern void sumo_rlc_fini(struct radeon_device *rdev);
177extern int sumo_rlc_init(struct radeon_device *rdev); 176extern int sumo_rlc_init(struct radeon_device *rdev);
177extern void cayman_dma_vm_set_page(struct radeon_device *rdev,
178 struct radeon_ib *ib,
179 uint64_t pe,
180 uint64_t addr, unsigned count,
181 uint32_t incr, uint32_t flags);
178 182
179/* Firmware Names */ 183/* Firmware Names */
180MODULE_FIRMWARE("radeon/BARTS_pfp.bin"); 184MODULE_FIRMWARE("radeon/BARTS_pfp.bin");
@@ -794,9 +798,13 @@ int ni_init_microcode(struct radeon_device *rdev)
794 if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) { 798 if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) {
795 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); 799 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
796 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); 800 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
797 if (err) 801 if (err) {
798 goto out; 802 printk(KERN_ERR
799 if (rdev->smc_fw->size != smc_req_size) { 803 "smc: error loading firmware \"%s\"\n",
804 fw_name);
805 release_firmware(rdev->smc_fw);
806 rdev->smc_fw = NULL;
807 } else if (rdev->smc_fw->size != smc_req_size) {
800 printk(KERN_ERR 808 printk(KERN_ERR
801 "ni_mc: Bogus length %zu in firmware \"%s\"\n", 809 "ni_mc: Bogus length %zu in firmware \"%s\"\n",
802 rdev->mc_fw->size, fw_name); 810 rdev->mc_fw->size, fw_name);
@@ -1370,23 +1378,6 @@ void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
1370 radeon_ring_write(ring, 10); /* poll interval */ 1378 radeon_ring_write(ring, 10); /* poll interval */
1371} 1379}
1372 1380
1373void cayman_uvd_semaphore_emit(struct radeon_device *rdev,
1374 struct radeon_ring *ring,
1375 struct radeon_semaphore *semaphore,
1376 bool emit_wait)
1377{
1378 uint64_t addr = semaphore->gpu_addr;
1379
1380 radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_LOW, 0));
1381 radeon_ring_write(ring, (addr >> 3) & 0x000FFFFF);
1382
1383 radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_HIGH, 0));
1384 radeon_ring_write(ring, (addr >> 23) & 0x000FFFFF);
1385
1386 radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0));
1387 radeon_ring_write(ring, 0x80 | (emit_wait ? 1 : 0));
1388}
1389
1390static void cayman_cp_enable(struct radeon_device *rdev, bool enable) 1381static void cayman_cp_enable(struct radeon_device *rdev, bool enable)
1391{ 1382{
1392 if (enable) 1383 if (enable)
@@ -1609,186 +1600,7 @@ static int cayman_cp_resume(struct radeon_device *rdev)
1609 return 0; 1600 return 0;
1610} 1601}
1611 1602
1612/* 1603u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
1613 * DMA
1614 * Starting with R600, the GPU has an asynchronous
1615 * DMA engine. The programming model is very similar
1616 * to the 3D engine (ring buffer, IBs, etc.), but the
1617 * DMA controller has it's own packet format that is
1618 * different form the PM4 format used by the 3D engine.
1619 * It supports copying data, writing embedded data,
1620 * solid fills, and a number of other things. It also
1621 * has support for tiling/detiling of buffers.
1622 * Cayman and newer support two asynchronous DMA engines.
1623 */
1624/**
1625 * cayman_dma_ring_ib_execute - Schedule an IB on the DMA engine
1626 *
1627 * @rdev: radeon_device pointer
1628 * @ib: IB object to schedule
1629 *
1630 * Schedule an IB in the DMA ring (cayman-SI).
1631 */
1632void cayman_dma_ring_ib_execute(struct radeon_device *rdev,
1633 struct radeon_ib *ib)
1634{
1635 struct radeon_ring *ring = &rdev->ring[ib->ring];
1636
1637 if (rdev->wb.enabled) {
1638 u32 next_rptr = ring->wptr + 4;
1639 while ((next_rptr & 7) != 5)
1640 next_rptr++;
1641 next_rptr += 3;
1642 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1));
1643 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
1644 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xff);
1645 radeon_ring_write(ring, next_rptr);
1646 }
1647
1648 /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring.
1649 * Pad as necessary with NOPs.
1650 */
1651 while ((ring->wptr & 7) != 5)
1652 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
1653 radeon_ring_write(ring, DMA_IB_PACKET(DMA_PACKET_INDIRECT_BUFFER, ib->vm ? ib->vm->id : 0, 0));
1654 radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0));
1655 radeon_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF));
1656
1657}
1658
1659/**
1660 * cayman_dma_stop - stop the async dma engines
1661 *
1662 * @rdev: radeon_device pointer
1663 *
1664 * Stop the async dma engines (cayman-SI).
1665 */
1666void cayman_dma_stop(struct radeon_device *rdev)
1667{
1668 u32 rb_cntl;
1669
1670 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
1671
1672 /* dma0 */
1673 rb_cntl = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
1674 rb_cntl &= ~DMA_RB_ENABLE;
1675 WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, rb_cntl);
1676
1677 /* dma1 */
1678 rb_cntl = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
1679 rb_cntl &= ~DMA_RB_ENABLE;
1680 WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, rb_cntl);
1681
1682 rdev->ring[R600_RING_TYPE_DMA_INDEX].ready = false;
1683 rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX].ready = false;
1684}
1685
1686/**
1687 * cayman_dma_resume - setup and start the async dma engines
1688 *
1689 * @rdev: radeon_device pointer
1690 *
1691 * Set up the DMA ring buffers and enable them. (cayman-SI).
1692 * Returns 0 for success, error for failure.
1693 */
1694int cayman_dma_resume(struct radeon_device *rdev)
1695{
1696 struct radeon_ring *ring;
1697 u32 rb_cntl, dma_cntl, ib_cntl;
1698 u32 rb_bufsz;
1699 u32 reg_offset, wb_offset;
1700 int i, r;
1701
1702 /* Reset dma */
1703 WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1);
1704 RREG32(SRBM_SOFT_RESET);
1705 udelay(50);
1706 WREG32(SRBM_SOFT_RESET, 0);
1707
1708 for (i = 0; i < 2; i++) {
1709 if (i == 0) {
1710 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
1711 reg_offset = DMA0_REGISTER_OFFSET;
1712 wb_offset = R600_WB_DMA_RPTR_OFFSET;
1713 } else {
1714 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
1715 reg_offset = DMA1_REGISTER_OFFSET;
1716 wb_offset = CAYMAN_WB_DMA1_RPTR_OFFSET;
1717 }
1718
1719 WREG32(DMA_SEM_INCOMPLETE_TIMER_CNTL + reg_offset, 0);
1720 WREG32(DMA_SEM_WAIT_FAIL_TIMER_CNTL + reg_offset, 0);
1721
1722 /* Set ring buffer size in dwords */
1723 rb_bufsz = order_base_2(ring->ring_size / 4);
1724 rb_cntl = rb_bufsz << 1;
1725#ifdef __BIG_ENDIAN
1726 rb_cntl |= DMA_RB_SWAP_ENABLE | DMA_RPTR_WRITEBACK_SWAP_ENABLE;
1727#endif
1728 WREG32(DMA_RB_CNTL + reg_offset, rb_cntl);
1729
1730 /* Initialize the ring buffer's read and write pointers */
1731 WREG32(DMA_RB_RPTR + reg_offset, 0);
1732 WREG32(DMA_RB_WPTR + reg_offset, 0);
1733
1734 /* set the wb address whether it's enabled or not */
1735 WREG32(DMA_RB_RPTR_ADDR_HI + reg_offset,
1736 upper_32_bits(rdev->wb.gpu_addr + wb_offset) & 0xFF);
1737 WREG32(DMA_RB_RPTR_ADDR_LO + reg_offset,
1738 ((rdev->wb.gpu_addr + wb_offset) & 0xFFFFFFFC));
1739
1740 if (rdev->wb.enabled)
1741 rb_cntl |= DMA_RPTR_WRITEBACK_ENABLE;
1742
1743 WREG32(DMA_RB_BASE + reg_offset, ring->gpu_addr >> 8);
1744
1745 /* enable DMA IBs */
1746 ib_cntl = DMA_IB_ENABLE | CMD_VMID_FORCE;
1747#ifdef __BIG_ENDIAN
1748 ib_cntl |= DMA_IB_SWAP_ENABLE;
1749#endif
1750 WREG32(DMA_IB_CNTL + reg_offset, ib_cntl);
1751
1752 dma_cntl = RREG32(DMA_CNTL + reg_offset);
1753 dma_cntl &= ~CTXEMPTY_INT_ENABLE;
1754 WREG32(DMA_CNTL + reg_offset, dma_cntl);
1755
1756 ring->wptr = 0;
1757 WREG32(DMA_RB_WPTR + reg_offset, ring->wptr << 2);
1758
1759 ring->rptr = RREG32(DMA_RB_RPTR + reg_offset) >> 2;
1760
1761 WREG32(DMA_RB_CNTL + reg_offset, rb_cntl | DMA_RB_ENABLE);
1762
1763 ring->ready = true;
1764
1765 r = radeon_ring_test(rdev, ring->idx, ring);
1766 if (r) {
1767 ring->ready = false;
1768 return r;
1769 }
1770 }
1771
1772 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
1773
1774 return 0;
1775}
1776
1777/**
1778 * cayman_dma_fini - tear down the async dma engines
1779 *
1780 * @rdev: radeon_device pointer
1781 *
1782 * Stop the async dma engines and free the rings (cayman-SI).
1783 */
1784void cayman_dma_fini(struct radeon_device *rdev)
1785{
1786 cayman_dma_stop(rdev);
1787 radeon_ring_fini(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX]);
1788 radeon_ring_fini(rdev, &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]);
1789}
1790
1791static u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev)
1792{ 1604{
1793 u32 reset_mask = 0; 1605 u32 reset_mask = 0;
1794 u32 tmp; 1606 u32 tmp;
@@ -2041,34 +1853,6 @@ bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
2041 return radeon_ring_test_lockup(rdev, ring); 1853 return radeon_ring_test_lockup(rdev, ring);
2042} 1854}
2043 1855
2044/**
2045 * cayman_dma_is_lockup - Check if the DMA engine is locked up
2046 *
2047 * @rdev: radeon_device pointer
2048 * @ring: radeon_ring structure holding ring information
2049 *
2050 * Check if the async DMA engine is locked up.
2051 * Returns true if the engine appears to be locked up, false if not.
2052 */
2053bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
2054{
2055 u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
2056 u32 mask;
2057
2058 if (ring->idx == R600_RING_TYPE_DMA_INDEX)
2059 mask = RADEON_RESET_DMA;
2060 else
2061 mask = RADEON_RESET_DMA1;
2062
2063 if (!(reset_mask & mask)) {
2064 radeon_ring_lockup_update(ring);
2065 return false;
2066 }
2067 /* force ring activities */
2068 radeon_ring_force_activity(rdev, ring);
2069 return radeon_ring_test_lockup(rdev, ring);
2070}
2071
2072static int cayman_startup(struct radeon_device *rdev) 1856static int cayman_startup(struct radeon_device *rdev)
2073{ 1857{
2074 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 1858 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
@@ -2079,6 +1863,13 @@ static int cayman_startup(struct radeon_device *rdev)
2079 /* enable aspm */ 1863 /* enable aspm */
2080 evergreen_program_aspm(rdev); 1864 evergreen_program_aspm(rdev);
2081 1865
1866 /* scratch needs to be initialized before MC */
1867 r = r600_vram_scratch_init(rdev);
1868 if (r)
1869 return r;
1870
1871 evergreen_mc_program(rdev);
1872
2082 if (rdev->flags & RADEON_IS_IGP) { 1873 if (rdev->flags & RADEON_IS_IGP) {
2083 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 1874 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
2084 r = ni_init_microcode(rdev); 1875 r = ni_init_microcode(rdev);
@@ -2103,27 +1894,16 @@ static int cayman_startup(struct radeon_device *rdev)
2103 } 1894 }
2104 } 1895 }
2105 1896
2106 r = r600_vram_scratch_init(rdev);
2107 if (r)
2108 return r;
2109
2110 evergreen_mc_program(rdev);
2111 r = cayman_pcie_gart_enable(rdev); 1897 r = cayman_pcie_gart_enable(rdev);
2112 if (r) 1898 if (r)
2113 return r; 1899 return r;
2114 cayman_gpu_init(rdev); 1900 cayman_gpu_init(rdev);
2115 1901
2116 r = evergreen_blit_init(rdev);
2117 if (r) {
2118 r600_blit_fini(rdev);
2119 rdev->asic->copy.copy = NULL;
2120 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
2121 }
2122
2123 /* allocate rlc buffers */ 1902 /* allocate rlc buffers */
2124 if (rdev->flags & RADEON_IS_IGP) { 1903 if (rdev->flags & RADEON_IS_IGP) {
2125 rdev->rlc.reg_list = tn_rlc_save_restore_register_list; 1904 rdev->rlc.reg_list = tn_rlc_save_restore_register_list;
2126 rdev->rlc.reg_list_size = tn_rlc_save_restore_register_list_size; 1905 rdev->rlc.reg_list_size =
1906 (u32)ARRAY_SIZE(tn_rlc_save_restore_register_list);
2127 rdev->rlc.cs_data = cayman_cs_data; 1907 rdev->rlc.cs_data = cayman_cs_data;
2128 r = sumo_rlc_init(rdev); 1908 r = sumo_rlc_init(rdev);
2129 if (r) { 1909 if (r) {
@@ -2143,7 +1923,7 @@ static int cayman_startup(struct radeon_device *rdev)
2143 return r; 1923 return r;
2144 } 1924 }
2145 1925
2146 r = rv770_uvd_resume(rdev); 1926 r = uvd_v2_2_resume(rdev);
2147 if (!r) { 1927 if (!r) {
2148 r = radeon_fence_driver_start_ring(rdev, 1928 r = radeon_fence_driver_start_ring(rdev,
2149 R600_RING_TYPE_UVD_INDEX); 1929 R600_RING_TYPE_UVD_INDEX);
@@ -2194,7 +1974,7 @@ static int cayman_startup(struct radeon_device *rdev)
2194 1974
2195 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 1975 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
2196 CP_RB0_RPTR, CP_RB0_WPTR, 1976 CP_RB0_RPTR, CP_RB0_WPTR,
2197 0, 0xfffff, RADEON_CP_PACKET2); 1977 RADEON_CP_PACKET2);
2198 if (r) 1978 if (r)
2199 return r; 1979 return r;
2200 1980
@@ -2202,7 +1982,7 @@ static int cayman_startup(struct radeon_device *rdev)
2202 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 1982 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
2203 DMA_RB_RPTR + DMA0_REGISTER_OFFSET, 1983 DMA_RB_RPTR + DMA0_REGISTER_OFFSET,
2204 DMA_RB_WPTR + DMA0_REGISTER_OFFSET, 1984 DMA_RB_WPTR + DMA0_REGISTER_OFFSET,
2205 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 1985 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2206 if (r) 1986 if (r)
2207 return r; 1987 return r;
2208 1988
@@ -2210,7 +1990,7 @@ static int cayman_startup(struct radeon_device *rdev)
2210 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, 1990 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
2211 DMA_RB_RPTR + DMA1_REGISTER_OFFSET, 1991 DMA_RB_RPTR + DMA1_REGISTER_OFFSET,
2212 DMA_RB_WPTR + DMA1_REGISTER_OFFSET, 1992 DMA_RB_WPTR + DMA1_REGISTER_OFFSET,
2213 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 1993 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
2214 if (r) 1994 if (r)
2215 return r; 1995 return r;
2216 1996
@@ -2227,12 +2007,11 @@ static int cayman_startup(struct radeon_device *rdev)
2227 2007
2228 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 2008 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
2229 if (ring->ring_size) { 2009 if (ring->ring_size) {
2230 r = radeon_ring_init(rdev, ring, ring->ring_size, 2010 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
2231 R600_WB_UVD_RPTR_OFFSET,
2232 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR, 2011 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
2233 0, 0xfffff, RADEON_CP_PACKET2); 2012 RADEON_CP_PACKET2);
2234 if (!r) 2013 if (!r)
2235 r = r600_uvd_init(rdev); 2014 r = uvd_v1_0_init(rdev);
2236 if (r) 2015 if (r)
2237 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r); 2016 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
2238 } 2017 }
@@ -2249,9 +2028,15 @@ static int cayman_startup(struct radeon_device *rdev)
2249 return r; 2028 return r;
2250 } 2029 }
2251 2030
2252 r = r600_audio_init(rdev); 2031 if (ASIC_IS_DCE6(rdev)) {
2253 if (r) 2032 r = dce6_audio_init(rdev);
2254 return r; 2033 if (r)
2034 return r;
2035 } else {
2036 r = r600_audio_init(rdev);
2037 if (r)
2038 return r;
2039 }
2255 2040
2256 return 0; 2041 return 0;
2257} 2042}
@@ -2282,11 +2067,14 @@ int cayman_resume(struct radeon_device *rdev)
2282 2067
2283int cayman_suspend(struct radeon_device *rdev) 2068int cayman_suspend(struct radeon_device *rdev)
2284{ 2069{
2285 r600_audio_fini(rdev); 2070 if (ASIC_IS_DCE6(rdev))
2071 dce6_audio_fini(rdev);
2072 else
2073 r600_audio_fini(rdev);
2286 radeon_vm_manager_fini(rdev); 2074 radeon_vm_manager_fini(rdev);
2287 cayman_cp_enable(rdev, false); 2075 cayman_cp_enable(rdev, false);
2288 cayman_dma_stop(rdev); 2076 cayman_dma_stop(rdev);
2289 r600_uvd_rbc_stop(rdev); 2077 uvd_v1_0_fini(rdev);
2290 radeon_uvd_suspend(rdev); 2078 radeon_uvd_suspend(rdev);
2291 evergreen_irq_suspend(rdev); 2079 evergreen_irq_suspend(rdev);
2292 radeon_wb_disable(rdev); 2080 radeon_wb_disable(rdev);
@@ -2408,7 +2196,6 @@ int cayman_init(struct radeon_device *rdev)
2408 2196
2409void cayman_fini(struct radeon_device *rdev) 2197void cayman_fini(struct radeon_device *rdev)
2410{ 2198{
2411 r600_blit_fini(rdev);
2412 cayman_cp_fini(rdev); 2199 cayman_cp_fini(rdev);
2413 cayman_dma_fini(rdev); 2200 cayman_dma_fini(rdev);
2414 r600_irq_fini(rdev); 2201 r600_irq_fini(rdev);
@@ -2418,6 +2205,7 @@ void cayman_fini(struct radeon_device *rdev)
2418 radeon_vm_manager_fini(rdev); 2205 radeon_vm_manager_fini(rdev);
2419 radeon_ib_pool_fini(rdev); 2206 radeon_ib_pool_fini(rdev);
2420 radeon_irq_kms_fini(rdev); 2207 radeon_irq_kms_fini(rdev);
2208 uvd_v1_0_fini(rdev);
2421 radeon_uvd_fini(rdev); 2209 radeon_uvd_fini(rdev);
2422 cayman_pcie_gart_fini(rdev); 2210 cayman_pcie_gart_fini(rdev);
2423 r600_vram_scratch_fini(rdev); 2211 r600_vram_scratch_fini(rdev);
@@ -2678,61 +2466,7 @@ void cayman_vm_set_page(struct radeon_device *rdev,
2678 } 2466 }
2679 } 2467 }
2680 } else { 2468 } else {
2681 if ((flags & RADEON_VM_PAGE_SYSTEM) || 2469 cayman_dma_vm_set_page(rdev, ib, pe, addr, count, incr, flags);
2682 (count == 1)) {
2683 while (count) {
2684 ndw = count * 2;
2685 if (ndw > 0xFFFFE)
2686 ndw = 0xFFFFE;
2687
2688 /* for non-physically contiguous pages (system) */
2689 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, ndw);
2690 ib->ptr[ib->length_dw++] = pe;
2691 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
2692 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
2693 if (flags & RADEON_VM_PAGE_SYSTEM) {
2694 value = radeon_vm_map_gart(rdev, addr);
2695 value &= 0xFFFFFFFFFFFFF000ULL;
2696 } else if (flags & RADEON_VM_PAGE_VALID) {
2697 value = addr;
2698 } else {
2699 value = 0;
2700 }
2701 addr += incr;
2702 value |= r600_flags;
2703 ib->ptr[ib->length_dw++] = value;
2704 ib->ptr[ib->length_dw++] = upper_32_bits(value);
2705 }
2706 }
2707 while (ib->length_dw & 0x7)
2708 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0);
2709 } else {
2710 while (count) {
2711 ndw = count * 2;
2712 if (ndw > 0xFFFFE)
2713 ndw = 0xFFFFE;
2714
2715 if (flags & RADEON_VM_PAGE_VALID)
2716 value = addr;
2717 else
2718 value = 0;
2719 /* for physically contiguous pages (vram) */
2720 ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
2721 ib->ptr[ib->length_dw++] = pe; /* dst addr */
2722 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
2723 ib->ptr[ib->length_dw++] = r600_flags; /* mask */
2724 ib->ptr[ib->length_dw++] = 0;
2725 ib->ptr[ib->length_dw++] = value; /* value */
2726 ib->ptr[ib->length_dw++] = upper_32_bits(value);
2727 ib->ptr[ib->length_dw++] = incr; /* increment size */
2728 ib->ptr[ib->length_dw++] = 0;
2729 pe += ndw * 4;
2730 addr += (ndw / 2) * incr;
2731 count -= ndw / 2;
2732 }
2733 }
2734 while (ib->length_dw & 0x7)
2735 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0);
2736 } 2470 }
2737} 2471}
2738 2472
@@ -2766,26 +2500,3 @@ void cayman_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
2766 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0)); 2500 radeon_ring_write(ring, PACKET3(PACKET3_PFP_SYNC_ME, 0));
2767 radeon_ring_write(ring, 0x0); 2501 radeon_ring_write(ring, 0x0);
2768} 2502}
2769
2770void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
2771{
2772 struct radeon_ring *ring = &rdev->ring[ridx];
2773
2774 if (vm == NULL)
2775 return;
2776
2777 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
2778 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2));
2779 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
2780
2781 /* flush hdp cache */
2782 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
2783 radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2));
2784 radeon_ring_write(ring, 1);
2785
2786 /* bits 0-7 are the VM contexts0-7 */
2787 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
2788 radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2));
2789 radeon_ring_write(ring, 1 << vm->id);
2790}
2791
diff --git a/drivers/gpu/drm/radeon/ni_dma.c b/drivers/gpu/drm/radeon/ni_dma.c
new file mode 100644
index 000000000000..dd6e9688fbef
--- /dev/null
+++ b/drivers/gpu/drm/radeon/ni_dma.c
@@ -0,0 +1,338 @@
1/*
2 * Copyright 2010 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: Alex Deucher
23 */
24#include <drm/drmP.h>
25#include "radeon.h"
26#include "radeon_asic.h"
27#include "nid.h"
28
29u32 cayman_gpu_check_soft_reset(struct radeon_device *rdev);
30
31/*
32 * DMA
33 * Starting with R600, the GPU has an asynchronous
34 * DMA engine. The programming model is very similar
35 * to the 3D engine (ring buffer, IBs, etc.), but the
36 * DMA controller has it's own packet format that is
37 * different form the PM4 format used by the 3D engine.
38 * It supports copying data, writing embedded data,
39 * solid fills, and a number of other things. It also
40 * has support for tiling/detiling of buffers.
41 * Cayman and newer support two asynchronous DMA engines.
42 */
43
44/**
45 * cayman_dma_ring_ib_execute - Schedule an IB on the DMA engine
46 *
47 * @rdev: radeon_device pointer
48 * @ib: IB object to schedule
49 *
50 * Schedule an IB in the DMA ring (cayman-SI).
51 */
52void cayman_dma_ring_ib_execute(struct radeon_device *rdev,
53 struct radeon_ib *ib)
54{
55 struct radeon_ring *ring = &rdev->ring[ib->ring];
56
57 if (rdev->wb.enabled) {
58 u32 next_rptr = ring->wptr + 4;
59 while ((next_rptr & 7) != 5)
60 next_rptr++;
61 next_rptr += 3;
62 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1));
63 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
64 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xff);
65 radeon_ring_write(ring, next_rptr);
66 }
67
68 /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring.
69 * Pad as necessary with NOPs.
70 */
71 while ((ring->wptr & 7) != 5)
72 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
73 radeon_ring_write(ring, DMA_IB_PACKET(DMA_PACKET_INDIRECT_BUFFER, ib->vm ? ib->vm->id : 0, 0));
74 radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0));
75 radeon_ring_write(ring, (ib->length_dw << 12) | (upper_32_bits(ib->gpu_addr) & 0xFF));
76
77}
78
79/**
80 * cayman_dma_stop - stop the async dma engines
81 *
82 * @rdev: radeon_device pointer
83 *
84 * Stop the async dma engines (cayman-SI).
85 */
86void cayman_dma_stop(struct radeon_device *rdev)
87{
88 u32 rb_cntl;
89
90 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
91
92 /* dma0 */
93 rb_cntl = RREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET);
94 rb_cntl &= ~DMA_RB_ENABLE;
95 WREG32(DMA_RB_CNTL + DMA0_REGISTER_OFFSET, rb_cntl);
96
97 /* dma1 */
98 rb_cntl = RREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET);
99 rb_cntl &= ~DMA_RB_ENABLE;
100 WREG32(DMA_RB_CNTL + DMA1_REGISTER_OFFSET, rb_cntl);
101
102 rdev->ring[R600_RING_TYPE_DMA_INDEX].ready = false;
103 rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX].ready = false;
104}
105
106/**
107 * cayman_dma_resume - setup and start the async dma engines
108 *
109 * @rdev: radeon_device pointer
110 *
111 * Set up the DMA ring buffers and enable them. (cayman-SI).
112 * Returns 0 for success, error for failure.
113 */
114int cayman_dma_resume(struct radeon_device *rdev)
115{
116 struct radeon_ring *ring;
117 u32 rb_cntl, dma_cntl, ib_cntl;
118 u32 rb_bufsz;
119 u32 reg_offset, wb_offset;
120 int i, r;
121
122 /* Reset dma */
123 WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1);
124 RREG32(SRBM_SOFT_RESET);
125 udelay(50);
126 WREG32(SRBM_SOFT_RESET, 0);
127
128 for (i = 0; i < 2; i++) {
129 if (i == 0) {
130 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
131 reg_offset = DMA0_REGISTER_OFFSET;
132 wb_offset = R600_WB_DMA_RPTR_OFFSET;
133 } else {
134 ring = &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX];
135 reg_offset = DMA1_REGISTER_OFFSET;
136 wb_offset = CAYMAN_WB_DMA1_RPTR_OFFSET;
137 }
138
139 WREG32(DMA_SEM_INCOMPLETE_TIMER_CNTL + reg_offset, 0);
140 WREG32(DMA_SEM_WAIT_FAIL_TIMER_CNTL + reg_offset, 0);
141
142 /* Set ring buffer size in dwords */
143 rb_bufsz = order_base_2(ring->ring_size / 4);
144 rb_cntl = rb_bufsz << 1;
145#ifdef __BIG_ENDIAN
146 rb_cntl |= DMA_RB_SWAP_ENABLE | DMA_RPTR_WRITEBACK_SWAP_ENABLE;
147#endif
148 WREG32(DMA_RB_CNTL + reg_offset, rb_cntl);
149
150 /* Initialize the ring buffer's read and write pointers */
151 WREG32(DMA_RB_RPTR + reg_offset, 0);
152 WREG32(DMA_RB_WPTR + reg_offset, 0);
153
154 /* set the wb address whether it's enabled or not */
155 WREG32(DMA_RB_RPTR_ADDR_HI + reg_offset,
156 upper_32_bits(rdev->wb.gpu_addr + wb_offset) & 0xFF);
157 WREG32(DMA_RB_RPTR_ADDR_LO + reg_offset,
158 ((rdev->wb.gpu_addr + wb_offset) & 0xFFFFFFFC));
159
160 if (rdev->wb.enabled)
161 rb_cntl |= DMA_RPTR_WRITEBACK_ENABLE;
162
163 WREG32(DMA_RB_BASE + reg_offset, ring->gpu_addr >> 8);
164
165 /* enable DMA IBs */
166 ib_cntl = DMA_IB_ENABLE | CMD_VMID_FORCE;
167#ifdef __BIG_ENDIAN
168 ib_cntl |= DMA_IB_SWAP_ENABLE;
169#endif
170 WREG32(DMA_IB_CNTL + reg_offset, ib_cntl);
171
172 dma_cntl = RREG32(DMA_CNTL + reg_offset);
173 dma_cntl &= ~CTXEMPTY_INT_ENABLE;
174 WREG32(DMA_CNTL + reg_offset, dma_cntl);
175
176 ring->wptr = 0;
177 WREG32(DMA_RB_WPTR + reg_offset, ring->wptr << 2);
178
179 ring->rptr = RREG32(DMA_RB_RPTR + reg_offset) >> 2;
180
181 WREG32(DMA_RB_CNTL + reg_offset, rb_cntl | DMA_RB_ENABLE);
182
183 ring->ready = true;
184
185 r = radeon_ring_test(rdev, ring->idx, ring);
186 if (r) {
187 ring->ready = false;
188 return r;
189 }
190 }
191
192 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
193
194 return 0;
195}
196
197/**
198 * cayman_dma_fini - tear down the async dma engines
199 *
200 * @rdev: radeon_device pointer
201 *
202 * Stop the async dma engines and free the rings (cayman-SI).
203 */
204void cayman_dma_fini(struct radeon_device *rdev)
205{
206 cayman_dma_stop(rdev);
207 radeon_ring_fini(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX]);
208 radeon_ring_fini(rdev, &rdev->ring[CAYMAN_RING_TYPE_DMA1_INDEX]);
209}
210
211/**
212 * cayman_dma_is_lockup - Check if the DMA engine is locked up
213 *
214 * @rdev: radeon_device pointer
215 * @ring: radeon_ring structure holding ring information
216 *
217 * Check if the async DMA engine is locked up.
218 * Returns true if the engine appears to be locked up, false if not.
219 */
220bool cayman_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
221{
222 u32 reset_mask = cayman_gpu_check_soft_reset(rdev);
223 u32 mask;
224
225 if (ring->idx == R600_RING_TYPE_DMA_INDEX)
226 mask = RADEON_RESET_DMA;
227 else
228 mask = RADEON_RESET_DMA1;
229
230 if (!(reset_mask & mask)) {
231 radeon_ring_lockup_update(ring);
232 return false;
233 }
234 /* force ring activities */
235 radeon_ring_force_activity(rdev, ring);
236 return radeon_ring_test_lockup(rdev, ring);
237}
238
239/**
240 * cayman_dma_vm_set_page - update the page tables using the DMA
241 *
242 * @rdev: radeon_device pointer
243 * @ib: indirect buffer to fill with commands
244 * @pe: addr of the page entry
245 * @addr: dst addr to write into pe
246 * @count: number of page entries to update
247 * @incr: increase next addr by incr bytes
248 * @flags: access flags
249 * @r600_flags: hw access flags
250 *
251 * Update the page tables using the DMA (cayman/TN).
252 */
253void cayman_dma_vm_set_page(struct radeon_device *rdev,
254 struct radeon_ib *ib,
255 uint64_t pe,
256 uint64_t addr, unsigned count,
257 uint32_t incr, uint32_t flags)
258{
259 uint32_t r600_flags = cayman_vm_page_flags(rdev, flags);
260 uint64_t value;
261 unsigned ndw;
262
263 if ((flags & RADEON_VM_PAGE_SYSTEM) || (count == 1)) {
264 while (count) {
265 ndw = count * 2;
266 if (ndw > 0xFFFFE)
267 ndw = 0xFFFFE;
268
269 /* for non-physically contiguous pages (system) */
270 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, ndw);
271 ib->ptr[ib->length_dw++] = pe;
272 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
273 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
274 if (flags & RADEON_VM_PAGE_SYSTEM) {
275 value = radeon_vm_map_gart(rdev, addr);
276 value &= 0xFFFFFFFFFFFFF000ULL;
277 } else if (flags & RADEON_VM_PAGE_VALID) {
278 value = addr;
279 } else {
280 value = 0;
281 }
282 addr += incr;
283 value |= r600_flags;
284 ib->ptr[ib->length_dw++] = value;
285 ib->ptr[ib->length_dw++] = upper_32_bits(value);
286 }
287 }
288 } else {
289 while (count) {
290 ndw = count * 2;
291 if (ndw > 0xFFFFE)
292 ndw = 0xFFFFE;
293
294 if (flags & RADEON_VM_PAGE_VALID)
295 value = addr;
296 else
297 value = 0;
298 /* for physically contiguous pages (vram) */
299 ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
300 ib->ptr[ib->length_dw++] = pe; /* dst addr */
301 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
302 ib->ptr[ib->length_dw++] = r600_flags; /* mask */
303 ib->ptr[ib->length_dw++] = 0;
304 ib->ptr[ib->length_dw++] = value; /* value */
305 ib->ptr[ib->length_dw++] = upper_32_bits(value);
306 ib->ptr[ib->length_dw++] = incr; /* increment size */
307 ib->ptr[ib->length_dw++] = 0;
308 pe += ndw * 4;
309 addr += (ndw / 2) * incr;
310 count -= ndw / 2;
311 }
312 }
313 while (ib->length_dw & 0x7)
314 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0);
315}
316
317void cayman_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
318{
319 struct radeon_ring *ring = &rdev->ring[ridx];
320
321 if (vm == NULL)
322 return;
323
324 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
325 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2));
326 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
327
328 /* flush hdp cache */
329 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
330 radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2));
331 radeon_ring_write(ring, 1);
332
333 /* bits 0-7 are the VM contexts0-7 */
334 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0));
335 radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2));
336 radeon_ring_write(ring, 1 << vm->id);
337}
338
diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c
index 559cf24d51af..f7b625c9e0e9 100644
--- a/drivers/gpu/drm/radeon/ni_dpm.c
+++ b/drivers/gpu/drm/radeon/ni_dpm.c
@@ -769,7 +769,8 @@ bool ni_dpm_vblank_too_short(struct radeon_device *rdev)
769{ 769{
770 struct rv7xx_power_info *pi = rv770_get_pi(rdev); 770 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
771 u32 vblank_time = r600_dpm_get_vblank_time(rdev); 771 u32 vblank_time = r600_dpm_get_vblank_time(rdev);
772 u32 switch_limit = pi->mem_gddr5 ? 450 : 300; 772 /* we never hit the non-gddr5 limit so disable it */
773 u32 switch_limit = pi->mem_gddr5 ? 450 : 0;
773 774
774 if (vblank_time < switch_limit) 775 if (vblank_time < switch_limit)
775 return true; 776 return true;
@@ -1054,10 +1055,6 @@ static int ni_restrict_performance_levels_before_switch(struct radeon_device *rd
1054int ni_dpm_force_performance_level(struct radeon_device *rdev, 1055int ni_dpm_force_performance_level(struct radeon_device *rdev,
1055 enum radeon_dpm_forced_level level) 1056 enum radeon_dpm_forced_level level)
1056{ 1057{
1057 struct radeon_ps *rps = rdev->pm.dpm.current_ps;
1058 struct ni_ps *ps = ni_get_ps(rps);
1059 u32 levels;
1060
1061 if (level == RADEON_DPM_FORCED_LEVEL_HIGH) { 1058 if (level == RADEON_DPM_FORCED_LEVEL_HIGH) {
1062 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK) 1059 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK)
1063 return -EINVAL; 1060 return -EINVAL;
@@ -1068,8 +1065,7 @@ int ni_dpm_force_performance_level(struct radeon_device *rdev,
1068 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) 1065 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
1069 return -EINVAL; 1066 return -EINVAL;
1070 1067
1071 levels = ps->performance_level_count - 1; 1068 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 1) != PPSMC_Result_OK)
1072 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK)
1073 return -EINVAL; 1069 return -EINVAL;
1074 } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) { 1070 } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) {
1075 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) 1071 if (ni_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
@@ -4042,6 +4038,7 @@ static int ni_parse_power_table(struct radeon_device *rdev)
4042 (power_state->v1.ucNonClockStateIndex * 4038 (power_state->v1.ucNonClockStateIndex *
4043 power_info->pplib.ucNonClockSize)); 4039 power_info->pplib.ucNonClockSize));
4044 if (power_info->pplib.ucStateEntrySize - 1) { 4040 if (power_info->pplib.ucStateEntrySize - 1) {
4041 u8 *idx;
4045 ps = kzalloc(sizeof(struct ni_ps), GFP_KERNEL); 4042 ps = kzalloc(sizeof(struct ni_ps), GFP_KERNEL);
4046 if (ps == NULL) { 4043 if (ps == NULL) {
4047 kfree(rdev->pm.dpm.ps); 4044 kfree(rdev->pm.dpm.ps);
@@ -4051,12 +4048,12 @@ static int ni_parse_power_table(struct radeon_device *rdev)
4051 ni_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i], 4048 ni_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i],
4052 non_clock_info, 4049 non_clock_info,
4053 power_info->pplib.ucNonClockSize); 4050 power_info->pplib.ucNonClockSize);
4051 idx = (u8 *)&power_state->v1.ucClockStateIndices[0];
4054 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) { 4052 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
4055 clock_info = (union pplib_clock_info *) 4053 clock_info = (union pplib_clock_info *)
4056 (mode_info->atom_context->bios + data_offset + 4054 (mode_info->atom_context->bios + data_offset +
4057 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) + 4055 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
4058 (power_state->v1.ucClockStateIndices[j] * 4056 (idx[j] * power_info->pplib.ucClockInfoSize));
4059 power_info->pplib.ucClockInfoSize));
4060 ni_parse_pplib_clock_info(rdev, 4057 ni_parse_pplib_clock_info(rdev,
4061 &rdev->pm.dpm.ps[i], j, 4058 &rdev->pm.dpm.ps[i], j,
4062 clock_info); 4059 clock_info);
@@ -4072,9 +4069,6 @@ int ni_dpm_init(struct radeon_device *rdev)
4072 struct rv7xx_power_info *pi; 4069 struct rv7xx_power_info *pi;
4073 struct evergreen_power_info *eg_pi; 4070 struct evergreen_power_info *eg_pi;
4074 struct ni_power_info *ni_pi; 4071 struct ni_power_info *ni_pi;
4075 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
4076 u16 data_offset, size;
4077 u8 frev, crev;
4078 struct atom_clock_dividers dividers; 4072 struct atom_clock_dividers dividers;
4079 int ret; 4073 int ret;
4080 4074
@@ -4167,16 +4161,7 @@ int ni_dpm_init(struct radeon_device *rdev)
4167 eg_pi->vddci_control = 4161 eg_pi->vddci_control =
4168 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0); 4162 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDCI, 0);
4169 4163
4170 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 4164 rv770_get_engine_memory_ss(rdev);
4171 &frev, &crev, &data_offset)) {
4172 pi->sclk_ss = true;
4173 pi->mclk_ss = true;
4174 pi->dynamic_ss = true;
4175 } else {
4176 pi->sclk_ss = false;
4177 pi->mclk_ss = false;
4178 pi->dynamic_ss = true;
4179 }
4180 4165
4181 pi->asi = RV770_ASI_DFLT; 4166 pi->asi = RV770_ASI_DFLT;
4182 pi->pasi = CYPRESS_HASI_DFLT; 4167 pi->pasi = CYPRESS_HASI_DFLT;
@@ -4193,8 +4178,7 @@ int ni_dpm_init(struct radeon_device *rdev)
4193 4178
4194 pi->dynamic_pcie_gen2 = true; 4179 pi->dynamic_pcie_gen2 = true;
4195 4180
4196 if (pi->gfx_clock_gating && 4181 if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
4197 (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE))
4198 pi->thermal_protection = true; 4182 pi->thermal_protection = true;
4199 else 4183 else
4200 pi->thermal_protection = false; 4184 pi->thermal_protection = false;
@@ -4288,6 +4272,12 @@ int ni_dpm_init(struct radeon_device *rdev)
4288 4272
4289 ni_pi->use_power_boost_limit = true; 4273 ni_pi->use_power_boost_limit = true;
4290 4274
4275 /* make sure dc limits are valid */
4276 if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
4277 (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
4278 rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
4279 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
4280
4291 return 0; 4281 return 0;
4292} 4282}
4293 4283
diff --git a/drivers/gpu/drm/radeon/ppsmc.h b/drivers/gpu/drm/radeon/ppsmc.h
index b5564a3645d2..682842804bce 100644
--- a/drivers/gpu/drm/radeon/ppsmc.h
+++ b/drivers/gpu/drm/radeon/ppsmc.h
@@ -99,11 +99,68 @@ typedef uint8_t PPSMC_Result;
99#define PPSMC_MSG_ThrottleOVRDSCLKDS ((uint8_t)0x96) 99#define PPSMC_MSG_ThrottleOVRDSCLKDS ((uint8_t)0x96)
100#define PPSMC_MSG_CancelThrottleOVRDSCLKDS ((uint8_t)0x97) 100#define PPSMC_MSG_CancelThrottleOVRDSCLKDS ((uint8_t)0x97)
101 101
102/* CI/KV/KB */
103#define PPSMC_MSG_UVDDPM_SetEnabledMask ((uint16_t) 0x12D)
104#define PPSMC_MSG_VCEDPM_SetEnabledMask ((uint16_t) 0x12E)
105#define PPSMC_MSG_ACPDPM_SetEnabledMask ((uint16_t) 0x12F)
106#define PPSMC_MSG_SAMUDPM_SetEnabledMask ((uint16_t) 0x130)
107#define PPSMC_MSG_MCLKDPM_ForceState ((uint16_t) 0x131)
108#define PPSMC_MSG_MCLKDPM_NoForcedLevel ((uint16_t) 0x132)
109#define PPSMC_MSG_Voltage_Cntl_Disable ((uint16_t) 0x135)
110#define PPSMC_MSG_PCIeDPM_Enable ((uint16_t) 0x136)
111#define PPSMC_MSG_PCIeDPM_Disable ((uint16_t) 0x13d)
112#define PPSMC_MSG_ACPPowerOFF ((uint16_t) 0x137)
113#define PPSMC_MSG_ACPPowerON ((uint16_t) 0x138)
114#define PPSMC_MSG_SAMPowerOFF ((uint16_t) 0x139)
115#define PPSMC_MSG_SAMPowerON ((uint16_t) 0x13a)
116#define PPSMC_MSG_PCIeDPM_Disable ((uint16_t) 0x13d)
117#define PPSMC_MSG_NBDPM_Enable ((uint16_t) 0x140)
118#define PPSMC_MSG_NBDPM_Disable ((uint16_t) 0x141)
119#define PPSMC_MSG_SCLKDPM_SetEnabledMask ((uint16_t) 0x145)
120#define PPSMC_MSG_MCLKDPM_SetEnabledMask ((uint16_t) 0x146)
121#define PPSMC_MSG_PCIeDPM_ForceLevel ((uint16_t) 0x147)
122#define PPSMC_MSG_PCIeDPM_UnForceLevel ((uint16_t) 0x148)
123#define PPSMC_MSG_EnableVRHotGPIOInterrupt ((uint16_t) 0x14a)
124#define PPSMC_MSG_DPM_Enable ((uint16_t) 0x14e)
125#define PPSMC_MSG_DPM_Disable ((uint16_t) 0x14f)
126#define PPSMC_MSG_MCLKDPM_Enable ((uint16_t) 0x150)
127#define PPSMC_MSG_MCLKDPM_Disable ((uint16_t) 0x151)
128#define PPSMC_MSG_UVDDPM_Enable ((uint16_t) 0x154)
129#define PPSMC_MSG_UVDDPM_Disable ((uint16_t) 0x155)
130#define PPSMC_MSG_SAMUDPM_Enable ((uint16_t) 0x156)
131#define PPSMC_MSG_SAMUDPM_Disable ((uint16_t) 0x157)
132#define PPSMC_MSG_ACPDPM_Enable ((uint16_t) 0x158)
133#define PPSMC_MSG_ACPDPM_Disable ((uint16_t) 0x159)
134#define PPSMC_MSG_VCEDPM_Enable ((uint16_t) 0x15a)
135#define PPSMC_MSG_VCEDPM_Disable ((uint16_t) 0x15b)
136#define PPSMC_MSG_VddC_Request ((uint16_t) 0x15f)
137#define PPSMC_MSG_SCLKDPM_GetEnabledMask ((uint16_t) 0x162)
138#define PPSMC_MSG_PCIeDPM_SetEnabledMask ((uint16_t) 0x167)
139#define PPSMC_MSG_TDCLimitEnable ((uint16_t) 0x169)
140#define PPSMC_MSG_TDCLimitDisable ((uint16_t) 0x16a)
141#define PPSMC_MSG_PkgPwrLimitEnable ((uint16_t) 0x185)
142#define PPSMC_MSG_PkgPwrLimitDisable ((uint16_t) 0x186)
143#define PPSMC_MSG_PkgPwrSetLimit ((uint16_t) 0x187)
144#define PPSMC_MSG_OverDriveSetTargetTdp ((uint16_t) 0x188)
145#define PPSMC_MSG_SCLKDPM_FreezeLevel ((uint16_t) 0x189)
146#define PPSMC_MSG_SCLKDPM_UnfreezeLevel ((uint16_t) 0x18A)
147#define PPSMC_MSG_MCLKDPM_FreezeLevel ((uint16_t) 0x18B)
148#define PPSMC_MSG_MCLKDPM_UnfreezeLevel ((uint16_t) 0x18C)
149#define PPSMC_MSG_MASTER_DeepSleep_ON ((uint16_t) 0x18F)
150#define PPSMC_MSG_MASTER_DeepSleep_OFF ((uint16_t) 0x190)
151#define PPSMC_MSG_Remove_DC_Clamp ((uint16_t) 0x191)
152
153#define PPSMC_MSG_API_GetSclkFrequency ((uint16_t) 0x200)
154#define PPSMC_MSG_API_GetMclkFrequency ((uint16_t) 0x201)
155
102/* TN */ 156/* TN */
103#define PPSMC_MSG_DPM_Config ((uint32_t) 0x102) 157#define PPSMC_MSG_DPM_Config ((uint32_t) 0x102)
104#define PPSMC_MSG_DPM_ForceState ((uint32_t) 0x104) 158#define PPSMC_MSG_DPM_ForceState ((uint32_t) 0x104)
105#define PPSMC_MSG_PG_SIMD_Config ((uint32_t) 0x108) 159#define PPSMC_MSG_PG_SIMD_Config ((uint32_t) 0x108)
106#define PPSMC_MSG_DPM_N_LevelsDisabled ((uint32_t) 0x112) 160#define PPSMC_MSG_DPM_N_LevelsDisabled ((uint32_t) 0x112)
161#define PPSMC_MSG_Voltage_Cntl_Enable ((uint32_t) 0x109)
162#define PPSMC_MSG_VCEPowerOFF ((uint32_t) 0x10e)
163#define PPSMC_MSG_VCEPowerON ((uint32_t) 0x10f)
107#define PPSMC_MSG_DCE_RemoveVoltageAdjustment ((uint32_t) 0x11d) 164#define PPSMC_MSG_DCE_RemoveVoltageAdjustment ((uint32_t) 0x11d)
108#define PPSMC_MSG_DCE_AllowVoltageAdjustment ((uint32_t) 0x11e) 165#define PPSMC_MSG_DCE_AllowVoltageAdjustment ((uint32_t) 0x11e)
109#define PPSMC_MSG_UVD_DPM_Config ((uint32_t) 0x124) 166#define PPSMC_MSG_UVD_DPM_Config ((uint32_t) 0x124)
diff --git a/drivers/gpu/drm/radeon/pptable.h b/drivers/gpu/drm/radeon/pptable.h
new file mode 100644
index 000000000000..da43ab328833
--- /dev/null
+++ b/drivers/gpu/drm/radeon/pptable.h
@@ -0,0 +1,682 @@
1/*
2 * Copyright 2013 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#ifndef _PPTABLE_H
24#define _PPTABLE_H
25
26#pragma pack(push, 1)
27
28typedef struct _ATOM_PPLIB_THERMALCONTROLLER
29
30{
31 UCHAR ucType; // one of ATOM_PP_THERMALCONTROLLER_*
32 UCHAR ucI2cLine; // as interpreted by DAL I2C
33 UCHAR ucI2cAddress;
34 UCHAR ucFanParameters; // Fan Control Parameters.
35 UCHAR ucFanMinRPM; // Fan Minimum RPM (hundreds) -- for display purposes only.
36 UCHAR ucFanMaxRPM; // Fan Maximum RPM (hundreds) -- for display purposes only.
37 UCHAR ucReserved; // ----
38 UCHAR ucFlags; // to be defined
39} ATOM_PPLIB_THERMALCONTROLLER;
40
41#define ATOM_PP_FANPARAMETERS_TACHOMETER_PULSES_PER_REVOLUTION_MASK 0x0f
42#define ATOM_PP_FANPARAMETERS_NOFAN 0x80 // No fan is connected to this controller.
43
44#define ATOM_PP_THERMALCONTROLLER_NONE 0
45#define ATOM_PP_THERMALCONTROLLER_LM63 1 // Not used by PPLib
46#define ATOM_PP_THERMALCONTROLLER_ADM1032 2 // Not used by PPLib
47#define ATOM_PP_THERMALCONTROLLER_ADM1030 3 // Not used by PPLib
48#define ATOM_PP_THERMALCONTROLLER_MUA6649 4 // Not used by PPLib
49#define ATOM_PP_THERMALCONTROLLER_LM64 5
50#define ATOM_PP_THERMALCONTROLLER_F75375 6 // Not used by PPLib
51#define ATOM_PP_THERMALCONTROLLER_RV6xx 7
52#define ATOM_PP_THERMALCONTROLLER_RV770 8
53#define ATOM_PP_THERMALCONTROLLER_ADT7473 9
54#define ATOM_PP_THERMALCONTROLLER_KONG 10
55#define ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO 11
56#define ATOM_PP_THERMALCONTROLLER_EVERGREEN 12
57#define ATOM_PP_THERMALCONTROLLER_EMC2103 13 /* 0x0D */ // Only fan control will be implemented, do NOT show this in PPGen.
58#define ATOM_PP_THERMALCONTROLLER_SUMO 14 /* 0x0E */ // Sumo type, used internally
59#define ATOM_PP_THERMALCONTROLLER_NISLANDS 15
60#define ATOM_PP_THERMALCONTROLLER_SISLANDS 16
61#define ATOM_PP_THERMALCONTROLLER_LM96163 17
62#define ATOM_PP_THERMALCONTROLLER_CISLANDS 18
63#define ATOM_PP_THERMALCONTROLLER_KAVERI 19
64
65
66// Thermal controller 'combo type' to use an external controller for Fan control and an internal controller for thermal.
67// We probably should reserve the bit 0x80 for this use.
68// To keep the number of these types low we should also use the same code for all ASICs (i.e. do not distinguish RV6xx and RV7xx Internal here).
69// The driver can pick the correct internal controller based on the ASIC.
70
71#define ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL 0x89 // ADT7473 Fan Control + Internal Thermal Controller
72#define ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL 0x8D // EMC2103 Fan Control + Internal Thermal Controller
73
74typedef struct _ATOM_PPLIB_STATE
75{
76 UCHAR ucNonClockStateIndex;
77 UCHAR ucClockStateIndices[1]; // variable-sized
78} ATOM_PPLIB_STATE;
79
80
81typedef struct _ATOM_PPLIB_FANTABLE
82{
83 UCHAR ucFanTableFormat; // Change this if the table format changes or version changes so that the other fields are not the same.
84 UCHAR ucTHyst; // Temperature hysteresis. Integer.
85 USHORT usTMin; // The temperature, in 0.01 centigrades, below which we just run at a minimal PWM.
86 USHORT usTMed; // The middle temperature where we change slopes.
87 USHORT usTHigh; // The high point above TMed for adjusting the second slope.
88 USHORT usPWMMin; // The minimum PWM value in percent (0.01% increments).
89 USHORT usPWMMed; // The PWM value (in percent) at TMed.
90 USHORT usPWMHigh; // The PWM value at THigh.
91} ATOM_PPLIB_FANTABLE;
92
93typedef struct _ATOM_PPLIB_FANTABLE2
94{
95 ATOM_PPLIB_FANTABLE basicTable;
96 USHORT usTMax; // The max temperature
97} ATOM_PPLIB_FANTABLE2;
98
99typedef struct _ATOM_PPLIB_EXTENDEDHEADER
100{
101 USHORT usSize;
102 ULONG ulMaxEngineClock; // For Overdrive.
103 ULONG ulMaxMemoryClock; // For Overdrive.
104 // Add extra system parameters here, always adjust size to include all fields.
105 USHORT usVCETableOffset; //points to ATOM_PPLIB_VCE_Table
106 USHORT usUVDTableOffset; //points to ATOM_PPLIB_UVD_Table
107 USHORT usSAMUTableOffset; //points to ATOM_PPLIB_SAMU_Table
108 USHORT usPPMTableOffset; //points to ATOM_PPLIB_PPM_Table
109 USHORT usACPTableOffset; //points to ATOM_PPLIB_ACP_Table
110 USHORT usPowerTuneTableOffset; //points to ATOM_PPLIB_POWERTUNE_Table
111} ATOM_PPLIB_EXTENDEDHEADER;
112
113//// ATOM_PPLIB_POWERPLAYTABLE::ulPlatformCaps
114#define ATOM_PP_PLATFORM_CAP_BACKBIAS 1
115#define ATOM_PP_PLATFORM_CAP_POWERPLAY 2
116#define ATOM_PP_PLATFORM_CAP_SBIOSPOWERSOURCE 4
117#define ATOM_PP_PLATFORM_CAP_ASPM_L0s 8
118#define ATOM_PP_PLATFORM_CAP_ASPM_L1 16
119#define ATOM_PP_PLATFORM_CAP_HARDWAREDC 32
120#define ATOM_PP_PLATFORM_CAP_GEMINIPRIMARY 64
121#define ATOM_PP_PLATFORM_CAP_STEPVDDC 128
122#define ATOM_PP_PLATFORM_CAP_VOLTAGECONTROL 256
123#define ATOM_PP_PLATFORM_CAP_SIDEPORTCONTROL 512
124#define ATOM_PP_PLATFORM_CAP_TURNOFFPLL_ASPML1 1024
125#define ATOM_PP_PLATFORM_CAP_HTLINKCONTROL 2048
126#define ATOM_PP_PLATFORM_CAP_MVDDCONTROL 4096
127#define ATOM_PP_PLATFORM_CAP_GOTO_BOOT_ON_ALERT 0x2000 // Go to boot state on alerts, e.g. on an AC->DC transition.
128#define ATOM_PP_PLATFORM_CAP_DONT_WAIT_FOR_VBLANK_ON_ALERT 0x4000 // Do NOT wait for VBLANK during an alert (e.g. AC->DC transition).
129#define ATOM_PP_PLATFORM_CAP_VDDCI_CONTROL 0x8000 // Does the driver control VDDCI independently from VDDC.
130#define ATOM_PP_PLATFORM_CAP_REGULATOR_HOT 0x00010000 // Enable the 'regulator hot' feature.
131#define ATOM_PP_PLATFORM_CAP_BACO 0x00020000 // Does the driver supports BACO state.
132#define ATOM_PP_PLATFORM_CAP_NEW_CAC_VOLTAGE 0x00040000 // Does the driver supports new CAC voltage table.
133#define ATOM_PP_PLATFORM_CAP_REVERT_GPIO5_POLARITY 0x00080000 // Does the driver supports revert GPIO5 polarity.
134#define ATOM_PP_PLATFORM_CAP_OUTPUT_THERMAL2GPIO17 0x00100000 // Does the driver supports thermal2GPIO17.
135#define ATOM_PP_PLATFORM_CAP_VRHOT_GPIO_CONFIGURABLE 0x00200000 // Does the driver supports VR HOT GPIO Configurable.
136#define ATOM_PP_PLATFORM_CAP_TEMP_INVERSION 0x00400000 // Does the driver supports Temp Inversion feature.
137#define ATOM_PP_PLATFORM_CAP_EVV 0x00800000
138
139typedef struct _ATOM_PPLIB_POWERPLAYTABLE
140{
141 ATOM_COMMON_TABLE_HEADER sHeader;
142
143 UCHAR ucDataRevision;
144
145 UCHAR ucNumStates;
146 UCHAR ucStateEntrySize;
147 UCHAR ucClockInfoSize;
148 UCHAR ucNonClockSize;
149
150 // offset from start of this table to array of ucNumStates ATOM_PPLIB_STATE structures
151 USHORT usStateArrayOffset;
152
153 // offset from start of this table to array of ASIC-specific structures,
154 // currently ATOM_PPLIB_CLOCK_INFO.
155 USHORT usClockInfoArrayOffset;
156
157 // offset from start of this table to array of ATOM_PPLIB_NONCLOCK_INFO
158 USHORT usNonClockInfoArrayOffset;
159
160 USHORT usBackbiasTime; // in microseconds
161 USHORT usVoltageTime; // in microseconds
162 USHORT usTableSize; //the size of this structure, or the extended structure
163
164 ULONG ulPlatformCaps; // See ATOM_PPLIB_CAPS_*
165
166 ATOM_PPLIB_THERMALCONTROLLER sThermalController;
167
168 USHORT usBootClockInfoOffset;
169 USHORT usBootNonClockInfoOffset;
170
171} ATOM_PPLIB_POWERPLAYTABLE;
172
173typedef struct _ATOM_PPLIB_POWERPLAYTABLE2
174{
175 ATOM_PPLIB_POWERPLAYTABLE basicTable;
176 UCHAR ucNumCustomThermalPolicy;
177 USHORT usCustomThermalPolicyArrayOffset;
178}ATOM_PPLIB_POWERPLAYTABLE2, *LPATOM_PPLIB_POWERPLAYTABLE2;
179
180typedef struct _ATOM_PPLIB_POWERPLAYTABLE3
181{
182 ATOM_PPLIB_POWERPLAYTABLE2 basicTable2;
183 USHORT usFormatID; // To be used ONLY by PPGen.
184 USHORT usFanTableOffset;
185 USHORT usExtendendedHeaderOffset;
186} ATOM_PPLIB_POWERPLAYTABLE3, *LPATOM_PPLIB_POWERPLAYTABLE3;
187
188typedef struct _ATOM_PPLIB_POWERPLAYTABLE4
189{
190 ATOM_PPLIB_POWERPLAYTABLE3 basicTable3;
191 ULONG ulGoldenPPID; // PPGen use only
192 ULONG ulGoldenRevision; // PPGen use only
193 USHORT usVddcDependencyOnSCLKOffset;
194 USHORT usVddciDependencyOnMCLKOffset;
195 USHORT usVddcDependencyOnMCLKOffset;
196 USHORT usMaxClockVoltageOnDCOffset;
197 USHORT usVddcPhaseShedLimitsTableOffset; // Points to ATOM_PPLIB_PhaseSheddingLimits_Table
198 USHORT usMvddDependencyOnMCLKOffset;
199} ATOM_PPLIB_POWERPLAYTABLE4, *LPATOM_PPLIB_POWERPLAYTABLE4;
200
201typedef struct _ATOM_PPLIB_POWERPLAYTABLE5
202{
203 ATOM_PPLIB_POWERPLAYTABLE4 basicTable4;
204 ULONG ulTDPLimit;
205 ULONG ulNearTDPLimit;
206 ULONG ulSQRampingThreshold;
207 USHORT usCACLeakageTableOffset; // Points to ATOM_PPLIB_CAC_Leakage_Table
208 ULONG ulCACLeakage; // The iLeakage for driver calculated CAC leakage table
209 USHORT usTDPODLimit;
210 USHORT usLoadLineSlope; // in milliOhms * 100
211} ATOM_PPLIB_POWERPLAYTABLE5, *LPATOM_PPLIB_POWERPLAYTABLE5;
212
213//// ATOM_PPLIB_NONCLOCK_INFO::usClassification
214#define ATOM_PPLIB_CLASSIFICATION_UI_MASK 0x0007
215#define ATOM_PPLIB_CLASSIFICATION_UI_SHIFT 0
216#define ATOM_PPLIB_CLASSIFICATION_UI_NONE 0
217#define ATOM_PPLIB_CLASSIFICATION_UI_BATTERY 1
218#define ATOM_PPLIB_CLASSIFICATION_UI_BALANCED 3
219#define ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE 5
220// 2, 4, 6, 7 are reserved
221
222#define ATOM_PPLIB_CLASSIFICATION_BOOT 0x0008
223#define ATOM_PPLIB_CLASSIFICATION_THERMAL 0x0010
224#define ATOM_PPLIB_CLASSIFICATION_LIMITEDPOWERSOURCE 0x0020
225#define ATOM_PPLIB_CLASSIFICATION_REST 0x0040
226#define ATOM_PPLIB_CLASSIFICATION_FORCED 0x0080
227#define ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE 0x0100
228#define ATOM_PPLIB_CLASSIFICATION_OVERDRIVETEMPLATE 0x0200
229#define ATOM_PPLIB_CLASSIFICATION_UVDSTATE 0x0400
230#define ATOM_PPLIB_CLASSIFICATION_3DLOW 0x0800
231#define ATOM_PPLIB_CLASSIFICATION_ACPI 0x1000
232#define ATOM_PPLIB_CLASSIFICATION_HD2STATE 0x2000
233#define ATOM_PPLIB_CLASSIFICATION_HDSTATE 0x4000
234#define ATOM_PPLIB_CLASSIFICATION_SDSTATE 0x8000
235
236//// ATOM_PPLIB_NONCLOCK_INFO::usClassification2
237#define ATOM_PPLIB_CLASSIFICATION2_LIMITEDPOWERSOURCE_2 0x0001
238#define ATOM_PPLIB_CLASSIFICATION2_ULV 0x0002
239#define ATOM_PPLIB_CLASSIFICATION2_MVC 0x0004 //Multi-View Codec (BD-3D)
240
241//// ATOM_PPLIB_NONCLOCK_INFO::ulCapsAndSettings
242#define ATOM_PPLIB_SINGLE_DISPLAY_ONLY 0x00000001
243#define ATOM_PPLIB_SUPPORTS_VIDEO_PLAYBACK 0x00000002
244
245// 0 is 2.5Gb/s, 1 is 5Gb/s
246#define ATOM_PPLIB_PCIE_LINK_SPEED_MASK 0x00000004
247#define ATOM_PPLIB_PCIE_LINK_SPEED_SHIFT 2
248
249// lanes - 1: 1, 2, 4, 8, 12, 16 permitted by PCIE spec
250#define ATOM_PPLIB_PCIE_LINK_WIDTH_MASK 0x000000F8
251#define ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT 3
252
253// lookup into reduced refresh-rate table
254#define ATOM_PPLIB_LIMITED_REFRESHRATE_VALUE_MASK 0x00000F00
255#define ATOM_PPLIB_LIMITED_REFRESHRATE_VALUE_SHIFT 8
256
257#define ATOM_PPLIB_LIMITED_REFRESHRATE_UNLIMITED 0
258#define ATOM_PPLIB_LIMITED_REFRESHRATE_50HZ 1
259// 2-15 TBD as needed.
260
261#define ATOM_PPLIB_SOFTWARE_DISABLE_LOADBALANCING 0x00001000
262#define ATOM_PPLIB_SOFTWARE_ENABLE_SLEEP_FOR_TIMESTAMPS 0x00002000
263
264#define ATOM_PPLIB_DISALLOW_ON_DC 0x00004000
265
266#define ATOM_PPLIB_ENABLE_VARIBRIGHT 0x00008000
267
268//memory related flags
269#define ATOM_PPLIB_SWSTATE_MEMORY_DLL_OFF 0x000010000
270
271//M3 Arb //2bits, current 3 sets of parameters in total
272#define ATOM_PPLIB_M3ARB_MASK 0x00060000
273#define ATOM_PPLIB_M3ARB_SHIFT 17
274
275#define ATOM_PPLIB_ENABLE_DRR 0x00080000
276
277// remaining 16 bits are reserved
278typedef struct _ATOM_PPLIB_THERMAL_STATE
279{
280 UCHAR ucMinTemperature;
281 UCHAR ucMaxTemperature;
282 UCHAR ucThermalAction;
283}ATOM_PPLIB_THERMAL_STATE, *LPATOM_PPLIB_THERMAL_STATE;
284
285// Contained in an array starting at the offset
286// in ATOM_PPLIB_POWERPLAYTABLE::usNonClockInfoArrayOffset.
287// referenced from ATOM_PPLIB_STATE_INFO::ucNonClockStateIndex
288#define ATOM_PPLIB_NONCLOCKINFO_VER1 12
289#define ATOM_PPLIB_NONCLOCKINFO_VER2 24
290typedef struct _ATOM_PPLIB_NONCLOCK_INFO
291{
292 USHORT usClassification;
293 UCHAR ucMinTemperature;
294 UCHAR ucMaxTemperature;
295 ULONG ulCapsAndSettings;
296 UCHAR ucRequiredPower;
297 USHORT usClassification2;
298 ULONG ulVCLK;
299 ULONG ulDCLK;
300 UCHAR ucUnused[5];
301} ATOM_PPLIB_NONCLOCK_INFO;
302
303// Contained in an array starting at the offset
304// in ATOM_PPLIB_POWERPLAYTABLE::usClockInfoArrayOffset.
305// referenced from ATOM_PPLIB_STATE::ucClockStateIndices
306typedef struct _ATOM_PPLIB_R600_CLOCK_INFO
307{
308 USHORT usEngineClockLow;
309 UCHAR ucEngineClockHigh;
310
311 USHORT usMemoryClockLow;
312 UCHAR ucMemoryClockHigh;
313
314 USHORT usVDDC;
315 USHORT usUnused1;
316 USHORT usUnused2;
317
318 ULONG ulFlags; // ATOM_PPLIB_R600_FLAGS_*
319
320} ATOM_PPLIB_R600_CLOCK_INFO;
321
322// ulFlags in ATOM_PPLIB_R600_CLOCK_INFO
323#define ATOM_PPLIB_R600_FLAGS_PCIEGEN2 1
324#define ATOM_PPLIB_R600_FLAGS_UVDSAFE 2
325#define ATOM_PPLIB_R600_FLAGS_BACKBIASENABLE 4
326#define ATOM_PPLIB_R600_FLAGS_MEMORY_ODT_OFF 8
327#define ATOM_PPLIB_R600_FLAGS_MEMORY_DLL_OFF 16
328#define ATOM_PPLIB_R600_FLAGS_LOWPOWER 32 // On the RV770 use 'low power' setting (sequencer S0).
329
330typedef struct _ATOM_PPLIB_RS780_CLOCK_INFO
331
332{
333 USHORT usLowEngineClockLow; // Low Engine clock in MHz (the same way as on the R600).
334 UCHAR ucLowEngineClockHigh;
335 USHORT usHighEngineClockLow; // High Engine clock in MHz.
336 UCHAR ucHighEngineClockHigh;
337 USHORT usMemoryClockLow; // For now one of the ATOM_PPLIB_RS780_SPMCLK_XXXX constants.
338 UCHAR ucMemoryClockHigh; // Currentyl unused.
339 UCHAR ucPadding; // For proper alignment and size.
340 USHORT usVDDC; // For the 780, use: None, Low, High, Variable
341 UCHAR ucMaxHTLinkWidth; // From SBIOS - {2, 4, 8, 16}
342 UCHAR ucMinHTLinkWidth; // From SBIOS - {2, 4, 8, 16}. Effective only if CDLW enabled. Minimum down stream width could
343 USHORT usHTLinkFreq; // See definition ATOM_PPLIB_RS780_HTLINKFREQ_xxx or in MHz(>=200).
344 ULONG ulFlags;
345} ATOM_PPLIB_RS780_CLOCK_INFO;
346
347#define ATOM_PPLIB_RS780_VOLTAGE_NONE 0
348#define ATOM_PPLIB_RS780_VOLTAGE_LOW 1
349#define ATOM_PPLIB_RS780_VOLTAGE_HIGH 2
350#define ATOM_PPLIB_RS780_VOLTAGE_VARIABLE 3
351
352#define ATOM_PPLIB_RS780_SPMCLK_NONE 0 // We cannot change the side port memory clock, leave it as it is.
353#define ATOM_PPLIB_RS780_SPMCLK_LOW 1
354#define ATOM_PPLIB_RS780_SPMCLK_HIGH 2
355
356#define ATOM_PPLIB_RS780_HTLINKFREQ_NONE 0
357#define ATOM_PPLIB_RS780_HTLINKFREQ_LOW 1
358#define ATOM_PPLIB_RS780_HTLINKFREQ_HIGH 2
359
360typedef struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO
361{
362 USHORT usEngineClockLow;
363 UCHAR ucEngineClockHigh;
364
365 USHORT usMemoryClockLow;
366 UCHAR ucMemoryClockHigh;
367
368 USHORT usVDDC;
369 USHORT usVDDCI;
370 USHORT usUnused;
371
372 ULONG ulFlags; // ATOM_PPLIB_R600_FLAGS_*
373
374} ATOM_PPLIB_EVERGREEN_CLOCK_INFO;
375
376typedef struct _ATOM_PPLIB_SI_CLOCK_INFO
377{
378 USHORT usEngineClockLow;
379 UCHAR ucEngineClockHigh;
380
381 USHORT usMemoryClockLow;
382 UCHAR ucMemoryClockHigh;
383
384 USHORT usVDDC;
385 USHORT usVDDCI;
386 UCHAR ucPCIEGen;
387 UCHAR ucUnused1;
388
389 ULONG ulFlags; // ATOM_PPLIB_SI_FLAGS_*, no flag is necessary for now
390
391} ATOM_PPLIB_SI_CLOCK_INFO;
392
393typedef struct _ATOM_PPLIB_CI_CLOCK_INFO
394{
395 USHORT usEngineClockLow;
396 UCHAR ucEngineClockHigh;
397
398 USHORT usMemoryClockLow;
399 UCHAR ucMemoryClockHigh;
400
401 UCHAR ucPCIEGen;
402 USHORT usPCIELane;
403} ATOM_PPLIB_CI_CLOCK_INFO;
404
405typedef struct _ATOM_PPLIB_SUMO_CLOCK_INFO{
406 USHORT usEngineClockLow; //clockfrequency & 0xFFFF. The unit is in 10khz
407 UCHAR ucEngineClockHigh; //clockfrequency >> 16.
408 UCHAR vddcIndex; //2-bit vddc index;
409 USHORT tdpLimit;
410 //please initalize to 0
411 USHORT rsv1;
412 //please initialize to 0s
413 ULONG rsv2[2];
414}ATOM_PPLIB_SUMO_CLOCK_INFO;
415
416typedef struct _ATOM_PPLIB_STATE_V2
417{
418 //number of valid dpm levels in this state; Driver uses it to calculate the whole
419 //size of the state: sizeof(ATOM_PPLIB_STATE_V2) + (ucNumDPMLevels - 1) * sizeof(UCHAR)
420 UCHAR ucNumDPMLevels;
421
422 //a index to the array of nonClockInfos
423 UCHAR nonClockInfoIndex;
424 /**
425 * Driver will read the first ucNumDPMLevels in this array
426 */
427 UCHAR clockInfoIndex[1];
428} ATOM_PPLIB_STATE_V2;
429
430typedef struct _StateArray{
431 //how many states we have
432 UCHAR ucNumEntries;
433
434 ATOM_PPLIB_STATE_V2 states[1];
435}StateArray;
436
437
438typedef struct _ClockInfoArray{
439 //how many clock levels we have
440 UCHAR ucNumEntries;
441
442 //sizeof(ATOM_PPLIB_CLOCK_INFO)
443 UCHAR ucEntrySize;
444
445 UCHAR clockInfo[1];
446}ClockInfoArray;
447
448typedef struct _NonClockInfoArray{
449
450 //how many non-clock levels we have. normally should be same as number of states
451 UCHAR ucNumEntries;
452 //sizeof(ATOM_PPLIB_NONCLOCK_INFO)
453 UCHAR ucEntrySize;
454
455 ATOM_PPLIB_NONCLOCK_INFO nonClockInfo[1];
456}NonClockInfoArray;
457
458typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Record
459{
460 USHORT usClockLow;
461 UCHAR ucClockHigh;
462 USHORT usVoltage;
463}ATOM_PPLIB_Clock_Voltage_Dependency_Record;
464
465typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Table
466{
467 UCHAR ucNumEntries; // Number of entries.
468 ATOM_PPLIB_Clock_Voltage_Dependency_Record entries[1]; // Dynamically allocate entries.
469}ATOM_PPLIB_Clock_Voltage_Dependency_Table;
470
471typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Record
472{
473 USHORT usSclkLow;
474 UCHAR ucSclkHigh;
475 USHORT usMclkLow;
476 UCHAR ucMclkHigh;
477 USHORT usVddc;
478 USHORT usVddci;
479}ATOM_PPLIB_Clock_Voltage_Limit_Record;
480
481typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Table
482{
483 UCHAR ucNumEntries; // Number of entries.
484 ATOM_PPLIB_Clock_Voltage_Limit_Record entries[1]; // Dynamically allocate entries.
485}ATOM_PPLIB_Clock_Voltage_Limit_Table;
486
487union _ATOM_PPLIB_CAC_Leakage_Record
488{
489 struct
490 {
491 USHORT usVddc; // We use this field for the "fake" standardized VDDC for power calculations; For CI and newer, we use this as the real VDDC value. in CI we read it as StdVoltageHiSidd
492 ULONG ulLeakageValue; // For CI and newer we use this as the "fake" standar VDDC value. in CI we read it as StdVoltageLoSidd
493
494 };
495 struct
496 {
497 USHORT usVddc1;
498 USHORT usVddc2;
499 USHORT usVddc3;
500 };
501};
502
503typedef union _ATOM_PPLIB_CAC_Leakage_Record ATOM_PPLIB_CAC_Leakage_Record;
504
505typedef struct _ATOM_PPLIB_CAC_Leakage_Table
506{
507 UCHAR ucNumEntries; // Number of entries.
508 ATOM_PPLIB_CAC_Leakage_Record entries[1]; // Dynamically allocate entries.
509}ATOM_PPLIB_CAC_Leakage_Table;
510
511typedef struct _ATOM_PPLIB_PhaseSheddingLimits_Record
512{
513 USHORT usVoltage;
514 USHORT usSclkLow;
515 UCHAR ucSclkHigh;
516 USHORT usMclkLow;
517 UCHAR ucMclkHigh;
518}ATOM_PPLIB_PhaseSheddingLimits_Record;
519
520typedef struct _ATOM_PPLIB_PhaseSheddingLimits_Table
521{
522 UCHAR ucNumEntries; // Number of entries.
523 ATOM_PPLIB_PhaseSheddingLimits_Record entries[1]; // Dynamically allocate entries.
524}ATOM_PPLIB_PhaseSheddingLimits_Table;
525
526typedef struct _VCEClockInfo{
527 USHORT usEVClkLow;
528 UCHAR ucEVClkHigh;
529 USHORT usECClkLow;
530 UCHAR ucECClkHigh;
531}VCEClockInfo;
532
533typedef struct _VCEClockInfoArray{
534 UCHAR ucNumEntries;
535 VCEClockInfo entries[1];
536}VCEClockInfoArray;
537
538typedef struct _ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record
539{
540 USHORT usVoltage;
541 UCHAR ucVCEClockInfoIndex;
542}ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record;
543
544typedef struct _ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table
545{
546 UCHAR numEntries;
547 ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record entries[1];
548}ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table;
549
550typedef struct _ATOM_PPLIB_VCE_State_Record
551{
552 UCHAR ucVCEClockInfoIndex;
553 UCHAR ucClockInfoIndex; //highest 2 bits indicates memory p-states, lower 6bits indicates index to ClockInfoArrary
554}ATOM_PPLIB_VCE_State_Record;
555
556typedef struct _ATOM_PPLIB_VCE_State_Table
557{
558 UCHAR numEntries;
559 ATOM_PPLIB_VCE_State_Record entries[1];
560}ATOM_PPLIB_VCE_State_Table;
561
562
563typedef struct _ATOM_PPLIB_VCE_Table
564{
565 UCHAR revid;
566// VCEClockInfoArray array;
567// ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table limits;
568// ATOM_PPLIB_VCE_State_Table states;
569}ATOM_PPLIB_VCE_Table;
570
571
572typedef struct _UVDClockInfo{
573 USHORT usVClkLow;
574 UCHAR ucVClkHigh;
575 USHORT usDClkLow;
576 UCHAR ucDClkHigh;
577}UVDClockInfo;
578
579typedef struct _UVDClockInfoArray{
580 UCHAR ucNumEntries;
581 UVDClockInfo entries[1];
582}UVDClockInfoArray;
583
584typedef struct _ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record
585{
586 USHORT usVoltage;
587 UCHAR ucUVDClockInfoIndex;
588}ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record;
589
590typedef struct _ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table
591{
592 UCHAR numEntries;
593 ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record entries[1];
594}ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table;
595
596typedef struct _ATOM_PPLIB_UVD_Table
597{
598 UCHAR revid;
599// UVDClockInfoArray array;
600// ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table limits;
601}ATOM_PPLIB_UVD_Table;
602
603typedef struct _ATOM_PPLIB_SAMClk_Voltage_Limit_Record
604{
605 USHORT usVoltage;
606 USHORT usSAMClockLow;
607 UCHAR ucSAMClockHigh;
608}ATOM_PPLIB_SAMClk_Voltage_Limit_Record;
609
610typedef struct _ATOM_PPLIB_SAMClk_Voltage_Limit_Table{
611 UCHAR numEntries;
612 ATOM_PPLIB_SAMClk_Voltage_Limit_Record entries[1];
613}ATOM_PPLIB_SAMClk_Voltage_Limit_Table;
614
615typedef struct _ATOM_PPLIB_SAMU_Table
616{
617 UCHAR revid;
618 ATOM_PPLIB_SAMClk_Voltage_Limit_Table limits;
619}ATOM_PPLIB_SAMU_Table;
620
621typedef struct _ATOM_PPLIB_ACPClk_Voltage_Limit_Record
622{
623 USHORT usVoltage;
624 USHORT usACPClockLow;
625 UCHAR ucACPClockHigh;
626}ATOM_PPLIB_ACPClk_Voltage_Limit_Record;
627
628typedef struct _ATOM_PPLIB_ACPClk_Voltage_Limit_Table{
629 UCHAR numEntries;
630 ATOM_PPLIB_ACPClk_Voltage_Limit_Record entries[1];
631}ATOM_PPLIB_ACPClk_Voltage_Limit_Table;
632
633typedef struct _ATOM_PPLIB_ACP_Table
634{
635 UCHAR revid;
636 ATOM_PPLIB_ACPClk_Voltage_Limit_Table limits;
637}ATOM_PPLIB_ACP_Table;
638
639typedef struct _ATOM_PowerTune_Table{
640 USHORT usTDP;
641 USHORT usConfigurableTDP;
642 USHORT usTDC;
643 USHORT usBatteryPowerLimit;
644 USHORT usSmallPowerLimit;
645 USHORT usLowCACLeakage;
646 USHORT usHighCACLeakage;
647}ATOM_PowerTune_Table;
648
649typedef struct _ATOM_PPLIB_POWERTUNE_Table
650{
651 UCHAR revid;
652 ATOM_PowerTune_Table power_tune_table;
653}ATOM_PPLIB_POWERTUNE_Table;
654
655typedef struct _ATOM_PPLIB_POWERTUNE_Table_V1
656{
657 UCHAR revid;
658 ATOM_PowerTune_Table power_tune_table;
659 USHORT usMaximumPowerDeliveryLimit;
660 USHORT usReserve[7];
661} ATOM_PPLIB_POWERTUNE_Table_V1;
662
663#define ATOM_PPM_A_A 1
664#define ATOM_PPM_A_I 2
665typedef struct _ATOM_PPLIB_PPM_Table
666{
667 UCHAR ucRevId;
668 UCHAR ucPpmDesign; //A+I or A+A
669 USHORT usCpuCoreNumber;
670 ULONG ulPlatformTDP;
671 ULONG ulSmallACPlatformTDP;
672 ULONG ulPlatformTDC;
673 ULONG ulSmallACPlatformTDC;
674 ULONG ulApuTDP;
675 ULONG ulDGpuTDP;
676 ULONG ulDGpuUlvPower;
677 ULONG ulTjmax;
678} ATOM_PPLIB_PPM_Table;
679
680#pragma pack(pop)
681
682#endif
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 5625cf706f0c..9fc61dd68bc0 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -1102,7 +1102,7 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
1102 r100_cp_load_microcode(rdev); 1102 r100_cp_load_microcode(rdev);
1103 r = radeon_ring_init(rdev, ring, ring_size, RADEON_WB_CP_RPTR_OFFSET, 1103 r = radeon_ring_init(rdev, ring, ring_size, RADEON_WB_CP_RPTR_OFFSET,
1104 RADEON_CP_RB_RPTR, RADEON_CP_RB_WPTR, 1104 RADEON_CP_RB_RPTR, RADEON_CP_RB_WPTR,
1105 0, 0x7fffff, RADEON_CP_PACKET2); 1105 RADEON_CP_PACKET2);
1106 if (r) { 1106 if (r) {
1107 return r; 1107 return r;
1108 } 1108 }
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index cfc1d28ade39..ea4d3734e6d9 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1374,7 +1374,7 @@ static bool r600_is_display_hung(struct radeon_device *rdev)
1374 return true; 1374 return true;
1375} 1375}
1376 1376
1377static u32 r600_gpu_check_soft_reset(struct radeon_device *rdev) 1377u32 r600_gpu_check_soft_reset(struct radeon_device *rdev)
1378{ 1378{
1379 u32 reset_mask = 0; 1379 u32 reset_mask = 0;
1380 u32 tmp; 1380 u32 tmp;
@@ -1622,28 +1622,6 @@ bool r600_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1622 return radeon_ring_test_lockup(rdev, ring); 1622 return radeon_ring_test_lockup(rdev, ring);
1623} 1623}
1624 1624
1625/**
1626 * r600_dma_is_lockup - Check if the DMA engine is locked up
1627 *
1628 * @rdev: radeon_device pointer
1629 * @ring: radeon_ring structure holding ring information
1630 *
1631 * Check if the async DMA engine is locked up.
1632 * Returns true if the engine appears to be locked up, false if not.
1633 */
1634bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
1635{
1636 u32 reset_mask = r600_gpu_check_soft_reset(rdev);
1637
1638 if (!(reset_mask & RADEON_RESET_DMA)) {
1639 radeon_ring_lockup_update(ring);
1640 return false;
1641 }
1642 /* force ring activities */
1643 radeon_ring_force_activity(rdev, ring);
1644 return radeon_ring_test_lockup(rdev, ring);
1645}
1646
1647u32 r6xx_remap_render_backend(struct radeon_device *rdev, 1625u32 r6xx_remap_render_backend(struct radeon_device *rdev,
1648 u32 tiling_pipe_num, 1626 u32 tiling_pipe_num,
1649 u32 max_rb_num, 1627 u32 max_rb_num,
@@ -2299,9 +2277,13 @@ int r600_init_microcode(struct radeon_device *rdev)
2299 if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_HEMLOCK)) { 2277 if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_HEMLOCK)) {
2300 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", smc_chip_name); 2278 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", smc_chip_name);
2301 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); 2279 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
2302 if (err) 2280 if (err) {
2303 goto out; 2281 printk(KERN_ERR
2304 if (rdev->smc_fw->size != smc_req_size) { 2282 "smc: error loading firmware \"%s\"\n",
2283 fw_name);
2284 release_firmware(rdev->smc_fw);
2285 rdev->smc_fw = NULL;
2286 } else if (rdev->smc_fw->size != smc_req_size) {
2305 printk(KERN_ERR 2287 printk(KERN_ERR
2306 "smc: Bogus length %zu in firmware \"%s\"\n", 2288 "smc: Bogus length %zu in firmware \"%s\"\n",
2307 rdev->smc_fw->size, fw_name); 2289 rdev->smc_fw->size, fw_name);
@@ -2490,327 +2472,6 @@ void r600_cp_fini(struct radeon_device *rdev)
2490} 2472}
2491 2473
2492/* 2474/*
2493 * DMA
2494 * Starting with R600, the GPU has an asynchronous
2495 * DMA engine. The programming model is very similar
2496 * to the 3D engine (ring buffer, IBs, etc.), but the
2497 * DMA controller has it's own packet format that is
2498 * different form the PM4 format used by the 3D engine.
2499 * It supports copying data, writing embedded data,
2500 * solid fills, and a number of other things. It also
2501 * has support for tiling/detiling of buffers.
2502 */
2503/**
2504 * r600_dma_stop - stop the async dma engine
2505 *
2506 * @rdev: radeon_device pointer
2507 *
2508 * Stop the async dma engine (r6xx-evergreen).
2509 */
2510void r600_dma_stop(struct radeon_device *rdev)
2511{
2512 u32 rb_cntl = RREG32(DMA_RB_CNTL);
2513
2514 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
2515
2516 rb_cntl &= ~DMA_RB_ENABLE;
2517 WREG32(DMA_RB_CNTL, rb_cntl);
2518
2519 rdev->ring[R600_RING_TYPE_DMA_INDEX].ready = false;
2520}
2521
2522/**
2523 * r600_dma_resume - setup and start the async dma engine
2524 *
2525 * @rdev: radeon_device pointer
2526 *
2527 * Set up the DMA ring buffer and enable it. (r6xx-evergreen).
2528 * Returns 0 for success, error for failure.
2529 */
2530int r600_dma_resume(struct radeon_device *rdev)
2531{
2532 struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
2533 u32 rb_cntl, dma_cntl, ib_cntl;
2534 u32 rb_bufsz;
2535 int r;
2536
2537 /* Reset dma */
2538 if (rdev->family >= CHIP_RV770)
2539 WREG32(SRBM_SOFT_RESET, RV770_SOFT_RESET_DMA);
2540 else
2541 WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA);
2542 RREG32(SRBM_SOFT_RESET);
2543 udelay(50);
2544 WREG32(SRBM_SOFT_RESET, 0);
2545
2546 WREG32(DMA_SEM_INCOMPLETE_TIMER_CNTL, 0);
2547 WREG32(DMA_SEM_WAIT_FAIL_TIMER_CNTL, 0);
2548
2549 /* Set ring buffer size in dwords */
2550 rb_bufsz = order_base_2(ring->ring_size / 4);
2551 rb_cntl = rb_bufsz << 1;
2552#ifdef __BIG_ENDIAN
2553 rb_cntl |= DMA_RB_SWAP_ENABLE | DMA_RPTR_WRITEBACK_SWAP_ENABLE;
2554#endif
2555 WREG32(DMA_RB_CNTL, rb_cntl);
2556
2557 /* Initialize the ring buffer's read and write pointers */
2558 WREG32(DMA_RB_RPTR, 0);
2559 WREG32(DMA_RB_WPTR, 0);
2560
2561 /* set the wb address whether it's enabled or not */
2562 WREG32(DMA_RB_RPTR_ADDR_HI,
2563 upper_32_bits(rdev->wb.gpu_addr + R600_WB_DMA_RPTR_OFFSET) & 0xFF);
2564 WREG32(DMA_RB_RPTR_ADDR_LO,
2565 ((rdev->wb.gpu_addr + R600_WB_DMA_RPTR_OFFSET) & 0xFFFFFFFC));
2566
2567 if (rdev->wb.enabled)
2568 rb_cntl |= DMA_RPTR_WRITEBACK_ENABLE;
2569
2570 WREG32(DMA_RB_BASE, ring->gpu_addr >> 8);
2571
2572 /* enable DMA IBs */
2573 ib_cntl = DMA_IB_ENABLE;
2574#ifdef __BIG_ENDIAN
2575 ib_cntl |= DMA_IB_SWAP_ENABLE;
2576#endif
2577 WREG32(DMA_IB_CNTL, ib_cntl);
2578
2579 dma_cntl = RREG32(DMA_CNTL);
2580 dma_cntl &= ~CTXEMPTY_INT_ENABLE;
2581 WREG32(DMA_CNTL, dma_cntl);
2582
2583 if (rdev->family >= CHIP_RV770)
2584 WREG32(DMA_MODE, 1);
2585
2586 ring->wptr = 0;
2587 WREG32(DMA_RB_WPTR, ring->wptr << 2);
2588
2589 ring->rptr = RREG32(DMA_RB_RPTR) >> 2;
2590
2591 WREG32(DMA_RB_CNTL, rb_cntl | DMA_RB_ENABLE);
2592
2593 ring->ready = true;
2594
2595 r = radeon_ring_test(rdev, R600_RING_TYPE_DMA_INDEX, ring);
2596 if (r) {
2597 ring->ready = false;
2598 return r;
2599 }
2600
2601 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
2602
2603 return 0;
2604}
2605
2606/**
2607 * r600_dma_fini - tear down the async dma engine
2608 *
2609 * @rdev: radeon_device pointer
2610 *
2611 * Stop the async dma engine and free the ring (r6xx-evergreen).
2612 */
2613void r600_dma_fini(struct radeon_device *rdev)
2614{
2615 r600_dma_stop(rdev);
2616 radeon_ring_fini(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX]);
2617}
2618
2619/*
2620 * UVD
2621 */
2622int r600_uvd_rbc_start(struct radeon_device *rdev)
2623{
2624 struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
2625 uint64_t rptr_addr;
2626 uint32_t rb_bufsz, tmp;
2627 int r;
2628
2629 rptr_addr = rdev->wb.gpu_addr + R600_WB_UVD_RPTR_OFFSET;
2630
2631 if (upper_32_bits(rptr_addr) != upper_32_bits(ring->gpu_addr)) {
2632 DRM_ERROR("UVD ring and rptr not in the same 4GB segment!\n");
2633 return -EINVAL;
2634 }
2635
2636 /* force RBC into idle state */
2637 WREG32(UVD_RBC_RB_CNTL, 0x11010101);
2638
2639 /* Set the write pointer delay */
2640 WREG32(UVD_RBC_RB_WPTR_CNTL, 0);
2641
2642 /* set the wb address */
2643 WREG32(UVD_RBC_RB_RPTR_ADDR, rptr_addr >> 2);
2644
2645 /* programm the 4GB memory segment for rptr and ring buffer */
2646 WREG32(UVD_LMI_EXT40_ADDR, upper_32_bits(rptr_addr) |
2647 (0x7 << 16) | (0x1 << 31));
2648
2649 /* Initialize the ring buffer's read and write pointers */
2650 WREG32(UVD_RBC_RB_RPTR, 0x0);
2651
2652 ring->wptr = ring->rptr = RREG32(UVD_RBC_RB_RPTR);
2653 WREG32(UVD_RBC_RB_WPTR, ring->wptr);
2654
2655 /* set the ring address */
2656 WREG32(UVD_RBC_RB_BASE, ring->gpu_addr);
2657
2658 /* Set ring buffer size */
2659 rb_bufsz = order_base_2(ring->ring_size);
2660 rb_bufsz = (0x1 << 8) | rb_bufsz;
2661 WREG32(UVD_RBC_RB_CNTL, rb_bufsz);
2662
2663 ring->ready = true;
2664 r = radeon_ring_test(rdev, R600_RING_TYPE_UVD_INDEX, ring);
2665 if (r) {
2666 ring->ready = false;
2667 return r;
2668 }
2669
2670 r = radeon_ring_lock(rdev, ring, 10);
2671 if (r) {
2672 DRM_ERROR("radeon: ring failed to lock UVD ring (%d).\n", r);
2673 return r;
2674 }
2675
2676 tmp = PACKET0(UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL, 0);
2677 radeon_ring_write(ring, tmp);
2678 radeon_ring_write(ring, 0xFFFFF);
2679
2680 tmp = PACKET0(UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL, 0);
2681 radeon_ring_write(ring, tmp);
2682 radeon_ring_write(ring, 0xFFFFF);
2683
2684 tmp = PACKET0(UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL, 0);
2685 radeon_ring_write(ring, tmp);
2686 radeon_ring_write(ring, 0xFFFFF);
2687
2688 /* Clear timeout status bits */
2689 radeon_ring_write(ring, PACKET0(UVD_SEMA_TIMEOUT_STATUS, 0));
2690 radeon_ring_write(ring, 0x8);
2691
2692 radeon_ring_write(ring, PACKET0(UVD_SEMA_CNTL, 0));
2693 radeon_ring_write(ring, 3);
2694
2695 radeon_ring_unlock_commit(rdev, ring);
2696
2697 return 0;
2698}
2699
2700void r600_uvd_rbc_stop(struct radeon_device *rdev)
2701{
2702 struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
2703
2704 /* force RBC into idle state */
2705 WREG32(UVD_RBC_RB_CNTL, 0x11010101);
2706 ring->ready = false;
2707}
2708
2709int r600_uvd_init(struct radeon_device *rdev)
2710{
2711 int i, j, r;
2712 /* disable byte swapping */
2713 u32 lmi_swap_cntl = 0;
2714 u32 mp_swap_cntl = 0;
2715
2716 /* raise clocks while booting up the VCPU */
2717 radeon_set_uvd_clocks(rdev, 53300, 40000);
2718
2719 /* disable clock gating */
2720 WREG32(UVD_CGC_GATE, 0);
2721
2722 /* disable interupt */
2723 WREG32_P(UVD_MASTINT_EN, 0, ~(1 << 1));
2724
2725 /* put LMI, VCPU, RBC etc... into reset */
2726 WREG32(UVD_SOFT_RESET, LMI_SOFT_RESET | VCPU_SOFT_RESET |
2727 LBSI_SOFT_RESET | RBC_SOFT_RESET | CSM_SOFT_RESET |
2728 CXW_SOFT_RESET | TAP_SOFT_RESET | LMI_UMC_SOFT_RESET);
2729 mdelay(5);
2730
2731 /* take UVD block out of reset */
2732 WREG32_P(SRBM_SOFT_RESET, 0, ~SOFT_RESET_UVD);
2733 mdelay(5);
2734
2735 /* initialize UVD memory controller */
2736 WREG32(UVD_LMI_CTRL, 0x40 | (1 << 8) | (1 << 13) |
2737 (1 << 21) | (1 << 9) | (1 << 20));
2738
2739#ifdef __BIG_ENDIAN
2740 /* swap (8 in 32) RB and IB */
2741 lmi_swap_cntl = 0xa;
2742 mp_swap_cntl = 0;
2743#endif
2744 WREG32(UVD_LMI_SWAP_CNTL, lmi_swap_cntl);
2745 WREG32(UVD_MP_SWAP_CNTL, mp_swap_cntl);
2746
2747 WREG32(UVD_MPC_SET_MUXA0, 0x40c2040);
2748 WREG32(UVD_MPC_SET_MUXA1, 0x0);
2749 WREG32(UVD_MPC_SET_MUXB0, 0x40c2040);
2750 WREG32(UVD_MPC_SET_MUXB1, 0x0);
2751 WREG32(UVD_MPC_SET_ALU, 0);
2752 WREG32(UVD_MPC_SET_MUX, 0x88);
2753
2754 /* Stall UMC */
2755 WREG32_P(UVD_LMI_CTRL2, 1 << 8, ~(1 << 8));
2756 WREG32_P(UVD_RB_ARB_CTRL, 1 << 3, ~(1 << 3));
2757
2758 /* take all subblocks out of reset, except VCPU */
2759 WREG32(UVD_SOFT_RESET, VCPU_SOFT_RESET);
2760 mdelay(5);
2761
2762 /* enable VCPU clock */
2763 WREG32(UVD_VCPU_CNTL, 1 << 9);
2764
2765 /* enable UMC */
2766 WREG32_P(UVD_LMI_CTRL2, 0, ~(1 << 8));
2767
2768 /* boot up the VCPU */
2769 WREG32(UVD_SOFT_RESET, 0);
2770 mdelay(10);
2771
2772 WREG32_P(UVD_RB_ARB_CTRL, 0, ~(1 << 3));
2773
2774 for (i = 0; i < 10; ++i) {
2775 uint32_t status;
2776 for (j = 0; j < 100; ++j) {
2777 status = RREG32(UVD_STATUS);
2778 if (status & 2)
2779 break;
2780 mdelay(10);
2781 }
2782 r = 0;
2783 if (status & 2)
2784 break;
2785
2786 DRM_ERROR("UVD not responding, trying to reset the VCPU!!!\n");
2787 WREG32_P(UVD_SOFT_RESET, VCPU_SOFT_RESET, ~VCPU_SOFT_RESET);
2788 mdelay(10);
2789 WREG32_P(UVD_SOFT_RESET, 0, ~VCPU_SOFT_RESET);
2790 mdelay(10);
2791 r = -1;
2792 }
2793
2794 if (r) {
2795 DRM_ERROR("UVD not responding, giving up!!!\n");
2796 radeon_set_uvd_clocks(rdev, 0, 0);
2797 return r;
2798 }
2799
2800 /* enable interupt */
2801 WREG32_P(UVD_MASTINT_EN, 3<<1, ~(3 << 1));
2802
2803 r = r600_uvd_rbc_start(rdev);
2804 if (!r)
2805 DRM_INFO("UVD initialized successfully.\n");
2806
2807 /* lower clocks again */
2808 radeon_set_uvd_clocks(rdev, 0, 0);
2809
2810 return r;
2811}
2812
2813/*
2814 * GPU scratch registers helpers function. 2475 * GPU scratch registers helpers function.
2815 */ 2476 */
2816void r600_scratch_init(struct radeon_device *rdev) 2477void r600_scratch_init(struct radeon_device *rdev)
@@ -2865,94 +2526,6 @@ int r600_ring_test(struct radeon_device *rdev, struct radeon_ring *ring)
2865 return r; 2526 return r;
2866} 2527}
2867 2528
2868/**
2869 * r600_dma_ring_test - simple async dma engine test
2870 *
2871 * @rdev: radeon_device pointer
2872 * @ring: radeon_ring structure holding ring information
2873 *
2874 * Test the DMA engine by writing using it to write an
2875 * value to memory. (r6xx-SI).
2876 * Returns 0 for success, error for failure.
2877 */
2878int r600_dma_ring_test(struct radeon_device *rdev,
2879 struct radeon_ring *ring)
2880{
2881 unsigned i;
2882 int r;
2883 void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
2884 u32 tmp;
2885
2886 if (!ptr) {
2887 DRM_ERROR("invalid vram scratch pointer\n");
2888 return -EINVAL;
2889 }
2890
2891 tmp = 0xCAFEDEAD;
2892 writel(tmp, ptr);
2893
2894 r = radeon_ring_lock(rdev, ring, 4);
2895 if (r) {
2896 DRM_ERROR("radeon: dma failed to lock ring %d (%d).\n", ring->idx, r);
2897 return r;
2898 }
2899 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1));
2900 radeon_ring_write(ring, rdev->vram_scratch.gpu_addr & 0xfffffffc);
2901 radeon_ring_write(ring, upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xff);
2902 radeon_ring_write(ring, 0xDEADBEEF);
2903 radeon_ring_unlock_commit(rdev, ring);
2904
2905 for (i = 0; i < rdev->usec_timeout; i++) {
2906 tmp = readl(ptr);
2907 if (tmp == 0xDEADBEEF)
2908 break;
2909 DRM_UDELAY(1);
2910 }
2911
2912 if (i < rdev->usec_timeout) {
2913 DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
2914 } else {
2915 DRM_ERROR("radeon: ring %d test failed (0x%08X)\n",
2916 ring->idx, tmp);
2917 r = -EINVAL;
2918 }
2919 return r;
2920}
2921
2922int r600_uvd_ring_test(struct radeon_device *rdev, struct radeon_ring *ring)
2923{
2924 uint32_t tmp = 0;
2925 unsigned i;
2926 int r;
2927
2928 WREG32(UVD_CONTEXT_ID, 0xCAFEDEAD);
2929 r = radeon_ring_lock(rdev, ring, 3);
2930 if (r) {
2931 DRM_ERROR("radeon: cp failed to lock ring %d (%d).\n",
2932 ring->idx, r);
2933 return r;
2934 }
2935 radeon_ring_write(ring, PACKET0(UVD_CONTEXT_ID, 0));
2936 radeon_ring_write(ring, 0xDEADBEEF);
2937 radeon_ring_unlock_commit(rdev, ring);
2938 for (i = 0; i < rdev->usec_timeout; i++) {
2939 tmp = RREG32(UVD_CONTEXT_ID);
2940 if (tmp == 0xDEADBEEF)
2941 break;
2942 DRM_UDELAY(1);
2943 }
2944
2945 if (i < rdev->usec_timeout) {
2946 DRM_INFO("ring test on %d succeeded in %d usecs\n",
2947 ring->idx, i);
2948 } else {
2949 DRM_ERROR("radeon: ring %d test failed (0x%08X)\n",
2950 ring->idx, tmp);
2951 r = -EINVAL;
2952 }
2953 return r;
2954}
2955
2956/* 2529/*
2957 * CP fences/semaphores 2530 * CP fences/semaphores
2958 */ 2531 */
@@ -3004,30 +2577,6 @@ void r600_fence_ring_emit(struct radeon_device *rdev,
3004 } 2577 }
3005} 2578}
3006 2579
3007void r600_uvd_fence_emit(struct radeon_device *rdev,
3008 struct radeon_fence *fence)
3009{
3010 struct radeon_ring *ring = &rdev->ring[fence->ring];
3011 uint64_t addr = rdev->fence_drv[fence->ring].gpu_addr;
3012
3013 radeon_ring_write(ring, PACKET0(UVD_CONTEXT_ID, 0));
3014 radeon_ring_write(ring, fence->seq);
3015 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA0, 0));
3016 radeon_ring_write(ring, addr & 0xffffffff);
3017 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA1, 0));
3018 radeon_ring_write(ring, upper_32_bits(addr) & 0xff);
3019 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_CMD, 0));
3020 radeon_ring_write(ring, 0);
3021
3022 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA0, 0));
3023 radeon_ring_write(ring, 0);
3024 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA1, 0));
3025 radeon_ring_write(ring, 0);
3026 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_CMD, 0));
3027 radeon_ring_write(ring, 2);
3028 return;
3029}
3030
3031void r600_semaphore_ring_emit(struct radeon_device *rdev, 2580void r600_semaphore_ring_emit(struct radeon_device *rdev,
3032 struct radeon_ring *ring, 2581 struct radeon_ring *ring,
3033 struct radeon_semaphore *semaphore, 2582 struct radeon_semaphore *semaphore,
@@ -3044,95 +2593,6 @@ void r600_semaphore_ring_emit(struct radeon_device *rdev,
3044 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel); 2593 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel);
3045} 2594}
3046 2595
3047/*
3048 * DMA fences/semaphores
3049 */
3050
3051/**
3052 * r600_dma_fence_ring_emit - emit a fence on the DMA ring
3053 *
3054 * @rdev: radeon_device pointer
3055 * @fence: radeon fence object
3056 *
3057 * Add a DMA fence packet to the ring to write
3058 * the fence seq number and DMA trap packet to generate
3059 * an interrupt if needed (r6xx-r7xx).
3060 */
3061void r600_dma_fence_ring_emit(struct radeon_device *rdev,
3062 struct radeon_fence *fence)
3063{
3064 struct radeon_ring *ring = &rdev->ring[fence->ring];
3065 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
3066
3067 /* write the fence */
3068 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_FENCE, 0, 0, 0));
3069 radeon_ring_write(ring, addr & 0xfffffffc);
3070 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff));
3071 radeon_ring_write(ring, lower_32_bits(fence->seq));
3072 /* generate an interrupt */
3073 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0, 0));
3074}
3075
3076/**
3077 * r600_dma_semaphore_ring_emit - emit a semaphore on the dma ring
3078 *
3079 * @rdev: radeon_device pointer
3080 * @ring: radeon_ring structure holding ring information
3081 * @semaphore: radeon semaphore object
3082 * @emit_wait: wait or signal semaphore
3083 *
3084 * Add a DMA semaphore packet to the ring wait on or signal
3085 * other rings (r6xx-SI).
3086 */
3087void r600_dma_semaphore_ring_emit(struct radeon_device *rdev,
3088 struct radeon_ring *ring,
3089 struct radeon_semaphore *semaphore,
3090 bool emit_wait)
3091{
3092 u64 addr = semaphore->gpu_addr;
3093 u32 s = emit_wait ? 0 : 1;
3094
3095 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SEMAPHORE, 0, s, 0));
3096 radeon_ring_write(ring, addr & 0xfffffffc);
3097 radeon_ring_write(ring, upper_32_bits(addr) & 0xff);
3098}
3099
3100void r600_uvd_semaphore_emit(struct radeon_device *rdev,
3101 struct radeon_ring *ring,
3102 struct radeon_semaphore *semaphore,
3103 bool emit_wait)
3104{
3105 uint64_t addr = semaphore->gpu_addr;
3106
3107 radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_LOW, 0));
3108 radeon_ring_write(ring, (addr >> 3) & 0x000FFFFF);
3109
3110 radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_HIGH, 0));
3111 radeon_ring_write(ring, (addr >> 23) & 0x000FFFFF);
3112
3113 radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0));
3114 radeon_ring_write(ring, emit_wait ? 1 : 0);
3115}
3116
3117int r600_copy_blit(struct radeon_device *rdev,
3118 uint64_t src_offset,
3119 uint64_t dst_offset,
3120 unsigned num_gpu_pages,
3121 struct radeon_fence **fence)
3122{
3123 struct radeon_semaphore *sem = NULL;
3124 struct radeon_sa_bo *vb = NULL;
3125 int r;
3126
3127 r = r600_blit_prepare_copy(rdev, num_gpu_pages, fence, &vb, &sem);
3128 if (r) {
3129 return r;
3130 }
3131 r600_kms_blit_copy(rdev, src_offset, dst_offset, num_gpu_pages, vb);
3132 r600_blit_done_copy(rdev, fence, vb, sem);
3133 return 0;
3134}
3135
3136/** 2596/**
3137 * r600_copy_cpdma - copy pages using the CP DMA engine 2597 * r600_copy_cpdma - copy pages using the CP DMA engine
3138 * 2598 *
@@ -3217,80 +2677,6 @@ int r600_copy_cpdma(struct radeon_device *rdev,
3217 return r; 2677 return r;
3218} 2678}
3219 2679
3220/**
3221 * r600_copy_dma - copy pages using the DMA engine
3222 *
3223 * @rdev: radeon_device pointer
3224 * @src_offset: src GPU address
3225 * @dst_offset: dst GPU address
3226 * @num_gpu_pages: number of GPU pages to xfer
3227 * @fence: radeon fence object
3228 *
3229 * Copy GPU paging using the DMA engine (r6xx).
3230 * Used by the radeon ttm implementation to move pages if
3231 * registered as the asic copy callback.
3232 */
3233int r600_copy_dma(struct radeon_device *rdev,
3234 uint64_t src_offset, uint64_t dst_offset,
3235 unsigned num_gpu_pages,
3236 struct radeon_fence **fence)
3237{
3238 struct radeon_semaphore *sem = NULL;
3239 int ring_index = rdev->asic->copy.dma_ring_index;
3240 struct radeon_ring *ring = &rdev->ring[ring_index];
3241 u32 size_in_dw, cur_size_in_dw;
3242 int i, num_loops;
3243 int r = 0;
3244
3245 r = radeon_semaphore_create(rdev, &sem);
3246 if (r) {
3247 DRM_ERROR("radeon: moving bo (%d).\n", r);
3248 return r;
3249 }
3250
3251 size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
3252 num_loops = DIV_ROUND_UP(size_in_dw, 0xFFFE);
3253 r = radeon_ring_lock(rdev, ring, num_loops * 4 + 8);
3254 if (r) {
3255 DRM_ERROR("radeon: moving bo (%d).\n", r);
3256 radeon_semaphore_free(rdev, &sem, NULL);
3257 return r;
3258 }
3259
3260 if (radeon_fence_need_sync(*fence, ring->idx)) {
3261 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
3262 ring->idx);
3263 radeon_fence_note_sync(*fence, ring->idx);
3264 } else {
3265 radeon_semaphore_free(rdev, &sem, NULL);
3266 }
3267
3268 for (i = 0; i < num_loops; i++) {
3269 cur_size_in_dw = size_in_dw;
3270 if (cur_size_in_dw > 0xFFFE)
3271 cur_size_in_dw = 0xFFFE;
3272 size_in_dw -= cur_size_in_dw;
3273 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw));
3274 radeon_ring_write(ring, dst_offset & 0xfffffffc);
3275 radeon_ring_write(ring, src_offset & 0xfffffffc);
3276 radeon_ring_write(ring, (((upper_32_bits(dst_offset) & 0xff) << 16) |
3277 (upper_32_bits(src_offset) & 0xff)));
3278 src_offset += cur_size_in_dw * 4;
3279 dst_offset += cur_size_in_dw * 4;
3280 }
3281
3282 r = radeon_fence_emit(rdev, fence, ring->idx);
3283 if (r) {
3284 radeon_ring_unlock_undo(rdev, ring);
3285 return r;
3286 }
3287
3288 radeon_ring_unlock_commit(rdev, ring);
3289 radeon_semaphore_free(rdev, &sem, *fence);
3290
3291 return r;
3292}
3293
3294int r600_set_surface_reg(struct radeon_device *rdev, int reg, 2680int r600_set_surface_reg(struct radeon_device *rdev, int reg,
3295 uint32_t tiling_flags, uint32_t pitch, 2681 uint32_t tiling_flags, uint32_t pitch,
3296 uint32_t offset, uint32_t obj_size) 2682 uint32_t offset, uint32_t obj_size)
@@ -3312,6 +2698,13 @@ static int r600_startup(struct radeon_device *rdev)
3312 /* enable pcie gen2 link */ 2698 /* enable pcie gen2 link */
3313 r600_pcie_gen2_enable(rdev); 2699 r600_pcie_gen2_enable(rdev);
3314 2700
2701 /* scratch needs to be initialized before MC */
2702 r = r600_vram_scratch_init(rdev);
2703 if (r)
2704 return r;
2705
2706 r600_mc_program(rdev);
2707
3315 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 2708 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
3316 r = r600_init_microcode(rdev); 2709 r = r600_init_microcode(rdev);
3317 if (r) { 2710 if (r) {
@@ -3320,11 +2713,6 @@ static int r600_startup(struct radeon_device *rdev)
3320 } 2713 }
3321 } 2714 }
3322 2715
3323 r = r600_vram_scratch_init(rdev);
3324 if (r)
3325 return r;
3326
3327 r600_mc_program(rdev);
3328 if (rdev->flags & RADEON_IS_AGP) { 2716 if (rdev->flags & RADEON_IS_AGP) {
3329 r600_agp_enable(rdev); 2717 r600_agp_enable(rdev);
3330 } else { 2718 } else {
@@ -3333,12 +2721,6 @@ static int r600_startup(struct radeon_device *rdev)
3333 return r; 2721 return r;
3334 } 2722 }
3335 r600_gpu_init(rdev); 2723 r600_gpu_init(rdev);
3336 r = r600_blit_init(rdev);
3337 if (r) {
3338 r600_blit_fini(rdev);
3339 rdev->asic->copy.copy = NULL;
3340 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
3341 }
3342 2724
3343 /* allocate wb buffer */ 2725 /* allocate wb buffer */
3344 r = radeon_wb_init(rdev); 2726 r = radeon_wb_init(rdev);
@@ -3375,14 +2757,14 @@ static int r600_startup(struct radeon_device *rdev)
3375 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 2757 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
3376 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 2758 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
3377 R600_CP_RB_RPTR, R600_CP_RB_WPTR, 2759 R600_CP_RB_RPTR, R600_CP_RB_WPTR,
3378 0, 0xfffff, RADEON_CP_PACKET2); 2760 RADEON_CP_PACKET2);
3379 if (r) 2761 if (r)
3380 return r; 2762 return r;
3381 2763
3382 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 2764 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
3383 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 2765 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
3384 DMA_RB_RPTR, DMA_RB_WPTR, 2766 DMA_RB_RPTR, DMA_RB_WPTR,
3385 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 2767 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
3386 if (r) 2768 if (r)
3387 return r; 2769 return r;
3388 2770
@@ -3551,7 +2933,6 @@ int r600_init(struct radeon_device *rdev)
3551void r600_fini(struct radeon_device *rdev) 2933void r600_fini(struct radeon_device *rdev)
3552{ 2934{
3553 r600_audio_fini(rdev); 2935 r600_audio_fini(rdev);
3554 r600_blit_fini(rdev);
3555 r600_cp_fini(rdev); 2936 r600_cp_fini(rdev);
3556 r600_dma_fini(rdev); 2937 r600_dma_fini(rdev);
3557 r600_irq_fini(rdev); 2938 r600_irq_fini(rdev);
@@ -3603,16 +2984,6 @@ void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
3603 radeon_ring_write(ring, ib->length_dw); 2984 radeon_ring_write(ring, ib->length_dw);
3604} 2985}
3605 2986
3606void r600_uvd_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
3607{
3608 struct radeon_ring *ring = &rdev->ring[ib->ring];
3609
3610 radeon_ring_write(ring, PACKET0(UVD_RBC_IB_BASE, 0));
3611 radeon_ring_write(ring, ib->gpu_addr);
3612 radeon_ring_write(ring, PACKET0(UVD_RBC_IB_SIZE, 0));
3613 radeon_ring_write(ring, ib->length_dw);
3614}
3615
3616int r600_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) 2987int r600_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
3617{ 2988{
3618 struct radeon_ib ib; 2989 struct radeon_ib ib;
@@ -3666,139 +3037,6 @@ free_scratch:
3666 return r; 3037 return r;
3667} 3038}
3668 3039
3669/**
3670 * r600_dma_ib_test - test an IB on the DMA engine
3671 *
3672 * @rdev: radeon_device pointer
3673 * @ring: radeon_ring structure holding ring information
3674 *
3675 * Test a simple IB in the DMA ring (r6xx-SI).
3676 * Returns 0 on success, error on failure.
3677 */
3678int r600_dma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
3679{
3680 struct radeon_ib ib;
3681 unsigned i;
3682 int r;
3683 void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
3684 u32 tmp = 0;
3685
3686 if (!ptr) {
3687 DRM_ERROR("invalid vram scratch pointer\n");
3688 return -EINVAL;
3689 }
3690
3691 tmp = 0xCAFEDEAD;
3692 writel(tmp, ptr);
3693
3694 r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
3695 if (r) {
3696 DRM_ERROR("radeon: failed to get ib (%d).\n", r);
3697 return r;
3698 }
3699
3700 ib.ptr[0] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1);
3701 ib.ptr[1] = rdev->vram_scratch.gpu_addr & 0xfffffffc;
3702 ib.ptr[2] = upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xff;
3703 ib.ptr[3] = 0xDEADBEEF;
3704 ib.length_dw = 4;
3705
3706 r = radeon_ib_schedule(rdev, &ib, NULL);
3707 if (r) {
3708 radeon_ib_free(rdev, &ib);
3709 DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
3710 return r;
3711 }
3712 r = radeon_fence_wait(ib.fence, false);
3713 if (r) {
3714 DRM_ERROR("radeon: fence wait failed (%d).\n", r);
3715 return r;
3716 }
3717 for (i = 0; i < rdev->usec_timeout; i++) {
3718 tmp = readl(ptr);
3719 if (tmp == 0xDEADBEEF)
3720 break;
3721 DRM_UDELAY(1);
3722 }
3723 if (i < rdev->usec_timeout) {
3724 DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i);
3725 } else {
3726 DRM_ERROR("radeon: ib test failed (0x%08X)\n", tmp);
3727 r = -EINVAL;
3728 }
3729 radeon_ib_free(rdev, &ib);
3730 return r;
3731}
3732
3733int r600_uvd_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
3734{
3735 struct radeon_fence *fence = NULL;
3736 int r;
3737
3738 r = radeon_set_uvd_clocks(rdev, 53300, 40000);
3739 if (r) {
3740 DRM_ERROR("radeon: failed to raise UVD clocks (%d).\n", r);
3741 return r;
3742 }
3743
3744 r = radeon_uvd_get_create_msg(rdev, ring->idx, 1, NULL);
3745 if (r) {
3746 DRM_ERROR("radeon: failed to get create msg (%d).\n", r);
3747 goto error;
3748 }
3749
3750 r = radeon_uvd_get_destroy_msg(rdev, ring->idx, 1, &fence);
3751 if (r) {
3752 DRM_ERROR("radeon: failed to get destroy ib (%d).\n", r);
3753 goto error;
3754 }
3755
3756 r = radeon_fence_wait(fence, false);
3757 if (r) {
3758 DRM_ERROR("radeon: fence wait failed (%d).\n", r);
3759 goto error;
3760 }
3761 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
3762error:
3763 radeon_fence_unref(&fence);
3764 radeon_set_uvd_clocks(rdev, 0, 0);
3765 return r;
3766}
3767
3768/**
3769 * r600_dma_ring_ib_execute - Schedule an IB on the DMA engine
3770 *
3771 * @rdev: radeon_device pointer
3772 * @ib: IB object to schedule
3773 *
3774 * Schedule an IB in the DMA ring (r6xx-r7xx).
3775 */
3776void r600_dma_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
3777{
3778 struct radeon_ring *ring = &rdev->ring[ib->ring];
3779
3780 if (rdev->wb.enabled) {
3781 u32 next_rptr = ring->wptr + 4;
3782 while ((next_rptr & 7) != 5)
3783 next_rptr++;
3784 next_rptr += 3;
3785 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1));
3786 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
3787 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xff);
3788 radeon_ring_write(ring, next_rptr);
3789 }
3790
3791 /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring.
3792 * Pad as necessary with NOPs.
3793 */
3794 while ((ring->wptr & 7) != 5)
3795 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
3796 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_INDIRECT_BUFFER, 0, 0, 0));
3797 radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0));
3798 radeon_ring_write(ring, (ib->length_dw << 16) | (upper_32_bits(ib->gpu_addr) & 0xFF));
3799
3800}
3801
3802/* 3040/*
3803 * Interrupts 3041 * Interrupts
3804 * 3042 *
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c
index c92eb86a8e55..47fc2b886979 100644
--- a/drivers/gpu/drm/radeon/r600_audio.c
+++ b/drivers/gpu/drm/radeon/r600_audio.c
@@ -57,12 +57,12 @@ static bool radeon_dig_encoder(struct drm_encoder *encoder)
57 */ 57 */
58static int r600_audio_chipset_supported(struct radeon_device *rdev) 58static int r600_audio_chipset_supported(struct radeon_device *rdev)
59{ 59{
60 return ASIC_IS_DCE2(rdev) && !ASIC_IS_DCE6(rdev); 60 return ASIC_IS_DCE2(rdev) && !ASIC_IS_NODCE(rdev);
61} 61}
62 62
63struct r600_audio r600_audio_status(struct radeon_device *rdev) 63struct r600_audio_pin r600_audio_status(struct radeon_device *rdev)
64{ 64{
65 struct r600_audio status; 65 struct r600_audio_pin status;
66 uint32_t value; 66 uint32_t value;
67 67
68 value = RREG32(R600_AUDIO_RATE_BPS_CHANNEL); 68 value = RREG32(R600_AUDIO_RATE_BPS_CHANNEL);
@@ -120,16 +120,16 @@ void r600_audio_update_hdmi(struct work_struct *work)
120 struct radeon_device *rdev = container_of(work, struct radeon_device, 120 struct radeon_device *rdev = container_of(work, struct radeon_device,
121 audio_work); 121 audio_work);
122 struct drm_device *dev = rdev->ddev; 122 struct drm_device *dev = rdev->ddev;
123 struct r600_audio audio_status = r600_audio_status(rdev); 123 struct r600_audio_pin audio_status = r600_audio_status(rdev);
124 struct drm_encoder *encoder; 124 struct drm_encoder *encoder;
125 bool changed = false; 125 bool changed = false;
126 126
127 if (rdev->audio_status.channels != audio_status.channels || 127 if (rdev->audio.pin[0].channels != audio_status.channels ||
128 rdev->audio_status.rate != audio_status.rate || 128 rdev->audio.pin[0].rate != audio_status.rate ||
129 rdev->audio_status.bits_per_sample != audio_status.bits_per_sample || 129 rdev->audio.pin[0].bits_per_sample != audio_status.bits_per_sample ||
130 rdev->audio_status.status_bits != audio_status.status_bits || 130 rdev->audio.pin[0].status_bits != audio_status.status_bits ||
131 rdev->audio_status.category_code != audio_status.category_code) { 131 rdev->audio.pin[0].category_code != audio_status.category_code) {
132 rdev->audio_status = audio_status; 132 rdev->audio.pin[0] = audio_status;
133 changed = true; 133 changed = true;
134 } 134 }
135 135
@@ -141,13 +141,13 @@ void r600_audio_update_hdmi(struct work_struct *work)
141 } 141 }
142} 142}
143 143
144/* 144/* enable the audio stream */
145 * turn on/off audio engine 145static void r600_audio_enable(struct radeon_device *rdev,
146 */ 146 struct r600_audio_pin *pin,
147static void r600_audio_engine_enable(struct radeon_device *rdev, bool enable) 147 bool enable)
148{ 148{
149 u32 value = 0; 149 u32 value = 0;
150 DRM_INFO("%s audio support\n", enable ? "Enabling" : "Disabling"); 150
151 if (ASIC_IS_DCE4(rdev)) { 151 if (ASIC_IS_DCE4(rdev)) {
152 if (enable) { 152 if (enable) {
153 value |= 0x81000000; /* Required to enable audio */ 153 value |= 0x81000000; /* Required to enable audio */
@@ -158,7 +158,7 @@ static void r600_audio_engine_enable(struct radeon_device *rdev, bool enable)
158 WREG32_P(R600_AUDIO_ENABLE, 158 WREG32_P(R600_AUDIO_ENABLE,
159 enable ? 0x81000000 : 0x0, ~0x81000000); 159 enable ? 0x81000000 : 0x0, ~0x81000000);
160 } 160 }
161 rdev->audio_enabled = enable; 161 DRM_INFO("%s audio %d support\n", enable ? "Enabling" : "Disabling", pin->id);
162} 162}
163 163
164/* 164/*
@@ -169,13 +169,17 @@ int r600_audio_init(struct radeon_device *rdev)
169 if (!radeon_audio || !r600_audio_chipset_supported(rdev)) 169 if (!radeon_audio || !r600_audio_chipset_supported(rdev))
170 return 0; 170 return 0;
171 171
172 r600_audio_engine_enable(rdev, true); 172 rdev->audio.enabled = true;
173
174 rdev->audio.num_pins = 1;
175 rdev->audio.pin[0].channels = -1;
176 rdev->audio.pin[0].rate = -1;
177 rdev->audio.pin[0].bits_per_sample = -1;
178 rdev->audio.pin[0].status_bits = 0;
179 rdev->audio.pin[0].category_code = 0;
180 rdev->audio.pin[0].id = 0;
173 181
174 rdev->audio_status.channels = -1; 182 r600_audio_enable(rdev, &rdev->audio.pin[0], true);
175 rdev->audio_status.rate = -1;
176 rdev->audio_status.bits_per_sample = -1;
177 rdev->audio_status.status_bits = 0;
178 rdev->audio_status.category_code = 0;
179 183
180 return 0; 184 return 0;
181} 185}
@@ -186,8 +190,16 @@ int r600_audio_init(struct radeon_device *rdev)
186 */ 190 */
187void r600_audio_fini(struct radeon_device *rdev) 191void r600_audio_fini(struct radeon_device *rdev)
188{ 192{
189 if (!rdev->audio_enabled) 193 if (!rdev->audio.enabled)
190 return; 194 return;
191 195
192 r600_audio_engine_enable(rdev, false); 196 r600_audio_enable(rdev, &rdev->audio.pin[0], false);
197
198 rdev->audio.enabled = false;
199}
200
201struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev)
202{
203 /* only one pin on 6xx-NI */
204 return &rdev->audio.pin[0];
193} 205}
diff --git a/drivers/gpu/drm/radeon/r600_blit.c b/drivers/gpu/drm/radeon/r600_blit.c
index f651881eb0ae..daf7572be976 100644
--- a/drivers/gpu/drm/radeon/r600_blit.c
+++ b/drivers/gpu/drm/radeon/r600_blit.c
@@ -31,6 +31,37 @@
31 31
32#include "r600_blit_shaders.h" 32#include "r600_blit_shaders.h"
33 33
34/* 23 bits of float fractional data */
35#define I2F_FRAC_BITS 23
36#define I2F_MASK ((1 << I2F_FRAC_BITS) - 1)
37
38/*
39 * Converts unsigned integer into 32-bit IEEE floating point representation.
40 * Will be exact from 0 to 2^24. Above that, we round towards zero
41 * as the fractional bits will not fit in a float. (It would be better to
42 * round towards even as the fpu does, but that is slower.)
43 */
44static __pure uint32_t int2float(uint32_t x)
45{
46 uint32_t msb, exponent, fraction;
47
48 /* Zero is special */
49 if (!x) return 0;
50
51 /* Get location of the most significant bit */
52 msb = __fls(x);
53
54 /*
55 * Use a rotate instead of a shift because that works both leftwards
56 * and rightwards due to the mod(32) behaviour. This means we don't
57 * need to check to see if we are above 2^24 or not.
58 */
59 fraction = ror32(x, (msb - I2F_FRAC_BITS) & 0x1f) & I2F_MASK;
60 exponent = (127 + msb) << I2F_FRAC_BITS;
61
62 return fraction + exponent;
63}
64
34#define DI_PT_RECTLIST 0x11 65#define DI_PT_RECTLIST 0x11
35#define DI_INDEX_SIZE_16_BIT 0x0 66#define DI_INDEX_SIZE_16_BIT 0x0
36#define DI_SRC_SEL_AUTO_INDEX 0x2 67#define DI_SRC_SEL_AUTO_INDEX 0x2
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c
deleted file mode 100644
index 9fb5780a552f..000000000000
--- a/drivers/gpu/drm/radeon/r600_blit_kms.c
+++ /dev/null
@@ -1,785 +0,0 @@
1/*
2 * Copyright 2009 Advanced Micro Devices, Inc.
3 * Copyright 2009 Red Hat Inc.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * 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) AND/OR ITS SUPPLIERS 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 OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 */
25
26#include <drm/drmP.h>
27#include <drm/radeon_drm.h>
28#include "radeon.h"
29
30#include "r600d.h"
31#include "r600_blit_shaders.h"
32#include "radeon_blit_common.h"
33
34/* 23 bits of float fractional data */
35#define I2F_FRAC_BITS 23
36#define I2F_MASK ((1 << I2F_FRAC_BITS) - 1)
37
38/*
39 * Converts unsigned integer into 32-bit IEEE floating point representation.
40 * Will be exact from 0 to 2^24. Above that, we round towards zero
41 * as the fractional bits will not fit in a float. (It would be better to
42 * round towards even as the fpu does, but that is slower.)
43 */
44__pure uint32_t int2float(uint32_t x)
45{
46 uint32_t msb, exponent, fraction;
47
48 /* Zero is special */
49 if (!x) return 0;
50
51 /* Get location of the most significant bit */
52 msb = __fls(x);
53
54 /*
55 * Use a rotate instead of a shift because that works both leftwards
56 * and rightwards due to the mod(32) behaviour. This means we don't
57 * need to check to see if we are above 2^24 or not.
58 */
59 fraction = ror32(x, (msb - I2F_FRAC_BITS) & 0x1f) & I2F_MASK;
60 exponent = (127 + msb) << I2F_FRAC_BITS;
61
62 return fraction + exponent;
63}
64
65/* emits 21 on rv770+, 23 on r600 */
66static void
67set_render_target(struct radeon_device *rdev, int format,
68 int w, int h, u64 gpu_addr)
69{
70 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
71 u32 cb_color_info;
72 int pitch, slice;
73
74 h = ALIGN(h, 8);
75 if (h < 8)
76 h = 8;
77
78 cb_color_info = CB_FORMAT(format) |
79 CB_SOURCE_FORMAT(CB_SF_EXPORT_NORM) |
80 CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
81 pitch = (w / 8) - 1;
82 slice = ((w * h) / 64) - 1;
83
84 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
85 radeon_ring_write(ring, (CB_COLOR0_BASE - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
86 radeon_ring_write(ring, gpu_addr >> 8);
87
88 if (rdev->family > CHIP_R600 && rdev->family < CHIP_RV770) {
89 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_BASE_UPDATE, 0));
90 radeon_ring_write(ring, 2 << 0);
91 }
92
93 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
94 radeon_ring_write(ring, (CB_COLOR0_SIZE - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
95 radeon_ring_write(ring, (pitch << 0) | (slice << 10));
96
97 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
98 radeon_ring_write(ring, (CB_COLOR0_VIEW - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
99 radeon_ring_write(ring, 0);
100
101 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
102 radeon_ring_write(ring, (CB_COLOR0_INFO - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
103 radeon_ring_write(ring, cb_color_info);
104
105 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
106 radeon_ring_write(ring, (CB_COLOR0_TILE - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
107 radeon_ring_write(ring, 0);
108
109 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
110 radeon_ring_write(ring, (CB_COLOR0_FRAG - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
111 radeon_ring_write(ring, 0);
112
113 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
114 radeon_ring_write(ring, (CB_COLOR0_MASK - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
115 radeon_ring_write(ring, 0);
116}
117
118/* emits 5dw */
119static void
120cp_set_surface_sync(struct radeon_device *rdev,
121 u32 sync_type, u32 size,
122 u64 mc_addr)
123{
124 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
125 u32 cp_coher_size;
126
127 if (size == 0xffffffff)
128 cp_coher_size = 0xffffffff;
129 else
130 cp_coher_size = ((size + 255) >> 8);
131
132 radeon_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3));
133 radeon_ring_write(ring, sync_type);
134 radeon_ring_write(ring, cp_coher_size);
135 radeon_ring_write(ring, mc_addr >> 8);
136 radeon_ring_write(ring, 10); /* poll interval */
137}
138
139/* emits 21dw + 1 surface sync = 26dw */
140static void
141set_shaders(struct radeon_device *rdev)
142{
143 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
144 u64 gpu_addr;
145 u32 sq_pgm_resources;
146
147 /* setup shader regs */
148 sq_pgm_resources = (1 << 0);
149
150 /* VS */
151 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.vs_offset;
152 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
153 radeon_ring_write(ring, (SQ_PGM_START_VS - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
154 radeon_ring_write(ring, gpu_addr >> 8);
155
156 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
157 radeon_ring_write(ring, (SQ_PGM_RESOURCES_VS - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
158 radeon_ring_write(ring, sq_pgm_resources);
159
160 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
161 radeon_ring_write(ring, (SQ_PGM_CF_OFFSET_VS - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
162 radeon_ring_write(ring, 0);
163
164 /* PS */
165 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.ps_offset;
166 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
167 radeon_ring_write(ring, (SQ_PGM_START_PS - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
168 radeon_ring_write(ring, gpu_addr >> 8);
169
170 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
171 radeon_ring_write(ring, (SQ_PGM_RESOURCES_PS - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
172 radeon_ring_write(ring, sq_pgm_resources | (1 << 28));
173
174 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
175 radeon_ring_write(ring, (SQ_PGM_EXPORTS_PS - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
176 radeon_ring_write(ring, 2);
177
178 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 1));
179 radeon_ring_write(ring, (SQ_PGM_CF_OFFSET_PS - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
180 radeon_ring_write(ring, 0);
181
182 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.vs_offset;
183 cp_set_surface_sync(rdev, PACKET3_SH_ACTION_ENA, 512, gpu_addr);
184}
185
186/* emits 9 + 1 sync (5) = 14*/
187static void
188set_vtx_resource(struct radeon_device *rdev, u64 gpu_addr)
189{
190 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
191 u32 sq_vtx_constant_word2;
192
193 sq_vtx_constant_word2 = SQ_VTXC_BASE_ADDR_HI(upper_32_bits(gpu_addr) & 0xff) |
194 SQ_VTXC_STRIDE(16);
195#ifdef __BIG_ENDIAN
196 sq_vtx_constant_word2 |= SQ_VTXC_ENDIAN_SWAP(SQ_ENDIAN_8IN32);
197#endif
198
199 radeon_ring_write(ring, PACKET3(PACKET3_SET_RESOURCE, 7));
200 radeon_ring_write(ring, 0x460);
201 radeon_ring_write(ring, gpu_addr & 0xffffffff);
202 radeon_ring_write(ring, 48 - 1);
203 radeon_ring_write(ring, sq_vtx_constant_word2);
204 radeon_ring_write(ring, 1 << 0);
205 radeon_ring_write(ring, 0);
206 radeon_ring_write(ring, 0);
207 radeon_ring_write(ring, SQ_TEX_VTX_VALID_BUFFER << 30);
208
209 if ((rdev->family == CHIP_RV610) ||
210 (rdev->family == CHIP_RV620) ||
211 (rdev->family == CHIP_RS780) ||
212 (rdev->family == CHIP_RS880) ||
213 (rdev->family == CHIP_RV710))
214 cp_set_surface_sync(rdev,
215 PACKET3_TC_ACTION_ENA, 48, gpu_addr);
216 else
217 cp_set_surface_sync(rdev,
218 PACKET3_VC_ACTION_ENA, 48, gpu_addr);
219}
220
221/* emits 9 */
222static void
223set_tex_resource(struct radeon_device *rdev,
224 int format, int w, int h, int pitch,
225 u64 gpu_addr, u32 size)
226{
227 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
228 uint32_t sq_tex_resource_word0, sq_tex_resource_word1, sq_tex_resource_word4;
229
230 if (h < 1)
231 h = 1;
232
233 sq_tex_resource_word0 = S_038000_DIM(V_038000_SQ_TEX_DIM_2D) |
234 S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1);
235 sq_tex_resource_word0 |= S_038000_PITCH((pitch >> 3) - 1) |
236 S_038000_TEX_WIDTH(w - 1);
237
238 sq_tex_resource_word1 = S_038004_DATA_FORMAT(format);
239 sq_tex_resource_word1 |= S_038004_TEX_HEIGHT(h - 1);
240
241 sq_tex_resource_word4 = S_038010_REQUEST_SIZE(1) |
242 S_038010_DST_SEL_X(SQ_SEL_X) |
243 S_038010_DST_SEL_Y(SQ_SEL_Y) |
244 S_038010_DST_SEL_Z(SQ_SEL_Z) |
245 S_038010_DST_SEL_W(SQ_SEL_W);
246
247 cp_set_surface_sync(rdev,
248 PACKET3_TC_ACTION_ENA, size, gpu_addr);
249
250 radeon_ring_write(ring, PACKET3(PACKET3_SET_RESOURCE, 7));
251 radeon_ring_write(ring, 0);
252 radeon_ring_write(ring, sq_tex_resource_word0);
253 radeon_ring_write(ring, sq_tex_resource_word1);
254 radeon_ring_write(ring, gpu_addr >> 8);
255 radeon_ring_write(ring, gpu_addr >> 8);
256 radeon_ring_write(ring, sq_tex_resource_word4);
257 radeon_ring_write(ring, 0);
258 radeon_ring_write(ring, SQ_TEX_VTX_VALID_TEXTURE << 30);
259}
260
261/* emits 12 */
262static void
263set_scissors(struct radeon_device *rdev, int x1, int y1,
264 int x2, int y2)
265{
266 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
267 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
268 radeon_ring_write(ring, (PA_SC_SCREEN_SCISSOR_TL - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
269 radeon_ring_write(ring, (x1 << 0) | (y1 << 16));
270 radeon_ring_write(ring, (x2 << 0) | (y2 << 16));
271
272 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
273 radeon_ring_write(ring, (PA_SC_GENERIC_SCISSOR_TL - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
274 radeon_ring_write(ring, (x1 << 0) | (y1 << 16) | (1 << 31));
275 radeon_ring_write(ring, (x2 << 0) | (y2 << 16));
276
277 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONTEXT_REG, 2));
278 radeon_ring_write(ring, (PA_SC_WINDOW_SCISSOR_TL - PACKET3_SET_CONTEXT_REG_OFFSET) >> 2);
279 radeon_ring_write(ring, (x1 << 0) | (y1 << 16) | (1 << 31));
280 radeon_ring_write(ring, (x2 << 0) | (y2 << 16));
281}
282
283/* emits 10 */
284static void
285draw_auto(struct radeon_device *rdev)
286{
287 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
288 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1));
289 radeon_ring_write(ring, (VGT_PRIMITIVE_TYPE - PACKET3_SET_CONFIG_REG_OFFSET) >> 2);
290 radeon_ring_write(ring, DI_PT_RECTLIST);
291
292 radeon_ring_write(ring, PACKET3(PACKET3_INDEX_TYPE, 0));
293 radeon_ring_write(ring,
294#ifdef __BIG_ENDIAN
295 (2 << 2) |
296#endif
297 DI_INDEX_SIZE_16_BIT);
298
299 radeon_ring_write(ring, PACKET3(PACKET3_NUM_INSTANCES, 0));
300 radeon_ring_write(ring, 1);
301
302 radeon_ring_write(ring, PACKET3(PACKET3_DRAW_INDEX_AUTO, 1));
303 radeon_ring_write(ring, 3);
304 radeon_ring_write(ring, DI_SRC_SEL_AUTO_INDEX);
305
306}
307
308/* emits 14 */
309static void
310set_default_state(struct radeon_device *rdev)
311{
312 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
313 u32 sq_config, sq_gpr_resource_mgmt_1, sq_gpr_resource_mgmt_2;
314 u32 sq_thread_resource_mgmt, sq_stack_resource_mgmt_1, sq_stack_resource_mgmt_2;
315 int num_ps_gprs, num_vs_gprs, num_temp_gprs, num_gs_gprs, num_es_gprs;
316 int num_ps_threads, num_vs_threads, num_gs_threads, num_es_threads;
317 int num_ps_stack_entries, num_vs_stack_entries, num_gs_stack_entries, num_es_stack_entries;
318 u64 gpu_addr;
319 int dwords;
320
321 switch (rdev->family) {
322 case CHIP_R600:
323 num_ps_gprs = 192;
324 num_vs_gprs = 56;
325 num_temp_gprs = 4;
326 num_gs_gprs = 0;
327 num_es_gprs = 0;
328 num_ps_threads = 136;
329 num_vs_threads = 48;
330 num_gs_threads = 4;
331 num_es_threads = 4;
332 num_ps_stack_entries = 128;
333 num_vs_stack_entries = 128;
334 num_gs_stack_entries = 0;
335 num_es_stack_entries = 0;
336 break;
337 case CHIP_RV630:
338 case CHIP_RV635:
339 num_ps_gprs = 84;
340 num_vs_gprs = 36;
341 num_temp_gprs = 4;
342 num_gs_gprs = 0;
343 num_es_gprs = 0;
344 num_ps_threads = 144;
345 num_vs_threads = 40;
346 num_gs_threads = 4;
347 num_es_threads = 4;
348 num_ps_stack_entries = 40;
349 num_vs_stack_entries = 40;
350 num_gs_stack_entries = 32;
351 num_es_stack_entries = 16;
352 break;
353 case CHIP_RV610:
354 case CHIP_RV620:
355 case CHIP_RS780:
356 case CHIP_RS880:
357 default:
358 num_ps_gprs = 84;
359 num_vs_gprs = 36;
360 num_temp_gprs = 4;
361 num_gs_gprs = 0;
362 num_es_gprs = 0;
363 num_ps_threads = 136;
364 num_vs_threads = 48;
365 num_gs_threads = 4;
366 num_es_threads = 4;
367 num_ps_stack_entries = 40;
368 num_vs_stack_entries = 40;
369 num_gs_stack_entries = 32;
370 num_es_stack_entries = 16;
371 break;
372 case CHIP_RV670:
373 num_ps_gprs = 144;
374 num_vs_gprs = 40;
375 num_temp_gprs = 4;
376 num_gs_gprs = 0;
377 num_es_gprs = 0;
378 num_ps_threads = 136;
379 num_vs_threads = 48;
380 num_gs_threads = 4;
381 num_es_threads = 4;
382 num_ps_stack_entries = 40;
383 num_vs_stack_entries = 40;
384 num_gs_stack_entries = 32;
385 num_es_stack_entries = 16;
386 break;
387 case CHIP_RV770:
388 num_ps_gprs = 192;
389 num_vs_gprs = 56;
390 num_temp_gprs = 4;
391 num_gs_gprs = 0;
392 num_es_gprs = 0;
393 num_ps_threads = 188;
394 num_vs_threads = 60;
395 num_gs_threads = 0;
396 num_es_threads = 0;
397 num_ps_stack_entries = 256;
398 num_vs_stack_entries = 256;
399 num_gs_stack_entries = 0;
400 num_es_stack_entries = 0;
401 break;
402 case CHIP_RV730:
403 case CHIP_RV740:
404 num_ps_gprs = 84;
405 num_vs_gprs = 36;
406 num_temp_gprs = 4;
407 num_gs_gprs = 0;
408 num_es_gprs = 0;
409 num_ps_threads = 188;
410 num_vs_threads = 60;
411 num_gs_threads = 0;
412 num_es_threads = 0;
413 num_ps_stack_entries = 128;
414 num_vs_stack_entries = 128;
415 num_gs_stack_entries = 0;
416 num_es_stack_entries = 0;
417 break;
418 case CHIP_RV710:
419 num_ps_gprs = 192;
420 num_vs_gprs = 56;
421 num_temp_gprs = 4;
422 num_gs_gprs = 0;
423 num_es_gprs = 0;
424 num_ps_threads = 144;
425 num_vs_threads = 48;
426 num_gs_threads = 0;
427 num_es_threads = 0;
428 num_ps_stack_entries = 128;
429 num_vs_stack_entries = 128;
430 num_gs_stack_entries = 0;
431 num_es_stack_entries = 0;
432 break;
433 }
434
435 if ((rdev->family == CHIP_RV610) ||
436 (rdev->family == CHIP_RV620) ||
437 (rdev->family == CHIP_RS780) ||
438 (rdev->family == CHIP_RS880) ||
439 (rdev->family == CHIP_RV710))
440 sq_config = 0;
441 else
442 sq_config = VC_ENABLE;
443
444 sq_config |= (DX9_CONSTS |
445 ALU_INST_PREFER_VECTOR |
446 PS_PRIO(0) |
447 VS_PRIO(1) |
448 GS_PRIO(2) |
449 ES_PRIO(3));
450
451 sq_gpr_resource_mgmt_1 = (NUM_PS_GPRS(num_ps_gprs) |
452 NUM_VS_GPRS(num_vs_gprs) |
453 NUM_CLAUSE_TEMP_GPRS(num_temp_gprs));
454 sq_gpr_resource_mgmt_2 = (NUM_GS_GPRS(num_gs_gprs) |
455 NUM_ES_GPRS(num_es_gprs));
456 sq_thread_resource_mgmt = (NUM_PS_THREADS(num_ps_threads) |
457 NUM_VS_THREADS(num_vs_threads) |
458 NUM_GS_THREADS(num_gs_threads) |
459 NUM_ES_THREADS(num_es_threads));
460 sq_stack_resource_mgmt_1 = (NUM_PS_STACK_ENTRIES(num_ps_stack_entries) |
461 NUM_VS_STACK_ENTRIES(num_vs_stack_entries));
462 sq_stack_resource_mgmt_2 = (NUM_GS_STACK_ENTRIES(num_gs_stack_entries) |
463 NUM_ES_STACK_ENTRIES(num_es_stack_entries));
464
465 /* emit an IB pointing at default state */
466 dwords = ALIGN(rdev->r600_blit.state_len, 0x10);
467 gpu_addr = rdev->r600_blit.shader_gpu_addr + rdev->r600_blit.state_offset;
468 radeon_ring_write(ring, PACKET3(PACKET3_INDIRECT_BUFFER, 2));
469 radeon_ring_write(ring,
470#ifdef __BIG_ENDIAN
471 (2 << 0) |
472#endif
473 (gpu_addr & 0xFFFFFFFC));
474 radeon_ring_write(ring, upper_32_bits(gpu_addr) & 0xFF);
475 radeon_ring_write(ring, dwords);
476
477 /* SQ config */
478 radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 6));
479 radeon_ring_write(ring, (SQ_CONFIG - PACKET3_SET_CONFIG_REG_OFFSET) >> 2);
480 radeon_ring_write(ring, sq_config);
481 radeon_ring_write(ring, sq_gpr_resource_mgmt_1);
482 radeon_ring_write(ring, sq_gpr_resource_mgmt_2);
483 radeon_ring_write(ring, sq_thread_resource_mgmt);
484 radeon_ring_write(ring, sq_stack_resource_mgmt_1);
485 radeon_ring_write(ring, sq_stack_resource_mgmt_2);
486}
487
488int r600_blit_init(struct radeon_device *rdev)
489{
490 u32 obj_size;
491 int i, r, dwords;
492 void *ptr;
493 u32 packet2s[16];
494 int num_packet2s = 0;
495
496 rdev->r600_blit.primitives.set_render_target = set_render_target;
497 rdev->r600_blit.primitives.cp_set_surface_sync = cp_set_surface_sync;
498 rdev->r600_blit.primitives.set_shaders = set_shaders;
499 rdev->r600_blit.primitives.set_vtx_resource = set_vtx_resource;
500 rdev->r600_blit.primitives.set_tex_resource = set_tex_resource;
501 rdev->r600_blit.primitives.set_scissors = set_scissors;
502 rdev->r600_blit.primitives.draw_auto = draw_auto;
503 rdev->r600_blit.primitives.set_default_state = set_default_state;
504
505 rdev->r600_blit.ring_size_common = 8; /* sync semaphore */
506 rdev->r600_blit.ring_size_common += 40; /* shaders + def state */
507 rdev->r600_blit.ring_size_common += 5; /* done copy */
508 rdev->r600_blit.ring_size_common += 16; /* fence emit for done copy */
509
510 rdev->r600_blit.ring_size_per_loop = 76;
511 /* set_render_target emits 2 extra dwords on rv6xx */
512 if (rdev->family > CHIP_R600 && rdev->family < CHIP_RV770)
513 rdev->r600_blit.ring_size_per_loop += 2;
514
515 rdev->r600_blit.max_dim = 8192;
516
517 rdev->r600_blit.state_offset = 0;
518
519 if (rdev->family >= CHIP_RV770)
520 rdev->r600_blit.state_len = r7xx_default_size;
521 else
522 rdev->r600_blit.state_len = r6xx_default_size;
523
524 dwords = rdev->r600_blit.state_len;
525 while (dwords & 0xf) {
526 packet2s[num_packet2s++] = cpu_to_le32(PACKET2(0));
527 dwords++;
528 }
529
530 obj_size = dwords * 4;
531 obj_size = ALIGN(obj_size, 256);
532
533 rdev->r600_blit.vs_offset = obj_size;
534 obj_size += r6xx_vs_size * 4;
535 obj_size = ALIGN(obj_size, 256);
536
537 rdev->r600_blit.ps_offset = obj_size;
538 obj_size += r6xx_ps_size * 4;
539 obj_size = ALIGN(obj_size, 256);
540
541 /* pin copy shader into vram if not already initialized */
542 if (rdev->r600_blit.shader_obj == NULL) {
543 r = radeon_bo_create(rdev, obj_size, PAGE_SIZE, true,
544 RADEON_GEM_DOMAIN_VRAM,
545 NULL, &rdev->r600_blit.shader_obj);
546 if (r) {
547 DRM_ERROR("r600 failed to allocate shader\n");
548 return r;
549 }
550
551 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
552 if (unlikely(r != 0))
553 return r;
554 r = radeon_bo_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
555 &rdev->r600_blit.shader_gpu_addr);
556 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
557 if (r) {
558 dev_err(rdev->dev, "(%d) pin blit object failed\n", r);
559 return r;
560 }
561 }
562
563 DRM_DEBUG("r6xx blit allocated bo %08x vs %08x ps %08x\n",
564 obj_size,
565 rdev->r600_blit.vs_offset, rdev->r600_blit.ps_offset);
566
567 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
568 if (unlikely(r != 0))
569 return r;
570 r = radeon_bo_kmap(rdev->r600_blit.shader_obj, &ptr);
571 if (r) {
572 DRM_ERROR("failed to map blit object %d\n", r);
573 return r;
574 }
575 if (rdev->family >= CHIP_RV770)
576 memcpy_toio(ptr + rdev->r600_blit.state_offset,
577 r7xx_default_state, rdev->r600_blit.state_len * 4);
578 else
579 memcpy_toio(ptr + rdev->r600_blit.state_offset,
580 r6xx_default_state, rdev->r600_blit.state_len * 4);
581 if (num_packet2s)
582 memcpy_toio(ptr + rdev->r600_blit.state_offset + (rdev->r600_blit.state_len * 4),
583 packet2s, num_packet2s * 4);
584 for (i = 0; i < r6xx_vs_size; i++)
585 *(u32 *)((unsigned long)ptr + rdev->r600_blit.vs_offset + i * 4) = cpu_to_le32(r6xx_vs[i]);
586 for (i = 0; i < r6xx_ps_size; i++)
587 *(u32 *)((unsigned long)ptr + rdev->r600_blit.ps_offset + i * 4) = cpu_to_le32(r6xx_ps[i]);
588 radeon_bo_kunmap(rdev->r600_blit.shader_obj);
589 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
590
591 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
592 return 0;
593}
594
595void r600_blit_fini(struct radeon_device *rdev)
596{
597 int r;
598
599 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
600 if (rdev->r600_blit.shader_obj == NULL)
601 return;
602 /* If we can't reserve the bo, unref should be enough to destroy
603 * it when it becomes idle.
604 */
605 r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
606 if (!r) {
607 radeon_bo_unpin(rdev->r600_blit.shader_obj);
608 radeon_bo_unreserve(rdev->r600_blit.shader_obj);
609 }
610 radeon_bo_unref(&rdev->r600_blit.shader_obj);
611}
612
613static unsigned r600_blit_create_rect(unsigned num_gpu_pages,
614 int *width, int *height, int max_dim)
615{
616 unsigned max_pages;
617 unsigned pages = num_gpu_pages;
618 int w, h;
619
620 if (num_gpu_pages == 0) {
621 /* not supposed to be called with no pages, but just in case */
622 h = 0;
623 w = 0;
624 pages = 0;
625 WARN_ON(1);
626 } else {
627 int rect_order = 2;
628 h = RECT_UNIT_H;
629 while (num_gpu_pages / rect_order) {
630 h *= 2;
631 rect_order *= 4;
632 if (h >= max_dim) {
633 h = max_dim;
634 break;
635 }
636 }
637 max_pages = (max_dim * h) / (RECT_UNIT_W * RECT_UNIT_H);
638 if (pages > max_pages)
639 pages = max_pages;
640 w = (pages * RECT_UNIT_W * RECT_UNIT_H) / h;
641 w = (w / RECT_UNIT_W) * RECT_UNIT_W;
642 pages = (w * h) / (RECT_UNIT_W * RECT_UNIT_H);
643 BUG_ON(pages == 0);
644 }
645
646
647 DRM_DEBUG("blit_rectangle: h=%d, w=%d, pages=%d\n", h, w, pages);
648
649 /* return width and height only of the caller wants it */
650 if (height)
651 *height = h;
652 if (width)
653 *width = w;
654
655 return pages;
656}
657
658
659int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
660 struct radeon_fence **fence, struct radeon_sa_bo **vb,
661 struct radeon_semaphore **sem)
662{
663 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
664 int r;
665 int ring_size;
666 int num_loops = 0;
667 int dwords_per_loop = rdev->r600_blit.ring_size_per_loop;
668
669 /* num loops */
670 while (num_gpu_pages) {
671 num_gpu_pages -=
672 r600_blit_create_rect(num_gpu_pages, NULL, NULL,
673 rdev->r600_blit.max_dim);
674 num_loops++;
675 }
676
677 /* 48 bytes for vertex per loop */
678 r = radeon_sa_bo_new(rdev, &rdev->ring_tmp_bo, vb,
679 (num_loops*48)+256, 256, true);
680 if (r) {
681 return r;
682 }
683
684 r = radeon_semaphore_create(rdev, sem);
685 if (r) {
686 radeon_sa_bo_free(rdev, vb, NULL);
687 return r;
688 }
689
690 /* calculate number of loops correctly */
691 ring_size = num_loops * dwords_per_loop;
692 ring_size += rdev->r600_blit.ring_size_common;
693 r = radeon_ring_lock(rdev, ring, ring_size);
694 if (r) {
695 radeon_sa_bo_free(rdev, vb, NULL);
696 radeon_semaphore_free(rdev, sem, NULL);
697 return r;
698 }
699
700 if (radeon_fence_need_sync(*fence, RADEON_RING_TYPE_GFX_INDEX)) {
701 radeon_semaphore_sync_rings(rdev, *sem, (*fence)->ring,
702 RADEON_RING_TYPE_GFX_INDEX);
703 radeon_fence_note_sync(*fence, RADEON_RING_TYPE_GFX_INDEX);
704 } else {
705 radeon_semaphore_free(rdev, sem, NULL);
706 }
707
708 rdev->r600_blit.primitives.set_default_state(rdev);
709 rdev->r600_blit.primitives.set_shaders(rdev);
710 return 0;
711}
712
713void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence **fence,
714 struct radeon_sa_bo *vb, struct radeon_semaphore *sem)
715{
716 struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
717 int r;
718
719 r = radeon_fence_emit(rdev, fence, RADEON_RING_TYPE_GFX_INDEX);
720 if (r) {
721 radeon_ring_unlock_undo(rdev, ring);
722 return;
723 }
724
725 radeon_ring_unlock_commit(rdev, ring);
726 radeon_sa_bo_free(rdev, &vb, *fence);
727 radeon_semaphore_free(rdev, &sem, *fence);
728}
729
730void r600_kms_blit_copy(struct radeon_device *rdev,
731 u64 src_gpu_addr, u64 dst_gpu_addr,
732 unsigned num_gpu_pages,
733 struct radeon_sa_bo *vb)
734{
735 u64 vb_gpu_addr;
736 u32 *vb_cpu_addr;
737
738 DRM_DEBUG("emitting copy %16llx %16llx %d\n",
739 src_gpu_addr, dst_gpu_addr, num_gpu_pages);
740 vb_cpu_addr = (u32 *)radeon_sa_bo_cpu_addr(vb);
741 vb_gpu_addr = radeon_sa_bo_gpu_addr(vb);
742
743 while (num_gpu_pages) {
744 int w, h;
745 unsigned size_in_bytes;
746 unsigned pages_per_loop =
747 r600_blit_create_rect(num_gpu_pages, &w, &h,
748 rdev->r600_blit.max_dim);
749
750 size_in_bytes = pages_per_loop * RADEON_GPU_PAGE_SIZE;
751 DRM_DEBUG("rectangle w=%d h=%d\n", w, h);
752
753 vb_cpu_addr[0] = 0;
754 vb_cpu_addr[1] = 0;
755 vb_cpu_addr[2] = 0;
756 vb_cpu_addr[3] = 0;
757
758 vb_cpu_addr[4] = 0;
759 vb_cpu_addr[5] = int2float(h);
760 vb_cpu_addr[6] = 0;
761 vb_cpu_addr[7] = int2float(h);
762
763 vb_cpu_addr[8] = int2float(w);
764 vb_cpu_addr[9] = int2float(h);
765 vb_cpu_addr[10] = int2float(w);
766 vb_cpu_addr[11] = int2float(h);
767
768 rdev->r600_blit.primitives.set_tex_resource(rdev, FMT_8_8_8_8,
769 w, h, w, src_gpu_addr, size_in_bytes);
770 rdev->r600_blit.primitives.set_render_target(rdev, COLOR_8_8_8_8,
771 w, h, dst_gpu_addr);
772 rdev->r600_blit.primitives.set_scissors(rdev, 0, 0, w, h);
773 rdev->r600_blit.primitives.set_vtx_resource(rdev, vb_gpu_addr);
774 rdev->r600_blit.primitives.draw_auto(rdev);
775 rdev->r600_blit.primitives.cp_set_surface_sync(rdev,
776 PACKET3_CB_ACTION_ENA | PACKET3_CB0_DEST_BASE_ENA,
777 size_in_bytes, dst_gpu_addr);
778
779 vb_cpu_addr += 12;
780 vb_gpu_addr += 4*12;
781 src_gpu_addr += size_in_bytes;
782 dst_gpu_addr += size_in_bytes;
783 num_gpu_pages -= pages_per_loop;
784 }
785}
diff --git a/drivers/gpu/drm/radeon/r600_blit_shaders.h b/drivers/gpu/drm/radeon/r600_blit_shaders.h
index 2f3ce7a75976..f437d36dd98c 100644
--- a/drivers/gpu/drm/radeon/r600_blit_shaders.h
+++ b/drivers/gpu/drm/radeon/r600_blit_shaders.h
@@ -35,5 +35,4 @@ extern const u32 r6xx_default_state[];
35extern const u32 r6xx_ps_size, r6xx_vs_size; 35extern const u32 r6xx_ps_size, r6xx_vs_size;
36extern const u32 r6xx_default_size, r7xx_default_size; 36extern const u32 r6xx_default_size, r7xx_default_size;
37 37
38__pure uint32_t int2float(uint32_t x);
39#endif 38#endif
diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c
new file mode 100644
index 000000000000..3b317456512a
--- /dev/null
+++ b/drivers/gpu/drm/radeon/r600_dma.c
@@ -0,0 +1,497 @@
1/*
2 * Copyright 2013 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: Alex Deucher
23 */
24#include <drm/drmP.h>
25#include "radeon.h"
26#include "radeon_asic.h"
27#include "r600d.h"
28
29u32 r600_gpu_check_soft_reset(struct radeon_device *rdev);
30
31/*
32 * DMA
33 * Starting with R600, the GPU has an asynchronous
34 * DMA engine. The programming model is very similar
35 * to the 3D engine (ring buffer, IBs, etc.), but the
36 * DMA controller has it's own packet format that is
37 * different form the PM4 format used by the 3D engine.
38 * It supports copying data, writing embedded data,
39 * solid fills, and a number of other things. It also
40 * has support for tiling/detiling of buffers.
41 */
42
43/**
44 * r600_dma_get_rptr - get the current read pointer
45 *
46 * @rdev: radeon_device pointer
47 * @ring: radeon ring pointer
48 *
49 * Get the current rptr from the hardware (r6xx+).
50 */
51uint32_t r600_dma_get_rptr(struct radeon_device *rdev,
52 struct radeon_ring *ring)
53{
54 return (radeon_ring_generic_get_rptr(rdev, ring) & 0x3fffc) >> 2;
55}
56
57/**
58 * r600_dma_get_wptr - get the current write pointer
59 *
60 * @rdev: radeon_device pointer
61 * @ring: radeon ring pointer
62 *
63 * Get the current wptr from the hardware (r6xx+).
64 */
65uint32_t r600_dma_get_wptr(struct radeon_device *rdev,
66 struct radeon_ring *ring)
67{
68 return (RREG32(ring->wptr_reg) & 0x3fffc) >> 2;
69}
70
71/**
72 * r600_dma_set_wptr - commit the write pointer
73 *
74 * @rdev: radeon_device pointer
75 * @ring: radeon ring pointer
76 *
77 * Write the wptr back to the hardware (r6xx+).
78 */
79void r600_dma_set_wptr(struct radeon_device *rdev,
80 struct radeon_ring *ring)
81{
82 WREG32(ring->wptr_reg, (ring->wptr << 2) & 0x3fffc);
83}
84
85/**
86 * r600_dma_stop - stop the async dma engine
87 *
88 * @rdev: radeon_device pointer
89 *
90 * Stop the async dma engine (r6xx-evergreen).
91 */
92void r600_dma_stop(struct radeon_device *rdev)
93{
94 u32 rb_cntl = RREG32(DMA_RB_CNTL);
95
96 radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
97
98 rb_cntl &= ~DMA_RB_ENABLE;
99 WREG32(DMA_RB_CNTL, rb_cntl);
100
101 rdev->ring[R600_RING_TYPE_DMA_INDEX].ready = false;
102}
103
104/**
105 * r600_dma_resume - setup and start the async dma engine
106 *
107 * @rdev: radeon_device pointer
108 *
109 * Set up the DMA ring buffer and enable it. (r6xx-evergreen).
110 * Returns 0 for success, error for failure.
111 */
112int r600_dma_resume(struct radeon_device *rdev)
113{
114 struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
115 u32 rb_cntl, dma_cntl, ib_cntl;
116 u32 rb_bufsz;
117 int r;
118
119 /* Reset dma */
120 if (rdev->family >= CHIP_RV770)
121 WREG32(SRBM_SOFT_RESET, RV770_SOFT_RESET_DMA);
122 else
123 WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA);
124 RREG32(SRBM_SOFT_RESET);
125 udelay(50);
126 WREG32(SRBM_SOFT_RESET, 0);
127
128 WREG32(DMA_SEM_INCOMPLETE_TIMER_CNTL, 0);
129 WREG32(DMA_SEM_WAIT_FAIL_TIMER_CNTL, 0);
130
131 /* Set ring buffer size in dwords */
132 rb_bufsz = order_base_2(ring->ring_size / 4);
133 rb_cntl = rb_bufsz << 1;
134#ifdef __BIG_ENDIAN
135 rb_cntl |= DMA_RB_SWAP_ENABLE | DMA_RPTR_WRITEBACK_SWAP_ENABLE;
136#endif
137 WREG32(DMA_RB_CNTL, rb_cntl);
138
139 /* Initialize the ring buffer's read and write pointers */
140 WREG32(DMA_RB_RPTR, 0);
141 WREG32(DMA_RB_WPTR, 0);
142
143 /* set the wb address whether it's enabled or not */
144 WREG32(DMA_RB_RPTR_ADDR_HI,
145 upper_32_bits(rdev->wb.gpu_addr + R600_WB_DMA_RPTR_OFFSET) & 0xFF);
146 WREG32(DMA_RB_RPTR_ADDR_LO,
147 ((rdev->wb.gpu_addr + R600_WB_DMA_RPTR_OFFSET) & 0xFFFFFFFC));
148
149 if (rdev->wb.enabled)
150 rb_cntl |= DMA_RPTR_WRITEBACK_ENABLE;
151
152 WREG32(DMA_RB_BASE, ring->gpu_addr >> 8);
153
154 /* enable DMA IBs */
155 ib_cntl = DMA_IB_ENABLE;
156#ifdef __BIG_ENDIAN
157 ib_cntl |= DMA_IB_SWAP_ENABLE;
158#endif
159 WREG32(DMA_IB_CNTL, ib_cntl);
160
161 dma_cntl = RREG32(DMA_CNTL);
162 dma_cntl &= ~CTXEMPTY_INT_ENABLE;
163 WREG32(DMA_CNTL, dma_cntl);
164
165 if (rdev->family >= CHIP_RV770)
166 WREG32(DMA_MODE, 1);
167
168 ring->wptr = 0;
169 WREG32(DMA_RB_WPTR, ring->wptr << 2);
170
171 ring->rptr = RREG32(DMA_RB_RPTR) >> 2;
172
173 WREG32(DMA_RB_CNTL, rb_cntl | DMA_RB_ENABLE);
174
175 ring->ready = true;
176
177 r = radeon_ring_test(rdev, R600_RING_TYPE_DMA_INDEX, ring);
178 if (r) {
179 ring->ready = false;
180 return r;
181 }
182
183 radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size);
184
185 return 0;
186}
187
188/**
189 * r600_dma_fini - tear down the async dma engine
190 *
191 * @rdev: radeon_device pointer
192 *
193 * Stop the async dma engine and free the ring (r6xx-evergreen).
194 */
195void r600_dma_fini(struct radeon_device *rdev)
196{
197 r600_dma_stop(rdev);
198 radeon_ring_fini(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX]);
199}
200
201/**
202 * r600_dma_is_lockup - Check if the DMA engine is locked up
203 *
204 * @rdev: radeon_device pointer
205 * @ring: radeon_ring structure holding ring information
206 *
207 * Check if the async DMA engine is locked up.
208 * Returns true if the engine appears to be locked up, false if not.
209 */
210bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
211{
212 u32 reset_mask = r600_gpu_check_soft_reset(rdev);
213
214 if (!(reset_mask & RADEON_RESET_DMA)) {
215 radeon_ring_lockup_update(ring);
216 return false;
217 }
218 /* force ring activities */
219 radeon_ring_force_activity(rdev, ring);
220 return radeon_ring_test_lockup(rdev, ring);
221}
222
223
224/**
225 * r600_dma_ring_test - simple async dma engine test
226 *
227 * @rdev: radeon_device pointer
228 * @ring: radeon_ring structure holding ring information
229 *
230 * Test the DMA engine by writing using it to write an
231 * value to memory. (r6xx-SI).
232 * Returns 0 for success, error for failure.
233 */
234int r600_dma_ring_test(struct radeon_device *rdev,
235 struct radeon_ring *ring)
236{
237 unsigned i;
238 int r;
239 void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
240 u32 tmp;
241
242 if (!ptr) {
243 DRM_ERROR("invalid vram scratch pointer\n");
244 return -EINVAL;
245 }
246
247 tmp = 0xCAFEDEAD;
248 writel(tmp, ptr);
249
250 r = radeon_ring_lock(rdev, ring, 4);
251 if (r) {
252 DRM_ERROR("radeon: dma failed to lock ring %d (%d).\n", ring->idx, r);
253 return r;
254 }
255 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1));
256 radeon_ring_write(ring, rdev->vram_scratch.gpu_addr & 0xfffffffc);
257 radeon_ring_write(ring, upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xff);
258 radeon_ring_write(ring, 0xDEADBEEF);
259 radeon_ring_unlock_commit(rdev, ring);
260
261 for (i = 0; i < rdev->usec_timeout; i++) {
262 tmp = readl(ptr);
263 if (tmp == 0xDEADBEEF)
264 break;
265 DRM_UDELAY(1);
266 }
267
268 if (i < rdev->usec_timeout) {
269 DRM_INFO("ring test on %d succeeded in %d usecs\n", ring->idx, i);
270 } else {
271 DRM_ERROR("radeon: ring %d test failed (0x%08X)\n",
272 ring->idx, tmp);
273 r = -EINVAL;
274 }
275 return r;
276}
277
278/**
279 * r600_dma_fence_ring_emit - emit a fence on the DMA ring
280 *
281 * @rdev: radeon_device pointer
282 * @fence: radeon fence object
283 *
284 * Add a DMA fence packet to the ring to write
285 * the fence seq number and DMA trap packet to generate
286 * an interrupt if needed (r6xx-r7xx).
287 */
288void r600_dma_fence_ring_emit(struct radeon_device *rdev,
289 struct radeon_fence *fence)
290{
291 struct radeon_ring *ring = &rdev->ring[fence->ring];
292 u64 addr = rdev->fence_drv[fence->ring].gpu_addr;
293
294 /* write the fence */
295 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_FENCE, 0, 0, 0));
296 radeon_ring_write(ring, addr & 0xfffffffc);
297 radeon_ring_write(ring, (upper_32_bits(addr) & 0xff));
298 radeon_ring_write(ring, lower_32_bits(fence->seq));
299 /* generate an interrupt */
300 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_TRAP, 0, 0, 0));
301}
302
303/**
304 * r600_dma_semaphore_ring_emit - emit a semaphore on the dma ring
305 *
306 * @rdev: radeon_device pointer
307 * @ring: radeon_ring structure holding ring information
308 * @semaphore: radeon semaphore object
309 * @emit_wait: wait or signal semaphore
310 *
311 * Add a DMA semaphore packet to the ring wait on or signal
312 * other rings (r6xx-SI).
313 */
314void r600_dma_semaphore_ring_emit(struct radeon_device *rdev,
315 struct radeon_ring *ring,
316 struct radeon_semaphore *semaphore,
317 bool emit_wait)
318{
319 u64 addr = semaphore->gpu_addr;
320 u32 s = emit_wait ? 0 : 1;
321
322 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SEMAPHORE, 0, s, 0));
323 radeon_ring_write(ring, addr & 0xfffffffc);
324 radeon_ring_write(ring, upper_32_bits(addr) & 0xff);
325}
326
327/**
328 * r600_dma_ib_test - test an IB on the DMA engine
329 *
330 * @rdev: radeon_device pointer
331 * @ring: radeon_ring structure holding ring information
332 *
333 * Test a simple IB in the DMA ring (r6xx-SI).
334 * Returns 0 on success, error on failure.
335 */
336int r600_dma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
337{
338 struct radeon_ib ib;
339 unsigned i;
340 int r;
341 void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
342 u32 tmp = 0;
343
344 if (!ptr) {
345 DRM_ERROR("invalid vram scratch pointer\n");
346 return -EINVAL;
347 }
348
349 tmp = 0xCAFEDEAD;
350 writel(tmp, ptr);
351
352 r = radeon_ib_get(rdev, ring->idx, &ib, NULL, 256);
353 if (r) {
354 DRM_ERROR("radeon: failed to get ib (%d).\n", r);
355 return r;
356 }
357
358 ib.ptr[0] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1);
359 ib.ptr[1] = rdev->vram_scratch.gpu_addr & 0xfffffffc;
360 ib.ptr[2] = upper_32_bits(rdev->vram_scratch.gpu_addr) & 0xff;
361 ib.ptr[3] = 0xDEADBEEF;
362 ib.length_dw = 4;
363
364 r = radeon_ib_schedule(rdev, &ib, NULL);
365 if (r) {
366 radeon_ib_free(rdev, &ib);
367 DRM_ERROR("radeon: failed to schedule ib (%d).\n", r);
368 return r;
369 }
370 r = radeon_fence_wait(ib.fence, false);
371 if (r) {
372 DRM_ERROR("radeon: fence wait failed (%d).\n", r);
373 return r;
374 }
375 for (i = 0; i < rdev->usec_timeout; i++) {
376 tmp = readl(ptr);
377 if (tmp == 0xDEADBEEF)
378 break;
379 DRM_UDELAY(1);
380 }
381 if (i < rdev->usec_timeout) {
382 DRM_INFO("ib test on ring %d succeeded in %u usecs\n", ib.fence->ring, i);
383 } else {
384 DRM_ERROR("radeon: ib test failed (0x%08X)\n", tmp);
385 r = -EINVAL;
386 }
387 radeon_ib_free(rdev, &ib);
388 return r;
389}
390
391/**
392 * r600_dma_ring_ib_execute - Schedule an IB on the DMA engine
393 *
394 * @rdev: radeon_device pointer
395 * @ib: IB object to schedule
396 *
397 * Schedule an IB in the DMA ring (r6xx-r7xx).
398 */
399void r600_dma_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
400{
401 struct radeon_ring *ring = &rdev->ring[ib->ring];
402
403 if (rdev->wb.enabled) {
404 u32 next_rptr = ring->wptr + 4;
405 while ((next_rptr & 7) != 5)
406 next_rptr++;
407 next_rptr += 3;
408 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 1));
409 radeon_ring_write(ring, ring->next_rptr_gpu_addr & 0xfffffffc);
410 radeon_ring_write(ring, upper_32_bits(ring->next_rptr_gpu_addr) & 0xff);
411 radeon_ring_write(ring, next_rptr);
412 }
413
414 /* The indirect buffer packet must end on an 8 DW boundary in the DMA ring.
415 * Pad as necessary with NOPs.
416 */
417 while ((ring->wptr & 7) != 5)
418 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
419 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_INDIRECT_BUFFER, 0, 0, 0));
420 radeon_ring_write(ring, (ib->gpu_addr & 0xFFFFFFE0));
421 radeon_ring_write(ring, (ib->length_dw << 16) | (upper_32_bits(ib->gpu_addr) & 0xFF));
422
423}
424
425/**
426 * r600_copy_dma - copy pages using the DMA engine
427 *
428 * @rdev: radeon_device pointer
429 * @src_offset: src GPU address
430 * @dst_offset: dst GPU address
431 * @num_gpu_pages: number of GPU pages to xfer
432 * @fence: radeon fence object
433 *
434 * Copy GPU paging using the DMA engine (r6xx).
435 * Used by the radeon ttm implementation to move pages if
436 * registered as the asic copy callback.
437 */
438int r600_copy_dma(struct radeon_device *rdev,
439 uint64_t src_offset, uint64_t dst_offset,
440 unsigned num_gpu_pages,
441 struct radeon_fence **fence)
442{
443 struct radeon_semaphore *sem = NULL;
444 int ring_index = rdev->asic->copy.dma_ring_index;
445 struct radeon_ring *ring = &rdev->ring[ring_index];
446 u32 size_in_dw, cur_size_in_dw;
447 int i, num_loops;
448 int r = 0;
449
450 r = radeon_semaphore_create(rdev, &sem);
451 if (r) {
452 DRM_ERROR("radeon: moving bo (%d).\n", r);
453 return r;
454 }
455
456 size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
457 num_loops = DIV_ROUND_UP(size_in_dw, 0xFFFE);
458 r = radeon_ring_lock(rdev, ring, num_loops * 4 + 8);
459 if (r) {
460 DRM_ERROR("radeon: moving bo (%d).\n", r);
461 radeon_semaphore_free(rdev, &sem, NULL);
462 return r;
463 }
464
465 if (radeon_fence_need_sync(*fence, ring->idx)) {
466 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
467 ring->idx);
468 radeon_fence_note_sync(*fence, ring->idx);
469 } else {
470 radeon_semaphore_free(rdev, &sem, NULL);
471 }
472
473 for (i = 0; i < num_loops; i++) {
474 cur_size_in_dw = size_in_dw;
475 if (cur_size_in_dw > 0xFFFE)
476 cur_size_in_dw = 0xFFFE;
477 size_in_dw -= cur_size_in_dw;
478 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw));
479 radeon_ring_write(ring, dst_offset & 0xfffffffc);
480 radeon_ring_write(ring, src_offset & 0xfffffffc);
481 radeon_ring_write(ring, (((upper_32_bits(dst_offset) & 0xff) << 16) |
482 (upper_32_bits(src_offset) & 0xff)));
483 src_offset += cur_size_in_dw * 4;
484 dst_offset += cur_size_in_dw * 4;
485 }
486
487 r = radeon_fence_emit(rdev, fence, ring->idx);
488 if (r) {
489 radeon_ring_unlock_undo(rdev, ring);
490 return r;
491 }
492
493 radeon_ring_unlock_commit(rdev, ring);
494 radeon_semaphore_free(rdev, &sem, *fence);
495
496 return r;
497}
diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c
index e5c860f4ccbe..fa0de46fcc0d 100644
--- a/drivers/gpu/drm/radeon/r600_dpm.c
+++ b/drivers/gpu/drm/radeon/r600_dpm.c
@@ -174,6 +174,24 @@ u32 r600_dpm_get_vblank_time(struct radeon_device *rdev)
174 return vblank_time_us; 174 return vblank_time_us;
175} 175}
176 176
177u32 r600_dpm_get_vrefresh(struct radeon_device *rdev)
178{
179 struct drm_device *dev = rdev->ddev;
180 struct drm_crtc *crtc;
181 struct radeon_crtc *radeon_crtc;
182 u32 vrefresh = 0;
183
184 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
185 radeon_crtc = to_radeon_crtc(crtc);
186 if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) {
187 vrefresh = radeon_crtc->hw_mode.vrefresh;
188 break;
189 }
190 }
191
192 return vrefresh;
193}
194
177void r600_calculate_u_and_p(u32 i, u32 r_c, u32 p_b, 195void r600_calculate_u_and_p(u32 i, u32 r_c, u32 p_b,
178 u32 *p, u32 *u) 196 u32 *p, u32 *u)
179{ 197{
@@ -745,6 +763,8 @@ bool r600_is_internal_thermal_sensor(enum radeon_int_thermal_type sensor)
745 case THERMAL_TYPE_SUMO: 763 case THERMAL_TYPE_SUMO:
746 case THERMAL_TYPE_NI: 764 case THERMAL_TYPE_NI:
747 case THERMAL_TYPE_SI: 765 case THERMAL_TYPE_SI:
766 case THERMAL_TYPE_CI:
767 case THERMAL_TYPE_KV:
748 return true; 768 return true;
749 case THERMAL_TYPE_ADT7473_WITH_INTERNAL: 769 case THERMAL_TYPE_ADT7473_WITH_INTERNAL:
750 case THERMAL_TYPE_EMC2103_WITH_INTERNAL: 770 case THERMAL_TYPE_EMC2103_WITH_INTERNAL:
@@ -779,15 +799,19 @@ static int r600_parse_clk_voltage_dep_table(struct radeon_clock_voltage_dependen
779 u32 size = atom_table->ucNumEntries * 799 u32 size = atom_table->ucNumEntries *
780 sizeof(struct radeon_clock_voltage_dependency_entry); 800 sizeof(struct radeon_clock_voltage_dependency_entry);
781 int i; 801 int i;
802 ATOM_PPLIB_Clock_Voltage_Dependency_Record *entry;
782 803
783 radeon_table->entries = kzalloc(size, GFP_KERNEL); 804 radeon_table->entries = kzalloc(size, GFP_KERNEL);
784 if (!radeon_table->entries) 805 if (!radeon_table->entries)
785 return -ENOMEM; 806 return -ENOMEM;
786 807
808 entry = &atom_table->entries[0];
787 for (i = 0; i < atom_table->ucNumEntries; i++) { 809 for (i = 0; i < atom_table->ucNumEntries; i++) {
788 radeon_table->entries[i].clk = le16_to_cpu(atom_table->entries[i].usClockLow) | 810 radeon_table->entries[i].clk = le16_to_cpu(entry->usClockLow) |
789 (atom_table->entries[i].ucClockHigh << 16); 811 (entry->ucClockHigh << 16);
790 radeon_table->entries[i].v = le16_to_cpu(atom_table->entries[i].usVoltage); 812 radeon_table->entries[i].v = le16_to_cpu(entry->usVoltage);
813 entry = (ATOM_PPLIB_Clock_Voltage_Dependency_Record *)
814 ((u8 *)entry + sizeof(ATOM_PPLIB_Clock_Voltage_Dependency_Record));
791 } 815 }
792 radeon_table->count = atom_table->ucNumEntries; 816 radeon_table->count = atom_table->ucNumEntries;
793 817
@@ -875,6 +899,19 @@ int r600_parse_extended_power_table(struct radeon_device *rdev)
875 return ret; 899 return ret;
876 } 900 }
877 } 901 }
902 if (power_info->pplib4.usMvddDependencyOnMCLKOffset) {
903 dep_table = (ATOM_PPLIB_Clock_Voltage_Dependency_Table *)
904 (mode_info->atom_context->bios + data_offset +
905 le16_to_cpu(power_info->pplib4.usMvddDependencyOnMCLKOffset));
906 ret = r600_parse_clk_voltage_dep_table(&rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk,
907 dep_table);
908 if (ret) {
909 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries);
910 kfree(rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk.entries);
911 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries);
912 return ret;
913 }
914 }
878 if (power_info->pplib4.usMaxClockVoltageOnDCOffset) { 915 if (power_info->pplib4.usMaxClockVoltageOnDCOffset) {
879 ATOM_PPLIB_Clock_Voltage_Limit_Table *clk_v = 916 ATOM_PPLIB_Clock_Voltage_Limit_Table *clk_v =
880 (ATOM_PPLIB_Clock_Voltage_Limit_Table *) 917 (ATOM_PPLIB_Clock_Voltage_Limit_Table *)
@@ -898,27 +935,27 @@ int r600_parse_extended_power_table(struct radeon_device *rdev)
898 (ATOM_PPLIB_PhaseSheddingLimits_Table *) 935 (ATOM_PPLIB_PhaseSheddingLimits_Table *)
899 (mode_info->atom_context->bios + data_offset + 936 (mode_info->atom_context->bios + data_offset +
900 le16_to_cpu(power_info->pplib4.usVddcPhaseShedLimitsTableOffset)); 937 le16_to_cpu(power_info->pplib4.usVddcPhaseShedLimitsTableOffset));
938 ATOM_PPLIB_PhaseSheddingLimits_Record *entry;
901 939
902 rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries = 940 rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries =
903 kzalloc(psl->ucNumEntries * 941 kzalloc(psl->ucNumEntries *
904 sizeof(struct radeon_phase_shedding_limits_entry), 942 sizeof(struct radeon_phase_shedding_limits_entry),
905 GFP_KERNEL); 943 GFP_KERNEL);
906 if (!rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries) { 944 if (!rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries) {
907 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries); 945 r600_free_extended_power_table(rdev);
908 kfree(rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk.entries);
909 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries);
910 return -ENOMEM; 946 return -ENOMEM;
911 } 947 }
912 948
949 entry = &psl->entries[0];
913 for (i = 0; i < psl->ucNumEntries; i++) { 950 for (i = 0; i < psl->ucNumEntries; i++) {
914 rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries[i].sclk = 951 rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries[i].sclk =
915 le16_to_cpu(psl->entries[i].usSclkLow) | 952 le16_to_cpu(entry->usSclkLow) | (entry->ucSclkHigh << 16);
916 (psl->entries[i].ucSclkHigh << 16);
917 rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries[i].mclk = 953 rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries[i].mclk =
918 le16_to_cpu(psl->entries[i].usMclkLow) | 954 le16_to_cpu(entry->usMclkLow) | (entry->ucMclkHigh << 16);
919 (psl->entries[i].ucMclkHigh << 16);
920 rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries[i].voltage = 955 rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries[i].voltage =
921 le16_to_cpu(psl->entries[i].usVoltage); 956 le16_to_cpu(entry->usVoltage);
957 entry = (ATOM_PPLIB_PhaseSheddingLimits_Record *)
958 ((u8 *)entry + sizeof(ATOM_PPLIB_PhaseSheddingLimits_Record));
922 } 959 }
923 rdev->pm.dpm.dyn_state.phase_shedding_limits_table.count = 960 rdev->pm.dpm.dyn_state.phase_shedding_limits_table.count =
924 psl->ucNumEntries; 961 psl->ucNumEntries;
@@ -945,30 +982,140 @@ int r600_parse_extended_power_table(struct radeon_device *rdev)
945 (ATOM_PPLIB_CAC_Leakage_Table *) 982 (ATOM_PPLIB_CAC_Leakage_Table *)
946 (mode_info->atom_context->bios + data_offset + 983 (mode_info->atom_context->bios + data_offset +
947 le16_to_cpu(power_info->pplib5.usCACLeakageTableOffset)); 984 le16_to_cpu(power_info->pplib5.usCACLeakageTableOffset));
985 ATOM_PPLIB_CAC_Leakage_Record *entry;
948 u32 size = cac_table->ucNumEntries * sizeof(struct radeon_cac_leakage_table); 986 u32 size = cac_table->ucNumEntries * sizeof(struct radeon_cac_leakage_table);
949 rdev->pm.dpm.dyn_state.cac_leakage_table.entries = kzalloc(size, GFP_KERNEL); 987 rdev->pm.dpm.dyn_state.cac_leakage_table.entries = kzalloc(size, GFP_KERNEL);
950 if (!rdev->pm.dpm.dyn_state.cac_leakage_table.entries) { 988 if (!rdev->pm.dpm.dyn_state.cac_leakage_table.entries) {
951 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries); 989 r600_free_extended_power_table(rdev);
952 kfree(rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk.entries);
953 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries);
954 return -ENOMEM; 990 return -ENOMEM;
955 } 991 }
992 entry = &cac_table->entries[0];
956 for (i = 0; i < cac_table->ucNumEntries; i++) { 993 for (i = 0; i < cac_table->ucNumEntries; i++) {
957 rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc = 994 if (rdev->pm.dpm.platform_caps & ATOM_PP_PLATFORM_CAP_EVV) {
958 le16_to_cpu(cac_table->entries[i].usVddc); 995 rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc1 =
959 rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].leakage = 996 le16_to_cpu(entry->usVddc1);
960 le32_to_cpu(cac_table->entries[i].ulLeakageValue); 997 rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc2 =
998 le16_to_cpu(entry->usVddc2);
999 rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc3 =
1000 le16_to_cpu(entry->usVddc3);
1001 } else {
1002 rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].vddc =
1003 le16_to_cpu(entry->usVddc);
1004 rdev->pm.dpm.dyn_state.cac_leakage_table.entries[i].leakage =
1005 le32_to_cpu(entry->ulLeakageValue);
1006 }
1007 entry = (ATOM_PPLIB_CAC_Leakage_Record *)
1008 ((u8 *)entry + sizeof(ATOM_PPLIB_CAC_Leakage_Record));
961 } 1009 }
962 rdev->pm.dpm.dyn_state.cac_leakage_table.count = cac_table->ucNumEntries; 1010 rdev->pm.dpm.dyn_state.cac_leakage_table.count = cac_table->ucNumEntries;
963 } 1011 }
964 } 1012 }
965 1013
966 /* ppm table */ 1014 /* ext tables */
967 if (le16_to_cpu(power_info->pplib.usTableSize) >= 1015 if (le16_to_cpu(power_info->pplib.usTableSize) >=
968 sizeof(struct _ATOM_PPLIB_POWERPLAYTABLE3)) { 1016 sizeof(struct _ATOM_PPLIB_POWERPLAYTABLE3)) {
969 ATOM_PPLIB_EXTENDEDHEADER *ext_hdr = (ATOM_PPLIB_EXTENDEDHEADER *) 1017 ATOM_PPLIB_EXTENDEDHEADER *ext_hdr = (ATOM_PPLIB_EXTENDEDHEADER *)
970 (mode_info->atom_context->bios + data_offset + 1018 (mode_info->atom_context->bios + data_offset +
971 le16_to_cpu(power_info->pplib3.usExtendendedHeaderOffset)); 1019 le16_to_cpu(power_info->pplib3.usExtendendedHeaderOffset));
1020 if ((le16_to_cpu(ext_hdr->usSize) >= SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V2) &&
1021 ext_hdr->usVCETableOffset) {
1022 VCEClockInfoArray *array = (VCEClockInfoArray *)
1023 (mode_info->atom_context->bios + data_offset +
1024 le16_to_cpu(ext_hdr->usVCETableOffset) + 1);
1025 ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table *limits =
1026 (ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table *)
1027 (mode_info->atom_context->bios + data_offset +
1028 le16_to_cpu(ext_hdr->usVCETableOffset) + 1 +
1029 1 + array->ucNumEntries * sizeof(VCEClockInfo));
1030 ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record *entry;
1031 u32 size = limits->numEntries *
1032 sizeof(struct radeon_vce_clock_voltage_dependency_entry);
1033 rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries =
1034 kzalloc(size, GFP_KERNEL);
1035 if (!rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries) {
1036 r600_free_extended_power_table(rdev);
1037 return -ENOMEM;
1038 }
1039 rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.count =
1040 limits->numEntries;
1041 entry = &limits->entries[0];
1042 for (i = 0; i < limits->numEntries; i++) {
1043 VCEClockInfo *vce_clk = (VCEClockInfo *)
1044 ((u8 *)&array->entries[0] +
1045 (entry->ucVCEClockInfoIndex * sizeof(VCEClockInfo)));
1046 rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries[i].evclk =
1047 le16_to_cpu(vce_clk->usEVClkLow) | (vce_clk->ucEVClkHigh << 16);
1048 rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries[i].ecclk =
1049 le16_to_cpu(vce_clk->usECClkLow) | (vce_clk->ucECClkHigh << 16);
1050 rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries[i].v =
1051 le16_to_cpu(entry->usVoltage);
1052 entry = (ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record *)
1053 ((u8 *)entry + sizeof(ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record));
1054 }
1055 }
1056 if ((le16_to_cpu(ext_hdr->usSize) >= SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V3) &&
1057 ext_hdr->usUVDTableOffset) {
1058 UVDClockInfoArray *array = (UVDClockInfoArray *)
1059 (mode_info->atom_context->bios + data_offset +
1060 le16_to_cpu(ext_hdr->usUVDTableOffset) + 1);
1061 ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table *limits =
1062 (ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table *)
1063 (mode_info->atom_context->bios + data_offset +
1064 le16_to_cpu(ext_hdr->usUVDTableOffset) + 1 +
1065 1 + (array->ucNumEntries * sizeof (UVDClockInfo)));
1066 ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record *entry;
1067 u32 size = limits->numEntries *
1068 sizeof(struct radeon_uvd_clock_voltage_dependency_entry);
1069 rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries =
1070 kzalloc(size, GFP_KERNEL);
1071 if (!rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries) {
1072 r600_free_extended_power_table(rdev);
1073 return -ENOMEM;
1074 }
1075 rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count =
1076 limits->numEntries;
1077 entry = &limits->entries[0];
1078 for (i = 0; i < limits->numEntries; i++) {
1079 UVDClockInfo *uvd_clk = (UVDClockInfo *)
1080 ((u8 *)&array->entries[0] +
1081 (entry->ucUVDClockInfoIndex * sizeof(UVDClockInfo)));
1082 rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].vclk =
1083 le16_to_cpu(uvd_clk->usVClkLow) | (uvd_clk->ucVClkHigh << 16);
1084 rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].dclk =
1085 le16_to_cpu(uvd_clk->usDClkLow) | (uvd_clk->ucDClkHigh << 16);
1086 rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries[i].v =
1087 le16_to_cpu(limits->entries[i].usVoltage);
1088 entry = (ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record *)
1089 ((u8 *)entry + sizeof(ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record));
1090 }
1091 }
1092 if ((le16_to_cpu(ext_hdr->usSize) >= SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V4) &&
1093 ext_hdr->usSAMUTableOffset) {
1094 ATOM_PPLIB_SAMClk_Voltage_Limit_Table *limits =
1095 (ATOM_PPLIB_SAMClk_Voltage_Limit_Table *)
1096 (mode_info->atom_context->bios + data_offset +
1097 le16_to_cpu(ext_hdr->usSAMUTableOffset) + 1);
1098 ATOM_PPLIB_SAMClk_Voltage_Limit_Record *entry;
1099 u32 size = limits->numEntries *
1100 sizeof(struct radeon_clock_voltage_dependency_entry);
1101 rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries =
1102 kzalloc(size, GFP_KERNEL);
1103 if (!rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries) {
1104 r600_free_extended_power_table(rdev);
1105 return -ENOMEM;
1106 }
1107 rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.count =
1108 limits->numEntries;
1109 entry = &limits->entries[0];
1110 for (i = 0; i < limits->numEntries; i++) {
1111 rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries[i].clk =
1112 le16_to_cpu(entry->usSAMClockLow) | (entry->ucSAMClockHigh << 16);
1113 rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries[i].v =
1114 le16_to_cpu(entry->usVoltage);
1115 entry = (ATOM_PPLIB_SAMClk_Voltage_Limit_Record *)
1116 ((u8 *)entry + sizeof(ATOM_PPLIB_SAMClk_Voltage_Limit_Record));
1117 }
1118 }
972 if ((le16_to_cpu(ext_hdr->usSize) >= SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V5) && 1119 if ((le16_to_cpu(ext_hdr->usSize) >= SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V5) &&
973 ext_hdr->usPPMTableOffset) { 1120 ext_hdr->usPPMTableOffset) {
974 ATOM_PPLIB_PPM_Table *ppm = (ATOM_PPLIB_PPM_Table *) 1121 ATOM_PPLIB_PPM_Table *ppm = (ATOM_PPLIB_PPM_Table *)
@@ -977,10 +1124,7 @@ int r600_parse_extended_power_table(struct radeon_device *rdev)
977 rdev->pm.dpm.dyn_state.ppm_table = 1124 rdev->pm.dpm.dyn_state.ppm_table =
978 kzalloc(sizeof(struct radeon_ppm_table), GFP_KERNEL); 1125 kzalloc(sizeof(struct radeon_ppm_table), GFP_KERNEL);
979 if (!rdev->pm.dpm.dyn_state.ppm_table) { 1126 if (!rdev->pm.dpm.dyn_state.ppm_table) {
980 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries); 1127 r600_free_extended_power_table(rdev);
981 kfree(rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk.entries);
982 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries);
983 kfree(rdev->pm.dpm.dyn_state.cac_leakage_table.entries);
984 return -ENOMEM; 1128 return -ENOMEM;
985 } 1129 }
986 rdev->pm.dpm.dyn_state.ppm_table->ppm_design = ppm->ucPpmDesign; 1130 rdev->pm.dpm.dyn_state.ppm_table->ppm_design = ppm->ucPpmDesign;
@@ -1003,6 +1147,71 @@ int r600_parse_extended_power_table(struct radeon_device *rdev)
1003 rdev->pm.dpm.dyn_state.ppm_table->tj_max = 1147 rdev->pm.dpm.dyn_state.ppm_table->tj_max =
1004 le32_to_cpu(ppm->ulTjmax); 1148 le32_to_cpu(ppm->ulTjmax);
1005 } 1149 }
1150 if ((le16_to_cpu(ext_hdr->usSize) >= SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V6) &&
1151 ext_hdr->usACPTableOffset) {
1152 ATOM_PPLIB_ACPClk_Voltage_Limit_Table *limits =
1153 (ATOM_PPLIB_ACPClk_Voltage_Limit_Table *)
1154 (mode_info->atom_context->bios + data_offset +
1155 le16_to_cpu(ext_hdr->usACPTableOffset) + 1);
1156 ATOM_PPLIB_ACPClk_Voltage_Limit_Record *entry;
1157 u32 size = limits->numEntries *
1158 sizeof(struct radeon_clock_voltage_dependency_entry);
1159 rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries =
1160 kzalloc(size, GFP_KERNEL);
1161 if (!rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries) {
1162 r600_free_extended_power_table(rdev);
1163 return -ENOMEM;
1164 }
1165 rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.count =
1166 limits->numEntries;
1167 entry = &limits->entries[0];
1168 for (i = 0; i < limits->numEntries; i++) {
1169 rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries[i].clk =
1170 le16_to_cpu(entry->usACPClockLow) | (entry->ucACPClockHigh << 16);
1171 rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries[i].v =
1172 le16_to_cpu(entry->usVoltage);
1173 entry = (ATOM_PPLIB_ACPClk_Voltage_Limit_Record *)
1174 ((u8 *)entry + sizeof(ATOM_PPLIB_ACPClk_Voltage_Limit_Record));
1175 }
1176 }
1177 if ((le16_to_cpu(ext_hdr->usSize) >= SIZE_OF_ATOM_PPLIB_EXTENDEDHEADER_V7) &&
1178 ext_hdr->usPowerTuneTableOffset) {
1179 u8 rev = *(u8 *)(mode_info->atom_context->bios + data_offset +
1180 le16_to_cpu(ext_hdr->usPowerTuneTableOffset));
1181 ATOM_PowerTune_Table *pt;
1182 rdev->pm.dpm.dyn_state.cac_tdp_table =
1183 kzalloc(sizeof(struct radeon_cac_tdp_table), GFP_KERNEL);
1184 if (!rdev->pm.dpm.dyn_state.cac_tdp_table) {
1185 r600_free_extended_power_table(rdev);
1186 return -ENOMEM;
1187 }
1188 if (rev > 0) {
1189 ATOM_PPLIB_POWERTUNE_Table_V1 *ppt = (ATOM_PPLIB_POWERTUNE_Table_V1 *)
1190 (mode_info->atom_context->bios + data_offset +
1191 le16_to_cpu(ext_hdr->usPowerTuneTableOffset));
1192 rdev->pm.dpm.dyn_state.cac_tdp_table->maximum_power_delivery_limit =
1193 ppt->usMaximumPowerDeliveryLimit;
1194 pt = &ppt->power_tune_table;
1195 } else {
1196 ATOM_PPLIB_POWERTUNE_Table *ppt = (ATOM_PPLIB_POWERTUNE_Table *)
1197 (mode_info->atom_context->bios + data_offset +
1198 le16_to_cpu(ext_hdr->usPowerTuneTableOffset));
1199 rdev->pm.dpm.dyn_state.cac_tdp_table->maximum_power_delivery_limit = 255;
1200 pt = &ppt->power_tune_table;
1201 }
1202 rdev->pm.dpm.dyn_state.cac_tdp_table->tdp = le16_to_cpu(pt->usTDP);
1203 rdev->pm.dpm.dyn_state.cac_tdp_table->configurable_tdp =
1204 le16_to_cpu(pt->usConfigurableTDP);
1205 rdev->pm.dpm.dyn_state.cac_tdp_table->tdc = le16_to_cpu(pt->usTDC);
1206 rdev->pm.dpm.dyn_state.cac_tdp_table->battery_power_limit =
1207 le16_to_cpu(pt->usBatteryPowerLimit);
1208 rdev->pm.dpm.dyn_state.cac_tdp_table->small_power_limit =
1209 le16_to_cpu(pt->usSmallPowerLimit);
1210 rdev->pm.dpm.dyn_state.cac_tdp_table->low_cac_leakage =
1211 le16_to_cpu(pt->usLowCACLeakage);
1212 rdev->pm.dpm.dyn_state.cac_tdp_table->high_cac_leakage =
1213 le16_to_cpu(pt->usHighCACLeakage);
1214 }
1006 } 1215 }
1007 1216
1008 return 0; 1217 return 0;
@@ -1016,12 +1225,24 @@ void r600_free_extended_power_table(struct radeon_device *rdev)
1016 kfree(rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk.entries); 1225 kfree(rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk.entries);
1017 if (rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries) 1226 if (rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries)
1018 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries); 1227 kfree(rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk.entries);
1228 if (rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk.entries)
1229 kfree(rdev->pm.dpm.dyn_state.mvdd_dependency_on_mclk.entries);
1019 if (rdev->pm.dpm.dyn_state.cac_leakage_table.entries) 1230 if (rdev->pm.dpm.dyn_state.cac_leakage_table.entries)
1020 kfree(rdev->pm.dpm.dyn_state.cac_leakage_table.entries); 1231 kfree(rdev->pm.dpm.dyn_state.cac_leakage_table.entries);
1021 if (rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries) 1232 if (rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries)
1022 kfree(rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries); 1233 kfree(rdev->pm.dpm.dyn_state.phase_shedding_limits_table.entries);
1023 if (rdev->pm.dpm.dyn_state.ppm_table) 1234 if (rdev->pm.dpm.dyn_state.ppm_table)
1024 kfree(rdev->pm.dpm.dyn_state.ppm_table); 1235 kfree(rdev->pm.dpm.dyn_state.ppm_table);
1236 if (rdev->pm.dpm.dyn_state.cac_tdp_table)
1237 kfree(rdev->pm.dpm.dyn_state.cac_tdp_table);
1238 if (rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries)
1239 kfree(rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table.entries);
1240 if (rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries)
1241 kfree(rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.entries);
1242 if (rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries)
1243 kfree(rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table.entries);
1244 if (rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries)
1245 kfree(rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table.entries);
1025} 1246}
1026 1247
1027enum radeon_pcie_gen r600_get_pcie_gen_support(struct radeon_device *rdev, 1248enum radeon_pcie_gen r600_get_pcie_gen_support(struct radeon_device *rdev,
@@ -1046,3 +1267,36 @@ enum radeon_pcie_gen r600_get_pcie_gen_support(struct radeon_device *rdev,
1046 } 1267 }
1047 return RADEON_PCIE_GEN1; 1268 return RADEON_PCIE_GEN1;
1048} 1269}
1270
1271u16 r600_get_pcie_lane_support(struct radeon_device *rdev,
1272 u16 asic_lanes,
1273 u16 default_lanes)
1274{
1275 switch (asic_lanes) {
1276 case 0:
1277 default:
1278 return default_lanes;
1279 case 1:
1280 return 1;
1281 case 2:
1282 return 2;
1283 case 4:
1284 return 4;
1285 case 8:
1286 return 8;
1287 case 12:
1288 return 12;
1289 case 16:
1290 return 16;
1291 }
1292}
1293
1294u8 r600_encode_pci_lane_width(u32 lanes)
1295{
1296 u8 encoded_lanes[] = { 0, 1, 2, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6 };
1297
1298 if (lanes > 16)
1299 return 0;
1300
1301 return encoded_lanes[lanes];
1302}
diff --git a/drivers/gpu/drm/radeon/r600_dpm.h b/drivers/gpu/drm/radeon/r600_dpm.h
index 7c822d9ae53d..1000bf9719f2 100644
--- a/drivers/gpu/drm/radeon/r600_dpm.h
+++ b/drivers/gpu/drm/radeon/r600_dpm.h
@@ -130,6 +130,7 @@ void r600_dpm_print_cap_info(u32 caps);
130void r600_dpm_print_ps_status(struct radeon_device *rdev, 130void r600_dpm_print_ps_status(struct radeon_device *rdev,
131 struct radeon_ps *rps); 131 struct radeon_ps *rps);
132u32 r600_dpm_get_vblank_time(struct radeon_device *rdev); 132u32 r600_dpm_get_vblank_time(struct radeon_device *rdev);
133u32 r600_dpm_get_vrefresh(struct radeon_device *rdev);
133bool r600_is_uvd_state(u32 class, u32 class2); 134bool r600_is_uvd_state(u32 class, u32 class2);
134void r600_calculate_u_and_p(u32 i, u32 r_c, u32 p_b, 135void r600_calculate_u_and_p(u32 i, u32 r_c, u32 p_b,
135 u32 *p, u32 *u); 136 u32 *p, u32 *u);
@@ -224,4 +225,9 @@ enum radeon_pcie_gen r600_get_pcie_gen_support(struct radeon_device *rdev,
224 enum radeon_pcie_gen asic_gen, 225 enum radeon_pcie_gen asic_gen,
225 enum radeon_pcie_gen default_gen); 226 enum radeon_pcie_gen default_gen);
226 227
228u16 r600_get_pcie_lane_support(struct radeon_device *rdev,
229 u16 asic_lanes,
230 u16 default_lanes);
231u8 r600_encode_pci_lane_width(u32 lanes);
232
227#endif 233#endif
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c
index f48240bb8c56..f443010ce90b 100644
--- a/drivers/gpu/drm/radeon/r600_hdmi.c
+++ b/drivers/gpu/drm/radeon/r600_hdmi.c
@@ -226,10 +226,29 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock)
226 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 226 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
227 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 227 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
228 u32 base_rate = 24000; 228 u32 base_rate = 24000;
229 u32 max_ratio = clock / base_rate;
230 u32 dto_phase;
231 u32 dto_modulo = clock;
232 u32 wallclock_ratio;
233 u32 dto_cntl;
229 234
230 if (!dig || !dig->afmt) 235 if (!dig || !dig->afmt)
231 return; 236 return;
232 237
238 if (max_ratio >= 8) {
239 dto_phase = 192 * 1000;
240 wallclock_ratio = 3;
241 } else if (max_ratio >= 4) {
242 dto_phase = 96 * 1000;
243 wallclock_ratio = 2;
244 } else if (max_ratio >= 2) {
245 dto_phase = 48 * 1000;
246 wallclock_ratio = 1;
247 } else {
248 dto_phase = 24 * 1000;
249 wallclock_ratio = 0;
250 }
251
233 /* there are two DTOs selected by DCCG_AUDIO_DTO_SELECT. 252 /* there are two DTOs selected by DCCG_AUDIO_DTO_SELECT.
234 * doesn't matter which one you use. Just use the first one. 253 * doesn't matter which one you use. Just use the first one.
235 */ 254 */
@@ -242,9 +261,21 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock)
242 /* according to the reg specs, this should DCE3.2 only, but in 261 /* according to the reg specs, this should DCE3.2 only, but in
243 * practice it seems to cover DCE3.0 as well. 262 * practice it seems to cover DCE3.0 as well.
244 */ 263 */
245 WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100); 264 if (dig->dig_encoder == 0) {
246 WREG32(DCCG_AUDIO_DTO0_MODULE, clock * 100); 265 dto_cntl = RREG32(DCCG_AUDIO_DTO0_CNTL) & ~DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK;
247 WREG32(DCCG_AUDIO_DTO_SELECT, 0); /* select DTO0 */ 266 dto_cntl |= DCCG_AUDIO_DTO_WALLCLOCK_RATIO(wallclock_ratio);
267 WREG32(DCCG_AUDIO_DTO0_CNTL, dto_cntl);
268 WREG32(DCCG_AUDIO_DTO0_PHASE, dto_phase);
269 WREG32(DCCG_AUDIO_DTO0_MODULE, dto_modulo);
270 WREG32(DCCG_AUDIO_DTO_SELECT, 0); /* select DTO0 */
271 } else {
272 dto_cntl = RREG32(DCCG_AUDIO_DTO1_CNTL) & ~DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK;
273 dto_cntl |= DCCG_AUDIO_DTO_WALLCLOCK_RATIO(wallclock_ratio);
274 WREG32(DCCG_AUDIO_DTO1_CNTL, dto_cntl);
275 WREG32(DCCG_AUDIO_DTO1_PHASE, dto_phase);
276 WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo);
277 WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */
278 }
248 } else { 279 } else {
249 /* according to the reg specs, this should be DCE2.0 and DCE3.0 */ 280 /* according to the reg specs, this should be DCE2.0 and DCE3.0 */
250 WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) | 281 WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) |
@@ -252,6 +283,107 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock)
252 } 283 }
253} 284}
254 285
286static void dce3_2_afmt_write_speaker_allocation(struct drm_encoder *encoder)
287{
288 struct radeon_device *rdev = encoder->dev->dev_private;
289 struct drm_connector *connector;
290 struct radeon_connector *radeon_connector = NULL;
291 u32 tmp;
292 u8 *sadb;
293 int sad_count;
294
295 list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
296 if (connector->encoder == encoder)
297 radeon_connector = to_radeon_connector(connector);
298 }
299
300 if (!radeon_connector) {
301 DRM_ERROR("Couldn't find encoder's connector\n");
302 return;
303 }
304
305 sad_count = drm_edid_to_speaker_allocation(radeon_connector->edid, &sadb);
306 if (sad_count < 0) {
307 DRM_ERROR("Couldn't read Speaker Allocation Data Block: %d\n", sad_count);
308 return;
309 }
310
311 /* program the speaker allocation */
312 tmp = RREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER);
313 tmp &= ~(DP_CONNECTION | SPEAKER_ALLOCATION_MASK);
314 /* set HDMI mode */
315 tmp |= HDMI_CONNECTION;
316 if (sad_count)
317 tmp |= SPEAKER_ALLOCATION(sadb[0]);
318 else
319 tmp |= SPEAKER_ALLOCATION(5); /* stereo */
320 WREG32(AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER, tmp);
321
322 kfree(sadb);
323}
324
325static void dce3_2_afmt_write_sad_regs(struct drm_encoder *encoder)
326{
327 struct radeon_device *rdev = encoder->dev->dev_private;
328 struct drm_connector *connector;
329 struct radeon_connector *radeon_connector = NULL;
330 struct cea_sad *sads;
331 int i, sad_count;
332
333 static const u16 eld_reg_to_type[][2] = {
334 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR0, HDMI_AUDIO_CODING_TYPE_PCM },
335 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR1, HDMI_AUDIO_CODING_TYPE_AC3 },
336 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR2, HDMI_AUDIO_CODING_TYPE_MPEG1 },
337 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR3, HDMI_AUDIO_CODING_TYPE_MP3 },
338 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR4, HDMI_AUDIO_CODING_TYPE_MPEG2 },
339 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR5, HDMI_AUDIO_CODING_TYPE_AAC_LC },
340 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR6, HDMI_AUDIO_CODING_TYPE_DTS },
341 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR7, HDMI_AUDIO_CODING_TYPE_ATRAC },
342 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR9, HDMI_AUDIO_CODING_TYPE_EAC3 },
343 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR10, HDMI_AUDIO_CODING_TYPE_DTS_HD },
344 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR11, HDMI_AUDIO_CODING_TYPE_MLP },
345 { AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR13, HDMI_AUDIO_CODING_TYPE_WMA_PRO },
346 };
347
348 list_for_each_entry(connector, &encoder->dev->mode_config.connector_list, head) {
349 if (connector->encoder == encoder)
350 radeon_connector = to_radeon_connector(connector);
351 }
352
353 if (!radeon_connector) {
354 DRM_ERROR("Couldn't find encoder's connector\n");
355 return;
356 }
357
358 sad_count = drm_edid_to_sad(radeon_connector->edid, &sads);
359 if (sad_count < 0) {
360 DRM_ERROR("Couldn't read SADs: %d\n", sad_count);
361 return;
362 }
363 BUG_ON(!sads);
364
365 for (i = 0; i < ARRAY_SIZE(eld_reg_to_type); i++) {
366 u32 value = 0;
367 int j;
368
369 for (j = 0; j < sad_count; j++) {
370 struct cea_sad *sad = &sads[j];
371
372 if (sad->format == eld_reg_to_type[i][1]) {
373 value = MAX_CHANNELS(sad->channels) |
374 DESCRIPTOR_BYTE_2(sad->byte2) |
375 SUPPORTED_FREQUENCIES(sad->freq);
376 if (sad->format == HDMI_AUDIO_CODING_TYPE_PCM)
377 value |= SUPPORTED_FREQUENCIES_STEREO(sad->freq);
378 break;
379 }
380 }
381 WREG32(eld_reg_to_type[i][0], value);
382 }
383
384 kfree(sads);
385}
386
255/* 387/*
256 * update the info frames with the data from the current display mode 388 * update the info frames with the data from the current display mode
257 */ 389 */
@@ -296,6 +428,11 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod
296 HDMI0_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */ 428 HDMI0_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */
297 } 429 }
298 430
431 if (ASIC_IS_DCE32(rdev)) {
432 dce3_2_afmt_write_speaker_allocation(encoder);
433 dce3_2_afmt_write_sad_regs(encoder);
434 }
435
299 WREG32(HDMI0_ACR_PACKET_CONTROL + offset, 436 WREG32(HDMI0_ACR_PACKET_CONTROL + offset,
300 HDMI0_ACR_AUTO_SEND | /* allow hw to sent ACR packets when required */ 437 HDMI0_ACR_AUTO_SEND | /* allow hw to sent ACR packets when required */
301 HDMI0_ACR_SOURCE); /* select SW CTS value */ 438 HDMI0_ACR_SOURCE); /* select SW CTS value */
@@ -351,7 +488,7 @@ void r600_hdmi_update_audio_settings(struct drm_encoder *encoder)
351 struct radeon_device *rdev = dev->dev_private; 488 struct radeon_device *rdev = dev->dev_private;
352 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 489 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
353 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 490 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
354 struct r600_audio audio = r600_audio_status(rdev); 491 struct r600_audio_pin audio = r600_audio_status(rdev);
355 uint8_t buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AUDIO_INFOFRAME_SIZE]; 492 uint8_t buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AUDIO_INFOFRAME_SIZE];
356 struct hdmi_audio_infoframe frame; 493 struct hdmi_audio_infoframe frame;
357 uint32_t offset; 494 uint32_t offset;
@@ -460,6 +597,11 @@ void r600_hdmi_enable(struct drm_encoder *encoder, bool enable)
460 if (!enable && !dig->afmt->enabled) 597 if (!enable && !dig->afmt->enabled)
461 return; 598 return;
462 599
600 if (enable)
601 dig->afmt->pin = r600_audio_get_pin(rdev);
602 else
603 dig->afmt->pin = NULL;
604
463 /* Older chipsets require setting HDMI and routing manually */ 605 /* Older chipsets require setting HDMI and routing manually */
464 if (!ASIC_IS_DCE3(rdev)) { 606 if (!ASIC_IS_DCE3(rdev)) {
465 if (enable) 607 if (enable)
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h
index 8e3fe815edab..454f90a849e4 100644
--- a/drivers/gpu/drm/radeon/r600d.h
+++ b/drivers/gpu/drm/radeon/r600d.h
@@ -933,6 +933,9 @@
933#define DCCG_AUDIO_DTO0_LOAD 0x051c 933#define DCCG_AUDIO_DTO0_LOAD 0x051c
934# define DTO_LOAD (1 << 31) 934# define DTO_LOAD (1 << 31)
935#define DCCG_AUDIO_DTO0_CNTL 0x0520 935#define DCCG_AUDIO_DTO0_CNTL 0x0520
936# define DCCG_AUDIO_DTO_WALLCLOCK_RATIO(x) (((x) & 7) << 0)
937# define DCCG_AUDIO_DTO_WALLCLOCK_RATIO_MASK 7
938# define DCCG_AUDIO_DTO_WALLCLOCK_RATIO_SHIFT 0
936 939
937#define DCCG_AUDIO_DTO1_PHASE 0x0524 940#define DCCG_AUDIO_DTO1_PHASE 0x0524
938#define DCCG_AUDIO_DTO1_MODULE 0x0528 941#define DCCG_AUDIO_DTO1_MODULE 0x0528
@@ -957,6 +960,42 @@
957# define DIG_MODE_SDVO 4 960# define DIG_MODE_SDVO 4
958#define DIG1_CNTL 0x79a0 961#define DIG1_CNTL 0x79a0
959 962
963#define AZ_F0_CODEC_PIN0_CONTROL_CHANNEL_SPEAKER 0x71bc
964#define SPEAKER_ALLOCATION(x) (((x) & 0x7f) << 0)
965#define SPEAKER_ALLOCATION_MASK (0x7f << 0)
966#define SPEAKER_ALLOCATION_SHIFT 0
967#define HDMI_CONNECTION (1 << 16)
968#define DP_CONNECTION (1 << 17)
969
970#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR0 0x71c8 /* LPCM */
971#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR1 0x71cc /* AC3 */
972#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR2 0x71d0 /* MPEG1 */
973#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR3 0x71d4 /* MP3 */
974#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR4 0x71d8 /* MPEG2 */
975#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR5 0x71dc /* AAC */
976#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR6 0x71e0 /* DTS */
977#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR7 0x71e4 /* ATRAC */
978#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR8 0x71e8 /* one bit audio - leave at 0 (default) */
979#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR9 0x71ec /* Dolby Digital */
980#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR10 0x71f0 /* DTS-HD */
981#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR11 0x71f4 /* MAT-MLP */
982#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR12 0x71f8 /* DTS */
983#define AZ_F0_CODEC_PIN0_CONTROL_AUDIO_DESCRIPTOR13 0x71fc /* WMA Pro */
984# define MAX_CHANNELS(x) (((x) & 0x7) << 0)
985/* max channels minus one. 7 = 8 channels */
986# define SUPPORTED_FREQUENCIES(x) (((x) & 0xff) << 8)
987# define DESCRIPTOR_BYTE_2(x) (((x) & 0xff) << 16)
988# define SUPPORTED_FREQUENCIES_STEREO(x) (((x) & 0xff) << 24) /* LPCM only */
989/* SUPPORTED_FREQUENCIES, SUPPORTED_FREQUENCIES_STEREO
990 * bit0 = 32 kHz
991 * bit1 = 44.1 kHz
992 * bit2 = 48 kHz
993 * bit3 = 88.2 kHz
994 * bit4 = 96 kHz
995 * bit5 = 176.4 kHz
996 * bit6 = 192 kHz
997 */
998
960/* rs6xx/rs740 and r6xx share the same HDMI blocks, however, rs6xx has only one 999/* rs6xx/rs740 and r6xx share the same HDMI blocks, however, rs6xx has only one
961 * instance of the blocks while r6xx has 2. DCE 3.0 cards are slightly 1000 * instance of the blocks while r6xx has 2. DCE 3.0 cards are slightly
962 * different due to the new DIG blocks, but also have 2 instances. 1001 * different due to the new DIG blocks, but also have 2 instances.
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 19066d1dcb7d..ff8b564ce2b2 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -152,6 +152,47 @@ extern int radeon_aspm;
152#define RADEON_RESET_MC (1 << 10) 152#define RADEON_RESET_MC (1 << 10)
153#define RADEON_RESET_DISPLAY (1 << 11) 153#define RADEON_RESET_DISPLAY (1 << 11)
154 154
155/* CG block flags */
156#define RADEON_CG_BLOCK_GFX (1 << 0)
157#define RADEON_CG_BLOCK_MC (1 << 1)
158#define RADEON_CG_BLOCK_SDMA (1 << 2)
159#define RADEON_CG_BLOCK_UVD (1 << 3)
160#define RADEON_CG_BLOCK_VCE (1 << 4)
161#define RADEON_CG_BLOCK_HDP (1 << 5)
162#define RADEON_CG_BLOCK_BIF (1 << 6)
163
164/* CG flags */
165#define RADEON_CG_SUPPORT_GFX_MGCG (1 << 0)
166#define RADEON_CG_SUPPORT_GFX_MGLS (1 << 1)
167#define RADEON_CG_SUPPORT_GFX_CGCG (1 << 2)
168#define RADEON_CG_SUPPORT_GFX_CGLS (1 << 3)
169#define RADEON_CG_SUPPORT_GFX_CGTS (1 << 4)
170#define RADEON_CG_SUPPORT_GFX_CGTS_LS (1 << 5)
171#define RADEON_CG_SUPPORT_GFX_CP_LS (1 << 6)
172#define RADEON_CG_SUPPORT_GFX_RLC_LS (1 << 7)
173#define RADEON_CG_SUPPORT_MC_LS (1 << 8)
174#define RADEON_CG_SUPPORT_MC_MGCG (1 << 9)
175#define RADEON_CG_SUPPORT_SDMA_LS (1 << 10)
176#define RADEON_CG_SUPPORT_SDMA_MGCG (1 << 11)
177#define RADEON_CG_SUPPORT_BIF_LS (1 << 12)
178#define RADEON_CG_SUPPORT_UVD_MGCG (1 << 13)
179#define RADEON_CG_SUPPORT_VCE_MGCG (1 << 14)
180#define RADEON_CG_SUPPORT_HDP_LS (1 << 15)
181#define RADEON_CG_SUPPORT_HDP_MGCG (1 << 16)
182
183/* PG flags */
184#define RADEON_PG_SUPPORT_GFX_CG (1 << 0)
185#define RADEON_PG_SUPPORT_GFX_SMG (1 << 1)
186#define RADEON_PG_SUPPORT_GFX_DMG (1 << 2)
187#define RADEON_PG_SUPPORT_UVD (1 << 3)
188#define RADEON_PG_SUPPORT_VCE (1 << 4)
189#define RADEON_PG_SUPPORT_CP (1 << 5)
190#define RADEON_PG_SUPPORT_GDS (1 << 6)
191#define RADEON_PG_SUPPORT_RLC_SMU_HS (1 << 7)
192#define RADEON_PG_SUPPORT_SDMA (1 << 8)
193#define RADEON_PG_SUPPORT_ACP (1 << 9)
194#define RADEON_PG_SUPPORT_SAMU (1 << 10)
195
155/* max cursor sizes (in pixels) */ 196/* max cursor sizes (in pixels) */
156#define CURSOR_WIDTH 64 197#define CURSOR_WIDTH 64
157#define CURSOR_HEIGHT 64 198#define CURSOR_HEIGHT 64
@@ -238,6 +279,12 @@ int radeon_atom_get_max_vddc(struct radeon_device *rdev, u8 voltage_type,
238int radeon_atom_get_leakage_vddc_based_on_leakage_idx(struct radeon_device *rdev, 279int radeon_atom_get_leakage_vddc_based_on_leakage_idx(struct radeon_device *rdev,
239 u16 *voltage, 280 u16 *voltage,
240 u16 leakage_idx); 281 u16 leakage_idx);
282int radeon_atom_get_leakage_id_from_vbios(struct radeon_device *rdev,
283 u16 *leakage_id);
284int radeon_atom_get_leakage_vddc_based_on_leakage_params(struct radeon_device *rdev,
285 u16 *vddc, u16 *vddci,
286 u16 virtual_voltage_id,
287 u16 vbios_voltage_id);
241int radeon_atom_round_to_true_voltage(struct radeon_device *rdev, 288int radeon_atom_round_to_true_voltage(struct radeon_device *rdev,
242 u8 voltage_type, 289 u8 voltage_type,
243 u16 nominal_voltage, 290 u16 nominal_voltage,
@@ -679,7 +726,7 @@ union radeon_irq_stat_regs {
679 726
680#define RADEON_MAX_HPD_PINS 6 727#define RADEON_MAX_HPD_PINS 6
681#define RADEON_MAX_CRTCS 6 728#define RADEON_MAX_CRTCS 6
682#define RADEON_MAX_AFMT_BLOCKS 6 729#define RADEON_MAX_AFMT_BLOCKS 7
683 730
684struct radeon_irq { 731struct radeon_irq {
685 bool installed; 732 bool installed;
@@ -743,8 +790,6 @@ struct radeon_ring {
743 uint32_t align_mask; 790 uint32_t align_mask;
744 uint32_t ptr_mask; 791 uint32_t ptr_mask;
745 bool ready; 792 bool ready;
746 u32 ptr_reg_shift;
747 u32 ptr_reg_mask;
748 u32 nop; 793 u32 nop;
749 u32 idx; 794 u32 idx;
750 u64 last_semaphore_signal_addr; 795 u64 last_semaphore_signal_addr;
@@ -841,35 +886,6 @@ struct r600_ih {
841 bool enabled; 886 bool enabled;
842}; 887};
843 888
844struct r600_blit_cp_primitives {
845 void (*set_render_target)(struct radeon_device *rdev, int format,
846 int w, int h, u64 gpu_addr);
847 void (*cp_set_surface_sync)(struct radeon_device *rdev,
848 u32 sync_type, u32 size,
849 u64 mc_addr);
850 void (*set_shaders)(struct radeon_device *rdev);
851 void (*set_vtx_resource)(struct radeon_device *rdev, u64 gpu_addr);
852 void (*set_tex_resource)(struct radeon_device *rdev,
853 int format, int w, int h, int pitch,
854 u64 gpu_addr, u32 size);
855 void (*set_scissors)(struct radeon_device *rdev, int x1, int y1,
856 int x2, int y2);
857 void (*draw_auto)(struct radeon_device *rdev);
858 void (*set_default_state)(struct radeon_device *rdev);
859};
860
861struct r600_blit {
862 struct radeon_bo *shader_obj;
863 struct r600_blit_cp_primitives primitives;
864 int max_dim;
865 int ring_size_common;
866 int ring_size_per_loop;
867 u64 shader_gpu_addr;
868 u32 vs_offset, ps_offset;
869 u32 state_offset;
870 u32 state_len;
871};
872
873/* 889/*
874 * RLC stuff 890 * RLC stuff
875 */ 891 */
@@ -880,13 +896,19 @@ struct radeon_rlc {
880 struct radeon_bo *save_restore_obj; 896 struct radeon_bo *save_restore_obj;
881 uint64_t save_restore_gpu_addr; 897 uint64_t save_restore_gpu_addr;
882 volatile uint32_t *sr_ptr; 898 volatile uint32_t *sr_ptr;
883 u32 *reg_list; 899 const u32 *reg_list;
884 u32 reg_list_size; 900 u32 reg_list_size;
885 /* for clear state */ 901 /* for clear state */
886 struct radeon_bo *clear_state_obj; 902 struct radeon_bo *clear_state_obj;
887 uint64_t clear_state_gpu_addr; 903 uint64_t clear_state_gpu_addr;
888 volatile uint32_t *cs_ptr; 904 volatile uint32_t *cs_ptr;
889 struct cs_section_def *cs_data; 905 const struct cs_section_def *cs_data;
906 u32 clear_state_size;
907 /* for cp tables */
908 struct radeon_bo *cp_table_obj;
909 uint64_t cp_table_gpu_addr;
910 volatile uint32_t *cp_table_ptr;
911 u32 cp_table_size;
890}; 912};
891 913
892int radeon_ib_get(struct radeon_device *rdev, int ring, 914int radeon_ib_get(struct radeon_device *rdev, int ring,
@@ -918,8 +940,7 @@ unsigned radeon_ring_backup(struct radeon_device *rdev, struct radeon_ring *ring
918int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring, 940int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring,
919 unsigned size, uint32_t *data); 941 unsigned size, uint32_t *data);
920int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigned ring_size, 942int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *cp, unsigned ring_size,
921 unsigned rptr_offs, unsigned rptr_reg, unsigned wptr_reg, 943 unsigned rptr_offs, unsigned rptr_reg, unsigned wptr_reg, u32 nop);
922 u32 ptr_reg_shift, u32 ptr_reg_mask, u32 nop);
923void radeon_ring_fini(struct radeon_device *rdev, struct radeon_ring *cp); 944void radeon_ring_fini(struct radeon_device *rdev, struct radeon_ring *cp);
924 945
925 946
@@ -1033,7 +1054,6 @@ struct radeon_wb {
1033#define R600_WB_DMA_RPTR_OFFSET 1792 1054#define R600_WB_DMA_RPTR_OFFSET 1792
1034#define R600_WB_IH_WPTR_OFFSET 2048 1055#define R600_WB_IH_WPTR_OFFSET 2048
1035#define CAYMAN_WB_DMA1_RPTR_OFFSET 2304 1056#define CAYMAN_WB_DMA1_RPTR_OFFSET 2304
1036#define R600_WB_UVD_RPTR_OFFSET 2560
1037#define R600_WB_EVENT_OFFSET 3072 1057#define R600_WB_EVENT_OFFSET 3072
1038#define CIK_WB_CP1_WPTR_OFFSET 3328 1058#define CIK_WB_CP1_WPTR_OFFSET 3328
1039#define CIK_WB_CP2_WPTR_OFFSET 3584 1059#define CIK_WB_CP2_WPTR_OFFSET 3584
@@ -1144,6 +1164,7 @@ enum radeon_int_thermal_type {
1144 THERMAL_TYPE_SI, 1164 THERMAL_TYPE_SI,
1145 THERMAL_TYPE_EMC2103_WITH_INTERNAL, 1165 THERMAL_TYPE_EMC2103_WITH_INTERNAL,
1146 THERMAL_TYPE_CI, 1166 THERMAL_TYPE_CI,
1167 THERMAL_TYPE_KV,
1147}; 1168};
1148 1169
1149struct radeon_voltage { 1170struct radeon_voltage {
@@ -1217,6 +1238,9 @@ struct radeon_ps {
1217 /* UVD clocks */ 1238 /* UVD clocks */
1218 u32 vclk; 1239 u32 vclk;
1219 u32 dclk; 1240 u32 dclk;
1241 /* VCE clocks */
1242 u32 evclk;
1243 u32 ecclk;
1220 /* asic priv */ 1244 /* asic priv */
1221 void *ps_priv; 1245 void *ps_priv;
1222}; 1246};
@@ -1267,14 +1291,21 @@ struct radeon_clock_voltage_dependency_table {
1267 struct radeon_clock_voltage_dependency_entry *entries; 1291 struct radeon_clock_voltage_dependency_entry *entries;
1268}; 1292};
1269 1293
1270struct radeon_cac_leakage_entry { 1294union radeon_cac_leakage_entry {
1271 u16 vddc; 1295 struct {
1272 u32 leakage; 1296 u16 vddc;
1297 u32 leakage;
1298 };
1299 struct {
1300 u16 vddc1;
1301 u16 vddc2;
1302 u16 vddc3;
1303 };
1273}; 1304};
1274 1305
1275struct radeon_cac_leakage_table { 1306struct radeon_cac_leakage_table {
1276 u32 count; 1307 u32 count;
1277 struct radeon_cac_leakage_entry *entries; 1308 union radeon_cac_leakage_entry *entries;
1278}; 1309};
1279 1310
1280struct radeon_phase_shedding_limits_entry { 1311struct radeon_phase_shedding_limits_entry {
@@ -1288,6 +1319,28 @@ struct radeon_phase_shedding_limits_table {
1288 struct radeon_phase_shedding_limits_entry *entries; 1319 struct radeon_phase_shedding_limits_entry *entries;
1289}; 1320};
1290 1321
1322struct radeon_uvd_clock_voltage_dependency_entry {
1323 u32 vclk;
1324 u32 dclk;
1325 u16 v;
1326};
1327
1328struct radeon_uvd_clock_voltage_dependency_table {
1329 u8 count;
1330 struct radeon_uvd_clock_voltage_dependency_entry *entries;
1331};
1332
1333struct radeon_vce_clock_voltage_dependency_entry {
1334 u32 ecclk;
1335 u32 evclk;
1336 u16 v;
1337};
1338
1339struct radeon_vce_clock_voltage_dependency_table {
1340 u8 count;
1341 struct radeon_vce_clock_voltage_dependency_entry *entries;
1342};
1343
1291struct radeon_ppm_table { 1344struct radeon_ppm_table {
1292 u8 ppm_design; 1345 u8 ppm_design;
1293 u16 cpu_core_number; 1346 u16 cpu_core_number;
@@ -1301,11 +1354,27 @@ struct radeon_ppm_table {
1301 u32 tj_max; 1354 u32 tj_max;
1302}; 1355};
1303 1356
1357struct radeon_cac_tdp_table {
1358 u16 tdp;
1359 u16 configurable_tdp;
1360 u16 tdc;
1361 u16 battery_power_limit;
1362 u16 small_power_limit;
1363 u16 low_cac_leakage;
1364 u16 high_cac_leakage;
1365 u16 maximum_power_delivery_limit;
1366};
1367
1304struct radeon_dpm_dynamic_state { 1368struct radeon_dpm_dynamic_state {
1305 struct radeon_clock_voltage_dependency_table vddc_dependency_on_sclk; 1369 struct radeon_clock_voltage_dependency_table vddc_dependency_on_sclk;
1306 struct radeon_clock_voltage_dependency_table vddci_dependency_on_mclk; 1370 struct radeon_clock_voltage_dependency_table vddci_dependency_on_mclk;
1307 struct radeon_clock_voltage_dependency_table vddc_dependency_on_mclk; 1371 struct radeon_clock_voltage_dependency_table vddc_dependency_on_mclk;
1372 struct radeon_clock_voltage_dependency_table mvdd_dependency_on_mclk;
1308 struct radeon_clock_voltage_dependency_table vddc_dependency_on_dispclk; 1373 struct radeon_clock_voltage_dependency_table vddc_dependency_on_dispclk;
1374 struct radeon_uvd_clock_voltage_dependency_table uvd_clock_voltage_dependency_table;
1375 struct radeon_vce_clock_voltage_dependency_table vce_clock_voltage_dependency_table;
1376 struct radeon_clock_voltage_dependency_table samu_clock_voltage_dependency_table;
1377 struct radeon_clock_voltage_dependency_table acp_clock_voltage_dependency_table;
1309 struct radeon_clock_array valid_sclk_values; 1378 struct radeon_clock_array valid_sclk_values;
1310 struct radeon_clock_array valid_mclk_values; 1379 struct radeon_clock_array valid_mclk_values;
1311 struct radeon_clock_and_voltage_limits max_clock_voltage_on_dc; 1380 struct radeon_clock_and_voltage_limits max_clock_voltage_on_dc;
@@ -1317,6 +1386,7 @@ struct radeon_dpm_dynamic_state {
1317 struct radeon_cac_leakage_table cac_leakage_table; 1386 struct radeon_cac_leakage_table cac_leakage_table;
1318 struct radeon_phase_shedding_limits_table phase_shedding_limits_table; 1387 struct radeon_phase_shedding_limits_table phase_shedding_limits_table;
1319 struct radeon_ppm_table *ppm_table; 1388 struct radeon_ppm_table *ppm_table;
1389 struct radeon_cac_tdp_table *cac_tdp_table;
1320}; 1390};
1321 1391
1322struct radeon_dpm_fan { 1392struct radeon_dpm_fan {
@@ -1386,11 +1456,12 @@ struct radeon_dpm {
1386 struct radeon_dpm_thermal thermal; 1456 struct radeon_dpm_thermal thermal;
1387 /* forced levels */ 1457 /* forced levels */
1388 enum radeon_dpm_forced_level forced_level; 1458 enum radeon_dpm_forced_level forced_level;
1459 /* track UVD streams */
1460 unsigned sd;
1461 unsigned hd;
1389}; 1462};
1390 1463
1391void radeon_dpm_enable_power_state(struct radeon_device *rdev, 1464void radeon_dpm_enable_uvd(struct radeon_device *rdev, bool enable);
1392 enum radeon_pm_state_type dpm_state);
1393
1394 1465
1395struct radeon_pm { 1466struct radeon_pm {
1396 struct mutex mutex; 1467 struct mutex mutex;
@@ -1465,9 +1536,9 @@ struct radeon_uvd {
1465 void *cpu_addr; 1536 void *cpu_addr;
1466 uint64_t gpu_addr; 1537 uint64_t gpu_addr;
1467 void *saved_bo; 1538 void *saved_bo;
1468 unsigned fw_size;
1469 atomic_t handles[RADEON_MAX_UVD_HANDLES]; 1539 atomic_t handles[RADEON_MAX_UVD_HANDLES];
1470 struct drm_file *filp[RADEON_MAX_UVD_HANDLES]; 1540 struct drm_file *filp[RADEON_MAX_UVD_HANDLES];
1541 unsigned img_size[RADEON_MAX_UVD_HANDLES];
1471 struct delayed_work idle_work; 1542 struct delayed_work idle_work;
1472}; 1543};
1473 1544
@@ -1496,12 +1567,21 @@ int radeon_uvd_calc_upll_dividers(struct radeon_device *rdev,
1496int radeon_uvd_send_upll_ctlreq(struct radeon_device *rdev, 1567int radeon_uvd_send_upll_ctlreq(struct radeon_device *rdev,
1497 unsigned cg_upll_func_cntl); 1568 unsigned cg_upll_func_cntl);
1498 1569
1499struct r600_audio { 1570struct r600_audio_pin {
1500 int channels; 1571 int channels;
1501 int rate; 1572 int rate;
1502 int bits_per_sample; 1573 int bits_per_sample;
1503 u8 status_bits; 1574 u8 status_bits;
1504 u8 category_code; 1575 u8 category_code;
1576 u32 offset;
1577 bool connected;
1578 u32 id;
1579};
1580
1581struct r600_audio {
1582 bool enabled;
1583 struct r600_audio_pin pin[RADEON_MAX_AFMT_BLOCKS];
1584 int num_pins;
1505}; 1585};
1506 1586
1507/* 1587/*
@@ -1533,6 +1613,34 @@ int radeon_debugfs_add_files(struct radeon_device *rdev,
1533 unsigned nfiles); 1613 unsigned nfiles);
1534int radeon_debugfs_fence_init(struct radeon_device *rdev); 1614int radeon_debugfs_fence_init(struct radeon_device *rdev);
1535 1615
1616/*
1617 * ASIC ring specific functions.
1618 */
1619struct radeon_asic_ring {
1620 /* ring read/write ptr handling */
1621 u32 (*get_rptr)(struct radeon_device *rdev, struct radeon_ring *ring);
1622 u32 (*get_wptr)(struct radeon_device *rdev, struct radeon_ring *ring);
1623 void (*set_wptr)(struct radeon_device *rdev, struct radeon_ring *ring);
1624
1625 /* validating and patching of IBs */
1626 int (*ib_parse)(struct radeon_device *rdev, struct radeon_ib *ib);
1627 int (*cs_parse)(struct radeon_cs_parser *p);
1628
1629 /* command emmit functions */
1630 void (*ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib);
1631 void (*emit_fence)(struct radeon_device *rdev, struct radeon_fence *fence);
1632 void (*emit_semaphore)(struct radeon_device *rdev, struct radeon_ring *cp,
1633 struct radeon_semaphore *semaphore, bool emit_wait);
1634 void (*vm_flush)(struct radeon_device *rdev, int ridx, struct radeon_vm *vm);
1635
1636 /* testing functions */
1637 int (*ring_test)(struct radeon_device *rdev, struct radeon_ring *cp);
1638 int (*ib_test)(struct radeon_device *rdev, struct radeon_ring *cp);
1639 bool (*is_lockup)(struct radeon_device *rdev, struct radeon_ring *cp);
1640
1641 /* deprecated */
1642 void (*ring_start)(struct radeon_device *rdev, struct radeon_ring *cp);
1643};
1536 1644
1537/* 1645/*
1538 * ASIC specific functions. 1646 * ASIC specific functions.
@@ -1576,23 +1684,7 @@ struct radeon_asic {
1576 uint32_t incr, uint32_t flags); 1684 uint32_t incr, uint32_t flags);
1577 } vm; 1685 } vm;
1578 /* ring specific callbacks */ 1686 /* ring specific callbacks */
1579 struct { 1687 struct radeon_asic_ring *ring[RADEON_NUM_RINGS];
1580 void (*ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib);
1581 int (*ib_parse)(struct radeon_device *rdev, struct radeon_ib *ib);
1582 void (*emit_fence)(struct radeon_device *rdev, struct radeon_fence *fence);
1583 void (*emit_semaphore)(struct radeon_device *rdev, struct radeon_ring *cp,
1584 struct radeon_semaphore *semaphore, bool emit_wait);
1585 int (*cs_parse)(struct radeon_cs_parser *p);
1586 void (*ring_start)(struct radeon_device *rdev, struct radeon_ring *cp);
1587 int (*ring_test)(struct radeon_device *rdev, struct radeon_ring *cp);
1588 int (*ib_test)(struct radeon_device *rdev, struct radeon_ring *cp);
1589 bool (*is_lockup)(struct radeon_device *rdev, struct radeon_ring *cp);
1590 void (*vm_flush)(struct radeon_device *rdev, int ridx, struct radeon_vm *vm);
1591
1592 u32 (*get_rptr)(struct radeon_device *rdev, struct radeon_ring *ring);
1593 u32 (*get_wptr)(struct radeon_device *rdev, struct radeon_ring *ring);
1594 void (*set_wptr)(struct radeon_device *rdev, struct radeon_ring *ring);
1595 } ring[RADEON_NUM_RINGS];
1596 /* irqs */ 1688 /* irqs */
1597 struct { 1689 struct {
1598 int (*set)(struct radeon_device *rdev); 1690 int (*set)(struct radeon_device *rdev);
@@ -1685,6 +1777,7 @@ struct radeon_asic {
1685 void (*debugfs_print_current_performance_level)(struct radeon_device *rdev, struct seq_file *m); 1777 void (*debugfs_print_current_performance_level)(struct radeon_device *rdev, struct seq_file *m);
1686 int (*force_performance_level)(struct radeon_device *rdev, enum radeon_dpm_forced_level level); 1778 int (*force_performance_level)(struct radeon_device *rdev, enum radeon_dpm_forced_level level);
1687 bool (*vblank_too_short)(struct radeon_device *rdev); 1779 bool (*vblank_too_short)(struct radeon_device *rdev);
1780 void (*powergate_uvd)(struct radeon_device *rdev, bool gate);
1688 } dpm; 1781 } dpm;
1689 /* pageflipping */ 1782 /* pageflipping */
1690 struct { 1783 struct {
@@ -2063,7 +2156,7 @@ struct radeon_device {
2063 const struct firmware *mec_fw; /* CIK MEC firmware */ 2156 const struct firmware *mec_fw; /* CIK MEC firmware */
2064 const struct firmware *sdma_fw; /* CIK SDMA firmware */ 2157 const struct firmware *sdma_fw; /* CIK SDMA firmware */
2065 const struct firmware *smc_fw; /* SMC firmware */ 2158 const struct firmware *smc_fw; /* SMC firmware */
2066 struct r600_blit r600_blit; 2159 const struct firmware *uvd_fw; /* UVD firmware */
2067 struct r600_vram_scratch vram_scratch; 2160 struct r600_vram_scratch vram_scratch;
2068 int msi_enabled; /* msi enabled */ 2161 int msi_enabled; /* msi enabled */
2069 struct r600_ih ih; /* r6/700 interrupt ring */ 2162 struct r600_ih ih; /* r6/700 interrupt ring */
@@ -2074,9 +2167,8 @@ struct radeon_device {
2074 struct work_struct reset_work; 2167 struct work_struct reset_work;
2075 int num_crtc; /* number of crtcs */ 2168 int num_crtc; /* number of crtcs */
2076 struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */ 2169 struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */
2077 bool audio_enabled;
2078 bool has_uvd; 2170 bool has_uvd;
2079 struct r600_audio audio_status; /* audio stuff */ 2171 struct r600_audio audio; /* audio stuff */
2080 struct notifier_block acpi_nb; 2172 struct notifier_block acpi_nb;
2081 /* only one userspace can use Hyperz features or CMASK at a time */ 2173 /* only one userspace can use Hyperz features or CMASK at a time */
2082 struct drm_file *hyperz_filp; 2174 struct drm_file *hyperz_filp;
@@ -2092,6 +2184,11 @@ struct radeon_device {
2092 /* ACPI interface */ 2184 /* ACPI interface */
2093 struct radeon_atif atif; 2185 struct radeon_atif atif;
2094 struct radeon_atcs atcs; 2186 struct radeon_atcs atcs;
2187 /* srbm instance registers */
2188 struct mutex srbm_mutex;
2189 /* clock, powergating flags */
2190 u32 cg_flags;
2191 u32 pg_flags;
2095}; 2192};
2096 2193
2097int radeon_device_init(struct radeon_device *rdev, 2194int radeon_device_init(struct radeon_device *rdev,
@@ -2150,6 +2247,8 @@ void cik_mm_wdoorbell(struct radeon_device *rdev, u32 offset, u32 v);
2150#define WREG32_PIF_PHY1(reg, v) eg_pif_phy1_wreg(rdev, (reg), (v)) 2247#define WREG32_PIF_PHY1(reg, v) eg_pif_phy1_wreg(rdev, (reg), (v))
2151#define RREG32_UVD_CTX(reg) r600_uvd_ctx_rreg(rdev, (reg)) 2248#define RREG32_UVD_CTX(reg) r600_uvd_ctx_rreg(rdev, (reg))
2152#define WREG32_UVD_CTX(reg, v) r600_uvd_ctx_wreg(rdev, (reg), (v)) 2249#define WREG32_UVD_CTX(reg, v) r600_uvd_ctx_wreg(rdev, (reg), (v))
2250#define RREG32_DIDT(reg) cik_didt_rreg(rdev, (reg))
2251#define WREG32_DIDT(reg, v) cik_didt_wreg(rdev, (reg), (v))
2153#define WREG32_P(reg, val, mask) \ 2252#define WREG32_P(reg, val, mask) \
2154 do { \ 2253 do { \
2155 uint32_t tmp_ = RREG32(reg); \ 2254 uint32_t tmp_ = RREG32(reg); \
@@ -2158,7 +2257,7 @@ void cik_mm_wdoorbell(struct radeon_device *rdev, u32 offset, u32 v);
2158 WREG32(reg, tmp_); \ 2257 WREG32(reg, tmp_); \
2159 } while (0) 2258 } while (0)
2160#define WREG32_AND(reg, and) WREG32_P(reg, 0, and) 2259#define WREG32_AND(reg, and) WREG32_P(reg, 0, and)
2161#define WREG32_OR(reg, or) WREG32_P(reg, or, ~or) 2260#define WREG32_OR(reg, or) WREG32_P(reg, or, ~(or))
2162#define WREG32_PLL_P(reg, val, mask) \ 2261#define WREG32_PLL_P(reg, val, mask) \
2163 do { \ 2262 do { \
2164 uint32_t tmp_ = RREG32_PLL(reg); \ 2263 uint32_t tmp_ = RREG32_PLL(reg); \
@@ -2281,6 +2380,22 @@ static inline void r600_uvd_ctx_wreg(struct radeon_device *rdev, u32 reg, u32 v)
2281 WREG32(R600_UVD_CTX_DATA, (v)); 2380 WREG32(R600_UVD_CTX_DATA, (v));
2282} 2381}
2283 2382
2383
2384static inline u32 cik_didt_rreg(struct radeon_device *rdev, u32 reg)
2385{
2386 u32 r;
2387
2388 WREG32(CIK_DIDT_IND_INDEX, (reg));
2389 r = RREG32(CIK_DIDT_IND_DATA);
2390 return r;
2391}
2392
2393static inline void cik_didt_wreg(struct radeon_device *rdev, u32 reg, u32 v)
2394{
2395 WREG32(CIK_DIDT_IND_INDEX, (reg));
2396 WREG32(CIK_DIDT_IND_DATA, (v));
2397}
2398
2284void r100_pll_errata_after_index(struct radeon_device *rdev); 2399void r100_pll_errata_after_index(struct radeon_device *rdev);
2285 2400
2286 2401
@@ -2376,7 +2491,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
2376#define radeon_fini(rdev) (rdev)->asic->fini((rdev)) 2491#define radeon_fini(rdev) (rdev)->asic->fini((rdev))
2377#define radeon_resume(rdev) (rdev)->asic->resume((rdev)) 2492#define radeon_resume(rdev) (rdev)->asic->resume((rdev))
2378#define radeon_suspend(rdev) (rdev)->asic->suspend((rdev)) 2493#define radeon_suspend(rdev) (rdev)->asic->suspend((rdev))
2379#define radeon_cs_parse(rdev, r, p) (rdev)->asic->ring[(r)].cs_parse((p)) 2494#define radeon_cs_parse(rdev, r, p) (rdev)->asic->ring[(r)]->cs_parse((p))
2380#define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) 2495#define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state))
2381#define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev)) 2496#define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev))
2382#define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev)) 2497#define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev))
@@ -2384,16 +2499,16 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
2384#define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev)) 2499#define radeon_asic_vm_init(rdev) (rdev)->asic->vm.init((rdev))
2385#define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev)) 2500#define radeon_asic_vm_fini(rdev) (rdev)->asic->vm.fini((rdev))
2386#define radeon_asic_vm_set_page(rdev, ib, pe, addr, count, incr, flags) ((rdev)->asic->vm.set_page((rdev), (ib), (pe), (addr), (count), (incr), (flags))) 2501#define radeon_asic_vm_set_page(rdev, ib, pe, addr, count, incr, flags) ((rdev)->asic->vm.set_page((rdev), (ib), (pe), (addr), (count), (incr), (flags)))
2387#define radeon_ring_start(rdev, r, cp) (rdev)->asic->ring[(r)].ring_start((rdev), (cp)) 2502#define radeon_ring_start(rdev, r, cp) (rdev)->asic->ring[(r)]->ring_start((rdev), (cp))
2388#define radeon_ring_test(rdev, r, cp) (rdev)->asic->ring[(r)].ring_test((rdev), (cp)) 2503#define radeon_ring_test(rdev, r, cp) (rdev)->asic->ring[(r)]->ring_test((rdev), (cp))
2389#define radeon_ib_test(rdev, r, cp) (rdev)->asic->ring[(r)].ib_test((rdev), (cp)) 2504#define radeon_ib_test(rdev, r, cp) (rdev)->asic->ring[(r)]->ib_test((rdev), (cp))
2390#define radeon_ring_ib_execute(rdev, r, ib) (rdev)->asic->ring[(r)].ib_execute((rdev), (ib)) 2505#define radeon_ring_ib_execute(rdev, r, ib) (rdev)->asic->ring[(r)]->ib_execute((rdev), (ib))
2391#define radeon_ring_ib_parse(rdev, r, ib) (rdev)->asic->ring[(r)].ib_parse((rdev), (ib)) 2506#define radeon_ring_ib_parse(rdev, r, ib) (rdev)->asic->ring[(r)]->ib_parse((rdev), (ib))
2392#define radeon_ring_is_lockup(rdev, r, cp) (rdev)->asic->ring[(r)].is_lockup((rdev), (cp)) 2507#define radeon_ring_is_lockup(rdev, r, cp) (rdev)->asic->ring[(r)]->is_lockup((rdev), (cp))
2393#define radeon_ring_vm_flush(rdev, r, vm) (rdev)->asic->ring[(r)].vm_flush((rdev), (r), (vm)) 2508#define radeon_ring_vm_flush(rdev, r, vm) (rdev)->asic->ring[(r)]->vm_flush((rdev), (r), (vm))
2394#define radeon_ring_get_rptr(rdev, r) (rdev)->asic->ring[(r)->idx].get_rptr((rdev), (r)) 2509#define radeon_ring_get_rptr(rdev, r) (rdev)->asic->ring[(r)->idx]->get_rptr((rdev), (r))
2395#define radeon_ring_get_wptr(rdev, r) (rdev)->asic->ring[(r)->idx].get_wptr((rdev), (r)) 2510#define radeon_ring_get_wptr(rdev, r) (rdev)->asic->ring[(r)->idx]->get_wptr((rdev), (r))
2396#define radeon_ring_set_wptr(rdev, r) (rdev)->asic->ring[(r)->idx].set_wptr((rdev), (r)) 2511#define radeon_ring_set_wptr(rdev, r) (rdev)->asic->ring[(r)->idx]->set_wptr((rdev), (r))
2397#define radeon_irq_set(rdev) (rdev)->asic->irq.set((rdev)) 2512#define radeon_irq_set(rdev) (rdev)->asic->irq.set((rdev))
2398#define radeon_irq_process(rdev) (rdev)->asic->irq.process((rdev)) 2513#define radeon_irq_process(rdev) (rdev)->asic->irq.process((rdev))
2399#define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->display.get_vblank_counter((rdev), (crtc)) 2514#define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->display.get_vblank_counter((rdev), (crtc))
@@ -2401,8 +2516,8 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
2401#define radeon_get_backlight_level(rdev, e) (rdev)->asic->display.get_backlight_level((e)) 2516#define radeon_get_backlight_level(rdev, e) (rdev)->asic->display.get_backlight_level((e))
2402#define radeon_hdmi_enable(rdev, e, b) (rdev)->asic->display.hdmi_enable((e), (b)) 2517#define radeon_hdmi_enable(rdev, e, b) (rdev)->asic->display.hdmi_enable((e), (b))
2403#define radeon_hdmi_setmode(rdev, e, m) (rdev)->asic->display.hdmi_setmode((e), (m)) 2518#define radeon_hdmi_setmode(rdev, e, m) (rdev)->asic->display.hdmi_setmode((e), (m))
2404#define radeon_fence_ring_emit(rdev, r, fence) (rdev)->asic->ring[(r)].emit_fence((rdev), (fence)) 2519#define radeon_fence_ring_emit(rdev, r, fence) (rdev)->asic->ring[(r)]->emit_fence((rdev), (fence))
2405#define radeon_semaphore_ring_emit(rdev, r, cp, semaphore, emit_wait) (rdev)->asic->ring[(r)].emit_semaphore((rdev), (cp), (semaphore), (emit_wait)) 2520#define radeon_semaphore_ring_emit(rdev, r, cp, semaphore, emit_wait) (rdev)->asic->ring[(r)]->emit_semaphore((rdev), (cp), (semaphore), (emit_wait))
2406#define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy.blit((rdev), (s), (d), (np), (f)) 2521#define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy.blit((rdev), (s), (d), (np), (f))
2407#define radeon_copy_dma(rdev, s, d, np, f) (rdev)->asic->copy.dma((rdev), (s), (d), (np), (f)) 2522#define radeon_copy_dma(rdev, s, d, np, f) (rdev)->asic->copy.dma((rdev), (s), (d), (np), (f))
2408#define radeon_copy(rdev, s, d, np, f) (rdev)->asic->copy.copy((rdev), (s), (d), (np), (f)) 2523#define radeon_copy(rdev, s, d, np, f) (rdev)->asic->copy.copy((rdev), (s), (d), (np), (f))
@@ -2453,6 +2568,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
2453#define radeon_dpm_debugfs_print_current_performance_level(rdev, m) rdev->asic->dpm.debugfs_print_current_performance_level((rdev), (m)) 2568#define radeon_dpm_debugfs_print_current_performance_level(rdev, m) rdev->asic->dpm.debugfs_print_current_performance_level((rdev), (m))
2454#define radeon_dpm_force_performance_level(rdev, l) rdev->asic->dpm.force_performance_level((rdev), (l)) 2569#define radeon_dpm_force_performance_level(rdev, l) rdev->asic->dpm.force_performance_level((rdev), (l))
2455#define radeon_dpm_vblank_too_short(rdev) rdev->asic->dpm.vblank_too_short((rdev)) 2570#define radeon_dpm_vblank_too_short(rdev) rdev->asic->dpm.vblank_too_short((rdev))
2571#define radeon_dpm_powergate_uvd(rdev, g) rdev->asic->dpm.powergate_uvd((rdev), (g))
2456 2572
2457/* Common functions */ 2573/* Common functions */
2458/* AGP */ 2574/* AGP */
@@ -2519,6 +2635,8 @@ int radeon_vm_bo_rmv(struct radeon_device *rdev,
2519 2635
2520/* audio */ 2636/* audio */
2521void r600_audio_update_hdmi(struct work_struct *work); 2637void r600_audio_update_hdmi(struct work_struct *work);
2638struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev);
2639struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev);
2522 2640
2523/* 2641/*
2524 * R600 vram scratch functions 2642 * R600 vram scratch functions
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c
index f8f8b3113ddd..630853b96841 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.c
+++ b/drivers/gpu/drm/radeon/radeon_asic.c
@@ -172,6 +172,21 @@ void radeon_agp_disable(struct radeon_device *rdev)
172/* 172/*
173 * ASIC 173 * ASIC
174 */ 174 */
175
176static struct radeon_asic_ring r100_gfx_ring = {
177 .ib_execute = &r100_ring_ib_execute,
178 .emit_fence = &r100_fence_ring_emit,
179 .emit_semaphore = &r100_semaphore_ring_emit,
180 .cs_parse = &r100_cs_parse,
181 .ring_start = &r100_ring_start,
182 .ring_test = &r100_ring_test,
183 .ib_test = &r100_ib_test,
184 .is_lockup = &r100_gpu_is_lockup,
185 .get_rptr = &radeon_ring_generic_get_rptr,
186 .get_wptr = &radeon_ring_generic_get_wptr,
187 .set_wptr = &radeon_ring_generic_set_wptr,
188};
189
175static struct radeon_asic r100_asic = { 190static struct radeon_asic r100_asic = {
176 .init = &r100_init, 191 .init = &r100_init,
177 .fini = &r100_fini, 192 .fini = &r100_fini,
@@ -187,19 +202,7 @@ static struct radeon_asic r100_asic = {
187 .set_page = &r100_pci_gart_set_page, 202 .set_page = &r100_pci_gart_set_page,
188 }, 203 },
189 .ring = { 204 .ring = {
190 [RADEON_RING_TYPE_GFX_INDEX] = { 205 [RADEON_RING_TYPE_GFX_INDEX] = &r100_gfx_ring
191 .ib_execute = &r100_ring_ib_execute,
192 .emit_fence = &r100_fence_ring_emit,
193 .emit_semaphore = &r100_semaphore_ring_emit,
194 .cs_parse = &r100_cs_parse,
195 .ring_start = &r100_ring_start,
196 .ring_test = &r100_ring_test,
197 .ib_test = &r100_ib_test,
198 .is_lockup = &r100_gpu_is_lockup,
199 .get_rptr = &radeon_ring_generic_get_rptr,
200 .get_wptr = &radeon_ring_generic_get_wptr,
201 .set_wptr = &radeon_ring_generic_set_wptr,
202 }
203 }, 206 },
204 .irq = { 207 .irq = {
205 .set = &r100_irq_set, 208 .set = &r100_irq_set,
@@ -266,19 +269,7 @@ static struct radeon_asic r200_asic = {
266 .set_page = &r100_pci_gart_set_page, 269 .set_page = &r100_pci_gart_set_page,
267 }, 270 },
268 .ring = { 271 .ring = {
269 [RADEON_RING_TYPE_GFX_INDEX] = { 272 [RADEON_RING_TYPE_GFX_INDEX] = &r100_gfx_ring
270 .ib_execute = &r100_ring_ib_execute,
271 .emit_fence = &r100_fence_ring_emit,
272 .emit_semaphore = &r100_semaphore_ring_emit,
273 .cs_parse = &r100_cs_parse,
274 .ring_start = &r100_ring_start,
275 .ring_test = &r100_ring_test,
276 .ib_test = &r100_ib_test,
277 .is_lockup = &r100_gpu_is_lockup,
278 .get_rptr = &radeon_ring_generic_get_rptr,
279 .get_wptr = &radeon_ring_generic_get_wptr,
280 .set_wptr = &radeon_ring_generic_set_wptr,
281 }
282 }, 273 },
283 .irq = { 274 .irq = {
284 .set = &r100_irq_set, 275 .set = &r100_irq_set,
@@ -330,6 +321,20 @@ static struct radeon_asic r200_asic = {
330 }, 321 },
331}; 322};
332 323
324static struct radeon_asic_ring r300_gfx_ring = {
325 .ib_execute = &r100_ring_ib_execute,
326 .emit_fence = &r300_fence_ring_emit,
327 .emit_semaphore = &r100_semaphore_ring_emit,
328 .cs_parse = &r300_cs_parse,
329 .ring_start = &r300_ring_start,
330 .ring_test = &r100_ring_test,
331 .ib_test = &r100_ib_test,
332 .is_lockup = &r100_gpu_is_lockup,
333 .get_rptr = &radeon_ring_generic_get_rptr,
334 .get_wptr = &radeon_ring_generic_get_wptr,
335 .set_wptr = &radeon_ring_generic_set_wptr,
336};
337
333static struct radeon_asic r300_asic = { 338static struct radeon_asic r300_asic = {
334 .init = &r300_init, 339 .init = &r300_init,
335 .fini = &r300_fini, 340 .fini = &r300_fini,
@@ -345,19 +350,7 @@ static struct radeon_asic r300_asic = {
345 .set_page = &r100_pci_gart_set_page, 350 .set_page = &r100_pci_gart_set_page,
346 }, 351 },
347 .ring = { 352 .ring = {
348 [RADEON_RING_TYPE_GFX_INDEX] = { 353 [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
349 .ib_execute = &r100_ring_ib_execute,
350 .emit_fence = &r300_fence_ring_emit,
351 .emit_semaphore = &r100_semaphore_ring_emit,
352 .cs_parse = &r300_cs_parse,
353 .ring_start = &r300_ring_start,
354 .ring_test = &r100_ring_test,
355 .ib_test = &r100_ib_test,
356 .is_lockup = &r100_gpu_is_lockup,
357 .get_rptr = &radeon_ring_generic_get_rptr,
358 .get_wptr = &radeon_ring_generic_get_wptr,
359 .set_wptr = &radeon_ring_generic_set_wptr,
360 }
361 }, 354 },
362 .irq = { 355 .irq = {
363 .set = &r100_irq_set, 356 .set = &r100_irq_set,
@@ -424,19 +417,7 @@ static struct radeon_asic r300_asic_pcie = {
424 .set_page = &rv370_pcie_gart_set_page, 417 .set_page = &rv370_pcie_gart_set_page,
425 }, 418 },
426 .ring = { 419 .ring = {
427 [RADEON_RING_TYPE_GFX_INDEX] = { 420 [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
428 .ib_execute = &r100_ring_ib_execute,
429 .emit_fence = &r300_fence_ring_emit,
430 .emit_semaphore = &r100_semaphore_ring_emit,
431 .cs_parse = &r300_cs_parse,
432 .ring_start = &r300_ring_start,
433 .ring_test = &r100_ring_test,
434 .ib_test = &r100_ib_test,
435 .is_lockup = &r100_gpu_is_lockup,
436 .get_rptr = &radeon_ring_generic_get_rptr,
437 .get_wptr = &radeon_ring_generic_get_wptr,
438 .set_wptr = &radeon_ring_generic_set_wptr,
439 }
440 }, 421 },
441 .irq = { 422 .irq = {
442 .set = &r100_irq_set, 423 .set = &r100_irq_set,
@@ -503,19 +484,7 @@ static struct radeon_asic r420_asic = {
503 .set_page = &rv370_pcie_gart_set_page, 484 .set_page = &rv370_pcie_gart_set_page,
504 }, 485 },
505 .ring = { 486 .ring = {
506 [RADEON_RING_TYPE_GFX_INDEX] = { 487 [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
507 .ib_execute = &r100_ring_ib_execute,
508 .emit_fence = &r300_fence_ring_emit,
509 .emit_semaphore = &r100_semaphore_ring_emit,
510 .cs_parse = &r300_cs_parse,
511 .ring_start = &r300_ring_start,
512 .ring_test = &r100_ring_test,
513 .ib_test = &r100_ib_test,
514 .is_lockup = &r100_gpu_is_lockup,
515 .get_rptr = &radeon_ring_generic_get_rptr,
516 .get_wptr = &radeon_ring_generic_get_wptr,
517 .set_wptr = &radeon_ring_generic_set_wptr,
518 }
519 }, 488 },
520 .irq = { 489 .irq = {
521 .set = &r100_irq_set, 490 .set = &r100_irq_set,
@@ -582,19 +551,7 @@ static struct radeon_asic rs400_asic = {
582 .set_page = &rs400_gart_set_page, 551 .set_page = &rs400_gart_set_page,
583 }, 552 },
584 .ring = { 553 .ring = {
585 [RADEON_RING_TYPE_GFX_INDEX] = { 554 [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
586 .ib_execute = &r100_ring_ib_execute,
587 .emit_fence = &r300_fence_ring_emit,
588 .emit_semaphore = &r100_semaphore_ring_emit,
589 .cs_parse = &r300_cs_parse,
590 .ring_start = &r300_ring_start,
591 .ring_test = &r100_ring_test,
592 .ib_test = &r100_ib_test,
593 .is_lockup = &r100_gpu_is_lockup,
594 .get_rptr = &radeon_ring_generic_get_rptr,
595 .get_wptr = &radeon_ring_generic_get_wptr,
596 .set_wptr = &radeon_ring_generic_set_wptr,
597 }
598 }, 555 },
599 .irq = { 556 .irq = {
600 .set = &r100_irq_set, 557 .set = &r100_irq_set,
@@ -661,19 +618,7 @@ static struct radeon_asic rs600_asic = {
661 .set_page = &rs600_gart_set_page, 618 .set_page = &rs600_gart_set_page,
662 }, 619 },
663 .ring = { 620 .ring = {
664 [RADEON_RING_TYPE_GFX_INDEX] = { 621 [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
665 .ib_execute = &r100_ring_ib_execute,
666 .emit_fence = &r300_fence_ring_emit,
667 .emit_semaphore = &r100_semaphore_ring_emit,
668 .cs_parse = &r300_cs_parse,
669 .ring_start = &r300_ring_start,
670 .ring_test = &r100_ring_test,
671 .ib_test = &r100_ib_test,
672 .is_lockup = &r100_gpu_is_lockup,
673 .get_rptr = &radeon_ring_generic_get_rptr,
674 .get_wptr = &radeon_ring_generic_get_wptr,
675 .set_wptr = &radeon_ring_generic_set_wptr,
676 }
677 }, 622 },
678 .irq = { 623 .irq = {
679 .set = &rs600_irq_set, 624 .set = &rs600_irq_set,
@@ -742,19 +687,7 @@ static struct radeon_asic rs690_asic = {
742 .set_page = &rs400_gart_set_page, 687 .set_page = &rs400_gart_set_page,
743 }, 688 },
744 .ring = { 689 .ring = {
745 [RADEON_RING_TYPE_GFX_INDEX] = { 690 [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
746 .ib_execute = &r100_ring_ib_execute,
747 .emit_fence = &r300_fence_ring_emit,
748 .emit_semaphore = &r100_semaphore_ring_emit,
749 .cs_parse = &r300_cs_parse,
750 .ring_start = &r300_ring_start,
751 .ring_test = &r100_ring_test,
752 .ib_test = &r100_ib_test,
753 .is_lockup = &r100_gpu_is_lockup,
754 .get_rptr = &radeon_ring_generic_get_rptr,
755 .get_wptr = &radeon_ring_generic_get_wptr,
756 .set_wptr = &radeon_ring_generic_set_wptr,
757 }
758 }, 691 },
759 .irq = { 692 .irq = {
760 .set = &rs600_irq_set, 693 .set = &rs600_irq_set,
@@ -823,19 +756,7 @@ static struct radeon_asic rv515_asic = {
823 .set_page = &rv370_pcie_gart_set_page, 756 .set_page = &rv370_pcie_gart_set_page,
824 }, 757 },
825 .ring = { 758 .ring = {
826 [RADEON_RING_TYPE_GFX_INDEX] = { 759 [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
827 .ib_execute = &r100_ring_ib_execute,
828 .emit_fence = &r300_fence_ring_emit,
829 .emit_semaphore = &r100_semaphore_ring_emit,
830 .cs_parse = &r300_cs_parse,
831 .ring_start = &rv515_ring_start,
832 .ring_test = &r100_ring_test,
833 .ib_test = &r100_ib_test,
834 .is_lockup = &r100_gpu_is_lockup,
835 .get_rptr = &radeon_ring_generic_get_rptr,
836 .get_wptr = &radeon_ring_generic_get_wptr,
837 .set_wptr = &radeon_ring_generic_set_wptr,
838 }
839 }, 760 },
840 .irq = { 761 .irq = {
841 .set = &rs600_irq_set, 762 .set = &rs600_irq_set,
@@ -902,19 +823,7 @@ static struct radeon_asic r520_asic = {
902 .set_page = &rv370_pcie_gart_set_page, 823 .set_page = &rv370_pcie_gart_set_page,
903 }, 824 },
904 .ring = { 825 .ring = {
905 [RADEON_RING_TYPE_GFX_INDEX] = { 826 [RADEON_RING_TYPE_GFX_INDEX] = &r300_gfx_ring
906 .ib_execute = &r100_ring_ib_execute,
907 .emit_fence = &r300_fence_ring_emit,
908 .emit_semaphore = &r100_semaphore_ring_emit,
909 .cs_parse = &r300_cs_parse,
910 .ring_start = &rv515_ring_start,
911 .ring_test = &r100_ring_test,
912 .ib_test = &r100_ib_test,
913 .is_lockup = &r100_gpu_is_lockup,
914 .get_rptr = &radeon_ring_generic_get_rptr,
915 .get_wptr = &radeon_ring_generic_get_wptr,
916 .set_wptr = &radeon_ring_generic_set_wptr,
917 }
918 }, 827 },
919 .irq = { 828 .irq = {
920 .set = &rs600_irq_set, 829 .set = &rs600_irq_set,
@@ -966,6 +875,32 @@ static struct radeon_asic r520_asic = {
966 }, 875 },
967}; 876};
968 877
878static struct radeon_asic_ring r600_gfx_ring = {
879 .ib_execute = &r600_ring_ib_execute,
880 .emit_fence = &r600_fence_ring_emit,
881 .emit_semaphore = &r600_semaphore_ring_emit,
882 .cs_parse = &r600_cs_parse,
883 .ring_test = &r600_ring_test,
884 .ib_test = &r600_ib_test,
885 .is_lockup = &r600_gfx_is_lockup,
886 .get_rptr = &radeon_ring_generic_get_rptr,
887 .get_wptr = &radeon_ring_generic_get_wptr,
888 .set_wptr = &radeon_ring_generic_set_wptr,
889};
890
891static struct radeon_asic_ring r600_dma_ring = {
892 .ib_execute = &r600_dma_ring_ib_execute,
893 .emit_fence = &r600_dma_fence_ring_emit,
894 .emit_semaphore = &r600_dma_semaphore_ring_emit,
895 .cs_parse = &r600_dma_cs_parse,
896 .ring_test = &r600_dma_ring_test,
897 .ib_test = &r600_dma_ib_test,
898 .is_lockup = &r600_dma_is_lockup,
899 .get_rptr = &r600_dma_get_rptr,
900 .get_wptr = &r600_dma_get_wptr,
901 .set_wptr = &r600_dma_set_wptr,
902};
903
969static struct radeon_asic r600_asic = { 904static struct radeon_asic r600_asic = {
970 .init = &r600_init, 905 .init = &r600_init,
971 .fini = &r600_fini, 906 .fini = &r600_fini,
@@ -983,30 +918,8 @@ static struct radeon_asic r600_asic = {
983 .set_page = &rs600_gart_set_page, 918 .set_page = &rs600_gart_set_page,
984 }, 919 },
985 .ring = { 920 .ring = {
986 [RADEON_RING_TYPE_GFX_INDEX] = { 921 [RADEON_RING_TYPE_GFX_INDEX] = &r600_gfx_ring,
987 .ib_execute = &r600_ring_ib_execute, 922 [R600_RING_TYPE_DMA_INDEX] = &r600_dma_ring,
988 .emit_fence = &r600_fence_ring_emit,
989 .emit_semaphore = &r600_semaphore_ring_emit,
990 .cs_parse = &r600_cs_parse,
991 .ring_test = &r600_ring_test,
992 .ib_test = &r600_ib_test,
993 .is_lockup = &r600_gfx_is_lockup,
994 .get_rptr = &radeon_ring_generic_get_rptr,
995 .get_wptr = &radeon_ring_generic_get_wptr,
996 .set_wptr = &radeon_ring_generic_set_wptr,
997 },
998 [R600_RING_TYPE_DMA_INDEX] = {
999 .ib_execute = &r600_dma_ring_ib_execute,
1000 .emit_fence = &r600_dma_fence_ring_emit,
1001 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1002 .cs_parse = &r600_dma_cs_parse,
1003 .ring_test = &r600_dma_ring_test,
1004 .ib_test = &r600_dma_ib_test,
1005 .is_lockup = &r600_dma_is_lockup,
1006 .get_rptr = &radeon_ring_generic_get_rptr,
1007 .get_wptr = &radeon_ring_generic_get_wptr,
1008 .set_wptr = &radeon_ring_generic_set_wptr,
1009 }
1010 }, 923 },
1011 .irq = { 924 .irq = {
1012 .set = &r600_irq_set, 925 .set = &r600_irq_set,
@@ -1022,7 +935,7 @@ static struct radeon_asic r600_asic = {
1022 .hdmi_setmode = &r600_hdmi_setmode, 935 .hdmi_setmode = &r600_hdmi_setmode,
1023 }, 936 },
1024 .copy = { 937 .copy = {
1025 .blit = &r600_copy_blit, 938 .blit = &r600_copy_cpdma,
1026 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 939 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1027 .dma = &r600_copy_dma, 940 .dma = &r600_copy_dma,
1028 .dma_ring_index = R600_RING_TYPE_DMA_INDEX, 941 .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
@@ -1078,30 +991,8 @@ static struct radeon_asic rv6xx_asic = {
1078 .set_page = &rs600_gart_set_page, 991 .set_page = &rs600_gart_set_page,
1079 }, 992 },
1080 .ring = { 993 .ring = {
1081 [RADEON_RING_TYPE_GFX_INDEX] = { 994 [RADEON_RING_TYPE_GFX_INDEX] = &r600_gfx_ring,
1082 .ib_execute = &r600_ring_ib_execute, 995 [R600_RING_TYPE_DMA_INDEX] = &r600_dma_ring,
1083 .emit_fence = &r600_fence_ring_emit,
1084 .emit_semaphore = &r600_semaphore_ring_emit,
1085 .cs_parse = &r600_cs_parse,
1086 .ring_test = &r600_ring_test,
1087 .ib_test = &r600_ib_test,
1088 .is_lockup = &r600_gfx_is_lockup,
1089 .get_rptr = &radeon_ring_generic_get_rptr,
1090 .get_wptr = &radeon_ring_generic_get_wptr,
1091 .set_wptr = &radeon_ring_generic_set_wptr,
1092 },
1093 [R600_RING_TYPE_DMA_INDEX] = {
1094 .ib_execute = &r600_dma_ring_ib_execute,
1095 .emit_fence = &r600_dma_fence_ring_emit,
1096 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1097 .cs_parse = &r600_dma_cs_parse,
1098 .ring_test = &r600_dma_ring_test,
1099 .ib_test = &r600_dma_ib_test,
1100 .is_lockup = &r600_dma_is_lockup,
1101 .get_rptr = &radeon_ring_generic_get_rptr,
1102 .get_wptr = &radeon_ring_generic_get_wptr,
1103 .set_wptr = &radeon_ring_generic_set_wptr,
1104 }
1105 }, 996 },
1106 .irq = { 997 .irq = {
1107 .set = &r600_irq_set, 998 .set = &r600_irq_set,
@@ -1115,7 +1006,7 @@ static struct radeon_asic rv6xx_asic = {
1115 .get_backlight_level = &atombios_get_backlight_level, 1006 .get_backlight_level = &atombios_get_backlight_level,
1116 }, 1007 },
1117 .copy = { 1008 .copy = {
1118 .blit = &r600_copy_blit, 1009 .blit = &r600_copy_cpdma,
1119 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1010 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1120 .dma = &r600_copy_dma, 1011 .dma = &r600_copy_dma,
1121 .dma_ring_index = R600_RING_TYPE_DMA_INDEX, 1012 .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
@@ -1187,30 +1078,8 @@ static struct radeon_asic rs780_asic = {
1187 .set_page = &rs600_gart_set_page, 1078 .set_page = &rs600_gart_set_page,
1188 }, 1079 },
1189 .ring = { 1080 .ring = {
1190 [RADEON_RING_TYPE_GFX_INDEX] = { 1081 [RADEON_RING_TYPE_GFX_INDEX] = &r600_gfx_ring,
1191 .ib_execute = &r600_ring_ib_execute, 1082 [R600_RING_TYPE_DMA_INDEX] = &r600_dma_ring,
1192 .emit_fence = &r600_fence_ring_emit,
1193 .emit_semaphore = &r600_semaphore_ring_emit,
1194 .cs_parse = &r600_cs_parse,
1195 .ring_test = &r600_ring_test,
1196 .ib_test = &r600_ib_test,
1197 .is_lockup = &r600_gfx_is_lockup,
1198 .get_rptr = &radeon_ring_generic_get_rptr,
1199 .get_wptr = &radeon_ring_generic_get_wptr,
1200 .set_wptr = &radeon_ring_generic_set_wptr,
1201 },
1202 [R600_RING_TYPE_DMA_INDEX] = {
1203 .ib_execute = &r600_dma_ring_ib_execute,
1204 .emit_fence = &r600_dma_fence_ring_emit,
1205 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1206 .cs_parse = &r600_dma_cs_parse,
1207 .ring_test = &r600_dma_ring_test,
1208 .ib_test = &r600_dma_ib_test,
1209 .is_lockup = &r600_dma_is_lockup,
1210 .get_rptr = &radeon_ring_generic_get_rptr,
1211 .get_wptr = &radeon_ring_generic_get_wptr,
1212 .set_wptr = &radeon_ring_generic_set_wptr,
1213 }
1214 }, 1083 },
1215 .irq = { 1084 .irq = {
1216 .set = &r600_irq_set, 1085 .set = &r600_irq_set,
@@ -1226,7 +1095,7 @@ static struct radeon_asic rs780_asic = {
1226 .hdmi_setmode = &r600_hdmi_setmode, 1095 .hdmi_setmode = &r600_hdmi_setmode,
1227 }, 1096 },
1228 .copy = { 1097 .copy = {
1229 .blit = &r600_copy_blit, 1098 .blit = &r600_copy_cpdma,
1230 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1099 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1231 .dma = &r600_copy_dma, 1100 .dma = &r600_copy_dma,
1232 .dma_ring_index = R600_RING_TYPE_DMA_INDEX, 1101 .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
@@ -1280,6 +1149,19 @@ static struct radeon_asic rs780_asic = {
1280 }, 1149 },
1281}; 1150};
1282 1151
1152static struct radeon_asic_ring rv770_uvd_ring = {
1153 .ib_execute = &uvd_v1_0_ib_execute,
1154 .emit_fence = &uvd_v2_2_fence_emit,
1155 .emit_semaphore = &uvd_v1_0_semaphore_emit,
1156 .cs_parse = &radeon_uvd_cs_parse,
1157 .ring_test = &uvd_v1_0_ring_test,
1158 .ib_test = &uvd_v1_0_ib_test,
1159 .is_lockup = &radeon_ring_test_lockup,
1160 .get_rptr = &uvd_v1_0_get_rptr,
1161 .get_wptr = &uvd_v1_0_get_wptr,
1162 .set_wptr = &uvd_v1_0_set_wptr,
1163};
1164
1283static struct radeon_asic rv770_asic = { 1165static struct radeon_asic rv770_asic = {
1284 .init = &rv770_init, 1166 .init = &rv770_init,
1285 .fini = &rv770_fini, 1167 .fini = &rv770_fini,
@@ -1297,42 +1179,9 @@ static struct radeon_asic rv770_asic = {
1297 .set_page = &rs600_gart_set_page, 1179 .set_page = &rs600_gart_set_page,
1298 }, 1180 },
1299 .ring = { 1181 .ring = {
1300 [RADEON_RING_TYPE_GFX_INDEX] = { 1182 [RADEON_RING_TYPE_GFX_INDEX] = &r600_gfx_ring,
1301 .ib_execute = &r600_ring_ib_execute, 1183 [R600_RING_TYPE_DMA_INDEX] = &r600_dma_ring,
1302 .emit_fence = &r600_fence_ring_emit, 1184 [R600_RING_TYPE_UVD_INDEX] = &rv770_uvd_ring,
1303 .emit_semaphore = &r600_semaphore_ring_emit,
1304 .cs_parse = &r600_cs_parse,
1305 .ring_test = &r600_ring_test,
1306 .ib_test = &r600_ib_test,
1307 .is_lockup = &r600_gfx_is_lockup,
1308 .get_rptr = &radeon_ring_generic_get_rptr,
1309 .get_wptr = &radeon_ring_generic_get_wptr,
1310 .set_wptr = &radeon_ring_generic_set_wptr,
1311 },
1312 [R600_RING_TYPE_DMA_INDEX] = {
1313 .ib_execute = &r600_dma_ring_ib_execute,
1314 .emit_fence = &r600_dma_fence_ring_emit,
1315 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1316 .cs_parse = &r600_dma_cs_parse,
1317 .ring_test = &r600_dma_ring_test,
1318 .ib_test = &r600_dma_ib_test,
1319 .is_lockup = &r600_dma_is_lockup,
1320 .get_rptr = &radeon_ring_generic_get_rptr,
1321 .get_wptr = &radeon_ring_generic_get_wptr,
1322 .set_wptr = &radeon_ring_generic_set_wptr,
1323 },
1324 [R600_RING_TYPE_UVD_INDEX] = {
1325 .ib_execute = &r600_uvd_ib_execute,
1326 .emit_fence = &r600_uvd_fence_emit,
1327 .emit_semaphore = &r600_uvd_semaphore_emit,
1328 .cs_parse = &radeon_uvd_cs_parse,
1329 .ring_test = &r600_uvd_ring_test,
1330 .ib_test = &r600_uvd_ib_test,
1331 .is_lockup = &radeon_ring_test_lockup,
1332 .get_rptr = &radeon_ring_generic_get_rptr,
1333 .get_wptr = &radeon_ring_generic_get_wptr,
1334 .set_wptr = &radeon_ring_generic_set_wptr,
1335 }
1336 }, 1185 },
1337 .irq = { 1186 .irq = {
1338 .set = &r600_irq_set, 1187 .set = &r600_irq_set,
@@ -1348,7 +1197,7 @@ static struct radeon_asic rv770_asic = {
1348 .hdmi_setmode = &r600_hdmi_setmode, 1197 .hdmi_setmode = &r600_hdmi_setmode,
1349 }, 1198 },
1350 .copy = { 1199 .copy = {
1351 .blit = &r600_copy_blit, 1200 .blit = &r600_copy_cpdma,
1352 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1201 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1353 .dma = &rv770_copy_dma, 1202 .dma = &rv770_copy_dma,
1354 .dma_ring_index = R600_RING_TYPE_DMA_INDEX, 1203 .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
@@ -1405,6 +1254,32 @@ static struct radeon_asic rv770_asic = {
1405 }, 1254 },
1406}; 1255};
1407 1256
1257static struct radeon_asic_ring evergreen_gfx_ring = {
1258 .ib_execute = &evergreen_ring_ib_execute,
1259 .emit_fence = &r600_fence_ring_emit,
1260 .emit_semaphore = &r600_semaphore_ring_emit,
1261 .cs_parse = &evergreen_cs_parse,
1262 .ring_test = &r600_ring_test,
1263 .ib_test = &r600_ib_test,
1264 .is_lockup = &evergreen_gfx_is_lockup,
1265 .get_rptr = &radeon_ring_generic_get_rptr,
1266 .get_wptr = &radeon_ring_generic_get_wptr,
1267 .set_wptr = &radeon_ring_generic_set_wptr,
1268};
1269
1270static struct radeon_asic_ring evergreen_dma_ring = {
1271 .ib_execute = &evergreen_dma_ring_ib_execute,
1272 .emit_fence = &evergreen_dma_fence_ring_emit,
1273 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1274 .cs_parse = &evergreen_dma_cs_parse,
1275 .ring_test = &r600_dma_ring_test,
1276 .ib_test = &r600_dma_ib_test,
1277 .is_lockup = &evergreen_dma_is_lockup,
1278 .get_rptr = &r600_dma_get_rptr,
1279 .get_wptr = &r600_dma_get_wptr,
1280 .set_wptr = &r600_dma_set_wptr,
1281};
1282
1408static struct radeon_asic evergreen_asic = { 1283static struct radeon_asic evergreen_asic = {
1409 .init = &evergreen_init, 1284 .init = &evergreen_init,
1410 .fini = &evergreen_fini, 1285 .fini = &evergreen_fini,
@@ -1422,42 +1297,9 @@ static struct radeon_asic evergreen_asic = {
1422 .set_page = &rs600_gart_set_page, 1297 .set_page = &rs600_gart_set_page,
1423 }, 1298 },
1424 .ring = { 1299 .ring = {
1425 [RADEON_RING_TYPE_GFX_INDEX] = { 1300 [RADEON_RING_TYPE_GFX_INDEX] = &evergreen_gfx_ring,
1426 .ib_execute = &evergreen_ring_ib_execute, 1301 [R600_RING_TYPE_DMA_INDEX] = &evergreen_dma_ring,
1427 .emit_fence = &r600_fence_ring_emit, 1302 [R600_RING_TYPE_UVD_INDEX] = &rv770_uvd_ring,
1428 .emit_semaphore = &r600_semaphore_ring_emit,
1429 .cs_parse = &evergreen_cs_parse,
1430 .ring_test = &r600_ring_test,
1431 .ib_test = &r600_ib_test,
1432 .is_lockup = &evergreen_gfx_is_lockup,
1433 .get_rptr = &radeon_ring_generic_get_rptr,
1434 .get_wptr = &radeon_ring_generic_get_wptr,
1435 .set_wptr = &radeon_ring_generic_set_wptr,
1436 },
1437 [R600_RING_TYPE_DMA_INDEX] = {
1438 .ib_execute = &evergreen_dma_ring_ib_execute,
1439 .emit_fence = &evergreen_dma_fence_ring_emit,
1440 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1441 .cs_parse = &evergreen_dma_cs_parse,
1442 .ring_test = &r600_dma_ring_test,
1443 .ib_test = &r600_dma_ib_test,
1444 .is_lockup = &evergreen_dma_is_lockup,
1445 .get_rptr = &radeon_ring_generic_get_rptr,
1446 .get_wptr = &radeon_ring_generic_get_wptr,
1447 .set_wptr = &radeon_ring_generic_set_wptr,
1448 },
1449 [R600_RING_TYPE_UVD_INDEX] = {
1450 .ib_execute = &r600_uvd_ib_execute,
1451 .emit_fence = &r600_uvd_fence_emit,
1452 .emit_semaphore = &r600_uvd_semaphore_emit,
1453 .cs_parse = &radeon_uvd_cs_parse,
1454 .ring_test = &r600_uvd_ring_test,
1455 .ib_test = &r600_uvd_ib_test,
1456 .is_lockup = &radeon_ring_test_lockup,
1457 .get_rptr = &radeon_ring_generic_get_rptr,
1458 .get_wptr = &radeon_ring_generic_get_wptr,
1459 .set_wptr = &radeon_ring_generic_set_wptr,
1460 }
1461 }, 1303 },
1462 .irq = { 1304 .irq = {
1463 .set = &evergreen_irq_set, 1305 .set = &evergreen_irq_set,
@@ -1473,7 +1315,7 @@ static struct radeon_asic evergreen_asic = {
1473 .hdmi_setmode = &evergreen_hdmi_setmode, 1315 .hdmi_setmode = &evergreen_hdmi_setmode,
1474 }, 1316 },
1475 .copy = { 1317 .copy = {
1476 .blit = &r600_copy_blit, 1318 .blit = &r600_copy_cpdma,
1477 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1319 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1478 .dma = &evergreen_copy_dma, 1320 .dma = &evergreen_copy_dma,
1479 .dma_ring_index = R600_RING_TYPE_DMA_INDEX, 1321 .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
@@ -1547,42 +1389,9 @@ static struct radeon_asic sumo_asic = {
1547 .set_page = &rs600_gart_set_page, 1389 .set_page = &rs600_gart_set_page,
1548 }, 1390 },
1549 .ring = { 1391 .ring = {
1550 [RADEON_RING_TYPE_GFX_INDEX] = { 1392 [RADEON_RING_TYPE_GFX_INDEX] = &evergreen_gfx_ring,
1551 .ib_execute = &evergreen_ring_ib_execute, 1393 [R600_RING_TYPE_DMA_INDEX] = &evergreen_dma_ring,
1552 .emit_fence = &r600_fence_ring_emit, 1394 [R600_RING_TYPE_UVD_INDEX] = &rv770_uvd_ring,
1553 .emit_semaphore = &r600_semaphore_ring_emit,
1554 .cs_parse = &evergreen_cs_parse,
1555 .ring_test = &r600_ring_test,
1556 .ib_test = &r600_ib_test,
1557 .is_lockup = &evergreen_gfx_is_lockup,
1558 .get_rptr = &radeon_ring_generic_get_rptr,
1559 .get_wptr = &radeon_ring_generic_get_wptr,
1560 .set_wptr = &radeon_ring_generic_set_wptr,
1561 },
1562 [R600_RING_TYPE_DMA_INDEX] = {
1563 .ib_execute = &evergreen_dma_ring_ib_execute,
1564 .emit_fence = &evergreen_dma_fence_ring_emit,
1565 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1566 .cs_parse = &evergreen_dma_cs_parse,
1567 .ring_test = &r600_dma_ring_test,
1568 .ib_test = &r600_dma_ib_test,
1569 .is_lockup = &evergreen_dma_is_lockup,
1570 .get_rptr = &radeon_ring_generic_get_rptr,
1571 .get_wptr = &radeon_ring_generic_get_wptr,
1572 .set_wptr = &radeon_ring_generic_set_wptr,
1573 },
1574 [R600_RING_TYPE_UVD_INDEX] = {
1575 .ib_execute = &r600_uvd_ib_execute,
1576 .emit_fence = &r600_uvd_fence_emit,
1577 .emit_semaphore = &r600_uvd_semaphore_emit,
1578 .cs_parse = &radeon_uvd_cs_parse,
1579 .ring_test = &r600_uvd_ring_test,
1580 .ib_test = &r600_uvd_ib_test,
1581 .is_lockup = &radeon_ring_test_lockup,
1582 .get_rptr = &radeon_ring_generic_get_rptr,
1583 .get_wptr = &radeon_ring_generic_get_wptr,
1584 .set_wptr = &radeon_ring_generic_set_wptr,
1585 }
1586 }, 1395 },
1587 .irq = { 1396 .irq = {
1588 .set = &evergreen_irq_set, 1397 .set = &evergreen_irq_set,
@@ -1598,7 +1407,7 @@ static struct radeon_asic sumo_asic = {
1598 .hdmi_setmode = &evergreen_hdmi_setmode, 1407 .hdmi_setmode = &evergreen_hdmi_setmode,
1599 }, 1408 },
1600 .copy = { 1409 .copy = {
1601 .blit = &r600_copy_blit, 1410 .blit = &r600_copy_cpdma,
1602 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1411 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1603 .dma = &evergreen_copy_dma, 1412 .dma = &evergreen_copy_dma,
1604 .dma_ring_index = R600_RING_TYPE_DMA_INDEX, 1413 .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
@@ -1671,42 +1480,9 @@ static struct radeon_asic btc_asic = {
1671 .set_page = &rs600_gart_set_page, 1480 .set_page = &rs600_gart_set_page,
1672 }, 1481 },
1673 .ring = { 1482 .ring = {
1674 [RADEON_RING_TYPE_GFX_INDEX] = { 1483 [RADEON_RING_TYPE_GFX_INDEX] = &evergreen_gfx_ring,
1675 .ib_execute = &evergreen_ring_ib_execute, 1484 [R600_RING_TYPE_DMA_INDEX] = &evergreen_dma_ring,
1676 .emit_fence = &r600_fence_ring_emit, 1485 [R600_RING_TYPE_UVD_INDEX] = &rv770_uvd_ring,
1677 .emit_semaphore = &r600_semaphore_ring_emit,
1678 .cs_parse = &evergreen_cs_parse,
1679 .ring_test = &r600_ring_test,
1680 .ib_test = &r600_ib_test,
1681 .is_lockup = &evergreen_gfx_is_lockup,
1682 .get_rptr = &radeon_ring_generic_get_rptr,
1683 .get_wptr = &radeon_ring_generic_get_wptr,
1684 .set_wptr = &radeon_ring_generic_set_wptr,
1685 },
1686 [R600_RING_TYPE_DMA_INDEX] = {
1687 .ib_execute = &evergreen_dma_ring_ib_execute,
1688 .emit_fence = &evergreen_dma_fence_ring_emit,
1689 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1690 .cs_parse = &evergreen_dma_cs_parse,
1691 .ring_test = &r600_dma_ring_test,
1692 .ib_test = &r600_dma_ib_test,
1693 .is_lockup = &evergreen_dma_is_lockup,
1694 .get_rptr = &radeon_ring_generic_get_rptr,
1695 .get_wptr = &radeon_ring_generic_get_wptr,
1696 .set_wptr = &radeon_ring_generic_set_wptr,
1697 },
1698 [R600_RING_TYPE_UVD_INDEX] = {
1699 .ib_execute = &r600_uvd_ib_execute,
1700 .emit_fence = &r600_uvd_fence_emit,
1701 .emit_semaphore = &r600_uvd_semaphore_emit,
1702 .cs_parse = &radeon_uvd_cs_parse,
1703 .ring_test = &r600_uvd_ring_test,
1704 .ib_test = &r600_uvd_ib_test,
1705 .is_lockup = &radeon_ring_test_lockup,
1706 .get_rptr = &radeon_ring_generic_get_rptr,
1707 .get_wptr = &radeon_ring_generic_get_wptr,
1708 .set_wptr = &radeon_ring_generic_set_wptr,
1709 }
1710 }, 1486 },
1711 .irq = { 1487 .irq = {
1712 .set = &evergreen_irq_set, 1488 .set = &evergreen_irq_set,
@@ -1722,7 +1498,7 @@ static struct radeon_asic btc_asic = {
1722 .hdmi_setmode = &evergreen_hdmi_setmode, 1498 .hdmi_setmode = &evergreen_hdmi_setmode,
1723 }, 1499 },
1724 .copy = { 1500 .copy = {
1725 .blit = &r600_copy_blit, 1501 .blit = &r600_copy_cpdma,
1726 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1502 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1727 .dma = &evergreen_copy_dma, 1503 .dma = &evergreen_copy_dma,
1728 .dma_ring_index = R600_RING_TYPE_DMA_INDEX, 1504 .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
@@ -1779,6 +1555,49 @@ static struct radeon_asic btc_asic = {
1779 }, 1555 },
1780}; 1556};
1781 1557
1558static struct radeon_asic_ring cayman_gfx_ring = {
1559 .ib_execute = &cayman_ring_ib_execute,
1560 .ib_parse = &evergreen_ib_parse,
1561 .emit_fence = &cayman_fence_ring_emit,
1562 .emit_semaphore = &r600_semaphore_ring_emit,
1563 .cs_parse = &evergreen_cs_parse,
1564 .ring_test = &r600_ring_test,
1565 .ib_test = &r600_ib_test,
1566 .is_lockup = &cayman_gfx_is_lockup,
1567 .vm_flush = &cayman_vm_flush,
1568 .get_rptr = &radeon_ring_generic_get_rptr,
1569 .get_wptr = &radeon_ring_generic_get_wptr,
1570 .set_wptr = &radeon_ring_generic_set_wptr,
1571};
1572
1573static struct radeon_asic_ring cayman_dma_ring = {
1574 .ib_execute = &cayman_dma_ring_ib_execute,
1575 .ib_parse = &evergreen_dma_ib_parse,
1576 .emit_fence = &evergreen_dma_fence_ring_emit,
1577 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1578 .cs_parse = &evergreen_dma_cs_parse,
1579 .ring_test = &r600_dma_ring_test,
1580 .ib_test = &r600_dma_ib_test,
1581 .is_lockup = &cayman_dma_is_lockup,
1582 .vm_flush = &cayman_dma_vm_flush,
1583 .get_rptr = &r600_dma_get_rptr,
1584 .get_wptr = &r600_dma_get_wptr,
1585 .set_wptr = &r600_dma_set_wptr
1586};
1587
1588static struct radeon_asic_ring cayman_uvd_ring = {
1589 .ib_execute = &uvd_v1_0_ib_execute,
1590 .emit_fence = &uvd_v2_2_fence_emit,
1591 .emit_semaphore = &uvd_v3_1_semaphore_emit,
1592 .cs_parse = &radeon_uvd_cs_parse,
1593 .ring_test = &uvd_v1_0_ring_test,
1594 .ib_test = &uvd_v1_0_ib_test,
1595 .is_lockup = &radeon_ring_test_lockup,
1596 .get_rptr = &uvd_v1_0_get_rptr,
1597 .get_wptr = &uvd_v1_0_get_wptr,
1598 .set_wptr = &uvd_v1_0_set_wptr,
1599};
1600
1782static struct radeon_asic cayman_asic = { 1601static struct radeon_asic cayman_asic = {
1783 .init = &cayman_init, 1602 .init = &cayman_init,
1784 .fini = &cayman_fini, 1603 .fini = &cayman_fini,
@@ -1802,88 +1621,12 @@ static struct radeon_asic cayman_asic = {
1802 .set_page = &cayman_vm_set_page, 1621 .set_page = &cayman_vm_set_page,
1803 }, 1622 },
1804 .ring = { 1623 .ring = {
1805 [RADEON_RING_TYPE_GFX_INDEX] = { 1624 [RADEON_RING_TYPE_GFX_INDEX] = &cayman_gfx_ring,
1806 .ib_execute = &cayman_ring_ib_execute, 1625 [CAYMAN_RING_TYPE_CP1_INDEX] = &cayman_gfx_ring,
1807 .ib_parse = &evergreen_ib_parse, 1626 [CAYMAN_RING_TYPE_CP2_INDEX] = &cayman_gfx_ring,
1808 .emit_fence = &cayman_fence_ring_emit, 1627 [R600_RING_TYPE_DMA_INDEX] = &cayman_dma_ring,
1809 .emit_semaphore = &r600_semaphore_ring_emit, 1628 [CAYMAN_RING_TYPE_DMA1_INDEX] = &cayman_dma_ring,
1810 .cs_parse = &evergreen_cs_parse, 1629 [R600_RING_TYPE_UVD_INDEX] = &cayman_uvd_ring,
1811 .ring_test = &r600_ring_test,
1812 .ib_test = &r600_ib_test,
1813 .is_lockup = &cayman_gfx_is_lockup,
1814 .vm_flush = &cayman_vm_flush,
1815 .get_rptr = &radeon_ring_generic_get_rptr,
1816 .get_wptr = &radeon_ring_generic_get_wptr,
1817 .set_wptr = &radeon_ring_generic_set_wptr,
1818 },
1819 [CAYMAN_RING_TYPE_CP1_INDEX] = {
1820 .ib_execute = &cayman_ring_ib_execute,
1821 .ib_parse = &evergreen_ib_parse,
1822 .emit_fence = &cayman_fence_ring_emit,
1823 .emit_semaphore = &r600_semaphore_ring_emit,
1824 .cs_parse = &evergreen_cs_parse,
1825 .ring_test = &r600_ring_test,
1826 .ib_test = &r600_ib_test,
1827 .is_lockup = &cayman_gfx_is_lockup,
1828 .vm_flush = &cayman_vm_flush,
1829 .get_rptr = &radeon_ring_generic_get_rptr,
1830 .get_wptr = &radeon_ring_generic_get_wptr,
1831 .set_wptr = &radeon_ring_generic_set_wptr,
1832 },
1833 [CAYMAN_RING_TYPE_CP2_INDEX] = {
1834 .ib_execute = &cayman_ring_ib_execute,
1835 .ib_parse = &evergreen_ib_parse,
1836 .emit_fence = &cayman_fence_ring_emit,
1837 .emit_semaphore = &r600_semaphore_ring_emit,
1838 .cs_parse = &evergreen_cs_parse,
1839 .ring_test = &r600_ring_test,
1840 .ib_test = &r600_ib_test,
1841 .is_lockup = &cayman_gfx_is_lockup,
1842 .vm_flush = &cayman_vm_flush,
1843 .get_rptr = &radeon_ring_generic_get_rptr,
1844 .get_wptr = &radeon_ring_generic_get_wptr,
1845 .set_wptr = &radeon_ring_generic_set_wptr,
1846 },
1847 [R600_RING_TYPE_DMA_INDEX] = {
1848 .ib_execute = &cayman_dma_ring_ib_execute,
1849 .ib_parse = &evergreen_dma_ib_parse,
1850 .emit_fence = &evergreen_dma_fence_ring_emit,
1851 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1852 .cs_parse = &evergreen_dma_cs_parse,
1853 .ring_test = &r600_dma_ring_test,
1854 .ib_test = &r600_dma_ib_test,
1855 .is_lockup = &cayman_dma_is_lockup,
1856 .vm_flush = &cayman_dma_vm_flush,
1857 .get_rptr = &radeon_ring_generic_get_rptr,
1858 .get_wptr = &radeon_ring_generic_get_wptr,
1859 .set_wptr = &radeon_ring_generic_set_wptr,
1860 },
1861 [CAYMAN_RING_TYPE_DMA1_INDEX] = {
1862 .ib_execute = &cayman_dma_ring_ib_execute,
1863 .ib_parse = &evergreen_dma_ib_parse,
1864 .emit_fence = &evergreen_dma_fence_ring_emit,
1865 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1866 .cs_parse = &evergreen_dma_cs_parse,
1867 .ring_test = &r600_dma_ring_test,
1868 .ib_test = &r600_dma_ib_test,
1869 .is_lockup = &cayman_dma_is_lockup,
1870 .vm_flush = &cayman_dma_vm_flush,
1871 .get_rptr = &radeon_ring_generic_get_rptr,
1872 .get_wptr = &radeon_ring_generic_get_wptr,
1873 .set_wptr = &radeon_ring_generic_set_wptr,
1874 },
1875 [R600_RING_TYPE_UVD_INDEX] = {
1876 .ib_execute = &r600_uvd_ib_execute,
1877 .emit_fence = &r600_uvd_fence_emit,
1878 .emit_semaphore = &cayman_uvd_semaphore_emit,
1879 .cs_parse = &radeon_uvd_cs_parse,
1880 .ring_test = &r600_uvd_ring_test,
1881 .ib_test = &r600_uvd_ib_test,
1882 .is_lockup = &radeon_ring_test_lockup,
1883 .get_rptr = &radeon_ring_generic_get_rptr,
1884 .get_wptr = &radeon_ring_generic_get_wptr,
1885 .set_wptr = &radeon_ring_generic_set_wptr,
1886 }
1887 }, 1630 },
1888 .irq = { 1631 .irq = {
1889 .set = &evergreen_irq_set, 1632 .set = &evergreen_irq_set,
@@ -1899,7 +1642,7 @@ static struct radeon_asic cayman_asic = {
1899 .hdmi_setmode = &evergreen_hdmi_setmode, 1642 .hdmi_setmode = &evergreen_hdmi_setmode,
1900 }, 1643 },
1901 .copy = { 1644 .copy = {
1902 .blit = &r600_copy_blit, 1645 .blit = &r600_copy_cpdma,
1903 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1646 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
1904 .dma = &evergreen_copy_dma, 1647 .dma = &evergreen_copy_dma,
1905 .dma_ring_index = R600_RING_TYPE_DMA_INDEX, 1648 .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
@@ -1979,88 +1722,12 @@ static struct radeon_asic trinity_asic = {
1979 .set_page = &cayman_vm_set_page, 1722 .set_page = &cayman_vm_set_page,
1980 }, 1723 },
1981 .ring = { 1724 .ring = {
1982 [RADEON_RING_TYPE_GFX_INDEX] = { 1725 [RADEON_RING_TYPE_GFX_INDEX] = &cayman_gfx_ring,
1983 .ib_execute = &cayman_ring_ib_execute, 1726 [CAYMAN_RING_TYPE_CP1_INDEX] = &cayman_gfx_ring,
1984 .ib_parse = &evergreen_ib_parse, 1727 [CAYMAN_RING_TYPE_CP2_INDEX] = &cayman_gfx_ring,
1985 .emit_fence = &cayman_fence_ring_emit, 1728 [R600_RING_TYPE_DMA_INDEX] = &cayman_dma_ring,
1986 .emit_semaphore = &r600_semaphore_ring_emit, 1729 [CAYMAN_RING_TYPE_DMA1_INDEX] = &cayman_dma_ring,
1987 .cs_parse = &evergreen_cs_parse, 1730 [R600_RING_TYPE_UVD_INDEX] = &cayman_uvd_ring,
1988 .ring_test = &r600_ring_test,
1989 .ib_test = &r600_ib_test,
1990 .is_lockup = &cayman_gfx_is_lockup,
1991 .vm_flush = &cayman_vm_flush,
1992 .get_rptr = &radeon_ring_generic_get_rptr,
1993 .get_wptr = &radeon_ring_generic_get_wptr,
1994 .set_wptr = &radeon_ring_generic_set_wptr,
1995 },
1996 [CAYMAN_RING_TYPE_CP1_INDEX] = {
1997 .ib_execute = &cayman_ring_ib_execute,
1998 .ib_parse = &evergreen_ib_parse,
1999 .emit_fence = &cayman_fence_ring_emit,
2000 .emit_semaphore = &r600_semaphore_ring_emit,
2001 .cs_parse = &evergreen_cs_parse,
2002 .ring_test = &r600_ring_test,
2003 .ib_test = &r600_ib_test,
2004 .is_lockup = &cayman_gfx_is_lockup,
2005 .vm_flush = &cayman_vm_flush,
2006 .get_rptr = &radeon_ring_generic_get_rptr,
2007 .get_wptr = &radeon_ring_generic_get_wptr,
2008 .set_wptr = &radeon_ring_generic_set_wptr,
2009 },
2010 [CAYMAN_RING_TYPE_CP2_INDEX] = {
2011 .ib_execute = &cayman_ring_ib_execute,
2012 .ib_parse = &evergreen_ib_parse,
2013 .emit_fence = &cayman_fence_ring_emit,
2014 .emit_semaphore = &r600_semaphore_ring_emit,
2015 .cs_parse = &evergreen_cs_parse,
2016 .ring_test = &r600_ring_test,
2017 .ib_test = &r600_ib_test,
2018 .is_lockup = &cayman_gfx_is_lockup,
2019 .vm_flush = &cayman_vm_flush,
2020 .get_rptr = &radeon_ring_generic_get_rptr,
2021 .get_wptr = &radeon_ring_generic_get_wptr,
2022 .set_wptr = &radeon_ring_generic_set_wptr,
2023 },
2024 [R600_RING_TYPE_DMA_INDEX] = {
2025 .ib_execute = &cayman_dma_ring_ib_execute,
2026 .ib_parse = &evergreen_dma_ib_parse,
2027 .emit_fence = &evergreen_dma_fence_ring_emit,
2028 .emit_semaphore = &r600_dma_semaphore_ring_emit,
2029 .cs_parse = &evergreen_dma_cs_parse,
2030 .ring_test = &r600_dma_ring_test,
2031 .ib_test = &r600_dma_ib_test,
2032 .is_lockup = &cayman_dma_is_lockup,
2033 .vm_flush = &cayman_dma_vm_flush,
2034 .get_rptr = &radeon_ring_generic_get_rptr,
2035 .get_wptr = &radeon_ring_generic_get_wptr,
2036 .set_wptr = &radeon_ring_generic_set_wptr,
2037 },
2038 [CAYMAN_RING_TYPE_DMA1_INDEX] = {
2039 .ib_execute = &cayman_dma_ring_ib_execute,
2040 .ib_parse = &evergreen_dma_ib_parse,
2041 .emit_fence = &evergreen_dma_fence_ring_emit,
2042 .emit_semaphore = &r600_dma_semaphore_ring_emit,
2043 .cs_parse = &evergreen_dma_cs_parse,
2044 .ring_test = &r600_dma_ring_test,
2045 .ib_test = &r600_dma_ib_test,
2046 .is_lockup = &cayman_dma_is_lockup,
2047 .vm_flush = &cayman_dma_vm_flush,
2048 .get_rptr = &radeon_ring_generic_get_rptr,
2049 .get_wptr = &radeon_ring_generic_get_wptr,
2050 .set_wptr = &radeon_ring_generic_set_wptr,
2051 },
2052 [R600_RING_TYPE_UVD_INDEX] = {
2053 .ib_execute = &r600_uvd_ib_execute,
2054 .emit_fence = &r600_uvd_fence_emit,
2055 .emit_semaphore = &cayman_uvd_semaphore_emit,
2056 .cs_parse = &radeon_uvd_cs_parse,
2057 .ring_test = &r600_uvd_ring_test,
2058 .ib_test = &r600_uvd_ib_test,
2059 .is_lockup = &radeon_ring_test_lockup,
2060 .get_rptr = &radeon_ring_generic_get_rptr,
2061 .get_wptr = &radeon_ring_generic_get_wptr,
2062 .set_wptr = &radeon_ring_generic_set_wptr,
2063 }
2064 }, 1731 },
2065 .irq = { 1732 .irq = {
2066 .set = &evergreen_irq_set, 1733 .set = &evergreen_irq_set,
@@ -2072,9 +1739,11 @@ static struct radeon_asic trinity_asic = {
2072 .wait_for_vblank = &dce4_wait_for_vblank, 1739 .wait_for_vblank = &dce4_wait_for_vblank,
2073 .set_backlight_level = &atombios_set_backlight_level, 1740 .set_backlight_level = &atombios_set_backlight_level,
2074 .get_backlight_level = &atombios_get_backlight_level, 1741 .get_backlight_level = &atombios_get_backlight_level,
1742 .hdmi_enable = &evergreen_hdmi_enable,
1743 .hdmi_setmode = &evergreen_hdmi_setmode,
2075 }, 1744 },
2076 .copy = { 1745 .copy = {
2077 .blit = &r600_copy_blit, 1746 .blit = &r600_copy_cpdma,
2078 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX, 1747 .blit_ring_index = RADEON_RING_TYPE_GFX_INDEX,
2079 .dma = &evergreen_copy_dma, 1748 .dma = &evergreen_copy_dma,
2080 .dma_ring_index = R600_RING_TYPE_DMA_INDEX, 1749 .dma_ring_index = R600_RING_TYPE_DMA_INDEX,
@@ -2130,6 +1799,36 @@ static struct radeon_asic trinity_asic = {
2130 }, 1799 },
2131}; 1800};
2132 1801
1802static struct radeon_asic_ring si_gfx_ring = {
1803 .ib_execute = &si_ring_ib_execute,
1804 .ib_parse = &si_ib_parse,
1805 .emit_fence = &si_fence_ring_emit,
1806 .emit_semaphore = &r600_semaphore_ring_emit,
1807 .cs_parse = NULL,
1808 .ring_test = &r600_ring_test,
1809 .ib_test = &r600_ib_test,
1810 .is_lockup = &si_gfx_is_lockup,
1811 .vm_flush = &si_vm_flush,
1812 .get_rptr = &radeon_ring_generic_get_rptr,
1813 .get_wptr = &radeon_ring_generic_get_wptr,
1814 .set_wptr = &radeon_ring_generic_set_wptr,
1815};
1816
1817static struct radeon_asic_ring si_dma_ring = {
1818 .ib_execute = &cayman_dma_ring_ib_execute,
1819 .ib_parse = &evergreen_dma_ib_parse,
1820 .emit_fence = &evergreen_dma_fence_ring_emit,
1821 .emit_semaphore = &r600_dma_semaphore_ring_emit,
1822 .cs_parse = NULL,
1823 .ring_test = &r600_dma_ring_test,
1824 .ib_test = &r600_dma_ib_test,
1825 .is_lockup = &si_dma_is_lockup,
1826 .vm_flush = &si_dma_vm_flush,
1827 .get_rptr = &r600_dma_get_rptr,
1828 .get_wptr = &r600_dma_get_wptr,
1829 .set_wptr = &r600_dma_set_wptr,
1830};
1831
2133static struct radeon_asic si_asic = { 1832static struct radeon_asic si_asic = {
2134 .init = &si_init, 1833 .init = &si_init,
2135 .fini = &si_fini, 1834 .fini = &si_fini,
@@ -2153,88 +1852,12 @@ static struct radeon_asic si_asic = {
2153 .set_page = &si_vm_set_page, 1852 .set_page = &si_vm_set_page,
2154 }, 1853 },
2155 .ring = { 1854 .ring = {
2156 [RADEON_RING_TYPE_GFX_INDEX] = { 1855 [RADEON_RING_TYPE_GFX_INDEX] = &si_gfx_ring,
2157 .ib_execute = &si_ring_ib_execute, 1856 [CAYMAN_RING_TYPE_CP1_INDEX] = &si_gfx_ring,
2158 .ib_parse = &si_ib_parse, 1857 [CAYMAN_RING_TYPE_CP2_INDEX] = &si_gfx_ring,
2159 .emit_fence = &si_fence_ring_emit, 1858 [R600_RING_TYPE_DMA_INDEX] = &si_dma_ring,
2160 .emit_semaphore = &r600_semaphore_ring_emit, 1859 [CAYMAN_RING_TYPE_DMA1_INDEX] = &si_dma_ring,
2161 .cs_parse = NULL, 1860 [R600_RING_TYPE_UVD_INDEX] = &cayman_uvd_ring,
2162 .ring_test = &r600_ring_test,
2163 .ib_test = &r600_ib_test,
2164 .is_lockup = &si_gfx_is_lockup,
2165 .vm_flush = &si_vm_flush,
2166 .get_rptr = &radeon_ring_generic_get_rptr,
2167 .get_wptr = &radeon_ring_generic_get_wptr,
2168 .set_wptr = &radeon_ring_generic_set_wptr,
2169 },
2170 [CAYMAN_RING_TYPE_CP1_INDEX] = {
2171 .ib_execute = &si_ring_ib_execute,
2172 .ib_parse = &si_ib_parse,
2173 .emit_fence = &si_fence_ring_emit,
2174 .emit_semaphore = &r600_semaphore_ring_emit,
2175 .cs_parse = NULL,
2176 .ring_test = &r600_ring_test,
2177 .ib_test = &r600_ib_test,
2178 .is_lockup = &si_gfx_is_lockup,
2179 .vm_flush = &si_vm_flush,
2180 .get_rptr = &radeon_ring_generic_get_rptr,
2181 .get_wptr = &radeon_ring_generic_get_wptr,
2182 .set_wptr = &radeon_ring_generic_set_wptr,
2183 },
2184 [CAYMAN_RING_TYPE_CP2_INDEX] = {
2185 .ib_execute = &si_ring_ib_execute,
2186 .ib_parse = &si_ib_parse,
2187 .emit_fence = &si_fence_ring_emit,
2188 .emit_semaphore = &r600_semaphore_ring_emit,
2189 .cs_parse = NULL,
2190 .ring_test = &r600_ring_test,
2191 .ib_test = &r600_ib_test,
2192 .is_lockup = &si_gfx_is_lockup,
2193 .vm_flush = &si_vm_flush,
2194 .get_rptr = &radeon_ring_generic_get_rptr,
2195 .get_wptr = &radeon_ring_generic_get_wptr,
2196 .set_wptr = &radeon_ring_generic_set_wptr,
2197 },
2198 [R600_RING_TYPE_DMA_INDEX] = {
2199 .ib_execute = &cayman_dma_ring_ib_execute,
2200 .ib_parse = &evergreen_dma_ib_parse,
2201 .emit_fence = &evergreen_dma_fence_ring_emit,
2202 .emit_semaphore = &r600_dma_semaphore_ring_emit,
2203 .cs_parse = NULL,
2204 .ring_test = &r600_dma_ring_test,
2205 .ib_test = &r600_dma_ib_test,
2206 .is_lockup = &si_dma_is_lockup,
2207 .vm_flush = &si_dma_vm_flush,
2208 .get_rptr = &radeon_ring_generic_get_rptr,
2209 .get_wptr = &radeon_ring_generic_get_wptr,
2210 .set_wptr = &radeon_ring_generic_set_wptr,
2211 },
2212 [CAYMAN_RING_TYPE_DMA1_INDEX] = {
2213 .ib_execute = &cayman_dma_ring_ib_execute,
2214 .ib_parse = &evergreen_dma_ib_parse,
2215 .emit_fence = &evergreen_dma_fence_ring_emit,
2216 .emit_semaphore = &r600_dma_semaphore_ring_emit,
2217 .cs_parse = NULL,
2218 .ring_test = &r600_dma_ring_test,
2219 .ib_test = &r600_dma_ib_test,
2220 .is_lockup = &si_dma_is_lockup,
2221 .vm_flush = &si_dma_vm_flush,
2222 .get_rptr = &radeon_ring_generic_get_rptr,
2223 .get_wptr = &radeon_ring_generic_get_wptr,
2224 .set_wptr = &radeon_ring_generic_set_wptr,
2225 },
2226 [R600_RING_TYPE_UVD_INDEX] = {
2227 .ib_execute = &r600_uvd_ib_execute,
2228 .emit_fence = &r600_uvd_fence_emit,
2229 .emit_semaphore = &cayman_uvd_semaphore_emit,
2230 .cs_parse = &radeon_uvd_cs_parse,
2231 .ring_test = &r600_uvd_ring_test,
2232 .ib_test = &r600_uvd_ib_test,
2233 .is_lockup = &radeon_ring_test_lockup,
2234 .get_rptr = &radeon_ring_generic_get_rptr,
2235 .get_wptr = &radeon_ring_generic_get_wptr,
2236 .set_wptr = &radeon_ring_generic_set_wptr,
2237 }
2238 }, 1861 },
2239 .irq = { 1862 .irq = {
2240 .set = &si_irq_set, 1863 .set = &si_irq_set,
@@ -2246,6 +1869,8 @@ static struct radeon_asic si_asic = {
2246 .wait_for_vblank = &dce4_wait_for_vblank, 1869 .wait_for_vblank = &dce4_wait_for_vblank,
2247 .set_backlight_level = &atombios_set_backlight_level, 1870 .set_backlight_level = &atombios_set_backlight_level,
2248 .get_backlight_level = &atombios_get_backlight_level, 1871 .get_backlight_level = &atombios_get_backlight_level,
1872 .hdmi_enable = &evergreen_hdmi_enable,
1873 .hdmi_setmode = &evergreen_hdmi_setmode,
2249 }, 1874 },
2250 .copy = { 1875 .copy = {
2251 .blit = NULL, 1876 .blit = NULL,
@@ -2305,6 +1930,51 @@ static struct radeon_asic si_asic = {
2305 }, 1930 },
2306}; 1931};
2307 1932
1933static struct radeon_asic_ring ci_gfx_ring = {
1934 .ib_execute = &cik_ring_ib_execute,
1935 .ib_parse = &cik_ib_parse,
1936 .emit_fence = &cik_fence_gfx_ring_emit,
1937 .emit_semaphore = &cik_semaphore_ring_emit,
1938 .cs_parse = NULL,
1939 .ring_test = &cik_ring_test,
1940 .ib_test = &cik_ib_test,
1941 .is_lockup = &cik_gfx_is_lockup,
1942 .vm_flush = &cik_vm_flush,
1943 .get_rptr = &radeon_ring_generic_get_rptr,
1944 .get_wptr = &radeon_ring_generic_get_wptr,
1945 .set_wptr = &radeon_ring_generic_set_wptr,
1946};
1947
1948static struct radeon_asic_ring ci_cp_ring = {
1949 .ib_execute = &cik_ring_ib_execute,
1950 .ib_parse = &cik_ib_parse,
1951 .emit_fence = &cik_fence_compute_ring_emit,
1952 .emit_semaphore = &cik_semaphore_ring_emit,
1953 .cs_parse = NULL,
1954 .ring_test = &cik_ring_test,
1955 .ib_test = &cik_ib_test,
1956 .is_lockup = &cik_gfx_is_lockup,
1957 .vm_flush = &cik_vm_flush,
1958 .get_rptr = &cik_compute_ring_get_rptr,
1959 .get_wptr = &cik_compute_ring_get_wptr,
1960 .set_wptr = &cik_compute_ring_set_wptr,
1961};
1962
1963static struct radeon_asic_ring ci_dma_ring = {
1964 .ib_execute = &cik_sdma_ring_ib_execute,
1965 .ib_parse = &cik_ib_parse,
1966 .emit_fence = &cik_sdma_fence_ring_emit,
1967 .emit_semaphore = &cik_sdma_semaphore_ring_emit,
1968 .cs_parse = NULL,
1969 .ring_test = &cik_sdma_ring_test,
1970 .ib_test = &cik_sdma_ib_test,
1971 .is_lockup = &cik_sdma_is_lockup,
1972 .vm_flush = &cik_dma_vm_flush,
1973 .get_rptr = &r600_dma_get_rptr,
1974 .get_wptr = &r600_dma_get_wptr,
1975 .set_wptr = &r600_dma_set_wptr,
1976};
1977
2308static struct radeon_asic ci_asic = { 1978static struct radeon_asic ci_asic = {
2309 .init = &cik_init, 1979 .init = &cik_init,
2310 .fini = &cik_fini, 1980 .fini = &cik_fini,
@@ -2328,88 +1998,12 @@ static struct radeon_asic ci_asic = {
2328 .set_page = &cik_vm_set_page, 1998 .set_page = &cik_vm_set_page,
2329 }, 1999 },
2330 .ring = { 2000 .ring = {
2331 [RADEON_RING_TYPE_GFX_INDEX] = { 2001 [RADEON_RING_TYPE_GFX_INDEX] = &ci_gfx_ring,
2332 .ib_execute = &cik_ring_ib_execute, 2002 [CAYMAN_RING_TYPE_CP1_INDEX] = &ci_cp_ring,
2333 .ib_parse = &cik_ib_parse, 2003 [CAYMAN_RING_TYPE_CP2_INDEX] = &ci_cp_ring,
2334 .emit_fence = &cik_fence_gfx_ring_emit, 2004 [R600_RING_TYPE_DMA_INDEX] = &ci_dma_ring,
2335 .emit_semaphore = &cik_semaphore_ring_emit, 2005 [CAYMAN_RING_TYPE_DMA1_INDEX] = &ci_dma_ring,
2336 .cs_parse = NULL, 2006 [R600_RING_TYPE_UVD_INDEX] = &cayman_uvd_ring,
2337 .ring_test = &cik_ring_test,
2338 .ib_test = &cik_ib_test,
2339 .is_lockup = &cik_gfx_is_lockup,
2340 .vm_flush = &cik_vm_flush,
2341 .get_rptr = &radeon_ring_generic_get_rptr,
2342 .get_wptr = &radeon_ring_generic_get_wptr,
2343 .set_wptr = &radeon_ring_generic_set_wptr,
2344 },
2345 [CAYMAN_RING_TYPE_CP1_INDEX] = {
2346 .ib_execute = &cik_ring_ib_execute,
2347 .ib_parse = &cik_ib_parse,
2348 .emit_fence = &cik_fence_compute_ring_emit,
2349 .emit_semaphore = &cik_semaphore_ring_emit,
2350 .cs_parse = NULL,
2351 .ring_test = &cik_ring_test,
2352 .ib_test = &cik_ib_test,
2353 .is_lockup = &cik_gfx_is_lockup,
2354 .vm_flush = &cik_vm_flush,
2355 .get_rptr = &cik_compute_ring_get_rptr,
2356 .get_wptr = &cik_compute_ring_get_wptr,
2357 .set_wptr = &cik_compute_ring_set_wptr,
2358 },
2359 [CAYMAN_RING_TYPE_CP2_INDEX] = {
2360 .ib_execute = &cik_ring_ib_execute,
2361 .ib_parse = &cik_ib_parse,
2362 .emit_fence = &cik_fence_compute_ring_emit,
2363 .emit_semaphore = &cik_semaphore_ring_emit,
2364 .cs_parse = NULL,
2365 .ring_test = &cik_ring_test,
2366 .ib_test = &cik_ib_test,
2367 .is_lockup = &cik_gfx_is_lockup,
2368 .vm_flush = &cik_vm_flush,
2369 .get_rptr = &cik_compute_ring_get_rptr,
2370 .get_wptr = &cik_compute_ring_get_wptr,
2371 .set_wptr = &cik_compute_ring_set_wptr,
2372 },
2373 [R600_RING_TYPE_DMA_INDEX] = {
2374 .ib_execute = &cik_sdma_ring_ib_execute,
2375 .ib_parse = &cik_ib_parse,
2376 .emit_fence = &cik_sdma_fence_ring_emit,
2377 .emit_semaphore = &cik_sdma_semaphore_ring_emit,
2378 .cs_parse = NULL,
2379 .ring_test = &cik_sdma_ring_test,
2380 .ib_test = &cik_sdma_ib_test,
2381 .is_lockup = &cik_sdma_is_lockup,
2382 .vm_flush = &cik_dma_vm_flush,
2383 .get_rptr = &radeon_ring_generic_get_rptr,
2384 .get_wptr = &radeon_ring_generic_get_wptr,
2385 .set_wptr = &radeon_ring_generic_set_wptr,
2386 },
2387 [CAYMAN_RING_TYPE_DMA1_INDEX] = {
2388 .ib_execute = &cik_sdma_ring_ib_execute,
2389 .ib_parse = &cik_ib_parse,
2390 .emit_fence = &cik_sdma_fence_ring_emit,
2391 .emit_semaphore = &cik_sdma_semaphore_ring_emit,
2392 .cs_parse = NULL,
2393 .ring_test = &cik_sdma_ring_test,
2394 .ib_test = &cik_sdma_ib_test,
2395 .is_lockup = &cik_sdma_is_lockup,
2396 .vm_flush = &cik_dma_vm_flush,
2397 .get_rptr = &radeon_ring_generic_get_rptr,
2398 .get_wptr = &radeon_ring_generic_get_wptr,
2399 .set_wptr = &radeon_ring_generic_set_wptr,
2400 },
2401 [R600_RING_TYPE_UVD_INDEX] = {
2402 .ib_execute = &r600_uvd_ib_execute,
2403 .emit_fence = &r600_uvd_fence_emit,
2404 .emit_semaphore = &cayman_uvd_semaphore_emit,
2405 .cs_parse = &radeon_uvd_cs_parse,
2406 .ring_test = &r600_uvd_ring_test,
2407 .ib_test = &r600_uvd_ib_test,
2408 .is_lockup = &radeon_ring_test_lockup,
2409 .get_rptr = &radeon_ring_generic_get_rptr,
2410 .get_wptr = &radeon_ring_generic_get_wptr,
2411 .set_wptr = &radeon_ring_generic_set_wptr,
2412 }
2413 }, 2007 },
2414 .irq = { 2008 .irq = {
2415 .set = &cik_irq_set, 2009 .set = &cik_irq_set,
@@ -2419,6 +2013,8 @@ static struct radeon_asic ci_asic = {
2419 .bandwidth_update = &dce8_bandwidth_update, 2013 .bandwidth_update = &dce8_bandwidth_update,
2420 .get_vblank_counter = &evergreen_get_vblank_counter, 2014 .get_vblank_counter = &evergreen_get_vblank_counter,
2421 .wait_for_vblank = &dce4_wait_for_vblank, 2015 .wait_for_vblank = &dce4_wait_for_vblank,
2016 .hdmi_enable = &evergreen_hdmi_enable,
2017 .hdmi_setmode = &evergreen_hdmi_setmode,
2422 }, 2018 },
2423 .copy = { 2019 .copy = {
2424 .blit = NULL, 2020 .blit = NULL,
@@ -2452,6 +2048,25 @@ static struct radeon_asic ci_asic = {
2452 .set_pcie_lanes = NULL, 2048 .set_pcie_lanes = NULL,
2453 .set_clock_gating = NULL, 2049 .set_clock_gating = NULL,
2454 .set_uvd_clocks = &cik_set_uvd_clocks, 2050 .set_uvd_clocks = &cik_set_uvd_clocks,
2051 .get_temperature = &ci_get_temp,
2052 },
2053 .dpm = {
2054 .init = &ci_dpm_init,
2055 .setup_asic = &ci_dpm_setup_asic,
2056 .enable = &ci_dpm_enable,
2057 .disable = &ci_dpm_disable,
2058 .pre_set_power_state = &ci_dpm_pre_set_power_state,
2059 .set_power_state = &ci_dpm_set_power_state,
2060 .post_set_power_state = &ci_dpm_post_set_power_state,
2061 .display_configuration_changed = &ci_dpm_display_configuration_changed,
2062 .fini = &ci_dpm_fini,
2063 .get_sclk = &ci_dpm_get_sclk,
2064 .get_mclk = &ci_dpm_get_mclk,
2065 .print_power_state = &ci_dpm_print_power_state,
2066 .debugfs_print_current_performance_level = &ci_dpm_debugfs_print_current_performance_level,
2067 .force_performance_level = &ci_dpm_force_performance_level,
2068 .vblank_too_short = &ci_dpm_vblank_too_short,
2069 .powergate_uvd = &ci_dpm_powergate_uvd,
2455 }, 2070 },
2456 .pflip = { 2071 .pflip = {
2457 .pre_page_flip = &evergreen_pre_page_flip, 2072 .pre_page_flip = &evergreen_pre_page_flip,
@@ -2483,88 +2098,12 @@ static struct radeon_asic kv_asic = {
2483 .set_page = &cik_vm_set_page, 2098 .set_page = &cik_vm_set_page,
2484 }, 2099 },
2485 .ring = { 2100 .ring = {
2486 [RADEON_RING_TYPE_GFX_INDEX] = { 2101 [RADEON_RING_TYPE_GFX_INDEX] = &ci_gfx_ring,
2487 .ib_execute = &cik_ring_ib_execute, 2102 [CAYMAN_RING_TYPE_CP1_INDEX] = &ci_cp_ring,
2488 .ib_parse = &cik_ib_parse, 2103 [CAYMAN_RING_TYPE_CP2_INDEX] = &ci_cp_ring,
2489 .emit_fence = &cik_fence_gfx_ring_emit, 2104 [R600_RING_TYPE_DMA_INDEX] = &ci_dma_ring,
2490 .emit_semaphore = &cik_semaphore_ring_emit, 2105 [CAYMAN_RING_TYPE_DMA1_INDEX] = &ci_dma_ring,
2491 .cs_parse = NULL, 2106 [R600_RING_TYPE_UVD_INDEX] = &cayman_uvd_ring,
2492 .ring_test = &cik_ring_test,
2493 .ib_test = &cik_ib_test,
2494 .is_lockup = &cik_gfx_is_lockup,
2495 .vm_flush = &cik_vm_flush,
2496 .get_rptr = &radeon_ring_generic_get_rptr,
2497 .get_wptr = &radeon_ring_generic_get_wptr,
2498 .set_wptr = &radeon_ring_generic_set_wptr,
2499 },
2500 [CAYMAN_RING_TYPE_CP1_INDEX] = {
2501 .ib_execute = &cik_ring_ib_execute,
2502 .ib_parse = &cik_ib_parse,
2503 .emit_fence = &cik_fence_compute_ring_emit,
2504 .emit_semaphore = &cik_semaphore_ring_emit,
2505 .cs_parse = NULL,
2506 .ring_test = &cik_ring_test,
2507 .ib_test = &cik_ib_test,
2508 .is_lockup = &cik_gfx_is_lockup,
2509 .vm_flush = &cik_vm_flush,
2510 .get_rptr = &cik_compute_ring_get_rptr,
2511 .get_wptr = &cik_compute_ring_get_wptr,
2512 .set_wptr = &cik_compute_ring_set_wptr,
2513 },
2514 [CAYMAN_RING_TYPE_CP2_INDEX] = {
2515 .ib_execute = &cik_ring_ib_execute,
2516 .ib_parse = &cik_ib_parse,
2517 .emit_fence = &cik_fence_compute_ring_emit,
2518 .emit_semaphore = &cik_semaphore_ring_emit,
2519 .cs_parse = NULL,
2520 .ring_test = &cik_ring_test,
2521 .ib_test = &cik_ib_test,
2522 .is_lockup = &cik_gfx_is_lockup,
2523 .vm_flush = &cik_vm_flush,
2524 .get_rptr = &cik_compute_ring_get_rptr,
2525 .get_wptr = &cik_compute_ring_get_wptr,
2526 .set_wptr = &cik_compute_ring_set_wptr,
2527 },
2528 [R600_RING_TYPE_DMA_INDEX] = {
2529 .ib_execute = &cik_sdma_ring_ib_execute,
2530 .ib_parse = &cik_ib_parse,
2531 .emit_fence = &cik_sdma_fence_ring_emit,
2532 .emit_semaphore = &cik_sdma_semaphore_ring_emit,
2533 .cs_parse = NULL,
2534 .ring_test = &cik_sdma_ring_test,
2535 .ib_test = &cik_sdma_ib_test,
2536 .is_lockup = &cik_sdma_is_lockup,
2537 .vm_flush = &cik_dma_vm_flush,
2538 .get_rptr = &radeon_ring_generic_get_rptr,
2539 .get_wptr = &radeon_ring_generic_get_wptr,
2540 .set_wptr = &radeon_ring_generic_set_wptr,
2541 },
2542 [CAYMAN_RING_TYPE_DMA1_INDEX] = {
2543 .ib_execute = &cik_sdma_ring_ib_execute,
2544 .ib_parse = &cik_ib_parse,
2545 .emit_fence = &cik_sdma_fence_ring_emit,
2546 .emit_semaphore = &cik_sdma_semaphore_ring_emit,
2547 .cs_parse = NULL,
2548 .ring_test = &cik_sdma_ring_test,
2549 .ib_test = &cik_sdma_ib_test,
2550 .is_lockup = &cik_sdma_is_lockup,
2551 .vm_flush = &cik_dma_vm_flush,
2552 .get_rptr = &radeon_ring_generic_get_rptr,
2553 .get_wptr = &radeon_ring_generic_get_wptr,
2554 .set_wptr = &radeon_ring_generic_set_wptr,
2555 },
2556 [R600_RING_TYPE_UVD_INDEX] = {
2557 .ib_execute = &r600_uvd_ib_execute,
2558 .emit_fence = &r600_uvd_fence_emit,
2559 .emit_semaphore = &cayman_uvd_semaphore_emit,
2560 .cs_parse = &radeon_uvd_cs_parse,
2561 .ring_test = &r600_uvd_ring_test,
2562 .ib_test = &r600_uvd_ib_test,
2563 .is_lockup = &radeon_ring_test_lockup,
2564 .get_rptr = &radeon_ring_generic_get_rptr,
2565 .get_wptr = &radeon_ring_generic_get_wptr,
2566 .set_wptr = &radeon_ring_generic_set_wptr,
2567 }
2568 }, 2107 },
2569 .irq = { 2108 .irq = {
2570 .set = &cik_irq_set, 2109 .set = &cik_irq_set,
@@ -2574,6 +2113,8 @@ static struct radeon_asic kv_asic = {
2574 .bandwidth_update = &dce8_bandwidth_update, 2113 .bandwidth_update = &dce8_bandwidth_update,
2575 .get_vblank_counter = &evergreen_get_vblank_counter, 2114 .get_vblank_counter = &evergreen_get_vblank_counter,
2576 .wait_for_vblank = &dce4_wait_for_vblank, 2115 .wait_for_vblank = &dce4_wait_for_vblank,
2116 .hdmi_enable = &evergreen_hdmi_enable,
2117 .hdmi_setmode = &evergreen_hdmi_setmode,
2577 }, 2118 },
2578 .copy = { 2119 .copy = {
2579 .blit = NULL, 2120 .blit = NULL,
@@ -2607,6 +2148,24 @@ static struct radeon_asic kv_asic = {
2607 .set_pcie_lanes = NULL, 2148 .set_pcie_lanes = NULL,
2608 .set_clock_gating = NULL, 2149 .set_clock_gating = NULL,
2609 .set_uvd_clocks = &cik_set_uvd_clocks, 2150 .set_uvd_clocks = &cik_set_uvd_clocks,
2151 .get_temperature = &kv_get_temp,
2152 },
2153 .dpm = {
2154 .init = &kv_dpm_init,
2155 .setup_asic = &kv_dpm_setup_asic,
2156 .enable = &kv_dpm_enable,
2157 .disable = &kv_dpm_disable,
2158 .pre_set_power_state = &kv_dpm_pre_set_power_state,
2159 .set_power_state = &kv_dpm_set_power_state,
2160 .post_set_power_state = &kv_dpm_post_set_power_state,
2161 .display_configuration_changed = &kv_dpm_display_configuration_changed,
2162 .fini = &kv_dpm_fini,
2163 .get_sclk = &kv_dpm_get_sclk,
2164 .get_mclk = &kv_dpm_get_mclk,
2165 .print_power_state = &kv_dpm_print_power_state,
2166 .debugfs_print_current_performance_level = &kv_dpm_debugfs_print_current_performance_level,
2167 .force_performance_level = &kv_dpm_force_performance_level,
2168 .powergate_uvd = &kv_dpm_powergate_uvd,
2610 }, 2169 },
2611 .pflip = { 2170 .pflip = {
2612 .pre_page_flip = &evergreen_pre_page_flip, 2171 .pre_page_flip = &evergreen_pre_page_flip,
@@ -2776,19 +2335,188 @@ int radeon_asic_init(struct radeon_device *rdev)
2776 rdev->has_uvd = false; 2335 rdev->has_uvd = false;
2777 else 2336 else
2778 rdev->has_uvd = true; 2337 rdev->has_uvd = true;
2338 switch (rdev->family) {
2339 case CHIP_TAHITI:
2340 rdev->cg_flags =
2341 RADEON_CG_SUPPORT_GFX_MGCG |
2342 RADEON_CG_SUPPORT_GFX_MGLS |
2343 /*RADEON_CG_SUPPORT_GFX_CGCG |*/
2344 RADEON_CG_SUPPORT_GFX_CGLS |
2345 RADEON_CG_SUPPORT_GFX_CGTS |
2346 RADEON_CG_SUPPORT_GFX_CP_LS |
2347 RADEON_CG_SUPPORT_MC_MGCG |
2348 RADEON_CG_SUPPORT_SDMA_MGCG |
2349 RADEON_CG_SUPPORT_BIF_LS |
2350 RADEON_CG_SUPPORT_VCE_MGCG |
2351 RADEON_CG_SUPPORT_UVD_MGCG |
2352 RADEON_CG_SUPPORT_HDP_LS |
2353 RADEON_CG_SUPPORT_HDP_MGCG;
2354 rdev->pg_flags = 0;
2355 break;
2356 case CHIP_PITCAIRN:
2357 rdev->cg_flags =
2358 RADEON_CG_SUPPORT_GFX_MGCG |
2359 RADEON_CG_SUPPORT_GFX_MGLS |
2360 /*RADEON_CG_SUPPORT_GFX_CGCG |*/
2361 RADEON_CG_SUPPORT_GFX_CGLS |
2362 RADEON_CG_SUPPORT_GFX_CGTS |
2363 RADEON_CG_SUPPORT_GFX_CP_LS |
2364 RADEON_CG_SUPPORT_GFX_RLC_LS |
2365 RADEON_CG_SUPPORT_MC_LS |
2366 RADEON_CG_SUPPORT_MC_MGCG |
2367 RADEON_CG_SUPPORT_SDMA_MGCG |
2368 RADEON_CG_SUPPORT_BIF_LS |
2369 RADEON_CG_SUPPORT_VCE_MGCG |
2370 RADEON_CG_SUPPORT_UVD_MGCG |
2371 RADEON_CG_SUPPORT_HDP_LS |
2372 RADEON_CG_SUPPORT_HDP_MGCG;
2373 rdev->pg_flags = 0;
2374 break;
2375 case CHIP_VERDE:
2376 rdev->cg_flags =
2377 RADEON_CG_SUPPORT_GFX_MGCG |
2378 RADEON_CG_SUPPORT_GFX_MGLS |
2379 /*RADEON_CG_SUPPORT_GFX_CGCG |*/
2380 RADEON_CG_SUPPORT_GFX_CGLS |
2381 RADEON_CG_SUPPORT_GFX_CGTS |
2382 RADEON_CG_SUPPORT_GFX_CP_LS |
2383 RADEON_CG_SUPPORT_GFX_RLC_LS |
2384 RADEON_CG_SUPPORT_MC_LS |
2385 RADEON_CG_SUPPORT_MC_MGCG |
2386 RADEON_CG_SUPPORT_SDMA_MGCG |
2387 RADEON_CG_SUPPORT_BIF_LS |
2388 RADEON_CG_SUPPORT_VCE_MGCG |
2389 RADEON_CG_SUPPORT_UVD_MGCG |
2390 RADEON_CG_SUPPORT_HDP_LS |
2391 RADEON_CG_SUPPORT_HDP_MGCG;
2392 rdev->pg_flags = 0 |
2393 /*RADEON_PG_SUPPORT_GFX_CG | */
2394 RADEON_PG_SUPPORT_SDMA;
2395 break;
2396 case CHIP_OLAND:
2397 rdev->cg_flags =
2398 RADEON_CG_SUPPORT_GFX_MGCG |
2399 RADEON_CG_SUPPORT_GFX_MGLS |
2400 /*RADEON_CG_SUPPORT_GFX_CGCG |*/
2401 RADEON_CG_SUPPORT_GFX_CGLS |
2402 RADEON_CG_SUPPORT_GFX_CGTS |
2403 RADEON_CG_SUPPORT_GFX_CP_LS |
2404 RADEON_CG_SUPPORT_GFX_RLC_LS |
2405 RADEON_CG_SUPPORT_MC_LS |
2406 RADEON_CG_SUPPORT_MC_MGCG |
2407 RADEON_CG_SUPPORT_SDMA_MGCG |
2408 RADEON_CG_SUPPORT_BIF_LS |
2409 RADEON_CG_SUPPORT_UVD_MGCG |
2410 RADEON_CG_SUPPORT_HDP_LS |
2411 RADEON_CG_SUPPORT_HDP_MGCG;
2412 rdev->pg_flags = 0;
2413 break;
2414 case CHIP_HAINAN:
2415 rdev->cg_flags =
2416 RADEON_CG_SUPPORT_GFX_MGCG |
2417 RADEON_CG_SUPPORT_GFX_MGLS |
2418 /*RADEON_CG_SUPPORT_GFX_CGCG |*/
2419 RADEON_CG_SUPPORT_GFX_CGLS |
2420 RADEON_CG_SUPPORT_GFX_CGTS |
2421 RADEON_CG_SUPPORT_GFX_CP_LS |
2422 RADEON_CG_SUPPORT_GFX_RLC_LS |
2423 RADEON_CG_SUPPORT_MC_LS |
2424 RADEON_CG_SUPPORT_MC_MGCG |
2425 RADEON_CG_SUPPORT_SDMA_MGCG |
2426 RADEON_CG_SUPPORT_BIF_LS |
2427 RADEON_CG_SUPPORT_HDP_LS |
2428 RADEON_CG_SUPPORT_HDP_MGCG;
2429 rdev->pg_flags = 0;
2430 break;
2431 default:
2432 rdev->cg_flags = 0;
2433 rdev->pg_flags = 0;
2434 break;
2435 }
2779 break; 2436 break;
2780 case CHIP_BONAIRE: 2437 case CHIP_BONAIRE:
2781 rdev->asic = &ci_asic; 2438 rdev->asic = &ci_asic;
2782 rdev->num_crtc = 6; 2439 rdev->num_crtc = 6;
2440 rdev->has_uvd = true;
2441 rdev->cg_flags =
2442 RADEON_CG_SUPPORT_GFX_MGCG |
2443 RADEON_CG_SUPPORT_GFX_MGLS |
2444 /*RADEON_CG_SUPPORT_GFX_CGCG |*/
2445 RADEON_CG_SUPPORT_GFX_CGLS |
2446 RADEON_CG_SUPPORT_GFX_CGTS |
2447 RADEON_CG_SUPPORT_GFX_CGTS_LS |
2448 RADEON_CG_SUPPORT_GFX_CP_LS |
2449 RADEON_CG_SUPPORT_MC_LS |
2450 RADEON_CG_SUPPORT_MC_MGCG |
2451 RADEON_CG_SUPPORT_SDMA_MGCG |
2452 RADEON_CG_SUPPORT_SDMA_LS |
2453 RADEON_CG_SUPPORT_BIF_LS |
2454 RADEON_CG_SUPPORT_VCE_MGCG |
2455 RADEON_CG_SUPPORT_UVD_MGCG |
2456 RADEON_CG_SUPPORT_HDP_LS |
2457 RADEON_CG_SUPPORT_HDP_MGCG;
2458 rdev->pg_flags = 0;
2783 break; 2459 break;
2784 case CHIP_KAVERI: 2460 case CHIP_KAVERI:
2785 case CHIP_KABINI: 2461 case CHIP_KABINI:
2786 rdev->asic = &kv_asic; 2462 rdev->asic = &kv_asic;
2787 /* set num crtcs */ 2463 /* set num crtcs */
2788 if (rdev->family == CHIP_KAVERI) 2464 if (rdev->family == CHIP_KAVERI) {
2789 rdev->num_crtc = 4; 2465 rdev->num_crtc = 4;
2790 else 2466 rdev->cg_flags =
2467 RADEON_CG_SUPPORT_GFX_MGCG |
2468 RADEON_CG_SUPPORT_GFX_MGLS |
2469 /*RADEON_CG_SUPPORT_GFX_CGCG |*/
2470 RADEON_CG_SUPPORT_GFX_CGLS |
2471 RADEON_CG_SUPPORT_GFX_CGTS |
2472 RADEON_CG_SUPPORT_GFX_CGTS_LS |
2473 RADEON_CG_SUPPORT_GFX_CP_LS |
2474 RADEON_CG_SUPPORT_SDMA_MGCG |
2475 RADEON_CG_SUPPORT_SDMA_LS |
2476 RADEON_CG_SUPPORT_BIF_LS |
2477 RADEON_CG_SUPPORT_VCE_MGCG |
2478 RADEON_CG_SUPPORT_UVD_MGCG |
2479 RADEON_CG_SUPPORT_HDP_LS |
2480 RADEON_CG_SUPPORT_HDP_MGCG;
2481 rdev->pg_flags = 0;
2482 /*RADEON_PG_SUPPORT_GFX_CG |
2483 RADEON_PG_SUPPORT_GFX_SMG |
2484 RADEON_PG_SUPPORT_GFX_DMG |
2485 RADEON_PG_SUPPORT_UVD |
2486 RADEON_PG_SUPPORT_VCE |
2487 RADEON_PG_SUPPORT_CP |
2488 RADEON_PG_SUPPORT_GDS |
2489 RADEON_PG_SUPPORT_RLC_SMU_HS |
2490 RADEON_PG_SUPPORT_ACP |
2491 RADEON_PG_SUPPORT_SAMU;*/
2492 } else {
2791 rdev->num_crtc = 2; 2493 rdev->num_crtc = 2;
2494 rdev->cg_flags =
2495 RADEON_CG_SUPPORT_GFX_MGCG |
2496 RADEON_CG_SUPPORT_GFX_MGLS |
2497 /*RADEON_CG_SUPPORT_GFX_CGCG |*/
2498 RADEON_CG_SUPPORT_GFX_CGLS |
2499 RADEON_CG_SUPPORT_GFX_CGTS |
2500 RADEON_CG_SUPPORT_GFX_CGTS_LS |
2501 RADEON_CG_SUPPORT_GFX_CP_LS |
2502 RADEON_CG_SUPPORT_SDMA_MGCG |
2503 RADEON_CG_SUPPORT_SDMA_LS |
2504 RADEON_CG_SUPPORT_BIF_LS |
2505 RADEON_CG_SUPPORT_VCE_MGCG |
2506 RADEON_CG_SUPPORT_UVD_MGCG |
2507 RADEON_CG_SUPPORT_HDP_LS |
2508 RADEON_CG_SUPPORT_HDP_MGCG;
2509 rdev->pg_flags = 0;
2510 /*RADEON_PG_SUPPORT_GFX_CG |
2511 RADEON_PG_SUPPORT_GFX_SMG |
2512 RADEON_PG_SUPPORT_UVD |
2513 RADEON_PG_SUPPORT_VCE |
2514 RADEON_PG_SUPPORT_CP |
2515 RADEON_PG_SUPPORT_GDS |
2516 RADEON_PG_SUPPORT_RLC_SMU_HS |
2517 RADEON_PG_SUPPORT_SAMU;*/
2518 }
2519 rdev->has_uvd = true;
2792 break; 2520 break;
2793 default: 2521 default:
2794 /* FIXME: not supported yet */ 2522 /* FIXME: not supported yet */
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
index 902479fa737f..818bbe6b884b 100644
--- a/drivers/gpu/drm/radeon/radeon_asic.h
+++ b/drivers/gpu/drm/radeon/radeon_asic.h
@@ -336,10 +336,6 @@ int r600_dma_ib_test(struct radeon_device *rdev, struct radeon_ring *ring);
336void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); 336void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
337int r600_ring_test(struct radeon_device *rdev, struct radeon_ring *cp); 337int r600_ring_test(struct radeon_device *rdev, struct radeon_ring *cp);
338int r600_dma_ring_test(struct radeon_device *rdev, struct radeon_ring *cp); 338int r600_dma_ring_test(struct radeon_device *rdev, struct radeon_ring *cp);
339int r600_uvd_ring_test(struct radeon_device *rdev, struct radeon_ring *ring);
340int r600_copy_blit(struct radeon_device *rdev,
341 uint64_t src_offset, uint64_t dst_offset,
342 unsigned num_gpu_pages, struct radeon_fence **fence);
343int r600_copy_cpdma(struct radeon_device *rdev, 339int r600_copy_cpdma(struct radeon_device *rdev,
344 uint64_t src_offset, uint64_t dst_offset, 340 uint64_t src_offset, uint64_t dst_offset,
345 unsigned num_gpu_pages, struct radeon_fence **fence); 341 unsigned num_gpu_pages, struct radeon_fence **fence);
@@ -371,8 +367,6 @@ int r600_count_pipe_bits(uint32_t val);
371int r600_mc_wait_for_idle(struct radeon_device *rdev); 367int r600_mc_wait_for_idle(struct radeon_device *rdev);
372int r600_pcie_gart_init(struct radeon_device *rdev); 368int r600_pcie_gart_init(struct radeon_device *rdev);
373void r600_scratch_init(struct radeon_device *rdev); 369void r600_scratch_init(struct radeon_device *rdev);
374int r600_blit_init(struct radeon_device *rdev);
375void r600_blit_fini(struct radeon_device *rdev);
376int r600_init_microcode(struct radeon_device *rdev); 370int r600_init_microcode(struct radeon_device *rdev);
377/* r600 irq */ 371/* r600 irq */
378int r600_irq_process(struct radeon_device *rdev); 372int r600_irq_process(struct radeon_device *rdev);
@@ -385,28 +379,25 @@ void r600_disable_interrupts(struct radeon_device *rdev);
385void r600_rlc_stop(struct radeon_device *rdev); 379void r600_rlc_stop(struct radeon_device *rdev);
386/* r600 audio */ 380/* r600 audio */
387int r600_audio_init(struct radeon_device *rdev); 381int r600_audio_init(struct radeon_device *rdev);
388struct r600_audio r600_audio_status(struct radeon_device *rdev); 382struct r600_audio_pin r600_audio_status(struct radeon_device *rdev);
389void r600_audio_fini(struct radeon_device *rdev); 383void r600_audio_fini(struct radeon_device *rdev);
390int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder); 384int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder);
391void r600_hdmi_update_audio_settings(struct drm_encoder *encoder); 385void r600_hdmi_update_audio_settings(struct drm_encoder *encoder);
392void r600_hdmi_enable(struct drm_encoder *encoder, bool enable); 386void r600_hdmi_enable(struct drm_encoder *encoder, bool enable);
393void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode); 387void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode);
394/* r600 blit */
395int r600_blit_prepare_copy(struct radeon_device *rdev, unsigned num_gpu_pages,
396 struct radeon_fence **fence, struct radeon_sa_bo **vb,
397 struct radeon_semaphore **sem);
398void r600_blit_done_copy(struct radeon_device *rdev, struct radeon_fence **fence,
399 struct radeon_sa_bo *vb, struct radeon_semaphore *sem);
400void r600_kms_blit_copy(struct radeon_device *rdev,
401 u64 src_gpu_addr, u64 dst_gpu_addr,
402 unsigned num_gpu_pages,
403 struct radeon_sa_bo *vb);
404int r600_mc_wait_for_idle(struct radeon_device *rdev); 388int r600_mc_wait_for_idle(struct radeon_device *rdev);
405u32 r600_get_xclk(struct radeon_device *rdev); 389u32 r600_get_xclk(struct radeon_device *rdev);
406uint64_t r600_get_gpu_clock_counter(struct radeon_device *rdev); 390uint64_t r600_get_gpu_clock_counter(struct radeon_device *rdev);
407int rv6xx_get_temp(struct radeon_device *rdev); 391int rv6xx_get_temp(struct radeon_device *rdev);
408int r600_dpm_pre_set_power_state(struct radeon_device *rdev); 392int r600_dpm_pre_set_power_state(struct radeon_device *rdev);
409void r600_dpm_post_set_power_state(struct radeon_device *rdev); 393void r600_dpm_post_set_power_state(struct radeon_device *rdev);
394/* r600 dma */
395uint32_t r600_dma_get_rptr(struct radeon_device *rdev,
396 struct radeon_ring *ring);
397uint32_t r600_dma_get_wptr(struct radeon_device *rdev,
398 struct radeon_ring *ring);
399void r600_dma_set_wptr(struct radeon_device *rdev,
400 struct radeon_ring *ring);
410/* rv6xx dpm */ 401/* rv6xx dpm */
411int rv6xx_dpm_init(struct radeon_device *rdev); 402int rv6xx_dpm_init(struct radeon_device *rdev);
412int rv6xx_dpm_enable(struct radeon_device *rdev); 403int rv6xx_dpm_enable(struct radeon_device *rdev);
@@ -438,19 +429,6 @@ void rs780_dpm_print_power_state(struct radeon_device *rdev,
438void rs780_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev, 429void rs780_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
439 struct seq_file *m); 430 struct seq_file *m);
440 431
441/* uvd */
442int r600_uvd_init(struct radeon_device *rdev);
443int r600_uvd_rbc_start(struct radeon_device *rdev);
444void r600_uvd_rbc_stop(struct radeon_device *rdev);
445int r600_uvd_ib_test(struct radeon_device *rdev, struct radeon_ring *ring);
446void r600_uvd_fence_emit(struct radeon_device *rdev,
447 struct radeon_fence *fence);
448void r600_uvd_semaphore_emit(struct radeon_device *rdev,
449 struct radeon_ring *ring,
450 struct radeon_semaphore *semaphore,
451 bool emit_wait);
452void r600_uvd_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
453
454/* 432/*
455 * rv770,rv730,rv710,rv740 433 * rv770,rv730,rv710,rv740
456 */ 434 */
@@ -468,7 +446,6 @@ int rv770_copy_dma(struct radeon_device *rdev,
468 unsigned num_gpu_pages, 446 unsigned num_gpu_pages,
469 struct radeon_fence **fence); 447 struct radeon_fence **fence);
470u32 rv770_get_xclk(struct radeon_device *rdev); 448u32 rv770_get_xclk(struct radeon_device *rdev);
471int rv770_uvd_resume(struct radeon_device *rdev);
472int rv770_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); 449int rv770_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
473int rv770_get_temp(struct radeon_device *rdev); 450int rv770_get_temp(struct radeon_device *rdev);
474/* rv7xx pm */ 451/* rv7xx pm */
@@ -530,7 +507,6 @@ extern u32 evergreen_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_ba
530extern void evergreen_post_page_flip(struct radeon_device *rdev, int crtc); 507extern void evergreen_post_page_flip(struct radeon_device *rdev, int crtc);
531extern void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc); 508extern void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc);
532void evergreen_disable_interrupt_state(struct radeon_device *rdev); 509void evergreen_disable_interrupt_state(struct radeon_device *rdev);
533int evergreen_blit_init(struct radeon_device *rdev);
534int evergreen_mc_wait_for_idle(struct radeon_device *rdev); 510int evergreen_mc_wait_for_idle(struct radeon_device *rdev);
535void evergreen_dma_fence_ring_emit(struct radeon_device *rdev, 511void evergreen_dma_fence_ring_emit(struct radeon_device *rdev,
536 struct radeon_fence *fence); 512 struct radeon_fence *fence);
@@ -652,6 +628,8 @@ int trinity_dpm_force_performance_level(struct radeon_device *rdev,
652 628
653/* DCE6 - SI */ 629/* DCE6 - SI */
654void dce6_bandwidth_update(struct radeon_device *rdev); 630void dce6_bandwidth_update(struct radeon_device *rdev);
631int dce6_audio_init(struct radeon_device *rdev);
632void dce6_audio_fini(struct radeon_device *rdev);
655 633
656/* 634/*
657 * si 635 * si
@@ -712,7 +690,6 @@ u32 cik_get_xclk(struct radeon_device *rdev);
712uint32_t cik_pciep_rreg(struct radeon_device *rdev, uint32_t reg); 690uint32_t cik_pciep_rreg(struct radeon_device *rdev, uint32_t reg);
713void cik_pciep_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); 691void cik_pciep_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
714int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk); 692int cik_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
715int cik_uvd_resume(struct radeon_device *rdev);
716void cik_sdma_fence_ring_emit(struct radeon_device *rdev, 693void cik_sdma_fence_ring_emit(struct radeon_device *rdev,
717 struct radeon_fence *fence); 694 struct radeon_fence *fence);
718void cik_sdma_semaphore_ring_emit(struct radeon_device *rdev, 695void cik_sdma_semaphore_ring_emit(struct radeon_device *rdev,
@@ -763,5 +740,81 @@ u32 cik_compute_ring_get_wptr(struct radeon_device *rdev,
763 struct radeon_ring *ring); 740 struct radeon_ring *ring);
764void cik_compute_ring_set_wptr(struct radeon_device *rdev, 741void cik_compute_ring_set_wptr(struct radeon_device *rdev,
765 struct radeon_ring *ring); 742 struct radeon_ring *ring);
743int ci_get_temp(struct radeon_device *rdev);
744int kv_get_temp(struct radeon_device *rdev);
745
746int ci_dpm_init(struct radeon_device *rdev);
747int ci_dpm_enable(struct radeon_device *rdev);
748void ci_dpm_disable(struct radeon_device *rdev);
749int ci_dpm_pre_set_power_state(struct radeon_device *rdev);
750int ci_dpm_set_power_state(struct radeon_device *rdev);
751void ci_dpm_post_set_power_state(struct radeon_device *rdev);
752void ci_dpm_setup_asic(struct radeon_device *rdev);
753void ci_dpm_display_configuration_changed(struct radeon_device *rdev);
754void ci_dpm_fini(struct radeon_device *rdev);
755u32 ci_dpm_get_sclk(struct radeon_device *rdev, bool low);
756u32 ci_dpm_get_mclk(struct radeon_device *rdev, bool low);
757void ci_dpm_print_power_state(struct radeon_device *rdev,
758 struct radeon_ps *ps);
759void ci_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
760 struct seq_file *m);
761int ci_dpm_force_performance_level(struct radeon_device *rdev,
762 enum radeon_dpm_forced_level level);
763bool ci_dpm_vblank_too_short(struct radeon_device *rdev);
764void ci_dpm_powergate_uvd(struct radeon_device *rdev, bool gate);
765
766int kv_dpm_init(struct radeon_device *rdev);
767int kv_dpm_enable(struct radeon_device *rdev);
768void kv_dpm_disable(struct radeon_device *rdev);
769int kv_dpm_pre_set_power_state(struct radeon_device *rdev);
770int kv_dpm_set_power_state(struct radeon_device *rdev);
771void kv_dpm_post_set_power_state(struct radeon_device *rdev);
772void kv_dpm_setup_asic(struct radeon_device *rdev);
773void kv_dpm_display_configuration_changed(struct radeon_device *rdev);
774void kv_dpm_fini(struct radeon_device *rdev);
775u32 kv_dpm_get_sclk(struct radeon_device *rdev, bool low);
776u32 kv_dpm_get_mclk(struct radeon_device *rdev, bool low);
777void kv_dpm_print_power_state(struct radeon_device *rdev,
778 struct radeon_ps *ps);
779void kv_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,
780 struct seq_file *m);
781int kv_dpm_force_performance_level(struct radeon_device *rdev,
782 enum radeon_dpm_forced_level level);
783void kv_dpm_powergate_uvd(struct radeon_device *rdev, bool gate);
784
785/* uvd v1.0 */
786uint32_t uvd_v1_0_get_rptr(struct radeon_device *rdev,
787 struct radeon_ring *ring);
788uint32_t uvd_v1_0_get_wptr(struct radeon_device *rdev,
789 struct radeon_ring *ring);
790void uvd_v1_0_set_wptr(struct radeon_device *rdev,
791 struct radeon_ring *ring);
792
793int uvd_v1_0_init(struct radeon_device *rdev);
794void uvd_v1_0_fini(struct radeon_device *rdev);
795int uvd_v1_0_start(struct radeon_device *rdev);
796void uvd_v1_0_stop(struct radeon_device *rdev);
797
798int uvd_v1_0_ring_test(struct radeon_device *rdev, struct radeon_ring *ring);
799int uvd_v1_0_ib_test(struct radeon_device *rdev, struct radeon_ring *ring);
800void uvd_v1_0_semaphore_emit(struct radeon_device *rdev,
801 struct radeon_ring *ring,
802 struct radeon_semaphore *semaphore,
803 bool emit_wait);
804void uvd_v1_0_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
805
806/* uvd v2.2 */
807int uvd_v2_2_resume(struct radeon_device *rdev);
808void uvd_v2_2_fence_emit(struct radeon_device *rdev,
809 struct radeon_fence *fence);
810
811/* uvd v3.1 */
812void uvd_v3_1_semaphore_emit(struct radeon_device *rdev,
813 struct radeon_ring *ring,
814 struct radeon_semaphore *semaphore,
815 bool emit_wait);
816
817/* uvd v4.2 */
818int uvd_v4_2_resume(struct radeon_device *rdev);
766 819
767#endif 820#endif
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index e3f3e8841789..404e25d285ba 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -163,8 +163,8 @@ static struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_device *rd
163 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 163 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
164 sizeof(ATOM_GPIO_I2C_ASSIGMENT); 164 sizeof(ATOM_GPIO_I2C_ASSIGMENT);
165 165
166 gpio = &i2c_info->asGPIO_Info[0];
166 for (i = 0; i < num_indices; i++) { 167 for (i = 0; i < num_indices; i++) {
167 gpio = &i2c_info->asGPIO_Info[i];
168 168
169 radeon_lookup_i2c_gpio_quirks(rdev, gpio, i); 169 radeon_lookup_i2c_gpio_quirks(rdev, gpio, i);
170 170
@@ -172,6 +172,8 @@ static struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_device *rd
172 i2c = radeon_get_bus_rec_for_i2c_gpio(gpio); 172 i2c = radeon_get_bus_rec_for_i2c_gpio(gpio);
173 break; 173 break;
174 } 174 }
175 gpio = (ATOM_GPIO_I2C_ASSIGMENT *)
176 ((u8 *)gpio + sizeof(ATOM_GPIO_I2C_ASSIGMENT));
175 } 177 }
176 } 178 }
177 179
@@ -195,9 +197,8 @@ void radeon_atombios_i2c_init(struct radeon_device *rdev)
195 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 197 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
196 sizeof(ATOM_GPIO_I2C_ASSIGMENT); 198 sizeof(ATOM_GPIO_I2C_ASSIGMENT);
197 199
200 gpio = &i2c_info->asGPIO_Info[0];
198 for (i = 0; i < num_indices; i++) { 201 for (i = 0; i < num_indices; i++) {
199 gpio = &i2c_info->asGPIO_Info[i];
200
201 radeon_lookup_i2c_gpio_quirks(rdev, gpio, i); 202 radeon_lookup_i2c_gpio_quirks(rdev, gpio, i);
202 203
203 i2c = radeon_get_bus_rec_for_i2c_gpio(gpio); 204 i2c = radeon_get_bus_rec_for_i2c_gpio(gpio);
@@ -206,12 +207,14 @@ void radeon_atombios_i2c_init(struct radeon_device *rdev)
206 sprintf(stmp, "0x%x", i2c.i2c_id); 207 sprintf(stmp, "0x%x", i2c.i2c_id);
207 rdev->i2c_bus[i] = radeon_i2c_create(rdev->ddev, &i2c, stmp); 208 rdev->i2c_bus[i] = radeon_i2c_create(rdev->ddev, &i2c, stmp);
208 } 209 }
210 gpio = (ATOM_GPIO_I2C_ASSIGMENT *)
211 ((u8 *)gpio + sizeof(ATOM_GPIO_I2C_ASSIGMENT));
209 } 212 }
210 } 213 }
211} 214}
212 215
213static struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev, 216static struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
214 u8 id) 217 u8 id)
215{ 218{
216 struct atom_context *ctx = rdev->mode_info.atom_context; 219 struct atom_context *ctx = rdev->mode_info.atom_context;
217 struct radeon_gpio_rec gpio; 220 struct radeon_gpio_rec gpio;
@@ -230,8 +233,8 @@ static struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
230 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 233 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
231 sizeof(ATOM_GPIO_PIN_ASSIGNMENT); 234 sizeof(ATOM_GPIO_PIN_ASSIGNMENT);
232 235
236 pin = gpio_info->asGPIO_Pin;
233 for (i = 0; i < num_indices; i++) { 237 for (i = 0; i < num_indices; i++) {
234 pin = &gpio_info->asGPIO_Pin[i];
235 if (id == pin->ucGPIO_ID) { 238 if (id == pin->ucGPIO_ID) {
236 gpio.id = pin->ucGPIO_ID; 239 gpio.id = pin->ucGPIO_ID;
237 gpio.reg = le16_to_cpu(pin->usGpioPin_AIndex) * 4; 240 gpio.reg = le16_to_cpu(pin->usGpioPin_AIndex) * 4;
@@ -239,6 +242,8 @@ static struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
239 gpio.valid = true; 242 gpio.valid = true;
240 break; 243 break;
241 } 244 }
245 pin = (ATOM_GPIO_PIN_ASSIGNMENT *)
246 ((u8 *)pin + sizeof(ATOM_GPIO_PIN_ASSIGNMENT));
242 } 247 }
243 } 248 }
244 249
@@ -711,13 +716,16 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
711 (ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *) 716 (ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *)
712 (ctx->bios + data_offset + 717 (ctx->bios + data_offset +
713 le16_to_cpu(router_obj->asObjects[k].usSrcDstTableOffset)); 718 le16_to_cpu(router_obj->asObjects[k].usSrcDstTableOffset));
719 u8 *num_dst_objs = (u8 *)
720 ((u8 *)router_src_dst_table + 1 +
721 (router_src_dst_table->ucNumberOfSrc * 2));
722 u16 *dst_objs = (u16 *)(num_dst_objs + 1);
714 int enum_id; 723 int enum_id;
715 724
716 router.router_id = router_obj_id; 725 router.router_id = router_obj_id;
717 for (enum_id = 0; enum_id < router_src_dst_table->ucNumberOfDst; 726 for (enum_id = 0; enum_id < (*num_dst_objs); enum_id++) {
718 enum_id++) {
719 if (le16_to_cpu(path->usConnObjectId) == 727 if (le16_to_cpu(path->usConnObjectId) ==
720 le16_to_cpu(router_src_dst_table->usDstObjectID[enum_id])) 728 le16_to_cpu(dst_objs[enum_id]))
721 break; 729 break;
722 } 730 }
723 731
@@ -1480,6 +1488,15 @@ bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
1480 uint8_t frev, crev; 1488 uint8_t frev, crev;
1481 int i, num_indices; 1489 int i, num_indices;
1482 1490
1491 if (id == ASIC_INTERNAL_MEMORY_SS) {
1492 if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_MEMORY_CLOCK_SS_SUPPORT))
1493 return false;
1494 }
1495 if (id == ASIC_INTERNAL_ENGINE_SS) {
1496 if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_ENGINE_CLOCK_SS_SUPPORT))
1497 return false;
1498 }
1499
1483 memset(ss, 0, sizeof(struct radeon_atom_ss)); 1500 memset(ss, 0, sizeof(struct radeon_atom_ss));
1484 if (atom_parse_data_header(mode_info->atom_context, index, &size, 1501 if (atom_parse_data_header(mode_info->atom_context, index, &size,
1485 &frev, &crev, &data_offset)) { 1502 &frev, &crev, &data_offset)) {
@@ -1672,7 +1689,9 @@ struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
1672 kfree(edid); 1689 kfree(edid);
1673 } 1690 }
1674 } 1691 }
1675 record += sizeof(ATOM_FAKE_EDID_PATCH_RECORD); 1692 record += fake_edid_record->ucFakeEDIDLength ?
1693 fake_edid_record->ucFakeEDIDLength + 2 :
1694 sizeof(ATOM_FAKE_EDID_PATCH_RECORD);
1676 break; 1695 break;
1677 case LCD_PANEL_RESOLUTION_RECORD_TYPE: 1696 case LCD_PANEL_RESOLUTION_RECORD_TYPE:
1678 panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record; 1697 panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
@@ -2237,6 +2256,11 @@ static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *r
2237 (controller->ucFanParameters & 2256 (controller->ucFanParameters &
2238 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2257 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2239 rdev->pm.int_thermal_type = THERMAL_TYPE_CI; 2258 rdev->pm.int_thermal_type = THERMAL_TYPE_CI;
2259 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_KAVERI) {
2260 DRM_INFO("Internal thermal controller %s fan control\n",
2261 (controller->ucFanParameters &
2262 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2263 rdev->pm.int_thermal_type = THERMAL_TYPE_KV;
2240 } else if ((controller->ucType == 2264 } else if ((controller->ucType ==
2241 ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) || 2265 ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) ||
2242 (controller->ucType == 2266 (controller->ucType ==
@@ -2782,7 +2806,7 @@ int radeon_atom_get_clock_dividers(struct radeon_device *rdev,
2782 ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false; 2806 ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false;
2783 dividers->enable_dithen = (args.v3.ucCntlFlag & 2807 dividers->enable_dithen = (args.v3.ucCntlFlag &
2784 ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true; 2808 ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true;
2785 dividers->fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDiv); 2809 dividers->whole_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDiv);
2786 dividers->frac_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDivFrac); 2810 dividers->frac_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDivFrac);
2787 dividers->ref_div = args.v3.ucRefDiv; 2811 dividers->ref_div = args.v3.ucRefDiv;
2788 dividers->vco_mode = (args.v3.ucCntlFlag & 2812 dividers->vco_mode = (args.v3.ucCntlFlag &
@@ -3077,6 +3101,121 @@ int radeon_atom_get_leakage_vddc_based_on_leakage_idx(struct radeon_device *rdev
3077 return radeon_atom_get_max_vddc(rdev, VOLTAGE_TYPE_VDDC, leakage_idx, voltage); 3101 return radeon_atom_get_max_vddc(rdev, VOLTAGE_TYPE_VDDC, leakage_idx, voltage);
3078} 3102}
3079 3103
3104int radeon_atom_get_leakage_id_from_vbios(struct radeon_device *rdev,
3105 u16 *leakage_id)
3106{
3107 union set_voltage args;
3108 int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
3109 u8 frev, crev;
3110
3111 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
3112 return -EINVAL;
3113
3114 switch (crev) {
3115 case 3:
3116 case 4:
3117 args.v3.ucVoltageType = 0;
3118 args.v3.ucVoltageMode = ATOM_GET_LEAKAGE_ID;
3119 args.v3.usVoltageLevel = 0;
3120
3121 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
3122
3123 *leakage_id = le16_to_cpu(args.v3.usVoltageLevel);
3124 break;
3125 default:
3126 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3127 return -EINVAL;
3128 }
3129
3130 return 0;
3131}
3132
3133int radeon_atom_get_leakage_vddc_based_on_leakage_params(struct radeon_device *rdev,
3134 u16 *vddc, u16 *vddci,
3135 u16 virtual_voltage_id,
3136 u16 vbios_voltage_id)
3137{
3138 int index = GetIndexIntoMasterTable(DATA, ASIC_ProfilingInfo);
3139 u8 frev, crev;
3140 u16 data_offset, size;
3141 int i, j;
3142 ATOM_ASIC_PROFILING_INFO_V2_1 *profile;
3143 u16 *leakage_bin, *vddc_id_buf, *vddc_buf, *vddci_id_buf, *vddci_buf;
3144
3145 *vddc = 0;
3146 *vddci = 0;
3147
3148 if (!atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
3149 &frev, &crev, &data_offset))
3150 return -EINVAL;
3151
3152 profile = (ATOM_ASIC_PROFILING_INFO_V2_1 *)
3153 (rdev->mode_info.atom_context->bios + data_offset);
3154
3155 switch (frev) {
3156 case 1:
3157 return -EINVAL;
3158 case 2:
3159 switch (crev) {
3160 case 1:
3161 if (size < sizeof(ATOM_ASIC_PROFILING_INFO_V2_1))
3162 return -EINVAL;
3163 leakage_bin = (u16 *)
3164 (rdev->mode_info.atom_context->bios + data_offset +
3165 le16_to_cpu(profile->usLeakageBinArrayOffset));
3166 vddc_id_buf = (u16 *)
3167 (rdev->mode_info.atom_context->bios + data_offset +
3168 le16_to_cpu(profile->usElbVDDC_IdArrayOffset));
3169 vddc_buf = (u16 *)
3170 (rdev->mode_info.atom_context->bios + data_offset +
3171 le16_to_cpu(profile->usElbVDDC_LevelArrayOffset));
3172 vddci_id_buf = (u16 *)
3173 (rdev->mode_info.atom_context->bios + data_offset +
3174 le16_to_cpu(profile->usElbVDDCI_IdArrayOffset));
3175 vddci_buf = (u16 *)
3176 (rdev->mode_info.atom_context->bios + data_offset +
3177 le16_to_cpu(profile->usElbVDDCI_LevelArrayOffset));
3178
3179 if (profile->ucElbVDDC_Num > 0) {
3180 for (i = 0; i < profile->ucElbVDDC_Num; i++) {
3181 if (vddc_id_buf[i] == virtual_voltage_id) {
3182 for (j = 0; j < profile->ucLeakageBinNum; j++) {
3183 if (vbios_voltage_id <= leakage_bin[j]) {
3184 *vddc = vddc_buf[j * profile->ucElbVDDC_Num + i];
3185 break;
3186 }
3187 }
3188 break;
3189 }
3190 }
3191 }
3192 if (profile->ucElbVDDCI_Num > 0) {
3193 for (i = 0; i < profile->ucElbVDDCI_Num; i++) {
3194 if (vddci_id_buf[i] == virtual_voltage_id) {
3195 for (j = 0; j < profile->ucLeakageBinNum; j++) {
3196 if (vbios_voltage_id <= leakage_bin[j]) {
3197 *vddci = vddci_buf[j * profile->ucElbVDDCI_Num + i];
3198 break;
3199 }
3200 }
3201 break;
3202 }
3203 }
3204 }
3205 break;
3206 default:
3207 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3208 return -EINVAL;
3209 }
3210 break;
3211 default:
3212 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3213 return -EINVAL;
3214 }
3215
3216 return 0;
3217}
3218
3080int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev, 3219int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev,
3081 u16 voltage_level, u8 voltage_type, 3220 u16 voltage_level, u8 voltage_type,
3082 u32 *gpio_value, u32 *gpio_mask) 3221 u32 *gpio_value, u32 *gpio_mask)
@@ -3279,10 +3418,11 @@ int radeon_atom_get_max_voltage(struct radeon_device *rdev,
3279 ATOM_VOLTAGE_FORMULA_V2 *formula = 3418 ATOM_VOLTAGE_FORMULA_V2 *formula =
3280 &voltage_object->v2.asFormula; 3419 &voltage_object->v2.asFormula;
3281 if (formula->ucNumOfVoltageEntries) { 3420 if (formula->ucNumOfVoltageEntries) {
3421 VOLTAGE_LUT_ENTRY *lut = (VOLTAGE_LUT_ENTRY *)
3422 ((u8 *)&formula->asVIDAdjustEntries[0] +
3423 (sizeof(VOLTAGE_LUT_ENTRY) * (formula->ucNumOfVoltageEntries - 1)));
3282 *max_voltage = 3424 *max_voltage =
3283 le16_to_cpu(formula->asVIDAdjustEntries[ 3425 le16_to_cpu(lut->usVoltageValue);
3284 formula->ucNumOfVoltageEntries - 1
3285 ].usVoltageValue);
3286 return 0; 3426 return 0;
3287 } 3427 }
3288 } 3428 }
@@ -3442,11 +3582,13 @@ int radeon_atom_get_voltage_table(struct radeon_device *rdev,
3442 if (voltage_object) { 3582 if (voltage_object) {
3443 ATOM_VOLTAGE_FORMULA_V2 *formula = 3583 ATOM_VOLTAGE_FORMULA_V2 *formula =
3444 &voltage_object->v2.asFormula; 3584 &voltage_object->v2.asFormula;
3585 VOLTAGE_LUT_ENTRY *lut;
3445 if (formula->ucNumOfVoltageEntries > MAX_VOLTAGE_ENTRIES) 3586 if (formula->ucNumOfVoltageEntries > MAX_VOLTAGE_ENTRIES)
3446 return -EINVAL; 3587 return -EINVAL;
3588 lut = &formula->asVIDAdjustEntries[0];
3447 for (i = 0; i < formula->ucNumOfVoltageEntries; i++) { 3589 for (i = 0; i < formula->ucNumOfVoltageEntries; i++) {
3448 voltage_table->entries[i].value = 3590 voltage_table->entries[i].value =
3449 le16_to_cpu(formula->asVIDAdjustEntries[i].usVoltageValue); 3591 le16_to_cpu(lut->usVoltageValue);
3450 ret = radeon_atom_get_voltage_gpio_settings(rdev, 3592 ret = radeon_atom_get_voltage_gpio_settings(rdev,
3451 voltage_table->entries[i].value, 3593 voltage_table->entries[i].value,
3452 voltage_type, 3594 voltage_type,
@@ -3454,6 +3596,8 @@ int radeon_atom_get_voltage_table(struct radeon_device *rdev,
3454 &voltage_table->mask_low); 3596 &voltage_table->mask_low);
3455 if (ret) 3597 if (ret)
3456 return ret; 3598 return ret;
3599 lut = (VOLTAGE_LUT_ENTRY *)
3600 ((u8 *)lut + sizeof(VOLTAGE_LUT_ENTRY));
3457 } 3601 }
3458 voltage_table->count = formula->ucNumOfVoltageEntries; 3602 voltage_table->count = formula->ucNumOfVoltageEntries;
3459 return 0; 3603 return 0;
@@ -3473,13 +3617,17 @@ int radeon_atom_get_voltage_table(struct radeon_device *rdev,
3473 if (voltage_object) { 3617 if (voltage_object) {
3474 ATOM_GPIO_VOLTAGE_OBJECT_V3 *gpio = 3618 ATOM_GPIO_VOLTAGE_OBJECT_V3 *gpio =
3475 &voltage_object->v3.asGpioVoltageObj; 3619 &voltage_object->v3.asGpioVoltageObj;
3620 VOLTAGE_LUT_ENTRY_V2 *lut;
3476 if (gpio->ucGpioEntryNum > MAX_VOLTAGE_ENTRIES) 3621 if (gpio->ucGpioEntryNum > MAX_VOLTAGE_ENTRIES)
3477 return -EINVAL; 3622 return -EINVAL;
3623 lut = &gpio->asVolGpioLut[0];
3478 for (i = 0; i < gpio->ucGpioEntryNum; i++) { 3624 for (i = 0; i < gpio->ucGpioEntryNum; i++) {
3479 voltage_table->entries[i].value = 3625 voltage_table->entries[i].value =
3480 le16_to_cpu(gpio->asVolGpioLut[i].usVoltageValue); 3626 le16_to_cpu(lut->usVoltageValue);
3481 voltage_table->entries[i].smio_low = 3627 voltage_table->entries[i].smio_low =
3482 le32_to_cpu(gpio->asVolGpioLut[i].ulVoltageId); 3628 le32_to_cpu(lut->ulVoltageId);
3629 lut = (VOLTAGE_LUT_ENTRY_V2 *)
3630 ((u8 *)lut + sizeof(VOLTAGE_LUT_ENTRY_V2));
3483 } 3631 }
3484 voltage_table->mask_low = le32_to_cpu(gpio->ulGpioMaskVal); 3632 voltage_table->mask_low = le32_to_cpu(gpio->ulGpioMaskVal);
3485 voltage_table->count = gpio->ucGpioEntryNum; 3633 voltage_table->count = gpio->ucGpioEntryNum;
@@ -3605,7 +3753,6 @@ int radeon_atom_get_mclk_range_table(struct radeon_device *rdev,
3605 union vram_info *vram_info; 3753 union vram_info *vram_info;
3606 u32 mem_timing_size = gddr5 ? 3754 u32 mem_timing_size = gddr5 ?
3607 sizeof(ATOM_MEMORY_TIMING_FORMAT_V2) : sizeof(ATOM_MEMORY_TIMING_FORMAT); 3755 sizeof(ATOM_MEMORY_TIMING_FORMAT_V2) : sizeof(ATOM_MEMORY_TIMING_FORMAT);
3608 u8 *p;
3609 3756
3610 memset(mclk_range_table, 0, sizeof(struct atom_memory_clock_range_table)); 3757 memset(mclk_range_table, 0, sizeof(struct atom_memory_clock_range_table));
3611 3758
@@ -3624,6 +3771,7 @@ int radeon_atom_get_mclk_range_table(struct radeon_device *rdev,
3624 if (module_index < vram_info->v1_4.ucNumOfVRAMModule) { 3771 if (module_index < vram_info->v1_4.ucNumOfVRAMModule) {
3625 ATOM_VRAM_MODULE_V4 *vram_module = 3772 ATOM_VRAM_MODULE_V4 *vram_module =
3626 (ATOM_VRAM_MODULE_V4 *)vram_info->v1_4.aVramInfo; 3773 (ATOM_VRAM_MODULE_V4 *)vram_info->v1_4.aVramInfo;
3774 ATOM_MEMORY_TIMING_FORMAT *format;
3627 3775
3628 for (i = 0; i < module_index; i++) { 3776 for (i = 0; i < module_index; i++) {
3629 if (le16_to_cpu(vram_module->usModuleSize) == 0) 3777 if (le16_to_cpu(vram_module->usModuleSize) == 0)
@@ -3634,11 +3782,11 @@ int radeon_atom_get_mclk_range_table(struct radeon_device *rdev,
3634 mclk_range_table->num_entries = (u8) 3782 mclk_range_table->num_entries = (u8)
3635 ((le16_to_cpu(vram_module->usModuleSize) - offsetof(ATOM_VRAM_MODULE_V4, asMemTiming)) / 3783 ((le16_to_cpu(vram_module->usModuleSize) - offsetof(ATOM_VRAM_MODULE_V4, asMemTiming)) /
3636 mem_timing_size); 3784 mem_timing_size);
3637 p = (u8 *)&vram_module->asMemTiming[0]; 3785 format = &vram_module->asMemTiming[0];
3638 for (i = 0; i < mclk_range_table->num_entries; i++) { 3786 for (i = 0; i < mclk_range_table->num_entries; i++) {
3639 ATOM_MEMORY_TIMING_FORMAT *format = (ATOM_MEMORY_TIMING_FORMAT *)p;
3640 mclk_range_table->mclk[i] = le32_to_cpu(format->ulClkRange); 3787 mclk_range_table->mclk[i] = le32_to_cpu(format->ulClkRange);
3641 p += mem_timing_size; 3788 format = (ATOM_MEMORY_TIMING_FORMAT *)
3789 ((u8 *)format + mem_timing_size);
3642 } 3790 }
3643 } else 3791 } else
3644 return -EINVAL; 3792 return -EINVAL;
diff --git a/drivers/gpu/drm/radeon/radeon_blit_common.h b/drivers/gpu/drm/radeon/radeon_blit_common.h
deleted file mode 100644
index 4ecbe72c9d2d..000000000000
--- a/drivers/gpu/drm/radeon/radeon_blit_common.h
+++ /dev/null
@@ -1,44 +0,0 @@
1/*
2 * Copyright 2009 Advanced Micro Devices, Inc.
3 * Copyright 2009 Red Hat Inc.
4 * Copyright 2012 Alcatel-Lucent, Inc.
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 (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
15 * Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE COPYRIGHT HOLDER(S) AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
24 *
25 */
26
27#ifndef __RADEON_BLIT_COMMON_H__
28
29#define DI_PT_RECTLIST 0x11
30#define DI_INDEX_SIZE_16_BIT 0x0
31#define DI_SRC_SEL_AUTO_INDEX 0x2
32
33#define FMT_8 0x1
34#define FMT_5_6_5 0x8
35#define FMT_8_8_8_8 0x1a
36#define COLOR_8 0x1
37#define COLOR_5_6_5 0x8
38#define COLOR_8_8_8_8 0x1a
39
40#define RECT_UNIT_H 32
41#define RECT_UNIT_W (RADEON_GPU_PAGE_SIZE / 4 / RECT_UNIT_H)
42
43#define __RADEON_BLIT_COMMON_H__
44#endif
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index 13a130fb3517..a56084410372 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -268,7 +268,7 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
268 return -EINVAL; 268 return -EINVAL;
269 269
270 /* we only support VM on some SI+ rings */ 270 /* we only support VM on some SI+ rings */
271 if ((p->rdev->asic->ring[p->ring].cs_parse == NULL) && 271 if ((p->rdev->asic->ring[p->ring]->cs_parse == NULL) &&
272 ((p->cs_flags & RADEON_CS_USE_VM) == 0)) { 272 ((p->cs_flags & RADEON_CS_USE_VM) == 0)) {
273 DRM_ERROR("Ring %d requires VM!\n", p->ring); 273 DRM_ERROR("Ring %d requires VM!\n", p->ring);
274 return -EINVAL; 274 return -EINVAL;
@@ -383,6 +383,10 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev,
383 DRM_ERROR("Invalid command stream !\n"); 383 DRM_ERROR("Invalid command stream !\n");
384 return r; 384 return r;
385 } 385 }
386
387 if (parser->ring == R600_RING_TYPE_UVD_INDEX)
388 radeon_uvd_note_usage(rdev);
389
386 radeon_cs_sync_rings(parser); 390 radeon_cs_sync_rings(parser);
387 r = radeon_ib_schedule(rdev, &parser->ib, NULL); 391 r = radeon_ib_schedule(rdev, &parser->ib, NULL);
388 if (r) { 392 if (r) {
@@ -474,6 +478,9 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,
474 return r; 478 return r;
475 } 479 }
476 480
481 if (parser->ring == R600_RING_TYPE_UVD_INDEX)
482 radeon_uvd_note_usage(rdev);
483
477 mutex_lock(&rdev->vm_manager.lock); 484 mutex_lock(&rdev->vm_manager.lock);
478 mutex_lock(&vm->mutex); 485 mutex_lock(&vm->mutex);
479 r = radeon_vm_alloc_pt(rdev, vm); 486 r = radeon_vm_alloc_pt(rdev, vm);
@@ -552,10 +559,6 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
552 return r; 559 return r;
553 } 560 }
554 561
555 /* XXX pick SD/HD/MVC */
556 if (parser.ring == R600_RING_TYPE_UVD_INDEX)
557 radeon_uvd_note_usage(rdev);
558
559 r = radeon_cs_ib_chunk(rdev, &parser); 562 r = radeon_cs_ib_chunk(rdev, &parser);
560 if (r) { 563 if (r) {
561 goto out; 564 goto out;
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 0610ca4fb6a3..16cb8792b1e6 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1003,16 +1003,28 @@ static void radeon_check_arguments(struct radeon_device *rdev)
1003 radeon_vram_limit = 0; 1003 radeon_vram_limit = 0;
1004 } 1004 }
1005 1005
1006 if (radeon_gart_size == -1) {
1007 /* default to a larger gart size on newer asics */
1008 if (rdev->family >= CHIP_RV770)
1009 radeon_gart_size = 1024;
1010 else
1011 radeon_gart_size = 512;
1012 }
1006 /* gtt size must be power of two and greater or equal to 32M */ 1013 /* gtt size must be power of two and greater or equal to 32M */
1007 if (radeon_gart_size < 32) { 1014 if (radeon_gart_size < 32) {
1008 dev_warn(rdev->dev, "gart size (%d) too small forcing to 512M\n", 1015 dev_warn(rdev->dev, "gart size (%d) too small\n",
1009 radeon_gart_size); 1016 radeon_gart_size);
1010 radeon_gart_size = 512; 1017 if (rdev->family >= CHIP_RV770)
1011 1018 radeon_gart_size = 1024;
1019 else
1020 radeon_gart_size = 512;
1012 } else if (!radeon_check_pot_argument(radeon_gart_size)) { 1021 } else if (!radeon_check_pot_argument(radeon_gart_size)) {
1013 dev_warn(rdev->dev, "gart size (%d) must be a power of 2\n", 1022 dev_warn(rdev->dev, "gart size (%d) must be a power of 2\n",
1014 radeon_gart_size); 1023 radeon_gart_size);
1015 radeon_gart_size = 512; 1024 if (rdev->family >= CHIP_RV770)
1025 radeon_gart_size = 1024;
1026 else
1027 radeon_gart_size = 512;
1016 } 1028 }
1017 rdev->mc.gtt_size = (uint64_t)radeon_gart_size << 20; 1029 rdev->mc.gtt_size = (uint64_t)radeon_gart_size << 20;
1018 1030
@@ -1144,7 +1156,7 @@ int radeon_device_init(struct radeon_device *rdev,
1144 rdev->family = flags & RADEON_FAMILY_MASK; 1156 rdev->family = flags & RADEON_FAMILY_MASK;
1145 rdev->is_atom_bios = false; 1157 rdev->is_atom_bios = false;
1146 rdev->usec_timeout = RADEON_MAX_USEC_TIMEOUT; 1158 rdev->usec_timeout = RADEON_MAX_USEC_TIMEOUT;
1147 rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; 1159 rdev->mc.gtt_size = 512 * 1024 * 1024;
1148 rdev->accel_working = false; 1160 rdev->accel_working = false;
1149 /* set up ring ids */ 1161 /* set up ring ids */
1150 for (i = 0; i < RADEON_NUM_RINGS; i++) { 1162 for (i = 0; i < RADEON_NUM_RINGS; i++) {
@@ -1163,6 +1175,7 @@ int radeon_device_init(struct radeon_device *rdev,
1163 mutex_init(&rdev->gem.mutex); 1175 mutex_init(&rdev->gem.mutex);
1164 mutex_init(&rdev->pm.mutex); 1176 mutex_init(&rdev->pm.mutex);
1165 mutex_init(&rdev->gpu_clock_mutex); 1177 mutex_init(&rdev->gpu_clock_mutex);
1178 mutex_init(&rdev->srbm_mutex);
1166 init_rwsem(&rdev->pm.mclk_lock); 1179 init_rwsem(&rdev->pm.mclk_lock);
1167 init_rwsem(&rdev->exclusive_lock); 1180 init_rwsem(&rdev->exclusive_lock);
1168 init_waitqueue_head(&rdev->irq.vblank_queue); 1181 init_waitqueue_head(&rdev->irq.vblank_queue);
@@ -1519,6 +1532,7 @@ int radeon_gpu_reset(struct radeon_device *rdev)
1519 radeon_save_bios_scratch_regs(rdev); 1532 radeon_save_bios_scratch_regs(rdev);
1520 /* block TTM */ 1533 /* block TTM */
1521 resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev); 1534 resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
1535 radeon_pm_suspend(rdev);
1522 radeon_suspend(rdev); 1536 radeon_suspend(rdev);
1523 1537
1524 for (i = 0; i < RADEON_NUM_RINGS; ++i) { 1538 for (i = 0; i < RADEON_NUM_RINGS; ++i) {
@@ -1564,6 +1578,7 @@ retry:
1564 } 1578 }
1565 } 1579 }
1566 1580
1581 radeon_pm_resume(rdev);
1567 drm_helper_resume_force_mode(rdev->ddev); 1582 drm_helper_resume_force_mode(rdev->ddev);
1568 1583
1569 ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched); 1584 ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index 358bd96c06c5..b055bddaa94c 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -1255,41 +1255,41 @@ static void radeon_afmt_init(struct radeon_device *rdev)
1255 for (i = 0; i < RADEON_MAX_AFMT_BLOCKS; i++) 1255 for (i = 0; i < RADEON_MAX_AFMT_BLOCKS; i++)
1256 rdev->mode_info.afmt[i] = NULL; 1256 rdev->mode_info.afmt[i] = NULL;
1257 1257
1258 if (ASIC_IS_DCE6(rdev)) { 1258 if (ASIC_IS_NODCE(rdev)) {
1259 /* todo */ 1259 /* nothing to do */
1260 } else if (ASIC_IS_DCE4(rdev)) { 1260 } else if (ASIC_IS_DCE4(rdev)) {
1261 static uint32_t eg_offsets[] = {
1262 EVERGREEN_CRTC0_REGISTER_OFFSET,
1263 EVERGREEN_CRTC1_REGISTER_OFFSET,
1264 EVERGREEN_CRTC2_REGISTER_OFFSET,
1265 EVERGREEN_CRTC3_REGISTER_OFFSET,
1266 EVERGREEN_CRTC4_REGISTER_OFFSET,
1267 EVERGREEN_CRTC5_REGISTER_OFFSET,
1268 0x13830 - 0x7030,
1269 };
1270 int num_afmt;
1271
1272 /* DCE8 has 7 audio blocks tied to DIG encoders */
1273 /* DCE6 has 6 audio blocks tied to DIG encoders */
1261 /* DCE4/5 has 6 audio blocks tied to DIG encoders */ 1274 /* DCE4/5 has 6 audio blocks tied to DIG encoders */
1262 /* DCE4.1 has 2 audio blocks tied to DIG encoders */ 1275 /* DCE4.1 has 2 audio blocks tied to DIG encoders */
1263 rdev->mode_info.afmt[0] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); 1276 if (ASIC_IS_DCE8(rdev))
1264 if (rdev->mode_info.afmt[0]) { 1277 num_afmt = 7;
1265 rdev->mode_info.afmt[0]->offset = EVERGREEN_CRTC0_REGISTER_OFFSET; 1278 else if (ASIC_IS_DCE6(rdev))
1266 rdev->mode_info.afmt[0]->id = 0; 1279 num_afmt = 6;
1267 } 1280 else if (ASIC_IS_DCE5(rdev))
1268 rdev->mode_info.afmt[1] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); 1281 num_afmt = 6;
1269 if (rdev->mode_info.afmt[1]) { 1282 else if (ASIC_IS_DCE41(rdev))
1270 rdev->mode_info.afmt[1]->offset = EVERGREEN_CRTC1_REGISTER_OFFSET; 1283 num_afmt = 2;
1271 rdev->mode_info.afmt[1]->id = 1; 1284 else /* DCE4 */
1272 } 1285 num_afmt = 6;
1273 if (!ASIC_IS_DCE41(rdev)) { 1286
1274 rdev->mode_info.afmt[2] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); 1287 BUG_ON(num_afmt > ARRAY_SIZE(eg_offsets));
1275 if (rdev->mode_info.afmt[2]) { 1288 for (i = 0; i < num_afmt; i++) {
1276 rdev->mode_info.afmt[2]->offset = EVERGREEN_CRTC2_REGISTER_OFFSET; 1289 rdev->mode_info.afmt[i] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL);
1277 rdev->mode_info.afmt[2]->id = 2; 1290 if (rdev->mode_info.afmt[i]) {
1278 } 1291 rdev->mode_info.afmt[i]->offset = eg_offsets[i];
1279 rdev->mode_info.afmt[3] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL); 1292 rdev->mode_info.afmt[i]->id = i;
1280 if (rdev->mode_info.afmt[3]) {
1281 rdev->mode_info.afmt[3]->offset = EVERGREEN_CRTC3_REGISTER_OFFSET;
1282 rdev->mode_info.afmt[3]->id = 3;
1283 }
1284 rdev->mode_info.afmt[4] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL);
1285 if (rdev->mode_info.afmt[4]) {
1286 rdev->mode_info.afmt[4]->offset = EVERGREEN_CRTC4_REGISTER_OFFSET;
1287 rdev->mode_info.afmt[4]->id = 4;
1288 }
1289 rdev->mode_info.afmt[5] = kzalloc(sizeof(struct radeon_afmt), GFP_KERNEL);
1290 if (rdev->mode_info.afmt[5]) {
1291 rdev->mode_info.afmt[5]->offset = EVERGREEN_CRTC5_REGISTER_OFFSET;
1292 rdev->mode_info.afmt[5]->id = 5;
1293 } 1293 }
1294 } 1294 }
1295 } else if (ASIC_IS_DCE3(rdev)) { 1295 } else if (ASIC_IS_DCE3(rdev)) {
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
index 1f93dd503646..6d09258fb9f2 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -148,7 +148,7 @@ int radeon_dynclks = -1;
148int radeon_r4xx_atom = 0; 148int radeon_r4xx_atom = 0;
149int radeon_agpmode = 0; 149int radeon_agpmode = 0;
150int radeon_vram_limit = 0; 150int radeon_vram_limit = 0;
151int radeon_gart_size = 512; /* default gart size */ 151int radeon_gart_size = -1; /* auto */
152int radeon_benchmarking = 0; 152int radeon_benchmarking = 0;
153int radeon_testing = 0; 153int radeon_testing = 0;
154int radeon_connector_table = 0; 154int radeon_connector_table = 0;
@@ -181,7 +181,7 @@ module_param_named(vramlimit, radeon_vram_limit, int, 0600);
181MODULE_PARM_DESC(agpmode, "AGP Mode (-1 == PCI)"); 181MODULE_PARM_DESC(agpmode, "AGP Mode (-1 == PCI)");
182module_param_named(agpmode, radeon_agpmode, int, 0444); 182module_param_named(agpmode, radeon_agpmode, int, 0444);
183 183
184MODULE_PARM_DESC(gartsize, "Size of PCIE/IGP gart to setup in megabytes (32, 64, etc)"); 184MODULE_PARM_DESC(gartsize, "Size of PCIE/IGP gart to setup in megabytes (32, 64, etc., -1 = auto)");
185module_param_named(gartsize, radeon_gart_size, int, 0600); 185module_param_named(gartsize, radeon_gart_size, int, 0600);
186 186
187MODULE_PARM_DESC(benchmark, "Run benchmark"); 187MODULE_PARM_DESC(benchmark, "Run benchmark");
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
index 7ddb0efe2408..ddb8f8e04eb5 100644
--- a/drivers/gpu/drm/radeon/radeon_fence.c
+++ b/drivers/gpu/drm/radeon/radeon_fence.c
@@ -782,7 +782,7 @@ int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring)
782 782
783 } else { 783 } else {
784 /* put fence directly behind firmware */ 784 /* put fence directly behind firmware */
785 index = ALIGN(rdev->uvd.fw_size, 8); 785 index = ALIGN(rdev->uvd_fw->size, 8);
786 rdev->fence_drv[ring].cpu_addr = rdev->uvd.cpu_addr + index; 786 rdev->fence_drv[ring].cpu_addr = rdev->uvd.cpu_addr + index;
787 rdev->fence_drv[ring].gpu_addr = rdev->uvd.gpu_addr + index; 787 rdev->fence_drv[ring].gpu_addr = rdev->uvd.gpu_addr + index;
788 } 788 }
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index 6a51d943ccf4..b990b1a2bd50 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -207,7 +207,6 @@ void radeon_gart_table_vram_free(struct radeon_device *rdev)
207 if (rdev->gart.robj == NULL) { 207 if (rdev->gart.robj == NULL) {
208 return; 208 return;
209 } 209 }
210 radeon_gart_table_vram_unpin(rdev);
211 radeon_bo_unref(&rdev->gart.robj); 210 radeon_bo_unref(&rdev->gart.robj);
212} 211}
213 212
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
index 081886b0642d..cc9e8482cf30 100644
--- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
@@ -275,17 +275,19 @@ int radeon_irq_kms_init(struct radeon_device *rdev)
275 dev_info(rdev->dev, "radeon: using MSI.\n"); 275 dev_info(rdev->dev, "radeon: using MSI.\n");
276 } 276 }
277 } 277 }
278
279 INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func);
280 INIT_WORK(&rdev->audio_work, r600_audio_update_hdmi);
281 INIT_WORK(&rdev->reset_work, radeon_irq_reset_work_func);
282
278 rdev->irq.installed = true; 283 rdev->irq.installed = true;
279 r = drm_irq_install(rdev->ddev); 284 r = drm_irq_install(rdev->ddev);
280 if (r) { 285 if (r) {
281 rdev->irq.installed = false; 286 rdev->irq.installed = false;
287 flush_work(&rdev->hotplug_work);
282 return r; 288 return r;
283 } 289 }
284 290
285 INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func);
286 INIT_WORK(&rdev->audio_work, r600_audio_update_hdmi);
287 INIT_WORK(&rdev->reset_work, radeon_irq_reset_work_func);
288
289 DRM_INFO("radeon: irq initialized.\n"); 291 DRM_INFO("radeon: irq initialized.\n");
290 return 0; 292 return 0;
291} 293}
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
index b46a5616664a..205440d9544b 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -433,6 +433,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
433 return -EINVAL; 433 return -EINVAL;
434 } 434 }
435 break; 435 break;
436 case RADEON_INFO_SI_CP_DMA_COMPUTE:
437 *value = 1;
438 break;
436 default: 439 default:
437 DRM_DEBUG_KMS("Invalid request %d\n", info->request); 440 DRM_DEBUG_KMS("Invalid request %d\n", info->request);
438 return -EINVAL; 441 return -EINVAL;
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index 8296632a4235..d908d8d68f6b 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -225,6 +225,7 @@ struct radeon_afmt {
225 int offset; 225 int offset;
226 bool last_buffer_filled_status; 226 bool last_buffer_filled_status;
227 int id; 227 int id;
228 struct r600_audio_pin *pin;
228}; 229};
229 230
230struct radeon_mode_info { 231struct radeon_mode_info {
@@ -233,7 +234,7 @@ struct radeon_mode_info {
233 enum radeon_connector_table connector_table; 234 enum radeon_connector_table connector_table;
234 bool mode_config_initialized; 235 bool mode_config_initialized;
235 struct radeon_crtc *crtcs[6]; 236 struct radeon_crtc *crtcs[6];
236 struct radeon_afmt *afmt[6]; 237 struct radeon_afmt *afmt[7];
237 /* DVI-I properties */ 238 /* DVI-I properties */
238 struct drm_property *coherent_mode_property; 239 struct drm_property *coherent_mode_property;
239 /* DAC enable load detect */ 240 /* DAC enable load detect */
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index f374c467aaca..d7555369a3e5 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -569,6 +569,8 @@ static int radeon_hwmon_init(struct radeon_device *rdev)
569 case THERMAL_TYPE_NI: 569 case THERMAL_TYPE_NI:
570 case THERMAL_TYPE_SUMO: 570 case THERMAL_TYPE_SUMO:
571 case THERMAL_TYPE_SI: 571 case THERMAL_TYPE_SI:
572 case THERMAL_TYPE_CI:
573 case THERMAL_TYPE_KV:
572 if (rdev->asic->pm.get_temperature == NULL) 574 if (rdev->asic->pm.get_temperature == NULL)
573 return err; 575 return err;
574 rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev); 576 rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev);
@@ -624,7 +626,15 @@ static void radeon_dpm_thermal_work_handler(struct work_struct *work)
624 /* switch back the user state */ 626 /* switch back the user state */
625 dpm_state = rdev->pm.dpm.user_state; 627 dpm_state = rdev->pm.dpm.user_state;
626 } 628 }
627 radeon_dpm_enable_power_state(rdev, dpm_state); 629 mutex_lock(&rdev->pm.mutex);
630 if (dpm_state == POWER_STATE_TYPE_INTERNAL_THERMAL)
631 rdev->pm.dpm.thermal_active = true;
632 else
633 rdev->pm.dpm.thermal_active = false;
634 rdev->pm.dpm.state = dpm_state;
635 mutex_unlock(&rdev->pm.mutex);
636
637 radeon_pm_compute_clocks(rdev);
628} 638}
629 639
630static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev, 640static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev,
@@ -687,7 +697,10 @@ restart_search:
687 break; 697 break;
688 /* internal states */ 698 /* internal states */
689 case POWER_STATE_TYPE_INTERNAL_UVD: 699 case POWER_STATE_TYPE_INTERNAL_UVD:
690 return rdev->pm.dpm.uvd_ps; 700 if (rdev->pm.dpm.uvd_ps)
701 return rdev->pm.dpm.uvd_ps;
702 else
703 break;
691 case POWER_STATE_TYPE_INTERNAL_UVD_SD: 704 case POWER_STATE_TYPE_INTERNAL_UVD_SD:
692 if (ps->class & ATOM_PPLIB_CLASSIFICATION_SDSTATE) 705 if (ps->class & ATOM_PPLIB_CLASSIFICATION_SDSTATE)
693 return ps; 706 return ps;
@@ -729,10 +742,17 @@ restart_search:
729 /* use a fallback state if we didn't match */ 742 /* use a fallback state if we didn't match */
730 switch (dpm_state) { 743 switch (dpm_state) {
731 case POWER_STATE_TYPE_INTERNAL_UVD_SD: 744 case POWER_STATE_TYPE_INTERNAL_UVD_SD:
745 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_HD;
746 goto restart_search;
732 case POWER_STATE_TYPE_INTERNAL_UVD_HD: 747 case POWER_STATE_TYPE_INTERNAL_UVD_HD:
733 case POWER_STATE_TYPE_INTERNAL_UVD_HD2: 748 case POWER_STATE_TYPE_INTERNAL_UVD_HD2:
734 case POWER_STATE_TYPE_INTERNAL_UVD_MVC: 749 case POWER_STATE_TYPE_INTERNAL_UVD_MVC:
735 return rdev->pm.dpm.uvd_ps; 750 if (rdev->pm.dpm.uvd_ps) {
751 return rdev->pm.dpm.uvd_ps;
752 } else {
753 dpm_state = POWER_STATE_TYPE_PERFORMANCE;
754 goto restart_search;
755 }
736 case POWER_STATE_TYPE_INTERNAL_THERMAL: 756 case POWER_STATE_TYPE_INTERNAL_THERMAL:
737 dpm_state = POWER_STATE_TYPE_INTERNAL_ACPI; 757 dpm_state = POWER_STATE_TYPE_INTERNAL_ACPI;
738 goto restart_search; 758 goto restart_search;
@@ -850,38 +870,51 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
850 870
851 radeon_dpm_post_set_power_state(rdev); 871 radeon_dpm_post_set_power_state(rdev);
852 872
873 /* force low perf level for thermal */
874 if (rdev->pm.dpm.thermal_active &&
875 rdev->asic->dpm.force_performance_level) {
876 radeon_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_LOW);
877 }
878
853done: 879done:
854 mutex_unlock(&rdev->ring_lock); 880 mutex_unlock(&rdev->ring_lock);
855 up_write(&rdev->pm.mclk_lock); 881 up_write(&rdev->pm.mclk_lock);
856 mutex_unlock(&rdev->ddev->struct_mutex); 882 mutex_unlock(&rdev->ddev->struct_mutex);
857} 883}
858 884
859void radeon_dpm_enable_power_state(struct radeon_device *rdev, 885void radeon_dpm_enable_uvd(struct radeon_device *rdev, bool enable)
860 enum radeon_pm_state_type dpm_state)
861{ 886{
862 if (!rdev->pm.dpm_enabled) 887 enum radeon_pm_state_type dpm_state;
863 return;
864 888
865 mutex_lock(&rdev->pm.mutex); 889 if (rdev->asic->dpm.powergate_uvd) {
866 switch (dpm_state) { 890 mutex_lock(&rdev->pm.mutex);
867 case POWER_STATE_TYPE_INTERNAL_THERMAL: 891 /* enable/disable UVD */
868 rdev->pm.dpm.thermal_active = true; 892 radeon_dpm_powergate_uvd(rdev, !enable);
869 break; 893 mutex_unlock(&rdev->pm.mutex);
870 case POWER_STATE_TYPE_INTERNAL_UVD: 894 } else {
871 case POWER_STATE_TYPE_INTERNAL_UVD_SD: 895 if (enable) {
872 case POWER_STATE_TYPE_INTERNAL_UVD_HD: 896 mutex_lock(&rdev->pm.mutex);
873 case POWER_STATE_TYPE_INTERNAL_UVD_HD2: 897 rdev->pm.dpm.uvd_active = true;
874 case POWER_STATE_TYPE_INTERNAL_UVD_MVC: 898 if ((rdev->pm.dpm.sd == 1) && (rdev->pm.dpm.hd == 0))
875 rdev->pm.dpm.uvd_active = true; 899 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_SD;
876 break; 900 else if ((rdev->pm.dpm.sd == 2) && (rdev->pm.dpm.hd == 0))
877 default: 901 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_HD;
878 rdev->pm.dpm.thermal_active = false; 902 else if ((rdev->pm.dpm.sd == 0) && (rdev->pm.dpm.hd == 1))
879 rdev->pm.dpm.uvd_active = false; 903 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_HD;
880 break; 904 else if ((rdev->pm.dpm.sd == 0) && (rdev->pm.dpm.hd == 2))
905 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD_HD2;
906 else
907 dpm_state = POWER_STATE_TYPE_INTERNAL_UVD;
908 rdev->pm.dpm.state = dpm_state;
909 mutex_unlock(&rdev->pm.mutex);
910 } else {
911 mutex_lock(&rdev->pm.mutex);
912 rdev->pm.dpm.uvd_active = false;
913 mutex_unlock(&rdev->pm.mutex);
914 }
915
916 radeon_pm_compute_clocks(rdev);
881 } 917 }
882 rdev->pm.dpm.state = dpm_state;
883 mutex_unlock(&rdev->pm.mutex);
884 radeon_pm_compute_clocks(rdev);
885} 918}
886 919
887static void radeon_pm_suspend_old(struct radeon_device *rdev) 920static void radeon_pm_suspend_old(struct radeon_device *rdev)
@@ -1176,7 +1209,17 @@ int radeon_pm_init(struct radeon_device *rdev)
1176 case CHIP_VERDE: 1209 case CHIP_VERDE:
1177 case CHIP_OLAND: 1210 case CHIP_OLAND:
1178 case CHIP_HAINAN: 1211 case CHIP_HAINAN:
1179 if (radeon_dpm == 1) 1212 case CHIP_BONAIRE:
1213 case CHIP_KABINI:
1214 case CHIP_KAVERI:
1215 /* DPM requires the RLC, RV770+ dGPU requires SMC */
1216 if (!rdev->rlc_fw)
1217 rdev->pm.pm_method = PM_METHOD_PROFILE;
1218 else if ((rdev->family >= CHIP_RV770) &&
1219 (!(rdev->flags & RADEON_IS_IGP)) &&
1220 (!rdev->smc_fw))
1221 rdev->pm.pm_method = PM_METHOD_PROFILE;
1222 else if (radeon_dpm == 1)
1180 rdev->pm.pm_method = PM_METHOD_DPM; 1223 rdev->pm.pm_method = PM_METHOD_DPM;
1181 else 1224 else
1182 rdev->pm.pm_method = PM_METHOD_PROFILE; 1225 rdev->pm.pm_method = PM_METHOD_PROFILE;
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
index fb5ea6208970..46a25f037b84 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -363,11 +363,10 @@ u32 radeon_ring_generic_get_rptr(struct radeon_device *rdev,
363{ 363{
364 u32 rptr; 364 u32 rptr;
365 365
366 if (rdev->wb.enabled && ring != &rdev->ring[R600_RING_TYPE_UVD_INDEX]) 366 if (rdev->wb.enabled)
367 rptr = le32_to_cpu(rdev->wb.wb[ring->rptr_offs/4]); 367 rptr = le32_to_cpu(rdev->wb.wb[ring->rptr_offs/4]);
368 else 368 else
369 rptr = RREG32(ring->rptr_reg); 369 rptr = RREG32(ring->rptr_reg);
370 rptr = (rptr & ring->ptr_reg_mask) >> ring->ptr_reg_shift;
371 370
372 return rptr; 371 return rptr;
373} 372}
@@ -378,7 +377,6 @@ u32 radeon_ring_generic_get_wptr(struct radeon_device *rdev,
378 u32 wptr; 377 u32 wptr;
379 378
380 wptr = RREG32(ring->wptr_reg); 379 wptr = RREG32(ring->wptr_reg);
381 wptr = (wptr & ring->ptr_reg_mask) >> ring->ptr_reg_shift;
382 380
383 return wptr; 381 return wptr;
384} 382}
@@ -386,7 +384,7 @@ u32 radeon_ring_generic_get_wptr(struct radeon_device *rdev,
386void radeon_ring_generic_set_wptr(struct radeon_device *rdev, 384void radeon_ring_generic_set_wptr(struct radeon_device *rdev,
387 struct radeon_ring *ring) 385 struct radeon_ring *ring)
388{ 386{
389 WREG32(ring->wptr_reg, (ring->wptr << ring->ptr_reg_shift) & ring->ptr_reg_mask); 387 WREG32(ring->wptr_reg, ring->wptr);
390 (void)RREG32(ring->wptr_reg); 388 (void)RREG32(ring->wptr_reg);
391} 389}
392 390
@@ -719,16 +717,13 @@ int radeon_ring_restore(struct radeon_device *rdev, struct radeon_ring *ring,
719 * @rptr_offs: offset of the rptr writeback location in the WB buffer 717 * @rptr_offs: offset of the rptr writeback location in the WB buffer
720 * @rptr_reg: MMIO offset of the rptr register 718 * @rptr_reg: MMIO offset of the rptr register
721 * @wptr_reg: MMIO offset of the wptr register 719 * @wptr_reg: MMIO offset of the wptr register
722 * @ptr_reg_shift: bit offset of the rptr/wptr values
723 * @ptr_reg_mask: bit mask of the rptr/wptr values
724 * @nop: nop packet for this ring 720 * @nop: nop packet for this ring
725 * 721 *
726 * Initialize the driver information for the selected ring (all asics). 722 * Initialize the driver information for the selected ring (all asics).
727 * Returns 0 on success, error on failure. 723 * Returns 0 on success, error on failure.
728 */ 724 */
729int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsigned ring_size, 725int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsigned ring_size,
730 unsigned rptr_offs, unsigned rptr_reg, unsigned wptr_reg, 726 unsigned rptr_offs, unsigned rptr_reg, unsigned wptr_reg, u32 nop)
731 u32 ptr_reg_shift, u32 ptr_reg_mask, u32 nop)
732{ 727{
733 int r; 728 int r;
734 729
@@ -736,8 +731,6 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig
736 ring->rptr_offs = rptr_offs; 731 ring->rptr_offs = rptr_offs;
737 ring->rptr_reg = rptr_reg; 732 ring->rptr_reg = rptr_reg;
738 ring->wptr_reg = wptr_reg; 733 ring->wptr_reg = wptr_reg;
739 ring->ptr_reg_shift = ptr_reg_shift;
740 ring->ptr_reg_mask = ptr_reg_mask;
741 ring->nop = nop; 734 ring->nop = nop;
742 /* Allocate ring buffer */ 735 /* Allocate ring buffer */
743 if (ring->ring_obj == NULL) { 736 if (ring->ring_obj == NULL) {
diff --git a/drivers/gpu/drm/radeon/radeon_ucode.h b/drivers/gpu/drm/radeon/radeon_ucode.h
index d8b05f7bcf1a..33858364fe89 100644
--- a/drivers/gpu/drm/radeon/radeon_ucode.h
+++ b/drivers/gpu/drm/radeon/radeon_ucode.h
@@ -35,6 +35,12 @@
35#define SI_PFP_UCODE_SIZE 2144 35#define SI_PFP_UCODE_SIZE 2144
36#define SI_PM4_UCODE_SIZE 2144 36#define SI_PM4_UCODE_SIZE 2144
37#define SI_CE_UCODE_SIZE 2144 37#define SI_CE_UCODE_SIZE 2144
38#define CIK_PFP_UCODE_SIZE 2144
39#define CIK_ME_UCODE_SIZE 2144
40#define CIK_CE_UCODE_SIZE 2144
41
42/* MEC */
43#define CIK_MEC_UCODE_SIZE 4192
38 44
39/* RLC */ 45/* RLC */
40#define R600_RLC_UCODE_SIZE 768 46#define R600_RLC_UCODE_SIZE 768
@@ -43,12 +49,20 @@
43#define CAYMAN_RLC_UCODE_SIZE 1024 49#define CAYMAN_RLC_UCODE_SIZE 1024
44#define ARUBA_RLC_UCODE_SIZE 1536 50#define ARUBA_RLC_UCODE_SIZE 1536
45#define SI_RLC_UCODE_SIZE 2048 51#define SI_RLC_UCODE_SIZE 2048
52#define BONAIRE_RLC_UCODE_SIZE 2048
53#define KB_RLC_UCODE_SIZE 2560
54#define KV_RLC_UCODE_SIZE 2560
46 55
47/* MC */ 56/* MC */
48#define BTC_MC_UCODE_SIZE 6024 57#define BTC_MC_UCODE_SIZE 6024
49#define CAYMAN_MC_UCODE_SIZE 6037 58#define CAYMAN_MC_UCODE_SIZE 6037
50#define SI_MC_UCODE_SIZE 7769 59#define SI_MC_UCODE_SIZE 7769
51#define OLAND_MC_UCODE_SIZE 7863 60#define OLAND_MC_UCODE_SIZE 7863
61#define CIK_MC_UCODE_SIZE 7866
62
63/* SDMA */
64#define CIK_SDMA_UCODE_SIZE 1050
65#define CIK_SDMA_UCODE_VERSION 64
52 66
53/* SMC */ 67/* SMC */
54#define RV770_SMC_UCODE_START 0x0100 68#define RV770_SMC_UCODE_START 0x0100
@@ -126,4 +140,7 @@
126#define HAINAN_SMC_UCODE_START 0x10000 140#define HAINAN_SMC_UCODE_START 0x10000
127#define HAINAN_SMC_UCODE_SIZE 0xe67C 141#define HAINAN_SMC_UCODE_SIZE 0xe67C
128 142
143#define BONAIRE_SMC_UCODE_START 0x20000
144#define BONAIRE_SMC_UCODE_SIZE 0x1FDEC
145
129#endif 146#endif
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index 414fd145d20e..1a01bbff9bfa 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -56,7 +56,6 @@ static void radeon_uvd_idle_work_handler(struct work_struct *work);
56 56
57int radeon_uvd_init(struct radeon_device *rdev) 57int radeon_uvd_init(struct radeon_device *rdev)
58{ 58{
59 const struct firmware *fw;
60 unsigned long bo_size; 59 unsigned long bo_size;
61 const char *fw_name; 60 const char *fw_name;
62 int i, r; 61 int i, r;
@@ -105,14 +104,14 @@ int radeon_uvd_init(struct radeon_device *rdev)
105 return -EINVAL; 104 return -EINVAL;
106 } 105 }
107 106
108 r = request_firmware(&fw, fw_name, rdev->dev); 107 r = request_firmware(&rdev->uvd_fw, fw_name, rdev->dev);
109 if (r) { 108 if (r) {
110 dev_err(rdev->dev, "radeon_uvd: Can't load firmware \"%s\"\n", 109 dev_err(rdev->dev, "radeon_uvd: Can't load firmware \"%s\"\n",
111 fw_name); 110 fw_name);
112 return r; 111 return r;
113 } 112 }
114 113
115 bo_size = RADEON_GPU_PAGE_ALIGN(fw->size + 8) + 114 bo_size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 8) +
116 RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE; 115 RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE;
117 r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true, 116 r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true,
118 RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->uvd.vcpu_bo); 117 RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->uvd.vcpu_bo);
@@ -145,15 +144,10 @@ int radeon_uvd_init(struct radeon_device *rdev)
145 144
146 radeon_bo_unreserve(rdev->uvd.vcpu_bo); 145 radeon_bo_unreserve(rdev->uvd.vcpu_bo);
147 146
148 rdev->uvd.fw_size = fw->size;
149 memset(rdev->uvd.cpu_addr, 0, bo_size);
150 memcpy(rdev->uvd.cpu_addr, fw->data, fw->size);
151
152 release_firmware(fw);
153
154 for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) { 147 for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
155 atomic_set(&rdev->uvd.handles[i], 0); 148 atomic_set(&rdev->uvd.handles[i], 0);
156 rdev->uvd.filp[i] = NULL; 149 rdev->uvd.filp[i] = NULL;
150 rdev->uvd.img_size[i] = 0;
157 } 151 }
158 152
159 return 0; 153 return 0;
@@ -174,33 +168,60 @@ void radeon_uvd_fini(struct radeon_device *rdev)
174 } 168 }
175 169
176 radeon_bo_unref(&rdev->uvd.vcpu_bo); 170 radeon_bo_unref(&rdev->uvd.vcpu_bo);
171
172 release_firmware(rdev->uvd_fw);
177} 173}
178 174
179int radeon_uvd_suspend(struct radeon_device *rdev) 175int radeon_uvd_suspend(struct radeon_device *rdev)
180{ 176{
181 unsigned size; 177 unsigned size;
178 void *ptr;
179 int i;
182 180
183 if (rdev->uvd.vcpu_bo == NULL) 181 if (rdev->uvd.vcpu_bo == NULL)
184 return 0; 182 return 0;
185 183
184 for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i)
185 if (atomic_read(&rdev->uvd.handles[i]))
186 break;
187
188 if (i == RADEON_MAX_UVD_HANDLES)
189 return 0;
190
186 size = radeon_bo_size(rdev->uvd.vcpu_bo); 191 size = radeon_bo_size(rdev->uvd.vcpu_bo);
192 size -= rdev->uvd_fw->size;
193
194 ptr = rdev->uvd.cpu_addr;
195 ptr += rdev->uvd_fw->size;
196
187 rdev->uvd.saved_bo = kmalloc(size, GFP_KERNEL); 197 rdev->uvd.saved_bo = kmalloc(size, GFP_KERNEL);
188 memcpy(rdev->uvd.saved_bo, rdev->uvd.cpu_addr, size); 198 memcpy(rdev->uvd.saved_bo, ptr, size);
189 199
190 return 0; 200 return 0;
191} 201}
192 202
193int radeon_uvd_resume(struct radeon_device *rdev) 203int radeon_uvd_resume(struct radeon_device *rdev)
194{ 204{
205 unsigned size;
206 void *ptr;
207
195 if (rdev->uvd.vcpu_bo == NULL) 208 if (rdev->uvd.vcpu_bo == NULL)
196 return -EINVAL; 209 return -EINVAL;
197 210
211 memcpy(rdev->uvd.cpu_addr, rdev->uvd_fw->data, rdev->uvd_fw->size);
212
213 size = radeon_bo_size(rdev->uvd.vcpu_bo);
214 size -= rdev->uvd_fw->size;
215
216 ptr = rdev->uvd.cpu_addr;
217 ptr += rdev->uvd_fw->size;
218
198 if (rdev->uvd.saved_bo != NULL) { 219 if (rdev->uvd.saved_bo != NULL) {
199 unsigned size = radeon_bo_size(rdev->uvd.vcpu_bo); 220 memcpy(ptr, rdev->uvd.saved_bo, size);
200 memcpy(rdev->uvd.cpu_addr, rdev->uvd.saved_bo, size);
201 kfree(rdev->uvd.saved_bo); 221 kfree(rdev->uvd.saved_bo);
202 rdev->uvd.saved_bo = NULL; 222 rdev->uvd.saved_bo = NULL;
203 } 223 } else
224 memset(ptr, 0, size);
204 225
205 return 0; 226 return 0;
206} 227}
@@ -215,8 +236,8 @@ void radeon_uvd_free_handles(struct radeon_device *rdev, struct drm_file *filp)
215{ 236{
216 int i, r; 237 int i, r;
217 for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) { 238 for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
218 if (rdev->uvd.filp[i] == filp) { 239 uint32_t handle = atomic_read(&rdev->uvd.handles[i]);
219 uint32_t handle = atomic_read(&rdev->uvd.handles[i]); 240 if (handle != 0 && rdev->uvd.filp[i] == filp) {
220 struct radeon_fence *fence; 241 struct radeon_fence *fence;
221 242
222 r = radeon_uvd_get_destroy_msg(rdev, 243 r = radeon_uvd_get_destroy_msg(rdev,
@@ -327,6 +348,7 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
327 unsigned offset, unsigned buf_sizes[]) 348 unsigned offset, unsigned buf_sizes[])
328{ 349{
329 int32_t *msg, msg_type, handle; 350 int32_t *msg, msg_type, handle;
351 unsigned img_size = 0;
330 void *ptr; 352 void *ptr;
331 353
332 int i, r; 354 int i, r;
@@ -336,9 +358,19 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
336 return -EINVAL; 358 return -EINVAL;
337 } 359 }
338 360
361 if (bo->tbo.sync_obj) {
362 r = radeon_fence_wait(bo->tbo.sync_obj, false);
363 if (r) {
364 DRM_ERROR("Failed waiting for UVD message (%d)!\n", r);
365 return r;
366 }
367 }
368
339 r = radeon_bo_kmap(bo, &ptr); 369 r = radeon_bo_kmap(bo, &ptr);
340 if (r) 370 if (r) {
371 DRM_ERROR("Failed mapping the UVD message (%d)!\n", r);
341 return r; 372 return r;
373 }
342 374
343 msg = ptr + offset; 375 msg = ptr + offset;
344 376
@@ -353,6 +385,8 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
353 if (msg_type == 1) { 385 if (msg_type == 1) {
354 /* it's a decode msg, calc buffer sizes */ 386 /* it's a decode msg, calc buffer sizes */
355 r = radeon_uvd_cs_msg_decode(msg, buf_sizes); 387 r = radeon_uvd_cs_msg_decode(msg, buf_sizes);
388 /* calc image size (width * height) */
389 img_size = msg[6] * msg[7];
356 radeon_bo_kunmap(bo); 390 radeon_bo_kunmap(bo);
357 if (r) 391 if (r)
358 return r; 392 return r;
@@ -364,8 +398,16 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
364 radeon_bo_kunmap(bo); 398 radeon_bo_kunmap(bo);
365 return 0; 399 return 0;
366 } else { 400 } else {
367 /* it's a create msg, no special handling needed */ 401 /* it's a create msg, calc image size (width * height) */
402 img_size = msg[7] * msg[8];
368 radeon_bo_kunmap(bo); 403 radeon_bo_kunmap(bo);
404
405 if (msg_type != 0) {
406 DRM_ERROR("Illegal UVD message type (%d)!\n", msg_type);
407 return -EINVAL;
408 }
409
410 /* it's a create msg, no special handling needed */
369 } 411 }
370 412
371 /* create or decode, validate the handle */ 413 /* create or decode, validate the handle */
@@ -378,6 +420,7 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
378 for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) { 420 for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
379 if (!atomic_cmpxchg(&p->rdev->uvd.handles[i], 0, handle)) { 421 if (!atomic_cmpxchg(&p->rdev->uvd.handles[i], 0, handle)) {
380 p->rdev->uvd.filp[i] = p->filp; 422 p->rdev->uvd.filp[i] = p->filp;
423 p->rdev->uvd.img_size[i] = img_size;
381 return 0; 424 return 0;
382 } 425 }
383 } 426 }
@@ -388,7 +431,7 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
388 431
389static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p, 432static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
390 int data0, int data1, 433 int data0, int data1,
391 unsigned buf_sizes[]) 434 unsigned buf_sizes[], bool *has_msg_cmd)
392{ 435{
393 struct radeon_cs_chunk *relocs_chunk; 436 struct radeon_cs_chunk *relocs_chunk;
394 struct radeon_cs_reloc *reloc; 437 struct radeon_cs_reloc *reloc;
@@ -417,7 +460,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
417 460
418 if (cmd < 0x4) { 461 if (cmd < 0x4) {
419 if ((end - start) < buf_sizes[cmd]) { 462 if ((end - start) < buf_sizes[cmd]) {
420 DRM_ERROR("buffer to small (%d / %d)!\n", 463 DRM_ERROR("buffer (%d) to small (%d / %d)!\n", cmd,
421 (unsigned)(end - start), buf_sizes[cmd]); 464 (unsigned)(end - start), buf_sizes[cmd]);
422 return -EINVAL; 465 return -EINVAL;
423 } 466 }
@@ -442,9 +485,17 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
442 } 485 }
443 486
444 if (cmd == 0) { 487 if (cmd == 0) {
488 if (*has_msg_cmd) {
489 DRM_ERROR("More than one message in a UVD-IB!\n");
490 return -EINVAL;
491 }
492 *has_msg_cmd = true;
445 r = radeon_uvd_cs_msg(p, reloc->robj, offset, buf_sizes); 493 r = radeon_uvd_cs_msg(p, reloc->robj, offset, buf_sizes);
446 if (r) 494 if (r)
447 return r; 495 return r;
496 } else if (!*has_msg_cmd) {
497 DRM_ERROR("Message needed before other commands are send!\n");
498 return -EINVAL;
448 } 499 }
449 500
450 return 0; 501 return 0;
@@ -453,7 +504,8 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
453static int radeon_uvd_cs_reg(struct radeon_cs_parser *p, 504static int radeon_uvd_cs_reg(struct radeon_cs_parser *p,
454 struct radeon_cs_packet *pkt, 505 struct radeon_cs_packet *pkt,
455 int *data0, int *data1, 506 int *data0, int *data1,
456 unsigned buf_sizes[]) 507 unsigned buf_sizes[],
508 bool *has_msg_cmd)
457{ 509{
458 int i, r; 510 int i, r;
459 511
@@ -467,7 +519,8 @@ static int radeon_uvd_cs_reg(struct radeon_cs_parser *p,
467 *data1 = p->idx; 519 *data1 = p->idx;
468 break; 520 break;
469 case UVD_GPCOM_VCPU_CMD: 521 case UVD_GPCOM_VCPU_CMD:
470 r = radeon_uvd_cs_reloc(p, *data0, *data1, buf_sizes); 522 r = radeon_uvd_cs_reloc(p, *data0, *data1,
523 buf_sizes, has_msg_cmd);
471 if (r) 524 if (r)
472 return r; 525 return r;
473 break; 526 break;
@@ -488,6 +541,9 @@ int radeon_uvd_cs_parse(struct radeon_cs_parser *p)
488 struct radeon_cs_packet pkt; 541 struct radeon_cs_packet pkt;
489 int r, data0 = 0, data1 = 0; 542 int r, data0 = 0, data1 = 0;
490 543
544 /* does the IB has a msg command */
545 bool has_msg_cmd = false;
546
491 /* minimum buffer sizes */ 547 /* minimum buffer sizes */
492 unsigned buf_sizes[] = { 548 unsigned buf_sizes[] = {
493 [0x00000000] = 2048, 549 [0x00000000] = 2048,
@@ -514,8 +570,8 @@ int radeon_uvd_cs_parse(struct radeon_cs_parser *p)
514 return r; 570 return r;
515 switch (pkt.type) { 571 switch (pkt.type) {
516 case RADEON_PACKET_TYPE0: 572 case RADEON_PACKET_TYPE0:
517 r = radeon_uvd_cs_reg(p, &pkt, &data0, 573 r = radeon_uvd_cs_reg(p, &pkt, &data0, &data1,
518 &data1, buf_sizes); 574 buf_sizes, &has_msg_cmd);
519 if (r) 575 if (r)
520 return r; 576 return r;
521 break; 577 break;
@@ -527,6 +583,12 @@ int radeon_uvd_cs_parse(struct radeon_cs_parser *p)
527 return -EINVAL; 583 return -EINVAL;
528 } 584 }
529 } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw); 585 } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw);
586
587 if (!has_msg_cmd) {
588 DRM_ERROR("UVD-IBs need a msg command!\n");
589 return -EINVAL;
590 }
591
530 return 0; 592 return 0;
531} 593}
532 594
@@ -678,6 +740,34 @@ int radeon_uvd_get_destroy_msg(struct radeon_device *rdev, int ring,
678 return radeon_uvd_send_msg(rdev, ring, bo, fence); 740 return radeon_uvd_send_msg(rdev, ring, bo, fence);
679} 741}
680 742
743/**
744 * radeon_uvd_count_handles - count number of open streams
745 *
746 * @rdev: radeon_device pointer
747 * @sd: number of SD streams
748 * @hd: number of HD streams
749 *
750 * Count the number of open SD/HD streams as a hint for power mangement
751 */
752static void radeon_uvd_count_handles(struct radeon_device *rdev,
753 unsigned *sd, unsigned *hd)
754{
755 unsigned i;
756
757 *sd = 0;
758 *hd = 0;
759
760 for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
761 if (!atomic_read(&rdev->uvd.handles[i]))
762 continue;
763
764 if (rdev->uvd.img_size[i] >= 720*576)
765 ++(*hd);
766 else
767 ++(*sd);
768 }
769}
770
681static void radeon_uvd_idle_work_handler(struct work_struct *work) 771static void radeon_uvd_idle_work_handler(struct work_struct *work)
682{ 772{
683 struct radeon_device *rdev = 773 struct radeon_device *rdev =
@@ -685,10 +775,7 @@ static void radeon_uvd_idle_work_handler(struct work_struct *work)
685 775
686 if (radeon_fence_count_emitted(rdev, R600_RING_TYPE_UVD_INDEX) == 0) { 776 if (radeon_fence_count_emitted(rdev, R600_RING_TYPE_UVD_INDEX) == 0) {
687 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) { 777 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
688 mutex_lock(&rdev->pm.mutex); 778 radeon_dpm_enable_uvd(rdev, false);
689 rdev->pm.dpm.uvd_active = false;
690 mutex_unlock(&rdev->pm.mutex);
691 radeon_pm_compute_clocks(rdev);
692 } else { 779 } else {
693 radeon_set_uvd_clocks(rdev, 0, 0); 780 radeon_set_uvd_clocks(rdev, 0, 0);
694 } 781 }
@@ -700,13 +787,25 @@ static void radeon_uvd_idle_work_handler(struct work_struct *work)
700 787
701void radeon_uvd_note_usage(struct radeon_device *rdev) 788void radeon_uvd_note_usage(struct radeon_device *rdev)
702{ 789{
790 bool streams_changed = false;
703 bool set_clocks = !cancel_delayed_work_sync(&rdev->uvd.idle_work); 791 bool set_clocks = !cancel_delayed_work_sync(&rdev->uvd.idle_work);
704 set_clocks &= schedule_delayed_work(&rdev->uvd.idle_work, 792 set_clocks &= schedule_delayed_work(&rdev->uvd.idle_work,
705 msecs_to_jiffies(UVD_IDLE_TIMEOUT_MS)); 793 msecs_to_jiffies(UVD_IDLE_TIMEOUT_MS));
706 if (set_clocks) { 794
795 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
796 unsigned hd = 0, sd = 0;
797 radeon_uvd_count_handles(rdev, &sd, &hd);
798 if ((rdev->pm.dpm.sd != sd) ||
799 (rdev->pm.dpm.hd != hd)) {
800 rdev->pm.dpm.sd = sd;
801 rdev->pm.dpm.hd = hd;
802 streams_changed = true;
803 }
804 }
805
806 if (set_clocks || streams_changed) {
707 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) { 807 if ((rdev->pm.pm_method == PM_METHOD_DPM) && rdev->pm.dpm_enabled) {
708 /* XXX pick SD/HD/MVC */ 808 radeon_dpm_enable_uvd(rdev, true);
709 radeon_dpm_enable_power_state(rdev, POWER_STATE_TYPE_INTERNAL_UVD);
710 } else { 809 } else {
711 radeon_set_uvd_clocks(rdev, 53300, 40000); 810 radeon_set_uvd_clocks(rdev, 53300, 40000);
712 } 811 }
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c
index 233a9b9fa1f7..b8074a8ec75a 100644
--- a/drivers/gpu/drm/radeon/rs400.c
+++ b/drivers/gpu/drm/radeon/rs400.c
@@ -174,10 +174,13 @@ int rs400_gart_enable(struct radeon_device *rdev)
174 /* FIXME: according to doc we should set HIDE_MMCFG_BAR=0, 174 /* FIXME: according to doc we should set HIDE_MMCFG_BAR=0,
175 * AGPMODE30=0 & AGP30ENHANCED=0 in NB_CNTL */ 175 * AGPMODE30=0 & AGP30ENHANCED=0 in NB_CNTL */
176 if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) { 176 if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) {
177 WREG32_MC(RS480_MC_MISC_CNTL, 177 tmp = RREG32_MC(RS480_MC_MISC_CNTL);
178 (RS480_GART_INDEX_REG_EN | RS690_BLOCK_GFX_D3_EN)); 178 tmp |= RS480_GART_INDEX_REG_EN | RS690_BLOCK_GFX_D3_EN;
179 WREG32_MC(RS480_MC_MISC_CNTL, tmp);
179 } else { 180 } else {
180 WREG32_MC(RS480_MC_MISC_CNTL, RS480_GART_INDEX_REG_EN); 181 tmp = RREG32_MC(RS480_MC_MISC_CNTL);
182 tmp |= RS480_GART_INDEX_REG_EN;
183 WREG32_MC(RS480_MC_MISC_CNTL, tmp);
181 } 184 }
182 /* Enable gart */ 185 /* Enable gart */
183 WREG32_MC(RS480_AGP_ADDRESS_SPACE_SIZE, (RS480_GART_EN | size_reg)); 186 WREG32_MC(RS480_AGP_ADDRESS_SPACE_SIZE, (RS480_GART_EN | size_reg));
diff --git a/drivers/gpu/drm/radeon/rv6xx_dpm.c b/drivers/gpu/drm/radeon/rv6xx_dpm.c
index 363018c60412..ab1f2016f21e 100644
--- a/drivers/gpu/drm/radeon/rv6xx_dpm.c
+++ b/drivers/gpu/drm/radeon/rv6xx_dpm.c
@@ -1918,6 +1918,7 @@ static int rv6xx_parse_power_table(struct radeon_device *rdev)
1918 (power_state->v1.ucNonClockStateIndex * 1918 (power_state->v1.ucNonClockStateIndex *
1919 power_info->pplib.ucNonClockSize)); 1919 power_info->pplib.ucNonClockSize));
1920 if (power_info->pplib.ucStateEntrySize - 1) { 1920 if (power_info->pplib.ucStateEntrySize - 1) {
1921 u8 *idx;
1921 ps = kzalloc(sizeof(struct rv6xx_ps), GFP_KERNEL); 1922 ps = kzalloc(sizeof(struct rv6xx_ps), GFP_KERNEL);
1922 if (ps == NULL) { 1923 if (ps == NULL) {
1923 kfree(rdev->pm.dpm.ps); 1924 kfree(rdev->pm.dpm.ps);
@@ -1926,12 +1927,12 @@ static int rv6xx_parse_power_table(struct radeon_device *rdev)
1926 rdev->pm.dpm.ps[i].ps_priv = ps; 1927 rdev->pm.dpm.ps[i].ps_priv = ps;
1927 rv6xx_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i], 1928 rv6xx_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i],
1928 non_clock_info); 1929 non_clock_info);
1930 idx = (u8 *)&power_state->v1.ucClockStateIndices[0];
1929 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) { 1931 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
1930 clock_info = (union pplib_clock_info *) 1932 clock_info = (union pplib_clock_info *)
1931 (mode_info->atom_context->bios + data_offset + 1933 (mode_info->atom_context->bios + data_offset +
1932 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) + 1934 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
1933 (power_state->v1.ucClockStateIndices[j] * 1935 (idx[j] * power_info->pplib.ucClockInfoSize));
1934 power_info->pplib.ucClockInfoSize));
1935 rv6xx_parse_pplib_clock_info(rdev, 1936 rv6xx_parse_pplib_clock_info(rdev,
1936 &rdev->pm.dpm.ps[i], j, 1937 &rdev->pm.dpm.ps[i], j,
1937 clock_info); 1938 clock_info);
@@ -1944,9 +1945,7 @@ static int rv6xx_parse_power_table(struct radeon_device *rdev)
1944 1945
1945int rv6xx_dpm_init(struct radeon_device *rdev) 1946int rv6xx_dpm_init(struct radeon_device *rdev)
1946{ 1947{
1947 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info); 1948 struct radeon_atom_ss ss;
1948 uint16_t data_offset, size;
1949 uint8_t frev, crev;
1950 struct atom_clock_dividers dividers; 1949 struct atom_clock_dividers dividers;
1951 struct rv6xx_power_info *pi; 1950 struct rv6xx_power_info *pi;
1952 int ret; 1951 int ret;
@@ -1989,16 +1988,18 @@ int rv6xx_dpm_init(struct radeon_device *rdev)
1989 1988
1990 pi->gfx_clock_gating = true; 1989 pi->gfx_clock_gating = true;
1991 1990
1992 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 1991 pi->sclk_ss = radeon_atombios_get_asic_ss_info(rdev, &ss,
1993 &frev, &crev, &data_offset)) { 1992 ASIC_INTERNAL_ENGINE_SS, 0);
1994 pi->sclk_ss = true; 1993 pi->mclk_ss = radeon_atombios_get_asic_ss_info(rdev, &ss,
1995 pi->mclk_ss = true; 1994 ASIC_INTERNAL_MEMORY_SS, 0);
1995
1996 /* Disable sclk ss, causes hangs on a lot of systems */
1997 pi->sclk_ss = false;
1998
1999 if (pi->sclk_ss || pi->mclk_ss)
1996 pi->dynamic_ss = true; 2000 pi->dynamic_ss = true;
1997 } else { 2001 else
1998 pi->sclk_ss = false;
1999 pi->mclk_ss = false;
2000 pi->dynamic_ss = false; 2002 pi->dynamic_ss = false;
2001 }
2002 2003
2003 pi->dynamic_pcie_gen2 = true; 2004 pi->dynamic_pcie_gen2 = true;
2004 2005
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 30ea14e8854c..9f5846743c9e 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -744,10 +744,10 @@ static void rv770_init_golden_registers(struct radeon_device *rdev)
744 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); 744 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
745 radeon_program_register_sequence(rdev, 745 radeon_program_register_sequence(rdev,
746 rv730_golden_registers, 746 rv730_golden_registers,
747 (const u32)ARRAY_SIZE(rv770_golden_registers)); 747 (const u32)ARRAY_SIZE(rv730_golden_registers));
748 radeon_program_register_sequence(rdev, 748 radeon_program_register_sequence(rdev,
749 rv730_mgcg_init, 749 rv730_mgcg_init,
750 (const u32)ARRAY_SIZE(rv770_mgcg_init)); 750 (const u32)ARRAY_SIZE(rv730_mgcg_init));
751 break; 751 break;
752 case CHIP_RV710: 752 case CHIP_RV710:
753 radeon_program_register_sequence(rdev, 753 radeon_program_register_sequence(rdev,
@@ -758,18 +758,18 @@ static void rv770_init_golden_registers(struct radeon_device *rdev)
758 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers)); 758 (const u32)ARRAY_SIZE(r7xx_golden_dyn_gpr_registers));
759 radeon_program_register_sequence(rdev, 759 radeon_program_register_sequence(rdev,
760 rv710_golden_registers, 760 rv710_golden_registers,
761 (const u32)ARRAY_SIZE(rv770_golden_registers)); 761 (const u32)ARRAY_SIZE(rv710_golden_registers));
762 radeon_program_register_sequence(rdev, 762 radeon_program_register_sequence(rdev,
763 rv710_mgcg_init, 763 rv710_mgcg_init,
764 (const u32)ARRAY_SIZE(rv770_mgcg_init)); 764 (const u32)ARRAY_SIZE(rv710_mgcg_init));
765 break; 765 break;
766 case CHIP_RV740: 766 case CHIP_RV740:
767 radeon_program_register_sequence(rdev, 767 radeon_program_register_sequence(rdev,
768 rv740_golden_registers, 768 rv740_golden_registers,
769 (const u32)ARRAY_SIZE(rv770_golden_registers)); 769 (const u32)ARRAY_SIZE(rv740_golden_registers));
770 radeon_program_register_sequence(rdev, 770 radeon_program_register_sequence(rdev,
771 rv740_mgcg_init, 771 rv740_mgcg_init,
772 (const u32)ARRAY_SIZE(rv770_mgcg_init)); 772 (const u32)ARRAY_SIZE(rv740_mgcg_init));
773 break; 773 break;
774 default: 774 default:
775 break; 775 break;
@@ -801,103 +801,6 @@ u32 rv770_get_xclk(struct radeon_device *rdev)
801 return reference_clock; 801 return reference_clock;
802} 802}
803 803
804int rv770_uvd_resume(struct radeon_device *rdev)
805{
806 uint64_t addr;
807 uint32_t chip_id, size;
808 int r;
809
810 r = radeon_uvd_resume(rdev);
811 if (r)
812 return r;
813
814 /* programm the VCPU memory controller bits 0-27 */
815 addr = rdev->uvd.gpu_addr >> 3;
816 size = RADEON_GPU_PAGE_ALIGN(rdev->uvd.fw_size + 4) >> 3;
817 WREG32(UVD_VCPU_CACHE_OFFSET0, addr);
818 WREG32(UVD_VCPU_CACHE_SIZE0, size);
819
820 addr += size;
821 size = RADEON_UVD_STACK_SIZE >> 3;
822 WREG32(UVD_VCPU_CACHE_OFFSET1, addr);
823 WREG32(UVD_VCPU_CACHE_SIZE1, size);
824
825 addr += size;
826 size = RADEON_UVD_HEAP_SIZE >> 3;
827 WREG32(UVD_VCPU_CACHE_OFFSET2, addr);
828 WREG32(UVD_VCPU_CACHE_SIZE2, size);
829
830 /* bits 28-31 */
831 addr = (rdev->uvd.gpu_addr >> 28) & 0xF;
832 WREG32(UVD_LMI_ADDR_EXT, (addr << 12) | (addr << 0));
833
834 /* bits 32-39 */
835 addr = (rdev->uvd.gpu_addr >> 32) & 0xFF;
836 WREG32(UVD_LMI_EXT40_ADDR, addr | (0x9 << 16) | (0x1 << 31));
837
838 /* tell firmware which hardware it is running on */
839 switch (rdev->family) {
840 default:
841 return -EINVAL;
842 case CHIP_RV710:
843 chip_id = 0x01000005;
844 break;
845 case CHIP_RV730:
846 chip_id = 0x01000006;
847 break;
848 case CHIP_RV740:
849 chip_id = 0x01000007;
850 break;
851 case CHIP_CYPRESS:
852 case CHIP_HEMLOCK:
853 chip_id = 0x01000008;
854 break;
855 case CHIP_JUNIPER:
856 chip_id = 0x01000009;
857 break;
858 case CHIP_REDWOOD:
859 chip_id = 0x0100000a;
860 break;
861 case CHIP_CEDAR:
862 chip_id = 0x0100000b;
863 break;
864 case CHIP_SUMO:
865 case CHIP_SUMO2:
866 chip_id = 0x0100000c;
867 break;
868 case CHIP_PALM:
869 chip_id = 0x0100000e;
870 break;
871 case CHIP_CAYMAN:
872 chip_id = 0x0100000f;
873 break;
874 case CHIP_BARTS:
875 chip_id = 0x01000010;
876 break;
877 case CHIP_TURKS:
878 chip_id = 0x01000011;
879 break;
880 case CHIP_CAICOS:
881 chip_id = 0x01000012;
882 break;
883 case CHIP_TAHITI:
884 chip_id = 0x01000014;
885 break;
886 case CHIP_VERDE:
887 chip_id = 0x01000015;
888 break;
889 case CHIP_PITCAIRN:
890 chip_id = 0x01000016;
891 break;
892 case CHIP_ARUBA:
893 chip_id = 0x01000017;
894 break;
895 }
896 WREG32(UVD_VCPU_CHIP_ID, chip_id);
897
898 return 0;
899}
900
901u32 rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base) 804u32 rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
902{ 805{
903 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id]; 806 struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
@@ -1747,80 +1650,6 @@ static int rv770_mc_init(struct radeon_device *rdev)
1747 return 0; 1650 return 0;
1748} 1651}
1749 1652
1750/**
1751 * rv770_copy_dma - copy pages using the DMA engine
1752 *
1753 * @rdev: radeon_device pointer
1754 * @src_offset: src GPU address
1755 * @dst_offset: dst GPU address
1756 * @num_gpu_pages: number of GPU pages to xfer
1757 * @fence: radeon fence object
1758 *
1759 * Copy GPU paging using the DMA engine (r7xx).
1760 * Used by the radeon ttm implementation to move pages if
1761 * registered as the asic copy callback.
1762 */
1763int rv770_copy_dma(struct radeon_device *rdev,
1764 uint64_t src_offset, uint64_t dst_offset,
1765 unsigned num_gpu_pages,
1766 struct radeon_fence **fence)
1767{
1768 struct radeon_semaphore *sem = NULL;
1769 int ring_index = rdev->asic->copy.dma_ring_index;
1770 struct radeon_ring *ring = &rdev->ring[ring_index];
1771 u32 size_in_dw, cur_size_in_dw;
1772 int i, num_loops;
1773 int r = 0;
1774
1775 r = radeon_semaphore_create(rdev, &sem);
1776 if (r) {
1777 DRM_ERROR("radeon: moving bo (%d).\n", r);
1778 return r;
1779 }
1780
1781 size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
1782 num_loops = DIV_ROUND_UP(size_in_dw, 0xFFFF);
1783 r = radeon_ring_lock(rdev, ring, num_loops * 5 + 8);
1784 if (r) {
1785 DRM_ERROR("radeon: moving bo (%d).\n", r);
1786 radeon_semaphore_free(rdev, &sem, NULL);
1787 return r;
1788 }
1789
1790 if (radeon_fence_need_sync(*fence, ring->idx)) {
1791 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
1792 ring->idx);
1793 radeon_fence_note_sync(*fence, ring->idx);
1794 } else {
1795 radeon_semaphore_free(rdev, &sem, NULL);
1796 }
1797
1798 for (i = 0; i < num_loops; i++) {
1799 cur_size_in_dw = size_in_dw;
1800 if (cur_size_in_dw > 0xFFFF)
1801 cur_size_in_dw = 0xFFFF;
1802 size_in_dw -= cur_size_in_dw;
1803 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw));
1804 radeon_ring_write(ring, dst_offset & 0xfffffffc);
1805 radeon_ring_write(ring, src_offset & 0xfffffffc);
1806 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
1807 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
1808 src_offset += cur_size_in_dw * 4;
1809 dst_offset += cur_size_in_dw * 4;
1810 }
1811
1812 r = radeon_fence_emit(rdev, fence, ring->idx);
1813 if (r) {
1814 radeon_ring_unlock_undo(rdev, ring);
1815 return r;
1816 }
1817
1818 radeon_ring_unlock_commit(rdev, ring);
1819 radeon_semaphore_free(rdev, &sem, *fence);
1820
1821 return r;
1822}
1823
1824static int rv770_startup(struct radeon_device *rdev) 1653static int rv770_startup(struct radeon_device *rdev)
1825{ 1654{
1826 struct radeon_ring *ring; 1655 struct radeon_ring *ring;
@@ -1829,6 +1658,13 @@ static int rv770_startup(struct radeon_device *rdev)
1829 /* enable pcie gen2 link */ 1658 /* enable pcie gen2 link */
1830 rv770_pcie_gen2_enable(rdev); 1659 rv770_pcie_gen2_enable(rdev);
1831 1660
1661 /* scratch needs to be initialized before MC */
1662 r = r600_vram_scratch_init(rdev);
1663 if (r)
1664 return r;
1665
1666 rv770_mc_program(rdev);
1667
1832 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) { 1668 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->rlc_fw) {
1833 r = r600_init_microcode(rdev); 1669 r = r600_init_microcode(rdev);
1834 if (r) { 1670 if (r) {
@@ -1837,11 +1673,6 @@ static int rv770_startup(struct radeon_device *rdev)
1837 } 1673 }
1838 } 1674 }
1839 1675
1840 r = r600_vram_scratch_init(rdev);
1841 if (r)
1842 return r;
1843
1844 rv770_mc_program(rdev);
1845 if (rdev->flags & RADEON_IS_AGP) { 1676 if (rdev->flags & RADEON_IS_AGP) {
1846 rv770_agp_enable(rdev); 1677 rv770_agp_enable(rdev);
1847 } else { 1678 } else {
@@ -1851,12 +1682,6 @@ static int rv770_startup(struct radeon_device *rdev)
1851 } 1682 }
1852 1683
1853 rv770_gpu_init(rdev); 1684 rv770_gpu_init(rdev);
1854 r = r600_blit_init(rdev);
1855 if (r) {
1856 r600_blit_fini(rdev);
1857 rdev->asic->copy.copy = NULL;
1858 dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
1859 }
1860 1685
1861 /* allocate wb buffer */ 1686 /* allocate wb buffer */
1862 r = radeon_wb_init(rdev); 1687 r = radeon_wb_init(rdev);
@@ -1875,7 +1700,7 @@ static int rv770_startup(struct radeon_device *rdev)
1875 return r; 1700 return r;
1876 } 1701 }
1877 1702
1878 r = rv770_uvd_resume(rdev); 1703 r = uvd_v2_2_resume(rdev);
1879 if (!r) { 1704 if (!r) {
1880 r = radeon_fence_driver_start_ring(rdev, 1705 r = radeon_fence_driver_start_ring(rdev,
1881 R600_RING_TYPE_UVD_INDEX); 1706 R600_RING_TYPE_UVD_INDEX);
@@ -1904,14 +1729,14 @@ static int rv770_startup(struct radeon_device *rdev)
1904 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 1729 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
1905 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 1730 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
1906 R600_CP_RB_RPTR, R600_CP_RB_WPTR, 1731 R600_CP_RB_RPTR, R600_CP_RB_WPTR,
1907 0, 0xfffff, RADEON_CP_PACKET2); 1732 RADEON_CP_PACKET2);
1908 if (r) 1733 if (r)
1909 return r; 1734 return r;
1910 1735
1911 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX]; 1736 ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
1912 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 1737 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
1913 DMA_RB_RPTR, DMA_RB_WPTR, 1738 DMA_RB_RPTR, DMA_RB_WPTR,
1914 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0)); 1739 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0));
1915 if (r) 1740 if (r)
1916 return r; 1741 return r;
1917 1742
@@ -1928,12 +1753,11 @@ static int rv770_startup(struct radeon_device *rdev)
1928 1753
1929 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 1754 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
1930 if (ring->ring_size) { 1755 if (ring->ring_size) {
1931 r = radeon_ring_init(rdev, ring, ring->ring_size, 1756 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
1932 R600_WB_UVD_RPTR_OFFSET,
1933 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR, 1757 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
1934 0, 0xfffff, RADEON_CP_PACKET2); 1758 RADEON_CP_PACKET2);
1935 if (!r) 1759 if (!r)
1936 r = r600_uvd_init(rdev); 1760 r = uvd_v1_0_init(rdev);
1937 1761
1938 if (r) 1762 if (r)
1939 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r); 1763 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
@@ -1983,6 +1807,7 @@ int rv770_resume(struct radeon_device *rdev)
1983int rv770_suspend(struct radeon_device *rdev) 1807int rv770_suspend(struct radeon_device *rdev)
1984{ 1808{
1985 r600_audio_fini(rdev); 1809 r600_audio_fini(rdev);
1810 uvd_v1_0_fini(rdev);
1986 radeon_uvd_suspend(rdev); 1811 radeon_uvd_suspend(rdev);
1987 r700_cp_stop(rdev); 1812 r700_cp_stop(rdev);
1988 r600_dma_stop(rdev); 1813 r600_dma_stop(rdev);
@@ -2090,7 +1915,6 @@ int rv770_init(struct radeon_device *rdev)
2090 1915
2091void rv770_fini(struct radeon_device *rdev) 1916void rv770_fini(struct radeon_device *rdev)
2092{ 1917{
2093 r600_blit_fini(rdev);
2094 r700_cp_fini(rdev); 1918 r700_cp_fini(rdev);
2095 r600_dma_fini(rdev); 1919 r600_dma_fini(rdev);
2096 r600_irq_fini(rdev); 1920 r600_irq_fini(rdev);
@@ -2098,6 +1922,7 @@ void rv770_fini(struct radeon_device *rdev)
2098 radeon_ib_pool_fini(rdev); 1922 radeon_ib_pool_fini(rdev);
2099 radeon_irq_kms_fini(rdev); 1923 radeon_irq_kms_fini(rdev);
2100 rv770_pcie_gart_fini(rdev); 1924 rv770_pcie_gart_fini(rdev);
1925 uvd_v1_0_fini(rdev);
2101 radeon_uvd_fini(rdev); 1926 radeon_uvd_fini(rdev);
2102 r600_vram_scratch_fini(rdev); 1927 r600_vram_scratch_fini(rdev);
2103 radeon_gem_fini(rdev); 1928 radeon_gem_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/rv770_dma.c b/drivers/gpu/drm/radeon/rv770_dma.c
new file mode 100644
index 000000000000..f9b02e3d6830
--- /dev/null
+++ b/drivers/gpu/drm/radeon/rv770_dma.c
@@ -0,0 +1,101 @@
1/*
2 * Copyright 2013 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: Alex Deucher
23 */
24#include <drm/drmP.h>
25#include "radeon.h"
26#include "radeon_asic.h"
27#include "rv770d.h"
28
29/**
30 * rv770_copy_dma - copy pages using the DMA engine
31 *
32 * @rdev: radeon_device pointer
33 * @src_offset: src GPU address
34 * @dst_offset: dst GPU address
35 * @num_gpu_pages: number of GPU pages to xfer
36 * @fence: radeon fence object
37 *
38 * Copy GPU paging using the DMA engine (r7xx).
39 * Used by the radeon ttm implementation to move pages if
40 * registered as the asic copy callback.
41 */
42int rv770_copy_dma(struct radeon_device *rdev,
43 uint64_t src_offset, uint64_t dst_offset,
44 unsigned num_gpu_pages,
45 struct radeon_fence **fence)
46{
47 struct radeon_semaphore *sem = NULL;
48 int ring_index = rdev->asic->copy.dma_ring_index;
49 struct radeon_ring *ring = &rdev->ring[ring_index];
50 u32 size_in_dw, cur_size_in_dw;
51 int i, num_loops;
52 int r = 0;
53
54 r = radeon_semaphore_create(rdev, &sem);
55 if (r) {
56 DRM_ERROR("radeon: moving bo (%d).\n", r);
57 return r;
58 }
59
60 size_in_dw = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT) / 4;
61 num_loops = DIV_ROUND_UP(size_in_dw, 0xFFFF);
62 r = radeon_ring_lock(rdev, ring, num_loops * 5 + 8);
63 if (r) {
64 DRM_ERROR("radeon: moving bo (%d).\n", r);
65 radeon_semaphore_free(rdev, &sem, NULL);
66 return r;
67 }
68
69 if (radeon_fence_need_sync(*fence, ring->idx)) {
70 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
71 ring->idx);
72 radeon_fence_note_sync(*fence, ring->idx);
73 } else {
74 radeon_semaphore_free(rdev, &sem, NULL);
75 }
76
77 for (i = 0; i < num_loops; i++) {
78 cur_size_in_dw = size_in_dw;
79 if (cur_size_in_dw > 0xFFFF)
80 cur_size_in_dw = 0xFFFF;
81 size_in_dw -= cur_size_in_dw;
82 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 0, 0, cur_size_in_dw));
83 radeon_ring_write(ring, dst_offset & 0xfffffffc);
84 radeon_ring_write(ring, src_offset & 0xfffffffc);
85 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
86 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
87 src_offset += cur_size_in_dw * 4;
88 dst_offset += cur_size_in_dw * 4;
89 }
90
91 r = radeon_fence_emit(rdev, fence, ring->idx);
92 if (r) {
93 radeon_ring_unlock_undo(rdev, ring);
94 return r;
95 }
96
97 radeon_ring_unlock_commit(rdev, ring);
98 radeon_semaphore_free(rdev, &sem, *fence);
99
100 return r;
101}
diff --git a/drivers/gpu/drm/radeon/rv770_dpm.c b/drivers/gpu/drm/radeon/rv770_dpm.c
index 2d347925f77d..8cbb85dae5aa 100644
--- a/drivers/gpu/drm/radeon/rv770_dpm.c
+++ b/drivers/gpu/drm/radeon/rv770_dpm.c
@@ -2294,6 +2294,7 @@ int rv7xx_parse_power_table(struct radeon_device *rdev)
2294 (power_state->v1.ucNonClockStateIndex * 2294 (power_state->v1.ucNonClockStateIndex *
2295 power_info->pplib.ucNonClockSize)); 2295 power_info->pplib.ucNonClockSize));
2296 if (power_info->pplib.ucStateEntrySize - 1) { 2296 if (power_info->pplib.ucStateEntrySize - 1) {
2297 u8 *idx;
2297 ps = kzalloc(sizeof(struct rv7xx_ps), GFP_KERNEL); 2298 ps = kzalloc(sizeof(struct rv7xx_ps), GFP_KERNEL);
2298 if (ps == NULL) { 2299 if (ps == NULL) {
2299 kfree(rdev->pm.dpm.ps); 2300 kfree(rdev->pm.dpm.ps);
@@ -2303,12 +2304,12 @@ int rv7xx_parse_power_table(struct radeon_device *rdev)
2303 rv7xx_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i], 2304 rv7xx_parse_pplib_non_clock_info(rdev, &rdev->pm.dpm.ps[i],
2304 non_clock_info, 2305 non_clock_info,
2305 power_info->pplib.ucNonClockSize); 2306 power_info->pplib.ucNonClockSize);
2307 idx = (u8 *)&power_state->v1.ucClockStateIndices[0];
2306 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) { 2308 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
2307 clock_info = (union pplib_clock_info *) 2309 clock_info = (union pplib_clock_info *)
2308 (mode_info->atom_context->bios + data_offset + 2310 (mode_info->atom_context->bios + data_offset +
2309 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) + 2311 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
2310 (power_state->v1.ucClockStateIndices[j] * 2312 (idx[j] * power_info->pplib.ucClockInfoSize));
2311 power_info->pplib.ucClockInfoSize));
2312 rv7xx_parse_pplib_clock_info(rdev, 2313 rv7xx_parse_pplib_clock_info(rdev,
2313 &rdev->pm.dpm.ps[i], j, 2314 &rdev->pm.dpm.ps[i], j,
2314 clock_info); 2315 clock_info);
@@ -2319,12 +2320,25 @@ int rv7xx_parse_power_table(struct radeon_device *rdev)
2319 return 0; 2320 return 0;
2320} 2321}
2321 2322
2323void rv770_get_engine_memory_ss(struct radeon_device *rdev)
2324{
2325 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
2326 struct radeon_atom_ss ss;
2327
2328 pi->sclk_ss = radeon_atombios_get_asic_ss_info(rdev, &ss,
2329 ASIC_INTERNAL_ENGINE_SS, 0);
2330 pi->mclk_ss = radeon_atombios_get_asic_ss_info(rdev, &ss,
2331 ASIC_INTERNAL_MEMORY_SS, 0);
2332
2333 if (pi->sclk_ss || pi->mclk_ss)
2334 pi->dynamic_ss = true;
2335 else
2336 pi->dynamic_ss = false;
2337}
2338
2322int rv770_dpm_init(struct radeon_device *rdev) 2339int rv770_dpm_init(struct radeon_device *rdev)
2323{ 2340{
2324 struct rv7xx_power_info *pi; 2341 struct rv7xx_power_info *pi;
2325 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
2326 uint16_t data_offset, size;
2327 uint8_t frev, crev;
2328 struct atom_clock_dividers dividers; 2342 struct atom_clock_dividers dividers;
2329 int ret; 2343 int ret;
2330 2344
@@ -2369,16 +2383,7 @@ int rv770_dpm_init(struct radeon_device *rdev)
2369 pi->mvdd_control = 2383 pi->mvdd_control =
2370 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 0); 2384 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_MVDDC, 0);
2371 2385
2372 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 2386 rv770_get_engine_memory_ss(rdev);
2373 &frev, &crev, &data_offset)) {
2374 pi->sclk_ss = true;
2375 pi->mclk_ss = true;
2376 pi->dynamic_ss = true;
2377 } else {
2378 pi->sclk_ss = false;
2379 pi->mclk_ss = false;
2380 pi->dynamic_ss = false;
2381 }
2382 2387
2383 pi->asi = RV770_ASI_DFLT; 2388 pi->asi = RV770_ASI_DFLT;
2384 pi->pasi = RV770_HASI_DFLT; 2389 pi->pasi = RV770_HASI_DFLT;
@@ -2393,8 +2398,7 @@ int rv770_dpm_init(struct radeon_device *rdev)
2393 2398
2394 pi->dynamic_pcie_gen2 = true; 2399 pi->dynamic_pcie_gen2 = true;
2395 2400
2396 if (pi->gfx_clock_gating && 2401 if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
2397 (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE))
2398 pi->thermal_protection = true; 2402 pi->thermal_protection = true;
2399 else 2403 else
2400 pi->thermal_protection = false; 2404 pi->thermal_protection = false;
@@ -2514,8 +2518,16 @@ u32 rv770_dpm_get_mclk(struct radeon_device *rdev, bool low)
2514bool rv770_dpm_vblank_too_short(struct radeon_device *rdev) 2518bool rv770_dpm_vblank_too_short(struct radeon_device *rdev)
2515{ 2519{
2516 u32 vblank_time = r600_dpm_get_vblank_time(rdev); 2520 u32 vblank_time = r600_dpm_get_vblank_time(rdev);
2521 u32 switch_limit = 300;
2522
2523 /* quirks */
2524 /* ASUS K70AF */
2525 if ((rdev->pdev->device == 0x9553) &&
2526 (rdev->pdev->subsystem_vendor == 0x1043) &&
2527 (rdev->pdev->subsystem_device == 0x1c42))
2528 switch_limit = 200;
2517 2529
2518 if (vblank_time < 300) 2530 if (vblank_time < switch_limit)
2519 return true; 2531 return true;
2520 else 2532 else
2521 return false; 2533 return false;
diff --git a/drivers/gpu/drm/radeon/rv770_dpm.h b/drivers/gpu/drm/radeon/rv770_dpm.h
index 96b1b2a62a8a..9244effc6b59 100644
--- a/drivers/gpu/drm/radeon/rv770_dpm.h
+++ b/drivers/gpu/drm/radeon/rv770_dpm.h
@@ -275,6 +275,7 @@ void rv770_set_uvd_clock_before_set_eng_clock(struct radeon_device *rdev,
275void rv770_set_uvd_clock_after_set_eng_clock(struct radeon_device *rdev, 275void rv770_set_uvd_clock_after_set_eng_clock(struct radeon_device *rdev,
276 struct radeon_ps *new_ps, 276 struct radeon_ps *new_ps,
277 struct radeon_ps *old_ps); 277 struct radeon_ps *old_ps);
278void rv770_get_engine_memory_ss(struct radeon_device *rdev);
278 279
279/* smc */ 280/* smc */
280int rv770_read_smc_soft_register(struct radeon_device *rdev, 281int rv770_read_smc_soft_register(struct radeon_device *rdev,
diff --git a/drivers/gpu/drm/radeon/rv770d.h b/drivers/gpu/drm/radeon/rv770d.h
index 6bef2b7d601b..9fe60e542922 100644
--- a/drivers/gpu/drm/radeon/rv770d.h
+++ b/drivers/gpu/drm/radeon/rv770d.h
@@ -971,7 +971,21 @@
971# define TARGET_LINK_SPEED_MASK (0xf << 0) 971# define TARGET_LINK_SPEED_MASK (0xf << 0)
972# define SELECTABLE_DEEMPHASIS (1 << 6) 972# define SELECTABLE_DEEMPHASIS (1 << 6)
973 973
974/*
975 * PM4
976 */
977#define PACKET0(reg, n) ((RADEON_PACKET_TYPE0 << 30) | \
978 (((reg) >> 2) & 0xFFFF) | \
979 ((n) & 0x3FFF) << 16)
980#define PACKET3(op, n) ((RADEON_PACKET_TYPE3 << 30) | \
981 (((op) & 0xFF) << 8) | \
982 ((n) & 0x3FFF) << 16)
983
974/* UVD */ 984/* UVD */
985#define UVD_GPCOM_VCPU_CMD 0xef0c
986#define UVD_GPCOM_VCPU_DATA0 0xef10
987#define UVD_GPCOM_VCPU_DATA1 0xef14
988
975#define UVD_LMI_EXT40_ADDR 0xf498 989#define UVD_LMI_EXT40_ADDR 0xf498
976#define UVD_VCPU_CHIP_ID 0xf4d4 990#define UVD_VCPU_CHIP_ID 0xf4d4
977#define UVD_VCPU_CACHE_OFFSET0 0xf4d8 991#define UVD_VCPU_CACHE_OFFSET0 0xf4d8
@@ -985,4 +999,6 @@
985#define UVD_RBC_RB_RPTR 0xf690 999#define UVD_RBC_RB_RPTR 0xf690
986#define UVD_RBC_RB_WPTR 0xf694 1000#define UVD_RBC_RB_WPTR 0xf694
987 1001
1002#define UVD_CONTEXT_ID 0xf6f4
1003
988#endif 1004#endif
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index d71037f4f68f..3e23b757dcfa 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -68,6 +68,8 @@ MODULE_FIRMWARE("radeon/HAINAN_smc.bin");
68 68
69static void si_pcie_gen3_enable(struct radeon_device *rdev); 69static void si_pcie_gen3_enable(struct radeon_device *rdev);
70static void si_program_aspm(struct radeon_device *rdev); 70static void si_program_aspm(struct radeon_device *rdev);
71extern void sumo_rlc_fini(struct radeon_device *rdev);
72extern int sumo_rlc_init(struct radeon_device *rdev);
71extern int r600_ih_ring_alloc(struct radeon_device *rdev); 73extern int r600_ih_ring_alloc(struct radeon_device *rdev);
72extern void r600_ih_ring_fini(struct radeon_device *rdev); 74extern void r600_ih_ring_fini(struct radeon_device *rdev);
73extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev); 75extern void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev);
@@ -76,6 +78,11 @@ extern void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_
76extern u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev); 78extern u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev);
77extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev); 79extern void evergreen_print_gpu_status_regs(struct radeon_device *rdev);
78extern bool evergreen_is_display_hung(struct radeon_device *rdev); 80extern bool evergreen_is_display_hung(struct radeon_device *rdev);
81extern void si_dma_vm_set_page(struct radeon_device *rdev,
82 struct radeon_ib *ib,
83 uint64_t pe,
84 uint64_t addr, unsigned count,
85 uint32_t incr, uint32_t flags);
79 86
80static const u32 verde_rlc_save_restore_register_list[] = 87static const u32 verde_rlc_save_restore_register_list[] =
81{ 88{
@@ -1663,9 +1670,13 @@ static int si_init_microcode(struct radeon_device *rdev)
1663 1670
1664 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); 1671 snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
1665 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); 1672 err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
1666 if (err) 1673 if (err) {
1667 goto out; 1674 printk(KERN_ERR
1668 if (rdev->smc_fw->size != smc_req_size) { 1675 "smc: error loading firmware \"%s\"\n",
1676 fw_name);
1677 release_firmware(rdev->smc_fw);
1678 rdev->smc_fw = NULL;
1679 } else if (rdev->smc_fw->size != smc_req_size) {
1669 printk(KERN_ERR 1680 printk(KERN_ERR
1670 "si_smc: Bogus length %zu in firmware \"%s\"\n", 1681 "si_smc: Bogus length %zu in firmware \"%s\"\n",
1671 rdev->smc_fw->size, fw_name); 1682 rdev->smc_fw->size, fw_name);
@@ -1700,7 +1711,8 @@ static u32 dce6_line_buffer_adjust(struct radeon_device *rdev,
1700 struct drm_display_mode *mode, 1711 struct drm_display_mode *mode,
1701 struct drm_display_mode *other_mode) 1712 struct drm_display_mode *other_mode)
1702{ 1713{
1703 u32 tmp; 1714 u32 tmp, buffer_alloc, i;
1715 u32 pipe_offset = radeon_crtc->crtc_id * 0x20;
1704 /* 1716 /*
1705 * Line Buffer Setup 1717 * Line Buffer Setup
1706 * There are 3 line buffers, each one shared by 2 display controllers. 1718 * There are 3 line buffers, each one shared by 2 display controllers.
@@ -1715,16 +1727,30 @@ static u32 dce6_line_buffer_adjust(struct radeon_device *rdev,
1715 * non-linked crtcs for maximum line buffer allocation. 1727 * non-linked crtcs for maximum line buffer allocation.
1716 */ 1728 */
1717 if (radeon_crtc->base.enabled && mode) { 1729 if (radeon_crtc->base.enabled && mode) {
1718 if (other_mode) 1730 if (other_mode) {
1719 tmp = 0; /* 1/2 */ 1731 tmp = 0; /* 1/2 */
1720 else 1732 buffer_alloc = 1;
1733 } else {
1721 tmp = 2; /* whole */ 1734 tmp = 2; /* whole */
1722 } else 1735 buffer_alloc = 2;
1736 }
1737 } else {
1723 tmp = 0; 1738 tmp = 0;
1739 buffer_alloc = 0;
1740 }
1724 1741
1725 WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset, 1742 WREG32(DC_LB_MEMORY_SPLIT + radeon_crtc->crtc_offset,
1726 DC_LB_MEMORY_CONFIG(tmp)); 1743 DC_LB_MEMORY_CONFIG(tmp));
1727 1744
1745 WREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset,
1746 DMIF_BUFFERS_ALLOCATED(buffer_alloc));
1747 for (i = 0; i < rdev->usec_timeout; i++) {
1748 if (RREG32(PIPE0_DMIF_BUFFER_CONTROL + pipe_offset) &
1749 DMIF_BUFFERS_ALLOCATED_COMPLETED)
1750 break;
1751 udelay(1);
1752 }
1753
1728 if (radeon_crtc->base.enabled && mode) { 1754 if (radeon_crtc->base.enabled && mode) {
1729 switch (tmp) { 1755 switch (tmp) {
1730 case 0: 1756 case 0:
@@ -3360,17 +3386,6 @@ static int si_cp_resume(struct radeon_device *rdev)
3360 u32 rb_bufsz; 3386 u32 rb_bufsz;
3361 int r; 3387 int r;
3362 3388
3363 /* Reset cp; if cp is reset, then PA, SH, VGT also need to be reset */
3364 WREG32(GRBM_SOFT_RESET, (SOFT_RESET_CP |
3365 SOFT_RESET_PA |
3366 SOFT_RESET_VGT |
3367 SOFT_RESET_SPI |
3368 SOFT_RESET_SX));
3369 RREG32(GRBM_SOFT_RESET);
3370 mdelay(15);
3371 WREG32(GRBM_SOFT_RESET, 0);
3372 RREG32(GRBM_SOFT_RESET);
3373
3374 WREG32(CP_SEM_WAIT_TIMER, 0x0); 3389 WREG32(CP_SEM_WAIT_TIMER, 0x0);
3375 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0); 3390 WREG32(CP_SEM_INCOMPLETE_TIMER_CNTL, 0x0);
3376 3391
@@ -3489,7 +3504,7 @@ static int si_cp_resume(struct radeon_device *rdev)
3489 return 0; 3504 return 0;
3490} 3505}
3491 3506
3492static u32 si_gpu_check_soft_reset(struct radeon_device *rdev) 3507u32 si_gpu_check_soft_reset(struct radeon_device *rdev)
3493{ 3508{
3494 u32 reset_mask = 0; 3509 u32 reset_mask = 0;
3495 u32 tmp; 3510 u32 tmp;
@@ -3738,34 +3753,6 @@ bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
3738 return radeon_ring_test_lockup(rdev, ring); 3753 return radeon_ring_test_lockup(rdev, ring);
3739} 3754}
3740 3755
3741/**
3742 * si_dma_is_lockup - Check if the DMA engine is locked up
3743 *
3744 * @rdev: radeon_device pointer
3745 * @ring: radeon_ring structure holding ring information
3746 *
3747 * Check if the async DMA engine is locked up.
3748 * Returns true if the engine appears to be locked up, false if not.
3749 */
3750bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
3751{
3752 u32 reset_mask = si_gpu_check_soft_reset(rdev);
3753 u32 mask;
3754
3755 if (ring->idx == R600_RING_TYPE_DMA_INDEX)
3756 mask = RADEON_RESET_DMA;
3757 else
3758 mask = RADEON_RESET_DMA1;
3759
3760 if (!(reset_mask & mask)) {
3761 radeon_ring_lockup_update(ring);
3762 return false;
3763 }
3764 /* force ring activities */
3765 radeon_ring_force_activity(rdev, ring);
3766 return radeon_ring_test_lockup(rdev, ring);
3767}
3768
3769/* MC */ 3756/* MC */
3770static void si_mc_program(struct radeon_device *rdev) 3757static void si_mc_program(struct radeon_device *rdev)
3771{ 3758{
@@ -4079,13 +4066,64 @@ static int si_vm_packet3_ce_check(struct radeon_device *rdev,
4079 return 0; 4066 return 0;
4080} 4067}
4081 4068
4069static int si_vm_packet3_cp_dma_check(u32 *ib, u32 idx)
4070{
4071 u32 start_reg, reg, i;
4072 u32 command = ib[idx + 4];
4073 u32 info = ib[idx + 1];
4074 u32 idx_value = ib[idx];
4075 if (command & PACKET3_CP_DMA_CMD_SAS) {
4076 /* src address space is register */
4077 if (((info & 0x60000000) >> 29) == 0) {
4078 start_reg = idx_value << 2;
4079 if (command & PACKET3_CP_DMA_CMD_SAIC) {
4080 reg = start_reg;
4081 if (!si_vm_reg_valid(reg)) {
4082 DRM_ERROR("CP DMA Bad SRC register\n");
4083 return -EINVAL;
4084 }
4085 } else {
4086 for (i = 0; i < (command & 0x1fffff); i++) {
4087 reg = start_reg + (4 * i);
4088 if (!si_vm_reg_valid(reg)) {
4089 DRM_ERROR("CP DMA Bad SRC register\n");
4090 return -EINVAL;
4091 }
4092 }
4093 }
4094 }
4095 }
4096 if (command & PACKET3_CP_DMA_CMD_DAS) {
4097 /* dst address space is register */
4098 if (((info & 0x00300000) >> 20) == 0) {
4099 start_reg = ib[idx + 2];
4100 if (command & PACKET3_CP_DMA_CMD_DAIC) {
4101 reg = start_reg;
4102 if (!si_vm_reg_valid(reg)) {
4103 DRM_ERROR("CP DMA Bad DST register\n");
4104 return -EINVAL;
4105 }
4106 } else {
4107 for (i = 0; i < (command & 0x1fffff); i++) {
4108 reg = start_reg + (4 * i);
4109 if (!si_vm_reg_valid(reg)) {
4110 DRM_ERROR("CP DMA Bad DST register\n");
4111 return -EINVAL;
4112 }
4113 }
4114 }
4115 }
4116 }
4117 return 0;
4118}
4119
4082static int si_vm_packet3_gfx_check(struct radeon_device *rdev, 4120static int si_vm_packet3_gfx_check(struct radeon_device *rdev,
4083 u32 *ib, struct radeon_cs_packet *pkt) 4121 u32 *ib, struct radeon_cs_packet *pkt)
4084{ 4122{
4123 int r;
4085 u32 idx = pkt->idx + 1; 4124 u32 idx = pkt->idx + 1;
4086 u32 idx_value = ib[idx]; 4125 u32 idx_value = ib[idx];
4087 u32 start_reg, end_reg, reg, i; 4126 u32 start_reg, end_reg, reg, i;
4088 u32 command, info;
4089 4127
4090 switch (pkt->opcode) { 4128 switch (pkt->opcode) {
4091 case PACKET3_NOP: 4129 case PACKET3_NOP:
@@ -4186,50 +4224,9 @@ static int si_vm_packet3_gfx_check(struct radeon_device *rdev,
4186 } 4224 }
4187 break; 4225 break;
4188 case PACKET3_CP_DMA: 4226 case PACKET3_CP_DMA:
4189 command = ib[idx + 4]; 4227 r = si_vm_packet3_cp_dma_check(ib, idx);
4190 info = ib[idx + 1]; 4228 if (r)
4191 if (command & PACKET3_CP_DMA_CMD_SAS) { 4229 return r;
4192 /* src address space is register */
4193 if (((info & 0x60000000) >> 29) == 0) {
4194 start_reg = idx_value << 2;
4195 if (command & PACKET3_CP_DMA_CMD_SAIC) {
4196 reg = start_reg;
4197 if (!si_vm_reg_valid(reg)) {
4198 DRM_ERROR("CP DMA Bad SRC register\n");
4199 return -EINVAL;
4200 }
4201 } else {
4202 for (i = 0; i < (command & 0x1fffff); i++) {
4203 reg = start_reg + (4 * i);
4204 if (!si_vm_reg_valid(reg)) {
4205 DRM_ERROR("CP DMA Bad SRC register\n");
4206 return -EINVAL;
4207 }
4208 }
4209 }
4210 }
4211 }
4212 if (command & PACKET3_CP_DMA_CMD_DAS) {
4213 /* dst address space is register */
4214 if (((info & 0x00300000) >> 20) == 0) {
4215 start_reg = ib[idx + 2];
4216 if (command & PACKET3_CP_DMA_CMD_DAIC) {
4217 reg = start_reg;
4218 if (!si_vm_reg_valid(reg)) {
4219 DRM_ERROR("CP DMA Bad DST register\n");
4220 return -EINVAL;
4221 }
4222 } else {
4223 for (i = 0; i < (command & 0x1fffff); i++) {
4224 reg = start_reg + (4 * i);
4225 if (!si_vm_reg_valid(reg)) {
4226 DRM_ERROR("CP DMA Bad DST register\n");
4227 return -EINVAL;
4228 }
4229 }
4230 }
4231 }
4232 }
4233 break; 4230 break;
4234 default: 4231 default:
4235 DRM_ERROR("Invalid GFX packet3: 0x%x\n", pkt->opcode); 4232 DRM_ERROR("Invalid GFX packet3: 0x%x\n", pkt->opcode);
@@ -4241,6 +4238,7 @@ static int si_vm_packet3_gfx_check(struct radeon_device *rdev,
4241static int si_vm_packet3_compute_check(struct radeon_device *rdev, 4238static int si_vm_packet3_compute_check(struct radeon_device *rdev,
4242 u32 *ib, struct radeon_cs_packet *pkt) 4239 u32 *ib, struct radeon_cs_packet *pkt)
4243{ 4240{
4241 int r;
4244 u32 idx = pkt->idx + 1; 4242 u32 idx = pkt->idx + 1;
4245 u32 idx_value = ib[idx]; 4243 u32 idx_value = ib[idx];
4246 u32 start_reg, reg, i; 4244 u32 start_reg, reg, i;
@@ -4313,6 +4311,11 @@ static int si_vm_packet3_compute_check(struct radeon_device *rdev,
4313 return -EINVAL; 4311 return -EINVAL;
4314 } 4312 }
4315 break; 4313 break;
4314 case PACKET3_CP_DMA:
4315 r = si_vm_packet3_cp_dma_check(ib, idx);
4316 if (r)
4317 return r;
4318 break;
4316 default: 4319 default:
4317 DRM_ERROR("Invalid Compute packet3: 0x%x\n", pkt->opcode); 4320 DRM_ERROR("Invalid Compute packet3: 0x%x\n", pkt->opcode);
4318 return -EINVAL; 4321 return -EINVAL;
@@ -4704,58 +4707,7 @@ void si_vm_set_page(struct radeon_device *rdev,
4704 } 4707 }
4705 } else { 4708 } else {
4706 /* DMA */ 4709 /* DMA */
4707 if (flags & RADEON_VM_PAGE_SYSTEM) { 4710 si_dma_vm_set_page(rdev, ib, pe, addr, count, incr, flags);
4708 while (count) {
4709 ndw = count * 2;
4710 if (ndw > 0xFFFFE)
4711 ndw = 0xFFFFE;
4712
4713 /* for non-physically contiguous pages (system) */
4714 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, ndw);
4715 ib->ptr[ib->length_dw++] = pe;
4716 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
4717 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
4718 if (flags & RADEON_VM_PAGE_SYSTEM) {
4719 value = radeon_vm_map_gart(rdev, addr);
4720 value &= 0xFFFFFFFFFFFFF000ULL;
4721 } else if (flags & RADEON_VM_PAGE_VALID) {
4722 value = addr;
4723 } else {
4724 value = 0;
4725 }
4726 addr += incr;
4727 value |= r600_flags;
4728 ib->ptr[ib->length_dw++] = value;
4729 ib->ptr[ib->length_dw++] = upper_32_bits(value);
4730 }
4731 }
4732 } else {
4733 while (count) {
4734 ndw = count * 2;
4735 if (ndw > 0xFFFFE)
4736 ndw = 0xFFFFE;
4737
4738 if (flags & RADEON_VM_PAGE_VALID)
4739 value = addr;
4740 else
4741 value = 0;
4742 /* for physically contiguous pages (vram) */
4743 ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
4744 ib->ptr[ib->length_dw++] = pe; /* dst addr */
4745 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
4746 ib->ptr[ib->length_dw++] = r600_flags; /* mask */
4747 ib->ptr[ib->length_dw++] = 0;
4748 ib->ptr[ib->length_dw++] = value; /* value */
4749 ib->ptr[ib->length_dw++] = upper_32_bits(value);
4750 ib->ptr[ib->length_dw++] = incr; /* increment size */
4751 ib->ptr[ib->length_dw++] = 0;
4752 pe += ndw * 4;
4753 addr += (ndw / 2) * incr;
4754 count -= ndw / 2;
4755 }
4756 }
4757 while (ib->length_dw & 0x7)
4758 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0);
4759 } 4711 }
4760} 4712}
4761 4713
@@ -4802,32 +4754,6 @@ void si_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
4802 radeon_ring_write(ring, 0x0); 4754 radeon_ring_write(ring, 0x0);
4803} 4755}
4804 4756
4805void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
4806{
4807 struct radeon_ring *ring = &rdev->ring[ridx];
4808
4809 if (vm == NULL)
4810 return;
4811
4812 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
4813 if (vm->id < 8) {
4814 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2));
4815 } else {
4816 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2));
4817 }
4818 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
4819
4820 /* flush hdp cache */
4821 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
4822 radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2));
4823 radeon_ring_write(ring, 1);
4824
4825 /* bits 0-7 are the VM contexts0-7 */
4826 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
4827 radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2));
4828 radeon_ring_write(ring, 1 << vm->id);
4829}
4830
4831/* 4757/*
4832 * Power and clock gating 4758 * Power and clock gating
4833 */ 4759 */
@@ -4895,7 +4821,7 @@ static void si_set_uvd_dcm(struct radeon_device *rdev,
4895 WREG32_UVD_CTX(UVD_CGC_CTRL2, tmp2); 4821 WREG32_UVD_CTX(UVD_CGC_CTRL2, tmp2);
4896} 4822}
4897 4823
4898static void si_init_uvd_internal_cg(struct radeon_device *rdev) 4824void si_init_uvd_internal_cg(struct radeon_device *rdev)
4899{ 4825{
4900 bool hw_mode = true; 4826 bool hw_mode = true;
4901 4827
@@ -4938,7 +4864,7 @@ static void si_enable_dma_pg(struct radeon_device *rdev, bool enable)
4938 u32 data, orig; 4864 u32 data, orig;
4939 4865
4940 orig = data = RREG32(DMA_PG); 4866 orig = data = RREG32(DMA_PG);
4941 if (enable) 4867 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_SDMA))
4942 data |= PG_CNTL_ENABLE; 4868 data |= PG_CNTL_ENABLE;
4943 else 4869 else
4944 data &= ~PG_CNTL_ENABLE; 4870 data &= ~PG_CNTL_ENABLE;
@@ -4962,7 +4888,7 @@ static void si_enable_gfx_cgpg(struct radeon_device *rdev,
4962{ 4888{
4963 u32 tmp; 4889 u32 tmp;
4964 4890
4965 if (enable) { 4891 if (enable && (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG)) {
4966 tmp = RLC_PUD(0x10) | RLC_PDD(0x10) | RLC_TTPD(0x10) | RLC_MSD(0x10); 4892 tmp = RLC_PUD(0x10) | RLC_PDD(0x10) | RLC_TTPD(0x10) | RLC_MSD(0x10);
4967 WREG32(RLC_TTOP_D, tmp); 4893 WREG32(RLC_TTOP_D, tmp);
4968 4894
@@ -5065,9 +4991,9 @@ static void si_enable_cgcg(struct radeon_device *rdev,
5065 4991
5066 orig = data = RREG32(RLC_CGCG_CGLS_CTRL); 4992 orig = data = RREG32(RLC_CGCG_CGLS_CTRL);
5067 4993
5068 si_enable_gui_idle_interrupt(rdev, enable); 4994 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CGCG)) {
4995 si_enable_gui_idle_interrupt(rdev, true);
5069 4996
5070 if (enable) {
5071 WREG32(RLC_GCPM_GENERAL_3, 0x00000080); 4997 WREG32(RLC_GCPM_GENERAL_3, 0x00000080);
5072 4998
5073 tmp = si_halt_rlc(rdev); 4999 tmp = si_halt_rlc(rdev);
@@ -5084,6 +5010,8 @@ static void si_enable_cgcg(struct radeon_device *rdev,
5084 5010
5085 data |= CGCG_EN | CGLS_EN; 5011 data |= CGCG_EN | CGLS_EN;
5086 } else { 5012 } else {
5013 si_enable_gui_idle_interrupt(rdev, false);
5014
5087 RREG32(CB_CGTT_SCLK_CTRL); 5015 RREG32(CB_CGTT_SCLK_CTRL);
5088 RREG32(CB_CGTT_SCLK_CTRL); 5016 RREG32(CB_CGTT_SCLK_CTRL);
5089 RREG32(CB_CGTT_SCLK_CTRL); 5017 RREG32(CB_CGTT_SCLK_CTRL);
@@ -5101,16 +5029,18 @@ static void si_enable_mgcg(struct radeon_device *rdev,
5101{ 5029{
5102 u32 data, orig, tmp = 0; 5030 u32 data, orig, tmp = 0;
5103 5031
5104 if (enable) { 5032 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_MGCG)) {
5105 orig = data = RREG32(CGTS_SM_CTRL_REG); 5033 orig = data = RREG32(CGTS_SM_CTRL_REG);
5106 data = 0x96940200; 5034 data = 0x96940200;
5107 if (orig != data) 5035 if (orig != data)
5108 WREG32(CGTS_SM_CTRL_REG, data); 5036 WREG32(CGTS_SM_CTRL_REG, data);
5109 5037
5110 orig = data = RREG32(CP_MEM_SLP_CNTL); 5038 if (rdev->cg_flags & RADEON_CG_SUPPORT_GFX_CP_LS) {
5111 data |= CP_MEM_LS_EN; 5039 orig = data = RREG32(CP_MEM_SLP_CNTL);
5112 if (orig != data) 5040 data |= CP_MEM_LS_EN;
5113 WREG32(CP_MEM_SLP_CNTL, data); 5041 if (orig != data)
5042 WREG32(CP_MEM_SLP_CNTL, data);
5043 }
5114 5044
5115 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE); 5045 orig = data = RREG32(RLC_CGTT_MGCG_OVERRIDE);
5116 data &= 0xffffffc0; 5046 data &= 0xffffffc0;
@@ -5155,7 +5085,7 @@ static void si_enable_uvd_mgcg(struct radeon_device *rdev,
5155{ 5085{
5156 u32 orig, data, tmp; 5086 u32 orig, data, tmp;
5157 5087
5158 if (enable) { 5088 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_UVD_MGCG)) {
5159 tmp = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL); 5089 tmp = RREG32_UVD_CTX(UVD_CGC_MEM_CTRL);
5160 tmp |= 0x3fff; 5090 tmp |= 0x3fff;
5161 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, tmp); 5091 WREG32_UVD_CTX(UVD_CGC_MEM_CTRL, tmp);
@@ -5203,7 +5133,7 @@ static void si_enable_mc_ls(struct radeon_device *rdev,
5203 5133
5204 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) { 5134 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
5205 orig = data = RREG32(mc_cg_registers[i]); 5135 orig = data = RREG32(mc_cg_registers[i]);
5206 if (enable) 5136 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_LS))
5207 data |= MC_LS_ENABLE; 5137 data |= MC_LS_ENABLE;
5208 else 5138 else
5209 data &= ~MC_LS_ENABLE; 5139 data &= ~MC_LS_ENABLE;
@@ -5212,230 +5142,295 @@ static void si_enable_mc_ls(struct radeon_device *rdev,
5212 } 5142 }
5213} 5143}
5214 5144
5215 5145static void si_enable_mc_mgcg(struct radeon_device *rdev,
5216static void si_init_cg(struct radeon_device *rdev) 5146 bool enable)
5217{ 5147{
5218 bool has_uvd = true; 5148 int i;
5149 u32 orig, data;
5219 5150
5220 si_enable_mgcg(rdev, true); 5151 for (i = 0; i < ARRAY_SIZE(mc_cg_registers); i++) {
5221 si_enable_cgcg(rdev, true); 5152 orig = data = RREG32(mc_cg_registers[i]);
5222 /* disable MC LS on Tahiti */ 5153 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_MC_MGCG))
5223 if (rdev->family == CHIP_TAHITI) 5154 data |= MC_CG_ENABLE;
5224 si_enable_mc_ls(rdev, false); 5155 else
5225 if (has_uvd) { 5156 data &= ~MC_CG_ENABLE;
5226 si_enable_uvd_mgcg(rdev, true); 5157 if (data != orig)
5227 si_init_uvd_internal_cg(rdev); 5158 WREG32(mc_cg_registers[i], data);
5228 } 5159 }
5229} 5160}
5230 5161
5231static void si_fini_cg(struct radeon_device *rdev) 5162static void si_enable_dma_mgcg(struct radeon_device *rdev,
5163 bool enable)
5232{ 5164{
5233 bool has_uvd = true; 5165 u32 orig, data, offset;
5166 int i;
5234 5167
5235 if (has_uvd) 5168 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_SDMA_MGCG)) {
5236 si_enable_uvd_mgcg(rdev, false); 5169 for (i = 0; i < 2; i++) {
5237 si_enable_cgcg(rdev, false); 5170 if (i == 0)
5238 si_enable_mgcg(rdev, false); 5171 offset = DMA0_REGISTER_OFFSET;
5172 else
5173 offset = DMA1_REGISTER_OFFSET;
5174 orig = data = RREG32(DMA_POWER_CNTL + offset);
5175 data &= ~MEM_POWER_OVERRIDE;
5176 if (data != orig)
5177 WREG32(DMA_POWER_CNTL + offset, data);
5178 WREG32(DMA_CLK_CTRL + offset, 0x00000100);
5179 }
5180 } else {
5181 for (i = 0; i < 2; i++) {
5182 if (i == 0)
5183 offset = DMA0_REGISTER_OFFSET;
5184 else
5185 offset = DMA1_REGISTER_OFFSET;
5186 orig = data = RREG32(DMA_POWER_CNTL + offset);
5187 data |= MEM_POWER_OVERRIDE;
5188 if (data != orig)
5189 WREG32(DMA_POWER_CNTL + offset, data);
5190
5191 orig = data = RREG32(DMA_CLK_CTRL + offset);
5192 data = 0xff000000;
5193 if (data != orig)
5194 WREG32(DMA_CLK_CTRL + offset, data);
5195 }
5196 }
5239} 5197}
5240 5198
5241static void si_init_pg(struct radeon_device *rdev) 5199static void si_enable_bif_mgls(struct radeon_device *rdev,
5200 bool enable)
5242{ 5201{
5243 bool has_pg = false; 5202 u32 orig, data;
5244 5203
5245 /* only cape verde supports PG */ 5204 orig = data = RREG32_PCIE(PCIE_CNTL2);
5246 if (rdev->family == CHIP_VERDE)
5247 has_pg = true;
5248 5205
5249 if (has_pg) { 5206 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_BIF_LS))
5250 si_init_ao_cu_mask(rdev); 5207 data |= SLV_MEM_LS_EN | MST_MEM_LS_EN |
5251 si_init_dma_pg(rdev); 5208 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN;
5252 si_enable_dma_pg(rdev, true); 5209 else
5253 si_init_gfx_cgpg(rdev); 5210 data &= ~(SLV_MEM_LS_EN | MST_MEM_LS_EN |
5254 si_enable_gfx_cgpg(rdev, true); 5211 REPLAY_MEM_LS_EN | SLV_MEM_AGGRESSIVE_LS_EN);
5255 } else { 5212
5256 WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8); 5213 if (orig != data)
5257 WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8); 5214 WREG32_PCIE(PCIE_CNTL2, data);
5258 }
5259} 5215}
5260 5216
5261static void si_fini_pg(struct radeon_device *rdev) 5217static void si_enable_hdp_mgcg(struct radeon_device *rdev,
5218 bool enable)
5262{ 5219{
5263 bool has_pg = false; 5220 u32 orig, data;
5264 5221
5265 /* only cape verde supports PG */ 5222 orig = data = RREG32(HDP_HOST_PATH_CNTL);
5266 if (rdev->family == CHIP_VERDE)
5267 has_pg = true;
5268 5223
5269 if (has_pg) { 5224 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_MGCG))
5270 si_enable_dma_pg(rdev, false); 5225 data &= ~CLOCK_GATING_DIS;
5271 si_enable_gfx_cgpg(rdev, false); 5226 else
5272 } 5227 data |= CLOCK_GATING_DIS;
5228
5229 if (orig != data)
5230 WREG32(HDP_HOST_PATH_CNTL, data);
5273} 5231}
5274 5232
5275/* 5233static void si_enable_hdp_ls(struct radeon_device *rdev,
5276 * RLC 5234 bool enable)
5277 */
5278void si_rlc_fini(struct radeon_device *rdev)
5279{ 5235{
5280 int r; 5236 u32 orig, data;
5281
5282 /* save restore block */
5283 if (rdev->rlc.save_restore_obj) {
5284 r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false);
5285 if (unlikely(r != 0))
5286 dev_warn(rdev->dev, "(%d) reserve RLC sr bo failed\n", r);
5287 radeon_bo_unpin(rdev->rlc.save_restore_obj);
5288 radeon_bo_unreserve(rdev->rlc.save_restore_obj);
5289 5237
5290 radeon_bo_unref(&rdev->rlc.save_restore_obj); 5238 orig = data = RREG32(HDP_MEM_POWER_LS);
5291 rdev->rlc.save_restore_obj = NULL;
5292 }
5293 5239
5294 /* clear state block */ 5240 if (enable && (rdev->cg_flags & RADEON_CG_SUPPORT_HDP_LS))
5295 if (rdev->rlc.clear_state_obj) { 5241 data |= HDP_LS_ENABLE;
5296 r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false); 5242 else
5297 if (unlikely(r != 0)) 5243 data &= ~HDP_LS_ENABLE;
5298 dev_warn(rdev->dev, "(%d) reserve RLC c bo failed\n", r);
5299 radeon_bo_unpin(rdev->rlc.clear_state_obj);
5300 radeon_bo_unreserve(rdev->rlc.clear_state_obj);
5301 5244
5302 radeon_bo_unref(&rdev->rlc.clear_state_obj); 5245 if (orig != data)
5303 rdev->rlc.clear_state_obj = NULL; 5246 WREG32(HDP_MEM_POWER_LS, data);
5304 }
5305} 5247}
5306 5248
5307#define RLC_CLEAR_STATE_END_MARKER 0x00000001 5249void si_update_cg(struct radeon_device *rdev,
5308 5250 u32 block, bool enable)
5309int si_rlc_init(struct radeon_device *rdev)
5310{ 5251{
5311 volatile u32 *dst_ptr; 5252 if (block & RADEON_CG_BLOCK_GFX) {
5312 u32 dws, data, i, j, k, reg_num; 5253 /* order matters! */
5313 u32 reg_list_num, reg_list_hdr_blk_index, reg_list_blk_index; 5254 if (enable) {
5314 u64 reg_list_mc_addr; 5255 si_enable_mgcg(rdev, true);
5315 const struct cs_section_def *cs_data = si_cs_data; 5256 si_enable_cgcg(rdev, true);
5316 int r; 5257 } else {
5317 5258 si_enable_cgcg(rdev, false);
5318 /* save restore block */ 5259 si_enable_mgcg(rdev, false);
5319 if (rdev->rlc.save_restore_obj == NULL) {
5320 r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
5321 RADEON_GEM_DOMAIN_VRAM, NULL,
5322 &rdev->rlc.save_restore_obj);
5323 if (r) {
5324 dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
5325 return r;
5326 } 5260 }
5327 } 5261 }
5328 5262
5329 r = radeon_bo_reserve(rdev->rlc.save_restore_obj, false); 5263 if (block & RADEON_CG_BLOCK_MC) {
5330 if (unlikely(r != 0)) { 5264 si_enable_mc_mgcg(rdev, enable);
5331 si_rlc_fini(rdev); 5265 si_enable_mc_ls(rdev, enable);
5332 return r;
5333 } 5266 }
5334 r = radeon_bo_pin(rdev->rlc.save_restore_obj, RADEON_GEM_DOMAIN_VRAM, 5267
5335 &rdev->rlc.save_restore_gpu_addr); 5268 if (block & RADEON_CG_BLOCK_SDMA) {
5336 if (r) { 5269 si_enable_dma_mgcg(rdev, enable);
5337 radeon_bo_unreserve(rdev->rlc.save_restore_obj);
5338 dev_warn(rdev->dev, "(%d) pin RLC sr bo failed\n", r);
5339 si_rlc_fini(rdev);
5340 return r;
5341 } 5270 }
5342 5271
5343 if (rdev->family == CHIP_VERDE) { 5272 if (block & RADEON_CG_BLOCK_BIF) {
5344 r = radeon_bo_kmap(rdev->rlc.save_restore_obj, (void **)&rdev->rlc.sr_ptr); 5273 si_enable_bif_mgls(rdev, enable);
5345 if (r) {
5346 dev_warn(rdev->dev, "(%d) map RLC sr bo failed\n", r);
5347 si_rlc_fini(rdev);
5348 return r;
5349 }
5350 /* write the sr buffer */
5351 dst_ptr = rdev->rlc.sr_ptr;
5352 for (i = 0; i < ARRAY_SIZE(verde_rlc_save_restore_register_list); i++) {
5353 dst_ptr[i] = verde_rlc_save_restore_register_list[i];
5354 }
5355 radeon_bo_kunmap(rdev->rlc.save_restore_obj);
5356 } 5274 }
5357 radeon_bo_unreserve(rdev->rlc.save_restore_obj);
5358 5275
5359 /* clear state block */ 5276 if (block & RADEON_CG_BLOCK_UVD) {
5360 reg_list_num = 0; 5277 if (rdev->has_uvd) {
5361 dws = 0; 5278 si_enable_uvd_mgcg(rdev, enable);
5362 for (i = 0; cs_data[i].section != NULL; i++) {
5363 for (j = 0; cs_data[i].section[j].extent != NULL; j++) {
5364 reg_list_num++;
5365 dws += cs_data[i].section[j].reg_count;
5366 } 5279 }
5367 } 5280 }
5368 reg_list_blk_index = (3 * reg_list_num + 2);
5369 dws += reg_list_blk_index;
5370 5281
5371 if (rdev->rlc.clear_state_obj == NULL) { 5282 if (block & RADEON_CG_BLOCK_HDP) {
5372 r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, 5283 si_enable_hdp_mgcg(rdev, enable);
5373 RADEON_GEM_DOMAIN_VRAM, NULL, &rdev->rlc.clear_state_obj); 5284 si_enable_hdp_ls(rdev, enable);
5374 if (r) {
5375 dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
5376 si_rlc_fini(rdev);
5377 return r;
5378 }
5379 } 5285 }
5380 r = radeon_bo_reserve(rdev->rlc.clear_state_obj, false); 5286}
5381 if (unlikely(r != 0)) { 5287
5382 si_rlc_fini(rdev); 5288static void si_init_cg(struct radeon_device *rdev)
5383 return r; 5289{
5290 si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
5291 RADEON_CG_BLOCK_MC |
5292 RADEON_CG_BLOCK_SDMA |
5293 RADEON_CG_BLOCK_BIF |
5294 RADEON_CG_BLOCK_HDP), true);
5295 if (rdev->has_uvd) {
5296 si_update_cg(rdev, RADEON_CG_BLOCK_UVD, true);
5297 si_init_uvd_internal_cg(rdev);
5384 } 5298 }
5385 r = radeon_bo_pin(rdev->rlc.clear_state_obj, RADEON_GEM_DOMAIN_VRAM, 5299}
5386 &rdev->rlc.clear_state_gpu_addr);
5387 if (r) {
5388 5300
5389 radeon_bo_unreserve(rdev->rlc.clear_state_obj); 5301static void si_fini_cg(struct radeon_device *rdev)
5390 dev_warn(rdev->dev, "(%d) pin RLC c bo failed\n", r); 5302{
5391 si_rlc_fini(rdev); 5303 if (rdev->has_uvd) {
5392 return r; 5304 si_update_cg(rdev, RADEON_CG_BLOCK_UVD, false);
5393 } 5305 }
5394 r = radeon_bo_kmap(rdev->rlc.clear_state_obj, (void **)&rdev->rlc.cs_ptr); 5306 si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
5395 if (r) { 5307 RADEON_CG_BLOCK_MC |
5396 dev_warn(rdev->dev, "(%d) map RLC c bo failed\n", r); 5308 RADEON_CG_BLOCK_SDMA |
5397 si_rlc_fini(rdev); 5309 RADEON_CG_BLOCK_BIF |
5398 return r; 5310 RADEON_CG_BLOCK_HDP), false);
5311}
5312
5313u32 si_get_csb_size(struct radeon_device *rdev)
5314{
5315 u32 count = 0;
5316 const struct cs_section_def *sect = NULL;
5317 const struct cs_extent_def *ext = NULL;
5318
5319 if (rdev->rlc.cs_data == NULL)
5320 return 0;
5321
5322 /* begin clear state */
5323 count += 2;
5324 /* context control state */
5325 count += 3;
5326
5327 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
5328 for (ext = sect->section; ext->extent != NULL; ++ext) {
5329 if (sect->id == SECT_CONTEXT)
5330 count += 2 + ext->reg_count;
5331 else
5332 return 0;
5333 }
5399 } 5334 }
5400 /* set up the cs buffer */ 5335 /* pa_sc_raster_config */
5401 dst_ptr = rdev->rlc.cs_ptr; 5336 count += 3;
5402 reg_list_hdr_blk_index = 0; 5337 /* end clear state */
5403 reg_list_mc_addr = rdev->rlc.clear_state_gpu_addr + (reg_list_blk_index * 4); 5338 count += 2;
5404 data = upper_32_bits(reg_list_mc_addr); 5339 /* clear state */
5405 dst_ptr[reg_list_hdr_blk_index] = data; 5340 count += 2;
5406 reg_list_hdr_blk_index++; 5341
5407 for (i = 0; cs_data[i].section != NULL; i++) { 5342 return count;
5408 for (j = 0; cs_data[i].section[j].extent != NULL; j++) { 5343}
5409 reg_num = cs_data[i].section[j].reg_count; 5344
5410 data = reg_list_mc_addr & 0xffffffff; 5345void si_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer)
5411 dst_ptr[reg_list_hdr_blk_index] = data; 5346{
5412 reg_list_hdr_blk_index++; 5347 u32 count = 0, i;
5413 5348 const struct cs_section_def *sect = NULL;
5414 data = (cs_data[i].section[j].reg_index * 4) & 0xffffffff; 5349 const struct cs_extent_def *ext = NULL;
5415 dst_ptr[reg_list_hdr_blk_index] = data; 5350
5416 reg_list_hdr_blk_index++; 5351 if (rdev->rlc.cs_data == NULL)
5417 5352 return;
5418 data = 0x08000000 | (reg_num * 4); 5353 if (buffer == NULL)
5419 dst_ptr[reg_list_hdr_blk_index] = data; 5354 return;
5420 reg_list_hdr_blk_index++; 5355
5421 5356 buffer[count++] = PACKET3(PACKET3_PREAMBLE_CNTL, 0);
5422 for (k = 0; k < reg_num; k++) { 5357 buffer[count++] = PACKET3_PREAMBLE_BEGIN_CLEAR_STATE;
5423 data = cs_data[i].section[j].extent[k]; 5358
5424 dst_ptr[reg_list_blk_index + k] = data; 5359 buffer[count++] = PACKET3(PACKET3_CONTEXT_CONTROL, 1);
5360 buffer[count++] = 0x80000000;
5361 buffer[count++] = 0x80000000;
5362
5363 for (sect = rdev->rlc.cs_data; sect->section != NULL; ++sect) {
5364 for (ext = sect->section; ext->extent != NULL; ++ext) {
5365 if (sect->id == SECT_CONTEXT) {
5366 buffer[count++] = PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count);
5367 buffer[count++] = ext->reg_index - 0xa000;
5368 for (i = 0; i < ext->reg_count; i++)
5369 buffer[count++] = ext->extent[i];
5370 } else {
5371 return;
5425 } 5372 }
5426 reg_list_mc_addr += reg_num * 4;
5427 reg_list_blk_index += reg_num;
5428 } 5373 }
5429 } 5374 }
5430 dst_ptr[reg_list_hdr_blk_index] = RLC_CLEAR_STATE_END_MARKER;
5431 5375
5432 radeon_bo_kunmap(rdev->rlc.clear_state_obj); 5376 buffer[count++] = PACKET3(PACKET3_SET_CONTEXT_REG, 1);
5433 radeon_bo_unreserve(rdev->rlc.clear_state_obj); 5377 buffer[count++] = PA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START;
5378 switch (rdev->family) {
5379 case CHIP_TAHITI:
5380 case CHIP_PITCAIRN:
5381 buffer[count++] = 0x2a00126a;
5382 break;
5383 case CHIP_VERDE:
5384 buffer[count++] = 0x0000124a;
5385 break;
5386 case CHIP_OLAND:
5387 buffer[count++] = 0x00000082;
5388 break;
5389 case CHIP_HAINAN:
5390 buffer[count++] = 0x00000000;
5391 break;
5392 default:
5393 buffer[count++] = 0x00000000;
5394 break;
5395 }
5434 5396
5435 return 0; 5397 buffer[count++] = PACKET3(PACKET3_PREAMBLE_CNTL, 0);
5398 buffer[count++] = PACKET3_PREAMBLE_END_CLEAR_STATE;
5399
5400 buffer[count++] = PACKET3(PACKET3_CLEAR_STATE, 0);
5401 buffer[count++] = 0;
5402}
5403
5404static void si_init_pg(struct radeon_device *rdev)
5405{
5406 if (rdev->pg_flags) {
5407 if (rdev->pg_flags & RADEON_PG_SUPPORT_SDMA) {
5408 si_init_dma_pg(rdev);
5409 }
5410 si_init_ao_cu_mask(rdev);
5411 if (rdev->pg_flags & RADEON_PG_SUPPORT_GFX_CG) {
5412 si_init_gfx_cgpg(rdev);
5413 }
5414 si_enable_dma_pg(rdev, true);
5415 si_enable_gfx_cgpg(rdev, true);
5416 } else {
5417 WREG32(RLC_SAVE_AND_RESTORE_BASE, rdev->rlc.save_restore_gpu_addr >> 8);
5418 WREG32(RLC_CLEAR_STATE_RESTORE_BASE, rdev->rlc.clear_state_gpu_addr >> 8);
5419 }
5420}
5421
5422static void si_fini_pg(struct radeon_device *rdev)
5423{
5424 if (rdev->pg_flags) {
5425 si_enable_dma_pg(rdev, false);
5426 si_enable_gfx_cgpg(rdev, false);
5427 }
5436} 5428}
5437 5429
5438static void si_rlc_reset(struct radeon_device *rdev) 5430/*
5431 * RLC
5432 */
5433void si_rlc_reset(struct radeon_device *rdev)
5439{ 5434{
5440 u32 tmp = RREG32(GRBM_SOFT_RESET); 5435 u32 tmp = RREG32(GRBM_SOFT_RESET);
5441 5436
@@ -6335,80 +6330,6 @@ restart_ih:
6335 return IRQ_HANDLED; 6330 return IRQ_HANDLED;
6336} 6331}
6337 6332
6338/**
6339 * si_copy_dma - copy pages using the DMA engine
6340 *
6341 * @rdev: radeon_device pointer
6342 * @src_offset: src GPU address
6343 * @dst_offset: dst GPU address
6344 * @num_gpu_pages: number of GPU pages to xfer
6345 * @fence: radeon fence object
6346 *
6347 * Copy GPU paging using the DMA engine (SI).
6348 * Used by the radeon ttm implementation to move pages if
6349 * registered as the asic copy callback.
6350 */
6351int si_copy_dma(struct radeon_device *rdev,
6352 uint64_t src_offset, uint64_t dst_offset,
6353 unsigned num_gpu_pages,
6354 struct radeon_fence **fence)
6355{
6356 struct radeon_semaphore *sem = NULL;
6357 int ring_index = rdev->asic->copy.dma_ring_index;
6358 struct radeon_ring *ring = &rdev->ring[ring_index];
6359 u32 size_in_bytes, cur_size_in_bytes;
6360 int i, num_loops;
6361 int r = 0;
6362
6363 r = radeon_semaphore_create(rdev, &sem);
6364 if (r) {
6365 DRM_ERROR("radeon: moving bo (%d).\n", r);
6366 return r;
6367 }
6368
6369 size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT);
6370 num_loops = DIV_ROUND_UP(size_in_bytes, 0xfffff);
6371 r = radeon_ring_lock(rdev, ring, num_loops * 5 + 11);
6372 if (r) {
6373 DRM_ERROR("radeon: moving bo (%d).\n", r);
6374 radeon_semaphore_free(rdev, &sem, NULL);
6375 return r;
6376 }
6377
6378 if (radeon_fence_need_sync(*fence, ring->idx)) {
6379 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
6380 ring->idx);
6381 radeon_fence_note_sync(*fence, ring->idx);
6382 } else {
6383 radeon_semaphore_free(rdev, &sem, NULL);
6384 }
6385
6386 for (i = 0; i < num_loops; i++) {
6387 cur_size_in_bytes = size_in_bytes;
6388 if (cur_size_in_bytes > 0xFFFFF)
6389 cur_size_in_bytes = 0xFFFFF;
6390 size_in_bytes -= cur_size_in_bytes;
6391 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 1, 0, 0, cur_size_in_bytes));
6392 radeon_ring_write(ring, dst_offset & 0xffffffff);
6393 radeon_ring_write(ring, src_offset & 0xffffffff);
6394 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
6395 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
6396 src_offset += cur_size_in_bytes;
6397 dst_offset += cur_size_in_bytes;
6398 }
6399
6400 r = radeon_fence_emit(rdev, fence, ring->idx);
6401 if (r) {
6402 radeon_ring_unlock_undo(rdev, ring);
6403 return r;
6404 }
6405
6406 radeon_ring_unlock_commit(rdev, ring);
6407 radeon_semaphore_free(rdev, &sem, *fence);
6408
6409 return r;
6410}
6411
6412/* 6333/*
6413 * startup/shutdown callbacks 6334 * startup/shutdown callbacks
6414 */ 6335 */
@@ -6422,6 +6343,13 @@ static int si_startup(struct radeon_device *rdev)
6422 /* enable aspm */ 6343 /* enable aspm */
6423 si_program_aspm(rdev); 6344 si_program_aspm(rdev);
6424 6345
6346 /* scratch needs to be initialized before MC */
6347 r = r600_vram_scratch_init(rdev);
6348 if (r)
6349 return r;
6350
6351 si_mc_program(rdev);
6352
6425 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw || 6353 if (!rdev->me_fw || !rdev->pfp_fw || !rdev->ce_fw ||
6426 !rdev->rlc_fw || !rdev->mc_fw) { 6354 !rdev->rlc_fw || !rdev->mc_fw) {
6427 r = si_init_microcode(rdev); 6355 r = si_init_microcode(rdev);
@@ -6437,18 +6365,19 @@ static int si_startup(struct radeon_device *rdev)
6437 return r; 6365 return r;
6438 } 6366 }
6439 6367
6440 r = r600_vram_scratch_init(rdev);
6441 if (r)
6442 return r;
6443
6444 si_mc_program(rdev);
6445 r = si_pcie_gart_enable(rdev); 6368 r = si_pcie_gart_enable(rdev);
6446 if (r) 6369 if (r)
6447 return r; 6370 return r;
6448 si_gpu_init(rdev); 6371 si_gpu_init(rdev);
6449 6372
6450 /* allocate rlc buffers */ 6373 /* allocate rlc buffers */
6451 r = si_rlc_init(rdev); 6374 if (rdev->family == CHIP_VERDE) {
6375 rdev->rlc.reg_list = verde_rlc_save_restore_register_list;
6376 rdev->rlc.reg_list_size =
6377 (u32)ARRAY_SIZE(verde_rlc_save_restore_register_list);
6378 }
6379 rdev->rlc.cs_data = si_cs_data;
6380 r = sumo_rlc_init(rdev);
6452 if (r) { 6381 if (r) {
6453 DRM_ERROR("Failed to init rlc BOs!\n"); 6382 DRM_ERROR("Failed to init rlc BOs!\n");
6454 return r; 6383 return r;
@@ -6490,7 +6419,7 @@ static int si_startup(struct radeon_device *rdev)
6490 } 6419 }
6491 6420
6492 if (rdev->has_uvd) { 6421 if (rdev->has_uvd) {
6493 r = rv770_uvd_resume(rdev); 6422 r = uvd_v2_2_resume(rdev);
6494 if (!r) { 6423 if (!r) {
6495 r = radeon_fence_driver_start_ring(rdev, 6424 r = radeon_fence_driver_start_ring(rdev,
6496 R600_RING_TYPE_UVD_INDEX); 6425 R600_RING_TYPE_UVD_INDEX);
@@ -6519,21 +6448,21 @@ static int si_startup(struct radeon_device *rdev)
6519 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 6448 ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
6520 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET, 6449 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP_RPTR_OFFSET,
6521 CP_RB0_RPTR, CP_RB0_WPTR, 6450 CP_RB0_RPTR, CP_RB0_WPTR,
6522 0, 0xfffff, RADEON_CP_PACKET2); 6451 RADEON_CP_PACKET2);
6523 if (r) 6452 if (r)
6524 return r; 6453 return r;
6525 6454
6526 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX]; 6455 ring = &rdev->ring[CAYMAN_RING_TYPE_CP1_INDEX];
6527 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET, 6456 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP1_RPTR_OFFSET,
6528 CP_RB1_RPTR, CP_RB1_WPTR, 6457 CP_RB1_RPTR, CP_RB1_WPTR,
6529 0, 0xfffff, RADEON_CP_PACKET2); 6458 RADEON_CP_PACKET2);
6530 if (r) 6459 if (r)
6531 return r; 6460 return r;
6532 6461
6533 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX]; 6462 ring = &rdev->ring[CAYMAN_RING_TYPE_CP2_INDEX];
6534 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET, 6463 r = radeon_ring_init(rdev, ring, ring->ring_size, RADEON_WB_CP2_RPTR_OFFSET,
6535 CP_RB2_RPTR, CP_RB2_WPTR, 6464 CP_RB2_RPTR, CP_RB2_WPTR,
6536 0, 0xfffff, RADEON_CP_PACKET2); 6465 RADEON_CP_PACKET2);
6537 if (r) 6466 if (r)
6538 return r; 6467 return r;
6539 6468
@@ -6541,7 +6470,7 @@ static int si_startup(struct radeon_device *rdev)
6541 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET, 6470 r = radeon_ring_init(rdev, ring, ring->ring_size, R600_WB_DMA_RPTR_OFFSET,
6542 DMA_RB_RPTR + DMA0_REGISTER_OFFSET, 6471 DMA_RB_RPTR + DMA0_REGISTER_OFFSET,
6543 DMA_RB_WPTR + DMA0_REGISTER_OFFSET, 6472 DMA_RB_WPTR + DMA0_REGISTER_OFFSET,
6544 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0)); 6473 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0));
6545 if (r) 6474 if (r)
6546 return r; 6475 return r;
6547 6476
@@ -6549,7 +6478,7 @@ static int si_startup(struct radeon_device *rdev)
6549 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET, 6478 r = radeon_ring_init(rdev, ring, ring->ring_size, CAYMAN_WB_DMA1_RPTR_OFFSET,
6550 DMA_RB_RPTR + DMA1_REGISTER_OFFSET, 6479 DMA_RB_RPTR + DMA1_REGISTER_OFFSET,
6551 DMA_RB_WPTR + DMA1_REGISTER_OFFSET, 6480 DMA_RB_WPTR + DMA1_REGISTER_OFFSET,
6552 2, 0x3fffc, DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0)); 6481 DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0));
6553 if (r) 6482 if (r)
6554 return r; 6483 return r;
6555 6484
@@ -6567,12 +6496,11 @@ static int si_startup(struct radeon_device *rdev)
6567 if (rdev->has_uvd) { 6496 if (rdev->has_uvd) {
6568 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX]; 6497 ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
6569 if (ring->ring_size) { 6498 if (ring->ring_size) {
6570 r = radeon_ring_init(rdev, ring, ring->ring_size, 6499 r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
6571 R600_WB_UVD_RPTR_OFFSET,
6572 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR, 6500 UVD_RBC_RB_RPTR, UVD_RBC_RB_WPTR,
6573 0, 0xfffff, RADEON_CP_PACKET2); 6501 RADEON_CP_PACKET2);
6574 if (!r) 6502 if (!r)
6575 r = r600_uvd_init(rdev); 6503 r = uvd_v1_0_init(rdev);
6576 if (r) 6504 if (r)
6577 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r); 6505 DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
6578 } 6506 }
@@ -6590,6 +6518,10 @@ static int si_startup(struct radeon_device *rdev)
6590 return r; 6518 return r;
6591 } 6519 }
6592 6520
6521 r = dce6_audio_init(rdev);
6522 if (r)
6523 return r;
6524
6593 return 0; 6525 return 0;
6594} 6526}
6595 6527
@@ -6621,13 +6553,16 @@ int si_resume(struct radeon_device *rdev)
6621 6553
6622int si_suspend(struct radeon_device *rdev) 6554int si_suspend(struct radeon_device *rdev)
6623{ 6555{
6556 dce6_audio_fini(rdev);
6624 radeon_vm_manager_fini(rdev); 6557 radeon_vm_manager_fini(rdev);
6625 si_cp_enable(rdev, false); 6558 si_cp_enable(rdev, false);
6626 cayman_dma_stop(rdev); 6559 cayman_dma_stop(rdev);
6627 if (rdev->has_uvd) { 6560 if (rdev->has_uvd) {
6628 r600_uvd_rbc_stop(rdev); 6561 uvd_v1_0_fini(rdev);
6629 radeon_uvd_suspend(rdev); 6562 radeon_uvd_suspend(rdev);
6630 } 6563 }
6564 si_fini_pg(rdev);
6565 si_fini_cg(rdev);
6631 si_irq_suspend(rdev); 6566 si_irq_suspend(rdev);
6632 radeon_wb_disable(rdev); 6567 radeon_wb_disable(rdev);
6633 si_pcie_gart_disable(rdev); 6568 si_pcie_gart_disable(rdev);
@@ -6734,7 +6669,7 @@ int si_init(struct radeon_device *rdev)
6734 si_cp_fini(rdev); 6669 si_cp_fini(rdev);
6735 cayman_dma_fini(rdev); 6670 cayman_dma_fini(rdev);
6736 si_irq_fini(rdev); 6671 si_irq_fini(rdev);
6737 si_rlc_fini(rdev); 6672 sumo_rlc_fini(rdev);
6738 radeon_wb_fini(rdev); 6673 radeon_wb_fini(rdev);
6739 radeon_ib_pool_fini(rdev); 6674 radeon_ib_pool_fini(rdev);
6740 radeon_vm_manager_fini(rdev); 6675 radeon_vm_manager_fini(rdev);
@@ -6759,16 +6694,18 @@ void si_fini(struct radeon_device *rdev)
6759{ 6694{
6760 si_cp_fini(rdev); 6695 si_cp_fini(rdev);
6761 cayman_dma_fini(rdev); 6696 cayman_dma_fini(rdev);
6762 si_irq_fini(rdev);
6763 si_rlc_fini(rdev);
6764 si_fini_cg(rdev);
6765 si_fini_pg(rdev); 6697 si_fini_pg(rdev);
6698 si_fini_cg(rdev);
6699 si_irq_fini(rdev);
6700 sumo_rlc_fini(rdev);
6766 radeon_wb_fini(rdev); 6701 radeon_wb_fini(rdev);
6767 radeon_vm_manager_fini(rdev); 6702 radeon_vm_manager_fini(rdev);
6768 radeon_ib_pool_fini(rdev); 6703 radeon_ib_pool_fini(rdev);
6769 radeon_irq_kms_fini(rdev); 6704 radeon_irq_kms_fini(rdev);
6770 if (rdev->has_uvd) 6705 if (rdev->has_uvd) {
6706 uvd_v1_0_fini(rdev);
6771 radeon_uvd_fini(rdev); 6707 radeon_uvd_fini(rdev);
6708 }
6772 si_pcie_gart_fini(rdev); 6709 si_pcie_gart_fini(rdev);
6773 r600_vram_scratch_fini(rdev); 6710 r600_vram_scratch_fini(rdev);
6774 radeon_gem_fini(rdev); 6711 radeon_gem_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c
new file mode 100644
index 000000000000..49909d23dfce
--- /dev/null
+++ b/drivers/gpu/drm/radeon/si_dma.c
@@ -0,0 +1,235 @@
1/*
2 * Copyright 2013 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: Alex Deucher
23 */
24#include <drm/drmP.h>
25#include "radeon.h"
26#include "radeon_asic.h"
27#include "sid.h"
28
29u32 si_gpu_check_soft_reset(struct radeon_device *rdev);
30
31/**
32 * si_dma_is_lockup - Check if the DMA engine is locked up
33 *
34 * @rdev: radeon_device pointer
35 * @ring: radeon_ring structure holding ring information
36 *
37 * Check if the async DMA engine is locked up.
38 * Returns true if the engine appears to be locked up, false if not.
39 */
40bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
41{
42 u32 reset_mask = si_gpu_check_soft_reset(rdev);
43 u32 mask;
44
45 if (ring->idx == R600_RING_TYPE_DMA_INDEX)
46 mask = RADEON_RESET_DMA;
47 else
48 mask = RADEON_RESET_DMA1;
49
50 if (!(reset_mask & mask)) {
51 radeon_ring_lockup_update(ring);
52 return false;
53 }
54 /* force ring activities */
55 radeon_ring_force_activity(rdev, ring);
56 return radeon_ring_test_lockup(rdev, ring);
57}
58
59/**
60 * si_dma_vm_set_page - update the page tables using the DMA
61 *
62 * @rdev: radeon_device pointer
63 * @ib: indirect buffer to fill with commands
64 * @pe: addr of the page entry
65 * @addr: dst addr to write into pe
66 * @count: number of page entries to update
67 * @incr: increase next addr by incr bytes
68 * @flags: access flags
69 *
70 * Update the page tables using the DMA (SI).
71 */
72void si_dma_vm_set_page(struct radeon_device *rdev,
73 struct radeon_ib *ib,
74 uint64_t pe,
75 uint64_t addr, unsigned count,
76 uint32_t incr, uint32_t flags)
77{
78 uint32_t r600_flags = cayman_vm_page_flags(rdev, flags);
79 uint64_t value;
80 unsigned ndw;
81
82 if (flags & RADEON_VM_PAGE_SYSTEM) {
83 while (count) {
84 ndw = count * 2;
85 if (ndw > 0xFFFFE)
86 ndw = 0xFFFFE;
87
88 /* for non-physically contiguous pages (system) */
89 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_WRITE, 0, 0, 0, ndw);
90 ib->ptr[ib->length_dw++] = pe;
91 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
92 for (; ndw > 0; ndw -= 2, --count, pe += 8) {
93 if (flags & RADEON_VM_PAGE_SYSTEM) {
94 value = radeon_vm_map_gart(rdev, addr);
95 value &= 0xFFFFFFFFFFFFF000ULL;
96 } else if (flags & RADEON_VM_PAGE_VALID) {
97 value = addr;
98 } else {
99 value = 0;
100 }
101 addr += incr;
102 value |= r600_flags;
103 ib->ptr[ib->length_dw++] = value;
104 ib->ptr[ib->length_dw++] = upper_32_bits(value);
105 }
106 }
107 } else {
108 while (count) {
109 ndw = count * 2;
110 if (ndw > 0xFFFFE)
111 ndw = 0xFFFFE;
112
113 if (flags & RADEON_VM_PAGE_VALID)
114 value = addr;
115 else
116 value = 0;
117 /* for physically contiguous pages (vram) */
118 ib->ptr[ib->length_dw++] = DMA_PTE_PDE_PACKET(ndw);
119 ib->ptr[ib->length_dw++] = pe; /* dst addr */
120 ib->ptr[ib->length_dw++] = upper_32_bits(pe) & 0xff;
121 ib->ptr[ib->length_dw++] = r600_flags; /* mask */
122 ib->ptr[ib->length_dw++] = 0;
123 ib->ptr[ib->length_dw++] = value; /* value */
124 ib->ptr[ib->length_dw++] = upper_32_bits(value);
125 ib->ptr[ib->length_dw++] = incr; /* increment size */
126 ib->ptr[ib->length_dw++] = 0;
127 pe += ndw * 4;
128 addr += (ndw / 2) * incr;
129 count -= ndw / 2;
130 }
131 }
132 while (ib->length_dw & 0x7)
133 ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0);
134}
135
136void si_dma_vm_flush(struct radeon_device *rdev, int ridx, struct radeon_vm *vm)
137{
138 struct radeon_ring *ring = &rdev->ring[ridx];
139
140 if (vm == NULL)
141 return;
142
143 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
144 if (vm->id < 8) {
145 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT0_PAGE_TABLE_BASE_ADDR + (vm->id << 2)) >> 2));
146 } else {
147 radeon_ring_write(ring, (0xf << 16) | ((VM_CONTEXT8_PAGE_TABLE_BASE_ADDR + ((vm->id - 8) << 2)) >> 2));
148 }
149 radeon_ring_write(ring, vm->pd_gpu_addr >> 12);
150
151 /* flush hdp cache */
152 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
153 radeon_ring_write(ring, (0xf << 16) | (HDP_MEM_COHERENCY_FLUSH_CNTL >> 2));
154 radeon_ring_write(ring, 1);
155
156 /* bits 0-7 are the VM contexts0-7 */
157 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_SRBM_WRITE, 0, 0, 0, 0));
158 radeon_ring_write(ring, (0xf << 16) | (VM_INVALIDATE_REQUEST >> 2));
159 radeon_ring_write(ring, 1 << vm->id);
160}
161
162/**
163 * si_copy_dma - copy pages using the DMA engine
164 *
165 * @rdev: radeon_device pointer
166 * @src_offset: src GPU address
167 * @dst_offset: dst GPU address
168 * @num_gpu_pages: number of GPU pages to xfer
169 * @fence: radeon fence object
170 *
171 * Copy GPU paging using the DMA engine (SI).
172 * Used by the radeon ttm implementation to move pages if
173 * registered as the asic copy callback.
174 */
175int si_copy_dma(struct radeon_device *rdev,
176 uint64_t src_offset, uint64_t dst_offset,
177 unsigned num_gpu_pages,
178 struct radeon_fence **fence)
179{
180 struct radeon_semaphore *sem = NULL;
181 int ring_index = rdev->asic->copy.dma_ring_index;
182 struct radeon_ring *ring = &rdev->ring[ring_index];
183 u32 size_in_bytes, cur_size_in_bytes;
184 int i, num_loops;
185 int r = 0;
186
187 r = radeon_semaphore_create(rdev, &sem);
188 if (r) {
189 DRM_ERROR("radeon: moving bo (%d).\n", r);
190 return r;
191 }
192
193 size_in_bytes = (num_gpu_pages << RADEON_GPU_PAGE_SHIFT);
194 num_loops = DIV_ROUND_UP(size_in_bytes, 0xfffff);
195 r = radeon_ring_lock(rdev, ring, num_loops * 5 + 11);
196 if (r) {
197 DRM_ERROR("radeon: moving bo (%d).\n", r);
198 radeon_semaphore_free(rdev, &sem, NULL);
199 return r;
200 }
201
202 if (radeon_fence_need_sync(*fence, ring->idx)) {
203 radeon_semaphore_sync_rings(rdev, sem, (*fence)->ring,
204 ring->idx);
205 radeon_fence_note_sync(*fence, ring->idx);
206 } else {
207 radeon_semaphore_free(rdev, &sem, NULL);
208 }
209
210 for (i = 0; i < num_loops; i++) {
211 cur_size_in_bytes = size_in_bytes;
212 if (cur_size_in_bytes > 0xFFFFF)
213 cur_size_in_bytes = 0xFFFFF;
214 size_in_bytes -= cur_size_in_bytes;
215 radeon_ring_write(ring, DMA_PACKET(DMA_PACKET_COPY, 1, 0, 0, cur_size_in_bytes));
216 radeon_ring_write(ring, dst_offset & 0xffffffff);
217 radeon_ring_write(ring, src_offset & 0xffffffff);
218 radeon_ring_write(ring, upper_32_bits(dst_offset) & 0xff);
219 radeon_ring_write(ring, upper_32_bits(src_offset) & 0xff);
220 src_offset += cur_size_in_bytes;
221 dst_offset += cur_size_in_bytes;
222 }
223
224 r = radeon_fence_emit(rdev, fence, ring->idx);
225 if (r) {
226 radeon_ring_unlock_undo(rdev, ring);
227 return r;
228 }
229
230 radeon_ring_unlock_commit(rdev, ring);
231 radeon_semaphore_free(rdev, &sem, *fence);
232
233 return r;
234}
235
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c
index 73aaa2e4c312..5be9b4e72350 100644
--- a/drivers/gpu/drm/radeon/si_dpm.c
+++ b/drivers/gpu/drm/radeon/si_dpm.c
@@ -37,8 +37,6 @@
37 37
38#define SMC_RAM_END 0x20000 38#define SMC_RAM_END 0x20000
39 39
40#define DDR3_DRAM_ROWS 0x2000
41
42#define SCLK_MIN_DEEPSLEEP_FREQ 1350 40#define SCLK_MIN_DEEPSLEEP_FREQ 1350
43 41
44static const struct si_cac_config_reg cac_weights_tahiti[] = 42static const struct si_cac_config_reg cac_weights_tahiti[] =
@@ -1755,6 +1753,9 @@ static int si_calculate_sclk_params(struct radeon_device *rdev,
1755 u32 engine_clock, 1753 u32 engine_clock,
1756 SISLANDS_SMC_SCLK_VALUE *sclk); 1754 SISLANDS_SMC_SCLK_VALUE *sclk);
1757 1755
1756extern void si_update_cg(struct radeon_device *rdev,
1757 u32 block, bool enable);
1758
1758static struct si_power_info *si_get_pi(struct radeon_device *rdev) 1759static struct si_power_info *si_get_pi(struct radeon_device *rdev)
1759{ 1760{
1760 struct si_power_info *pi = rdev->pm.dpm.priv; 1761 struct si_power_info *pi = rdev->pm.dpm.priv;
@@ -1767,8 +1768,9 @@ static void si_calculate_leakage_for_v_and_t_formula(const struct ni_leakage_coe
1767{ 1768{
1768 s64 kt, kv, leakage_w, i_leakage, vddc; 1769 s64 kt, kv, leakage_w, i_leakage, vddc;
1769 s64 temperature, t_slope, t_intercept, av, bv, t_ref; 1770 s64 temperature, t_slope, t_intercept, av, bv, t_ref;
1771 s64 tmp;
1770 1772
1771 i_leakage = drm_int2fixp(ileakage / 100); 1773 i_leakage = div64_s64(drm_int2fixp(ileakage), 100);
1772 vddc = div64_s64(drm_int2fixp(v), 1000); 1774 vddc = div64_s64(drm_int2fixp(v), 1000);
1773 temperature = div64_s64(drm_int2fixp(t), 1000); 1775 temperature = div64_s64(drm_int2fixp(t), 1000);
1774 1776
@@ -1778,8 +1780,9 @@ static void si_calculate_leakage_for_v_and_t_formula(const struct ni_leakage_coe
1778 bv = div64_s64(drm_int2fixp(coeff->bv), 100000000); 1780 bv = div64_s64(drm_int2fixp(coeff->bv), 100000000);
1779 t_ref = drm_int2fixp(coeff->t_ref); 1781 t_ref = drm_int2fixp(coeff->t_ref);
1780 1782
1781 kt = drm_fixp_div(drm_fixp_exp(drm_fixp_mul(drm_fixp_mul(t_slope, vddc) + t_intercept, temperature)), 1783 tmp = drm_fixp_mul(t_slope, vddc) + t_intercept;
1782 drm_fixp_exp(drm_fixp_mul(drm_fixp_mul(t_slope, vddc) + t_intercept, t_ref))); 1784 kt = drm_fixp_exp(drm_fixp_mul(tmp, temperature));
1785 kt = drm_fixp_div(kt, drm_fixp_exp(drm_fixp_mul(tmp, t_ref)));
1783 kv = drm_fixp_mul(av, drm_fixp_exp(drm_fixp_mul(bv, vddc))); 1786 kv = drm_fixp_mul(av, drm_fixp_exp(drm_fixp_mul(bv, vddc)));
1784 1787
1785 leakage_w = drm_fixp_mul(drm_fixp_mul(drm_fixp_mul(i_leakage, kt), kv), vddc); 1788 leakage_w = drm_fixp_mul(drm_fixp_mul(drm_fixp_mul(i_leakage, kt), kv), vddc);
@@ -1931,6 +1934,7 @@ static void si_initialize_powertune_defaults(struct radeon_device *rdev)
1931 si_pi->cac_override = cac_override_pitcairn; 1934 si_pi->cac_override = cac_override_pitcairn;
1932 si_pi->powertune_data = &powertune_data_pitcairn; 1935 si_pi->powertune_data = &powertune_data_pitcairn;
1933 si_pi->dte_data = dte_data_pitcairn; 1936 si_pi->dte_data = dte_data_pitcairn;
1937 break;
1934 } 1938 }
1935 } else if (rdev->family == CHIP_VERDE) { 1939 } else if (rdev->family == CHIP_VERDE) {
1936 si_pi->lcac_config = lcac_cape_verde; 1940 si_pi->lcac_config = lcac_cape_verde;
@@ -1941,6 +1945,7 @@ static void si_initialize_powertune_defaults(struct radeon_device *rdev)
1941 case 0x683B: 1945 case 0x683B:
1942 case 0x683F: 1946 case 0x683F:
1943 case 0x6829: 1947 case 0x6829:
1948 case 0x6835:
1944 si_pi->cac_weights = cac_weights_cape_verde_pro; 1949 si_pi->cac_weights = cac_weights_cape_verde_pro;
1945 si_pi->dte_data = dte_data_cape_verde; 1950 si_pi->dte_data = dte_data_cape_verde;
1946 break; 1951 break;
@@ -2901,7 +2906,8 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev,
2901{ 2906{
2902 struct ni_ps *ps = ni_get_ps(rps); 2907 struct ni_ps *ps = ni_get_ps(rps);
2903 struct radeon_clock_and_voltage_limits *max_limits; 2908 struct radeon_clock_and_voltage_limits *max_limits;
2904 bool disable_mclk_switching; 2909 bool disable_mclk_switching = false;
2910 bool disable_sclk_switching = false;
2905 u32 mclk, sclk; 2911 u32 mclk, sclk;
2906 u16 vddc, vddci; 2912 u16 vddc, vddci;
2907 int i; 2913 int i;
@@ -2909,8 +2915,11 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev,
2909 if ((rdev->pm.dpm.new_active_crtc_count > 1) || 2915 if ((rdev->pm.dpm.new_active_crtc_count > 1) ||
2910 ni_dpm_vblank_too_short(rdev)) 2916 ni_dpm_vblank_too_short(rdev))
2911 disable_mclk_switching = true; 2917 disable_mclk_switching = true;
2912 else 2918
2913 disable_mclk_switching = false; 2919 if (rps->vclk || rps->dclk) {
2920 disable_mclk_switching = true;
2921 disable_sclk_switching = true;
2922 }
2914 2923
2915 if (rdev->pm.dpm.ac_power) 2924 if (rdev->pm.dpm.ac_power)
2916 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac; 2925 max_limits = &rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
@@ -2938,27 +2947,43 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev,
2938 2947
2939 if (disable_mclk_switching) { 2948 if (disable_mclk_switching) {
2940 mclk = ps->performance_levels[ps->performance_level_count - 1].mclk; 2949 mclk = ps->performance_levels[ps->performance_level_count - 1].mclk;
2941 sclk = ps->performance_levels[0].sclk;
2942 vddc = ps->performance_levels[0].vddc;
2943 vddci = ps->performance_levels[ps->performance_level_count - 1].vddci; 2950 vddci = ps->performance_levels[ps->performance_level_count - 1].vddci;
2944 } else { 2951 } else {
2945 sclk = ps->performance_levels[0].sclk;
2946 mclk = ps->performance_levels[0].mclk; 2952 mclk = ps->performance_levels[0].mclk;
2947 vddc = ps->performance_levels[0].vddc;
2948 vddci = ps->performance_levels[0].vddci; 2953 vddci = ps->performance_levels[0].vddci;
2949 } 2954 }
2950 2955
2956 if (disable_sclk_switching) {
2957 sclk = ps->performance_levels[ps->performance_level_count - 1].sclk;
2958 vddc = ps->performance_levels[ps->performance_level_count - 1].vddc;
2959 } else {
2960 sclk = ps->performance_levels[0].sclk;
2961 vddc = ps->performance_levels[0].vddc;
2962 }
2963
2951 /* adjusted low state */ 2964 /* adjusted low state */
2952 ps->performance_levels[0].sclk = sclk; 2965 ps->performance_levels[0].sclk = sclk;
2953 ps->performance_levels[0].mclk = mclk; 2966 ps->performance_levels[0].mclk = mclk;
2954 ps->performance_levels[0].vddc = vddc; 2967 ps->performance_levels[0].vddc = vddc;
2955 ps->performance_levels[0].vddci = vddci; 2968 ps->performance_levels[0].vddci = vddci;
2956 2969
2957 for (i = 1; i < ps->performance_level_count; i++) { 2970 if (disable_sclk_switching) {
2958 if (ps->performance_levels[i].sclk < ps->performance_levels[i - 1].sclk) 2971 sclk = ps->performance_levels[0].sclk;
2959 ps->performance_levels[i].sclk = ps->performance_levels[i - 1].sclk; 2972 for (i = 1; i < ps->performance_level_count; i++) {
2960 if (ps->performance_levels[i].vddc < ps->performance_levels[i - 1].vddc) 2973 if (sclk < ps->performance_levels[i].sclk)
2961 ps->performance_levels[i].vddc = ps->performance_levels[i - 1].vddc; 2974 sclk = ps->performance_levels[i].sclk;
2975 }
2976 for (i = 0; i < ps->performance_level_count; i++) {
2977 ps->performance_levels[i].sclk = sclk;
2978 ps->performance_levels[i].vddc = vddc;
2979 }
2980 } else {
2981 for (i = 1; i < ps->performance_level_count; i++) {
2982 if (ps->performance_levels[i].sclk < ps->performance_levels[i - 1].sclk)
2983 ps->performance_levels[i].sclk = ps->performance_levels[i - 1].sclk;
2984 if (ps->performance_levels[i].vddc < ps->performance_levels[i - 1].vddc)
2985 ps->performance_levels[i].vddc = ps->performance_levels[i - 1].vddc;
2986 }
2962 } 2987 }
2963 2988
2964 if (disable_mclk_switching) { 2989 if (disable_mclk_switching) {
@@ -3237,10 +3262,10 @@ int si_dpm_force_performance_level(struct radeon_device *rdev,
3237{ 3262{
3238 struct radeon_ps *rps = rdev->pm.dpm.current_ps; 3263 struct radeon_ps *rps = rdev->pm.dpm.current_ps;
3239 struct ni_ps *ps = ni_get_ps(rps); 3264 struct ni_ps *ps = ni_get_ps(rps);
3240 u32 levels; 3265 u32 levels = ps->performance_level_count;
3241 3266
3242 if (level == RADEON_DPM_FORCED_LEVEL_HIGH) { 3267 if (level == RADEON_DPM_FORCED_LEVEL_HIGH) {
3243 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK) 3268 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK)
3244 return -EINVAL; 3269 return -EINVAL;
3245 3270
3246 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 1) != PPSMC_Result_OK) 3271 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 1) != PPSMC_Result_OK)
@@ -3249,14 +3274,13 @@ int si_dpm_force_performance_level(struct radeon_device *rdev,
3249 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) 3274 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
3250 return -EINVAL; 3275 return -EINVAL;
3251 3276
3252 levels = ps->performance_level_count - 1; 3277 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 1) != PPSMC_Result_OK)
3253 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK)
3254 return -EINVAL; 3278 return -EINVAL;
3255 } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) { 3279 } else if (level == RADEON_DPM_FORCED_LEVEL_AUTO) {
3256 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK) 3280 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetForcedLevels, 0) != PPSMC_Result_OK)
3257 return -EINVAL; 3281 return -EINVAL;
3258 3282
3259 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, 0) != PPSMC_Result_OK) 3283 if (si_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_SetEnabledLevels, levels) != PPSMC_Result_OK)
3260 return -EINVAL; 3284 return -EINVAL;
3261 } 3285 }
3262 3286
@@ -3620,8 +3644,12 @@ static void si_enable_display_gap(struct radeon_device *rdev)
3620{ 3644{
3621 u32 tmp = RREG32(CG_DISPLAY_GAP_CNTL); 3645 u32 tmp = RREG32(CG_DISPLAY_GAP_CNTL);
3622 3646
3647 tmp &= ~(DISP1_GAP_MASK | DISP2_GAP_MASK);
3648 tmp |= (DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE) |
3649 DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE));
3650
3623 tmp &= ~(DISP1_GAP_MCHG_MASK | DISP2_GAP_MCHG_MASK); 3651 tmp &= ~(DISP1_GAP_MCHG_MASK | DISP2_GAP_MCHG_MASK);
3624 tmp |= (DISP1_GAP_MCHG(R600_PM_DISPLAY_GAP_IGNORE) | 3652 tmp |= (DISP1_GAP_MCHG(R600_PM_DISPLAY_GAP_VBLANK) |
3625 DISP2_GAP_MCHG(R600_PM_DISPLAY_GAP_IGNORE)); 3653 DISP2_GAP_MCHG(R600_PM_DISPLAY_GAP_IGNORE));
3626 WREG32(CG_DISPLAY_GAP_CNTL, tmp); 3654 WREG32(CG_DISPLAY_GAP_CNTL, tmp);
3627} 3655}
@@ -3638,7 +3666,7 @@ static void si_clear_vc(struct radeon_device *rdev)
3638 WREG32(CG_FTV, 0); 3666 WREG32(CG_FTV, 0);
3639} 3667}
3640 3668
3641static u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock) 3669u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock)
3642{ 3670{
3643 u8 mc_para_index; 3671 u8 mc_para_index;
3644 3672
@@ -3651,7 +3679,7 @@ static u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock)
3651 return mc_para_index; 3679 return mc_para_index;
3652} 3680}
3653 3681
3654static u8 si_get_mclk_frequency_ratio(u32 memory_clock, bool strobe_mode) 3682u8 si_get_mclk_frequency_ratio(u32 memory_clock, bool strobe_mode)
3655{ 3683{
3656 u8 mc_para_index; 3684 u8 mc_para_index;
3657 3685
@@ -3733,20 +3761,21 @@ static bool si_validate_phase_shedding_tables(struct radeon_device *rdev,
3733 return true; 3761 return true;
3734} 3762}
3735 3763
3736static void si_trim_voltage_table_to_fit_state_table(struct radeon_device *rdev, 3764void si_trim_voltage_table_to_fit_state_table(struct radeon_device *rdev,
3737 struct atom_voltage_table *voltage_table) 3765 u32 max_voltage_steps,
3766 struct atom_voltage_table *voltage_table)
3738{ 3767{
3739 unsigned int i, diff; 3768 unsigned int i, diff;
3740 3769
3741 if (voltage_table->count <= SISLANDS_MAX_NO_VREG_STEPS) 3770 if (voltage_table->count <= max_voltage_steps)
3742 return; 3771 return;
3743 3772
3744 diff = voltage_table->count - SISLANDS_MAX_NO_VREG_STEPS; 3773 diff = voltage_table->count - max_voltage_steps;
3745 3774
3746 for (i= 0; i < SISLANDS_MAX_NO_VREG_STEPS; i++) 3775 for (i= 0; i < max_voltage_steps; i++)
3747 voltage_table->entries[i] = voltage_table->entries[i + diff]; 3776 voltage_table->entries[i] = voltage_table->entries[i + diff];
3748 3777
3749 voltage_table->count = SISLANDS_MAX_NO_VREG_STEPS; 3778 voltage_table->count = max_voltage_steps;
3750} 3779}
3751 3780
3752static int si_construct_voltage_tables(struct radeon_device *rdev) 3781static int si_construct_voltage_tables(struct radeon_device *rdev)
@@ -3762,7 +3791,9 @@ static int si_construct_voltage_tables(struct radeon_device *rdev)
3762 return ret; 3791 return ret;
3763 3792
3764 if (eg_pi->vddc_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS) 3793 if (eg_pi->vddc_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS)
3765 si_trim_voltage_table_to_fit_state_table(rdev, &eg_pi->vddc_voltage_table); 3794 si_trim_voltage_table_to_fit_state_table(rdev,
3795 SISLANDS_MAX_NO_VREG_STEPS,
3796 &eg_pi->vddc_voltage_table);
3766 3797
3767 if (eg_pi->vddci_control) { 3798 if (eg_pi->vddci_control) {
3768 ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDCI, 3799 ret = radeon_atom_get_voltage_table(rdev, VOLTAGE_TYPE_VDDCI,
@@ -3771,7 +3802,9 @@ static int si_construct_voltage_tables(struct radeon_device *rdev)
3771 return ret; 3802 return ret;
3772 3803
3773 if (eg_pi->vddci_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS) 3804 if (eg_pi->vddci_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS)
3774 si_trim_voltage_table_to_fit_state_table(rdev, &eg_pi->vddci_voltage_table); 3805 si_trim_voltage_table_to_fit_state_table(rdev,
3806 SISLANDS_MAX_NO_VREG_STEPS,
3807 &eg_pi->vddci_voltage_table);
3775 } 3808 }
3776 3809
3777 if (pi->mvdd_control) { 3810 if (pi->mvdd_control) {
@@ -3789,7 +3822,9 @@ static int si_construct_voltage_tables(struct radeon_device *rdev)
3789 } 3822 }
3790 3823
3791 if (si_pi->mvdd_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS) 3824 if (si_pi->mvdd_voltage_table.count > SISLANDS_MAX_NO_VREG_STEPS)
3792 si_trim_voltage_table_to_fit_state_table(rdev, &si_pi->mvdd_voltage_table); 3825 si_trim_voltage_table_to_fit_state_table(rdev,
3826 SISLANDS_MAX_NO_VREG_STEPS,
3827 &si_pi->mvdd_voltage_table);
3793 } 3828 }
3794 3829
3795 if (si_pi->vddc_phase_shed_control) { 3830 if (si_pi->vddc_phase_shed_control) {
@@ -4036,16 +4071,15 @@ static int si_force_switch_to_arb_f0(struct radeon_device *rdev)
4036static u32 si_calculate_memory_refresh_rate(struct radeon_device *rdev, 4071static u32 si_calculate_memory_refresh_rate(struct radeon_device *rdev,
4037 u32 engine_clock) 4072 u32 engine_clock)
4038{ 4073{
4039 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
4040 u32 dram_rows; 4074 u32 dram_rows;
4041 u32 dram_refresh_rate; 4075 u32 dram_refresh_rate;
4042 u32 mc_arb_rfsh_rate; 4076 u32 mc_arb_rfsh_rate;
4043 u32 tmp = (RREG32(MC_ARB_RAMCFG) & NOOFROWS_MASK) >> NOOFROWS_SHIFT; 4077 u32 tmp = (RREG32(MC_ARB_RAMCFG) & NOOFROWS_MASK) >> NOOFROWS_SHIFT;
4044 4078
4045 if (pi->mem_gddr5) 4079 if (tmp >= 4)
4046 dram_rows = 1 << (tmp + 10); 4080 dram_rows = 16384;
4047 else 4081 else
4048 dram_rows = DDR3_DRAM_ROWS; 4082 dram_rows = 1 << (tmp + 10);
4049 4083
4050 dram_refresh_rate = 1 << ((RREG32(MC_SEQ_MISC0) & 0x3) + 3); 4084 dram_refresh_rate = 1 << ((RREG32(MC_SEQ_MISC0) & 0x3) + 3);
4051 mc_arb_rfsh_rate = ((engine_clock * 10) * dram_refresh_rate / dram_rows - 32) / 64; 4085 mc_arb_rfsh_rate = ((engine_clock * 10) * dram_refresh_rate / dram_rows - 32) / 64;
@@ -5728,6 +5762,13 @@ int si_dpm_enable(struct radeon_device *rdev)
5728 struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps; 5762 struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
5729 int ret; 5763 int ret;
5730 5764
5765 si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
5766 RADEON_CG_BLOCK_MC |
5767 RADEON_CG_BLOCK_SDMA |
5768 RADEON_CG_BLOCK_BIF |
5769 RADEON_CG_BLOCK_UVD |
5770 RADEON_CG_BLOCK_HDP), false);
5771
5731 if (si_is_smc_running(rdev)) 5772 if (si_is_smc_running(rdev))
5732 return -EINVAL; 5773 return -EINVAL;
5733 if (pi->voltage_control) 5774 if (pi->voltage_control)
@@ -5847,6 +5888,13 @@ int si_dpm_enable(struct radeon_device *rdev)
5847 5888
5848 si_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true); 5889 si_enable_auto_throttle_source(rdev, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL, true);
5849 5890
5891 si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
5892 RADEON_CG_BLOCK_MC |
5893 RADEON_CG_BLOCK_SDMA |
5894 RADEON_CG_BLOCK_BIF |
5895 RADEON_CG_BLOCK_UVD |
5896 RADEON_CG_BLOCK_HDP), true);
5897
5850 ni_update_current_ps(rdev, boot_ps); 5898 ni_update_current_ps(rdev, boot_ps);
5851 5899
5852 return 0; 5900 return 0;
@@ -5857,6 +5905,13 @@ void si_dpm_disable(struct radeon_device *rdev)
5857 struct rv7xx_power_info *pi = rv770_get_pi(rdev); 5905 struct rv7xx_power_info *pi = rv770_get_pi(rdev);
5858 struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps; 5906 struct radeon_ps *boot_ps = rdev->pm.dpm.boot_ps;
5859 5907
5908 si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
5909 RADEON_CG_BLOCK_MC |
5910 RADEON_CG_BLOCK_SDMA |
5911 RADEON_CG_BLOCK_BIF |
5912 RADEON_CG_BLOCK_UVD |
5913 RADEON_CG_BLOCK_HDP), false);
5914
5860 if (!si_is_smc_running(rdev)) 5915 if (!si_is_smc_running(rdev))
5861 return; 5916 return;
5862 si_disable_ulv(rdev); 5917 si_disable_ulv(rdev);
@@ -5921,6 +5976,13 @@ int si_dpm_set_power_state(struct radeon_device *rdev)
5921 struct radeon_ps *old_ps = &eg_pi->current_rps; 5976 struct radeon_ps *old_ps = &eg_pi->current_rps;
5922 int ret; 5977 int ret;
5923 5978
5979 si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
5980 RADEON_CG_BLOCK_MC |
5981 RADEON_CG_BLOCK_SDMA |
5982 RADEON_CG_BLOCK_BIF |
5983 RADEON_CG_BLOCK_UVD |
5984 RADEON_CG_BLOCK_HDP), false);
5985
5924 ret = si_disable_ulv(rdev); 5986 ret = si_disable_ulv(rdev);
5925 if (ret) { 5987 if (ret) {
5926 DRM_ERROR("si_disable_ulv failed\n"); 5988 DRM_ERROR("si_disable_ulv failed\n");
@@ -6013,16 +6075,18 @@ int si_dpm_set_power_state(struct radeon_device *rdev)
6013 return ret; 6075 return ret;
6014 } 6076 }
6015 6077
6016#if 0
6017 /* XXX */
6018 ret = si_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_AUTO); 6078 ret = si_dpm_force_performance_level(rdev, RADEON_DPM_FORCED_LEVEL_AUTO);
6019 if (ret) { 6079 if (ret) {
6020 DRM_ERROR("si_dpm_force_performance_level failed\n"); 6080 DRM_ERROR("si_dpm_force_performance_level failed\n");
6021 return ret; 6081 return ret;
6022 } 6082 }
6023#else 6083
6024 rdev->pm.dpm.forced_level = RADEON_DPM_FORCED_LEVEL_AUTO; 6084 si_update_cg(rdev, (RADEON_CG_BLOCK_GFX |
6025#endif 6085 RADEON_CG_BLOCK_MC |
6086 RADEON_CG_BLOCK_SDMA |
6087 RADEON_CG_BLOCK_BIF |
6088 RADEON_CG_BLOCK_UVD |
6089 RADEON_CG_BLOCK_HDP), true);
6026 6090
6027 return 0; 6091 return 0;
6028} 6092}
@@ -6213,6 +6277,7 @@ static int si_parse_power_table(struct radeon_device *rdev)
6213 rdev->pm.dpm.backbias_response_time = le16_to_cpu(power_info->pplib.usBackbiasTime); 6277 rdev->pm.dpm.backbias_response_time = le16_to_cpu(power_info->pplib.usBackbiasTime);
6214 rdev->pm.dpm.voltage_response_time = le16_to_cpu(power_info->pplib.usVoltageTime); 6278 rdev->pm.dpm.voltage_response_time = le16_to_cpu(power_info->pplib.usVoltageTime);
6215 for (i = 0; i < state_array->ucNumEntries; i++) { 6279 for (i = 0; i < state_array->ucNumEntries; i++) {
6280 u8 *idx;
6216 power_state = (union pplib_power_state *)power_state_offset; 6281 power_state = (union pplib_power_state *)power_state_offset;
6217 non_clock_array_index = power_state->v2.nonClockInfoIndex; 6282 non_clock_array_index = power_state->v2.nonClockInfoIndex;
6218 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) 6283 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
@@ -6229,14 +6294,16 @@ static int si_parse_power_table(struct radeon_device *rdev)
6229 non_clock_info, 6294 non_clock_info,
6230 non_clock_info_array->ucEntrySize); 6295 non_clock_info_array->ucEntrySize);
6231 k = 0; 6296 k = 0;
6297 idx = (u8 *)&power_state->v2.clockInfoIndex[0];
6232 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) { 6298 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
6233 clock_array_index = power_state->v2.clockInfoIndex[j]; 6299 clock_array_index = idx[j];
6234 if (clock_array_index >= clock_info_array->ucNumEntries) 6300 if (clock_array_index >= clock_info_array->ucNumEntries)
6235 continue; 6301 continue;
6236 if (k >= SISLANDS_MAX_HARDWARE_POWERLEVELS) 6302 if (k >= SISLANDS_MAX_HARDWARE_POWERLEVELS)
6237 break; 6303 break;
6238 clock_info = (union pplib_clock_info *) 6304 clock_info = (union pplib_clock_info *)
6239 &clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize]; 6305 ((u8 *)&clock_info_array->clockInfo[0] +
6306 (clock_array_index * clock_info_array->ucEntrySize));
6240 si_parse_pplib_clock_info(rdev, 6307 si_parse_pplib_clock_info(rdev,
6241 &rdev->pm.dpm.ps[i], k, 6308 &rdev->pm.dpm.ps[i], k,
6242 clock_info); 6309 clock_info);
@@ -6254,9 +6321,6 @@ int si_dpm_init(struct radeon_device *rdev)
6254 struct evergreen_power_info *eg_pi; 6321 struct evergreen_power_info *eg_pi;
6255 struct ni_power_info *ni_pi; 6322 struct ni_power_info *ni_pi;
6256 struct si_power_info *si_pi; 6323 struct si_power_info *si_pi;
6257 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
6258 u16 data_offset, size;
6259 u8 frev, crev;
6260 struct atom_clock_dividers dividers; 6324 struct atom_clock_dividers dividers;
6261 int ret; 6325 int ret;
6262 u32 mask; 6326 u32 mask;
@@ -6347,16 +6411,7 @@ int si_dpm_init(struct radeon_device *rdev)
6347 si_pi->vddc_phase_shed_control = 6411 si_pi->vddc_phase_shed_control =
6348 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, VOLTAGE_OBJ_PHASE_LUT); 6412 radeon_atom_is_voltage_gpio(rdev, SET_VOLTAGE_TYPE_ASIC_VDDC, VOLTAGE_OBJ_PHASE_LUT);
6349 6413
6350 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 6414 rv770_get_engine_memory_ss(rdev);
6351 &frev, &crev, &data_offset)) {
6352 pi->sclk_ss = true;
6353 pi->mclk_ss = true;
6354 pi->dynamic_ss = true;
6355 } else {
6356 pi->sclk_ss = false;
6357 pi->mclk_ss = false;
6358 pi->dynamic_ss = true;
6359 }
6360 6415
6361 pi->asi = RV770_ASI_DFLT; 6416 pi->asi = RV770_ASI_DFLT;
6362 pi->pasi = CYPRESS_HASI_DFLT; 6417 pi->pasi = CYPRESS_HASI_DFLT;
@@ -6367,8 +6422,7 @@ int si_dpm_init(struct radeon_device *rdev)
6367 eg_pi->sclk_deep_sleep = true; 6422 eg_pi->sclk_deep_sleep = true;
6368 si_pi->sclk_deep_sleep_above_low = false; 6423 si_pi->sclk_deep_sleep_above_low = false;
6369 6424
6370 if (pi->gfx_clock_gating && 6425 if (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE)
6371 (rdev->pm.int_thermal_type != THERMAL_TYPE_NONE))
6372 pi->thermal_protection = true; 6426 pi->thermal_protection = true;
6373 else 6427 else
6374 pi->thermal_protection = false; 6428 pi->thermal_protection = false;
@@ -6395,6 +6449,12 @@ int si_dpm_init(struct radeon_device *rdev)
6395 6449
6396 si_initialize_powertune_defaults(rdev); 6450 si_initialize_powertune_defaults(rdev);
6397 6451
6452 /* make sure dc limits are valid */
6453 if ((rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.sclk == 0) ||
6454 (rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc.mclk == 0))
6455 rdev->pm.dpm.dyn_state.max_clock_voltage_on_dc =
6456 rdev->pm.dpm.dyn_state.max_clock_voltage_on_ac;
6457
6398 return 0; 6458 return 0;
6399} 6459}
6400 6460
diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h
index 2c8da27a929f..52d2ab6b67a0 100644
--- a/drivers/gpu/drm/radeon/sid.h
+++ b/drivers/gpu/drm/radeon/sid.h
@@ -282,6 +282,10 @@
282 282
283#define DMIF_ADDR_CALC 0xC00 283#define DMIF_ADDR_CALC 0xC00
284 284
285#define PIPE0_DMIF_BUFFER_CONTROL 0x0ca0
286# define DMIF_BUFFERS_ALLOCATED(x) ((x) << 0)
287# define DMIF_BUFFERS_ALLOCATED_COMPLETED (1 << 4)
288
285#define SRBM_STATUS 0xE50 289#define SRBM_STATUS 0xE50
286#define GRBM_RQ_PENDING (1 << 5) 290#define GRBM_RQ_PENDING (1 << 5)
287#define VMC_BUSY (1 << 8) 291#define VMC_BUSY (1 << 8)
@@ -581,6 +585,7 @@
581#define CLKS_MASK (0xfff << 0) 585#define CLKS_MASK (0xfff << 0)
582 586
583#define HDP_HOST_PATH_CNTL 0x2C00 587#define HDP_HOST_PATH_CNTL 0x2C00
588#define CLOCK_GATING_DIS (1 << 23)
584#define HDP_NONSURFACE_BASE 0x2C04 589#define HDP_NONSURFACE_BASE 0x2C04
585#define HDP_NONSURFACE_INFO 0x2C08 590#define HDP_NONSURFACE_INFO 0x2C08
586#define HDP_NONSURFACE_SIZE 0x2C0C 591#define HDP_NONSURFACE_SIZE 0x2C0C
@@ -588,6 +593,8 @@
588#define HDP_ADDR_CONFIG 0x2F48 593#define HDP_ADDR_CONFIG 0x2F48
589#define HDP_MISC_CNTL 0x2F4C 594#define HDP_MISC_CNTL 0x2F4C
590#define HDP_FLUSH_INVALIDATE_CACHE (1 << 0) 595#define HDP_FLUSH_INVALIDATE_CACHE (1 << 0)
596#define HDP_MEM_POWER_LS 0x2F50
597#define HDP_LS_ENABLE (1 << 0)
591 598
592#define ATC_MISC_CG 0x3350 599#define ATC_MISC_CG 0x3350
593 600
@@ -635,6 +642,54 @@
635 642
636#define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0 643#define HDP_REG_COHERENCY_FLUSH_CNTL 0x54A0
637 644
645/* DCE6 ELD audio interface */
646#define AZ_F0_CODEC_ENDPOINT_INDEX 0x5E00
647# define AZ_ENDPOINT_REG_INDEX(x) (((x) & 0xff) << 0)
648# define AZ_ENDPOINT_REG_WRITE_EN (1 << 8)
649#define AZ_F0_CODEC_ENDPOINT_DATA 0x5E04
650
651#define AZ_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER 0x25
652#define SPEAKER_ALLOCATION(x) (((x) & 0x7f) << 0)
653#define SPEAKER_ALLOCATION_MASK (0x7f << 0)
654#define SPEAKER_ALLOCATION_SHIFT 0
655#define HDMI_CONNECTION (1 << 16)
656#define DP_CONNECTION (1 << 17)
657
658#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0 0x28 /* LPCM */
659#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR1 0x29 /* AC3 */
660#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR2 0x2A /* MPEG1 */
661#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR3 0x2B /* MP3 */
662#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR4 0x2C /* MPEG2 */
663#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR5 0x2D /* AAC */
664#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR6 0x2E /* DTS */
665#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR7 0x2F /* ATRAC */
666#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR8 0x30 /* one bit audio - leave at 0 (default) */
667#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR9 0x31 /* Dolby Digital */
668#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR10 0x32 /* DTS-HD */
669#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR11 0x33 /* MAT-MLP */
670#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR12 0x34 /* DTS */
671#define AZ_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13 0x35 /* WMA Pro */
672# define MAX_CHANNELS(x) (((x) & 0x7) << 0)
673/* max channels minus one. 7 = 8 channels */
674# define SUPPORTED_FREQUENCIES(x) (((x) & 0xff) << 8)
675# define DESCRIPTOR_BYTE_2(x) (((x) & 0xff) << 16)
676# define SUPPORTED_FREQUENCIES_STEREO(x) (((x) & 0xff) << 24) /* LPCM only */
677/* SUPPORTED_FREQUENCIES, SUPPORTED_FREQUENCIES_STEREO
678 * bit0 = 32 kHz
679 * bit1 = 44.1 kHz
680 * bit2 = 48 kHz
681 * bit3 = 88.2 kHz
682 * bit4 = 96 kHz
683 * bit5 = 176.4 kHz
684 * bit6 = 192 kHz
685 */
686#define AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL 0x54
687# define AUDIO_ENABLED (1 << 31)
688
689#define AZ_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT 0x56
690#define PORT_CONNECTIVITY_MASK (3 << 30)
691#define PORT_CONNECTIVITY_SHIFT 30
692
638#define DC_LB_MEMORY_SPLIT 0x6b0c 693#define DC_LB_MEMORY_SPLIT 0x6b0c
639#define DC_LB_MEMORY_CONFIG(x) ((x) << 20) 694#define DC_LB_MEMORY_CONFIG(x) ((x) << 20)
640 695
@@ -755,6 +810,17 @@
755/* 0x6e98, 0x7a98, 0x10698, 0x11298, 0x11e98, 0x12a98 */ 810/* 0x6e98, 0x7a98, 0x10698, 0x11298, 0x11e98, 0x12a98 */
756#define CRTC_STATUS_FRAME_COUNT 0x6e98 811#define CRTC_STATUS_FRAME_COUNT 0x6e98
757 812
813#define AFMT_AUDIO_SRC_CONTROL 0x713c
814#define AFMT_AUDIO_SRC_SELECT(x) (((x) & 7) << 0)
815/* AFMT_AUDIO_SRC_SELECT
816 * 0 = stream0
817 * 1 = stream1
818 * 2 = stream2
819 * 3 = stream3
820 * 4 = stream4
821 * 5 = stream5
822 */
823
758#define GRBM_CNTL 0x8000 824#define GRBM_CNTL 0x8000
759#define GRBM_READ_TIMEOUT(x) ((x) << 0) 825#define GRBM_READ_TIMEOUT(x) ((x) << 0)
760 826
@@ -1295,6 +1361,7 @@
1295/* PCIE registers idx/data 0x30/0x34 */ 1361/* PCIE registers idx/data 0x30/0x34 */
1296#define PCIE_CNTL2 0x1c /* PCIE */ 1362#define PCIE_CNTL2 0x1c /* PCIE */
1297# define SLV_MEM_LS_EN (1 << 16) 1363# define SLV_MEM_LS_EN (1 << 16)
1364# define SLV_MEM_AGGRESSIVE_LS_EN (1 << 17)
1298# define MST_MEM_LS_EN (1 << 18) 1365# define MST_MEM_LS_EN (1 << 18)
1299# define REPLAY_MEM_LS_EN (1 << 19) 1366# define REPLAY_MEM_LS_EN (1 << 19)
1300#define PCIE_LC_STATUS1 0x28 /* PCIE */ 1367#define PCIE_LC_STATUS1 0x28 /* PCIE */
@@ -1644,6 +1711,10 @@
1644# define DMA_IDLE (1 << 0) 1711# define DMA_IDLE (1 << 0)
1645#define DMA_TILING_CONFIG 0xd0b8 1712#define DMA_TILING_CONFIG 0xd0b8
1646 1713
1714#define DMA_POWER_CNTL 0xd0bc
1715# define MEM_POWER_OVERRIDE (1 << 8)
1716#define DMA_CLK_CTRL 0xd0c0
1717
1647#define DMA_PG 0xd0d4 1718#define DMA_PG 0xd0d4
1648# define PG_CNTL_ENABLE (1 << 0) 1719# define PG_CNTL_ENABLE (1 << 0)
1649#define DMA_PGFSM_CONFIG 0xd0d8 1720#define DMA_PGFSM_CONFIG 0xd0d8
diff --git a/drivers/gpu/drm/radeon/smu7.h b/drivers/gpu/drm/radeon/smu7.h
new file mode 100644
index 000000000000..75a380a15292
--- /dev/null
+++ b/drivers/gpu/drm/radeon/smu7.h
@@ -0,0 +1,170 @@
1/*
2 * Copyright 2013 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 SMU7_H
25#define SMU7_H
26
27#pragma pack(push, 1)
28
29#define SMU7_CONTEXT_ID_SMC 1
30#define SMU7_CONTEXT_ID_VBIOS 2
31
32
33#define SMU7_CONTEXT_ID_SMC 1
34#define SMU7_CONTEXT_ID_VBIOS 2
35
36#define SMU7_MAX_LEVELS_VDDC 8
37#define SMU7_MAX_LEVELS_VDDCI 4
38#define SMU7_MAX_LEVELS_MVDD 4
39#define SMU7_MAX_LEVELS_VDDNB 8
40
41#define SMU7_MAX_LEVELS_GRAPHICS SMU__NUM_SCLK_DPM_STATE // SCLK + SQ DPM + ULV
42#define SMU7_MAX_LEVELS_MEMORY SMU__NUM_MCLK_DPM_LEVELS // MCLK Levels DPM
43#define SMU7_MAX_LEVELS_GIO SMU__NUM_LCLK_DPM_LEVELS // LCLK Levels
44#define SMU7_MAX_LEVELS_LINK SMU__NUM_PCIE_DPM_LEVELS // PCIe speed and number of lanes.
45#define SMU7_MAX_LEVELS_UVD 8 // VCLK/DCLK levels for UVD.
46#define SMU7_MAX_LEVELS_VCE 8 // ECLK levels for VCE.
47#define SMU7_MAX_LEVELS_ACP 8 // ACLK levels for ACP.
48#define SMU7_MAX_LEVELS_SAMU 8 // SAMCLK levels for SAMU.
49#define SMU7_MAX_ENTRIES_SMIO 32 // Number of entries in SMIO table.
50
51#define DPM_NO_LIMIT 0
52#define DPM_NO_UP 1
53#define DPM_GO_DOWN 2
54#define DPM_GO_UP 3
55
56#define SMU7_FIRST_DPM_GRAPHICS_LEVEL 0
57#define SMU7_FIRST_DPM_MEMORY_LEVEL 0
58
59#define GPIO_CLAMP_MODE_VRHOT 1
60#define GPIO_CLAMP_MODE_THERM 2
61#define GPIO_CLAMP_MODE_DC 4
62
63#define SCRATCH_B_TARG_PCIE_INDEX_SHIFT 0
64#define SCRATCH_B_TARG_PCIE_INDEX_MASK (0x7<<SCRATCH_B_TARG_PCIE_INDEX_SHIFT)
65#define SCRATCH_B_CURR_PCIE_INDEX_SHIFT 3
66#define SCRATCH_B_CURR_PCIE_INDEX_MASK (0x7<<SCRATCH_B_CURR_PCIE_INDEX_SHIFT)
67#define SCRATCH_B_TARG_UVD_INDEX_SHIFT 6
68#define SCRATCH_B_TARG_UVD_INDEX_MASK (0x7<<SCRATCH_B_TARG_UVD_INDEX_SHIFT)
69#define SCRATCH_B_CURR_UVD_INDEX_SHIFT 9
70#define SCRATCH_B_CURR_UVD_INDEX_MASK (0x7<<SCRATCH_B_CURR_UVD_INDEX_SHIFT)
71#define SCRATCH_B_TARG_VCE_INDEX_SHIFT 12
72#define SCRATCH_B_TARG_VCE_INDEX_MASK (0x7<<SCRATCH_B_TARG_VCE_INDEX_SHIFT)
73#define SCRATCH_B_CURR_VCE_INDEX_SHIFT 15
74#define SCRATCH_B_CURR_VCE_INDEX_MASK (0x7<<SCRATCH_B_CURR_VCE_INDEX_SHIFT)
75#define SCRATCH_B_TARG_ACP_INDEX_SHIFT 18
76#define SCRATCH_B_TARG_ACP_INDEX_MASK (0x7<<SCRATCH_B_TARG_ACP_INDEX_SHIFT)
77#define SCRATCH_B_CURR_ACP_INDEX_SHIFT 21
78#define SCRATCH_B_CURR_ACP_INDEX_MASK (0x7<<SCRATCH_B_CURR_ACP_INDEX_SHIFT)
79#define SCRATCH_B_TARG_SAMU_INDEX_SHIFT 24
80#define SCRATCH_B_TARG_SAMU_INDEX_MASK (0x7<<SCRATCH_B_TARG_SAMU_INDEX_SHIFT)
81#define SCRATCH_B_CURR_SAMU_INDEX_SHIFT 27
82#define SCRATCH_B_CURR_SAMU_INDEX_MASK (0x7<<SCRATCH_B_CURR_SAMU_INDEX_SHIFT)
83
84
85struct SMU7_PIDController
86{
87 uint32_t Ki;
88 int32_t LFWindupUL;
89 int32_t LFWindupLL;
90 uint32_t StatePrecision;
91 uint32_t LfPrecision;
92 uint32_t LfOffset;
93 uint32_t MaxState;
94 uint32_t MaxLfFraction;
95 uint32_t StateShift;
96};
97
98typedef struct SMU7_PIDController SMU7_PIDController;
99
100// -------------------------------------------------------------------------------------------------------------------------
101#define SMU7_MAX_PCIE_LINK_SPEEDS 3 /* 0:Gen1 1:Gen2 2:Gen3 */
102
103#define SMU7_SCLK_DPM_CONFIG_MASK 0x01
104#define SMU7_VOLTAGE_CONTROLLER_CONFIG_MASK 0x02
105#define SMU7_THERMAL_CONTROLLER_CONFIG_MASK 0x04
106#define SMU7_MCLK_DPM_CONFIG_MASK 0x08
107#define SMU7_UVD_DPM_CONFIG_MASK 0x10
108#define SMU7_VCE_DPM_CONFIG_MASK 0x20
109#define SMU7_ACP_DPM_CONFIG_MASK 0x40
110#define SMU7_SAMU_DPM_CONFIG_MASK 0x80
111#define SMU7_PCIEGEN_DPM_CONFIG_MASK 0x100
112
113#define SMU7_ACP_MCLK_HANDSHAKE_DISABLE 0x00000001
114#define SMU7_ACP_SCLK_HANDSHAKE_DISABLE 0x00000002
115#define SMU7_UVD_MCLK_HANDSHAKE_DISABLE 0x00000100
116#define SMU7_UVD_SCLK_HANDSHAKE_DISABLE 0x00000200
117#define SMU7_VCE_MCLK_HANDSHAKE_DISABLE 0x00010000
118#define SMU7_VCE_SCLK_HANDSHAKE_DISABLE 0x00020000
119
120struct SMU7_Firmware_Header
121{
122 uint32_t Digest[5];
123 uint32_t Version;
124 uint32_t HeaderSize;
125 uint32_t Flags;
126 uint32_t EntryPoint;
127 uint32_t CodeSize;
128 uint32_t ImageSize;
129
130 uint32_t Rtos;
131 uint32_t SoftRegisters;
132 uint32_t DpmTable;
133 uint32_t FanTable;
134 uint32_t CacConfigTable;
135 uint32_t CacStatusTable;
136
137 uint32_t mcRegisterTable;
138
139 uint32_t mcArbDramTimingTable;
140
141 uint32_t PmFuseTable;
142 uint32_t Globals;
143 uint32_t Reserved[42];
144 uint32_t Signature;
145};
146
147typedef struct SMU7_Firmware_Header SMU7_Firmware_Header;
148
149#define SMU7_FIRMWARE_HEADER_LOCATION 0x20000
150
151enum DisplayConfig {
152 PowerDown = 1,
153 DP54x4,
154 DP54x2,
155 DP54x1,
156 DP27x4,
157 DP27x2,
158 DP27x1,
159 HDMI297,
160 HDMI162,
161 LVDS,
162 DP324x4,
163 DP324x2,
164 DP324x1
165};
166
167#pragma pack(pop)
168
169#endif
170
diff --git a/drivers/gpu/drm/radeon/smu7_discrete.h b/drivers/gpu/drm/radeon/smu7_discrete.h
new file mode 100644
index 000000000000..82f70c90a9ee
--- /dev/null
+++ b/drivers/gpu/drm/radeon/smu7_discrete.h
@@ -0,0 +1,486 @@
1/*
2 * Copyright 2013 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 SMU7_DISCRETE_H
25#define SMU7_DISCRETE_H
26
27#include "smu7.h"
28
29#pragma pack(push, 1)
30
31#define SMU7_DTE_ITERATIONS 5
32#define SMU7_DTE_SOURCES 3
33#define SMU7_DTE_SINKS 1
34#define SMU7_NUM_CPU_TES 0
35#define SMU7_NUM_GPU_TES 1
36#define SMU7_NUM_NON_TES 2
37
38struct SMU7_SoftRegisters
39{
40 uint32_t RefClockFrequency;
41 uint32_t PmTimerP;
42 uint32_t FeatureEnables;
43 uint32_t PreVBlankGap;
44 uint32_t VBlankTimeout;
45 uint32_t TrainTimeGap;
46
47 uint32_t MvddSwitchTime;
48 uint32_t LongestAcpiTrainTime;
49 uint32_t AcpiDelay;
50 uint32_t G5TrainTime;
51 uint32_t DelayMpllPwron;
52 uint32_t VoltageChangeTimeout;
53 uint32_t HandshakeDisables;
54
55 uint8_t DisplayPhy1Config;
56 uint8_t DisplayPhy2Config;
57 uint8_t DisplayPhy3Config;
58 uint8_t DisplayPhy4Config;
59
60 uint8_t DisplayPhy5Config;
61 uint8_t DisplayPhy6Config;
62 uint8_t DisplayPhy7Config;
63 uint8_t DisplayPhy8Config;
64
65 uint32_t AverageGraphicsA;
66 uint32_t AverageMemoryA;
67 uint32_t AverageGioA;
68
69 uint8_t SClkDpmEnabledLevels;
70 uint8_t MClkDpmEnabledLevels;
71 uint8_t LClkDpmEnabledLevels;
72 uint8_t PCIeDpmEnabledLevels;
73
74 uint8_t UVDDpmEnabledLevels;
75 uint8_t SAMUDpmEnabledLevels;
76 uint8_t ACPDpmEnabledLevels;
77 uint8_t VCEDpmEnabledLevels;
78
79 uint32_t DRAM_LOG_ADDR_H;
80 uint32_t DRAM_LOG_ADDR_L;
81 uint32_t DRAM_LOG_PHY_ADDR_H;
82 uint32_t DRAM_LOG_PHY_ADDR_L;
83 uint32_t DRAM_LOG_BUFF_SIZE;
84 uint32_t UlvEnterC;
85 uint32_t UlvTime;
86 uint32_t Reserved[3];
87
88};
89
90typedef struct SMU7_SoftRegisters SMU7_SoftRegisters;
91
92struct SMU7_Discrete_VoltageLevel
93{
94 uint16_t Voltage;
95 uint16_t StdVoltageHiSidd;
96 uint16_t StdVoltageLoSidd;
97 uint8_t Smio;
98 uint8_t padding;
99};
100
101typedef struct SMU7_Discrete_VoltageLevel SMU7_Discrete_VoltageLevel;
102
103struct SMU7_Discrete_GraphicsLevel
104{
105 uint32_t Flags;
106 uint32_t MinVddc;
107 uint32_t MinVddcPhases;
108
109 uint32_t SclkFrequency;
110
111 uint8_t padding1[2];
112 uint16_t ActivityLevel;
113
114 uint32_t CgSpllFuncCntl3;
115 uint32_t CgSpllFuncCntl4;
116 uint32_t SpllSpreadSpectrum;
117 uint32_t SpllSpreadSpectrum2;
118 uint32_t CcPwrDynRm;
119 uint32_t CcPwrDynRm1;
120 uint8_t SclkDid;
121 uint8_t DisplayWatermark;
122 uint8_t EnabledForActivity;
123 uint8_t EnabledForThrottle;
124 uint8_t UpH;
125 uint8_t DownH;
126 uint8_t VoltageDownH;
127 uint8_t PowerThrottle;
128 uint8_t DeepSleepDivId;
129 uint8_t padding[3];
130};
131
132typedef struct SMU7_Discrete_GraphicsLevel SMU7_Discrete_GraphicsLevel;
133
134struct SMU7_Discrete_ACPILevel
135{
136 uint32_t Flags;
137 uint32_t MinVddc;
138 uint32_t MinVddcPhases;
139 uint32_t SclkFrequency;
140 uint8_t SclkDid;
141 uint8_t DisplayWatermark;
142 uint8_t DeepSleepDivId;
143 uint8_t padding;
144 uint32_t CgSpllFuncCntl;
145 uint32_t CgSpllFuncCntl2;
146 uint32_t CgSpllFuncCntl3;
147 uint32_t CgSpllFuncCntl4;
148 uint32_t SpllSpreadSpectrum;
149 uint32_t SpllSpreadSpectrum2;
150 uint32_t CcPwrDynRm;
151 uint32_t CcPwrDynRm1;
152};
153
154typedef struct SMU7_Discrete_ACPILevel SMU7_Discrete_ACPILevel;
155
156struct SMU7_Discrete_Ulv
157{
158 uint32_t CcPwrDynRm;
159 uint32_t CcPwrDynRm1;
160 uint16_t VddcOffset;
161 uint8_t VddcOffsetVid;
162 uint8_t VddcPhase;
163 uint32_t Reserved;
164};
165
166typedef struct SMU7_Discrete_Ulv SMU7_Discrete_Ulv;
167
168struct SMU7_Discrete_MemoryLevel
169{
170 uint32_t MinVddc;
171 uint32_t MinVddcPhases;
172 uint32_t MinVddci;
173 uint32_t MinMvdd;
174
175 uint32_t MclkFrequency;
176
177 uint8_t EdcReadEnable;
178 uint8_t EdcWriteEnable;
179 uint8_t RttEnable;
180 uint8_t StutterEnable;
181
182 uint8_t StrobeEnable;
183 uint8_t StrobeRatio;
184 uint8_t EnabledForThrottle;
185 uint8_t EnabledForActivity;
186
187 uint8_t UpH;
188 uint8_t DownH;
189 uint8_t VoltageDownH;
190 uint8_t padding;
191
192 uint16_t ActivityLevel;
193 uint8_t DisplayWatermark;
194 uint8_t padding1;
195
196 uint32_t MpllFuncCntl;
197 uint32_t MpllFuncCntl_1;
198 uint32_t MpllFuncCntl_2;
199 uint32_t MpllAdFuncCntl;
200 uint32_t MpllDqFuncCntl;
201 uint32_t MclkPwrmgtCntl;
202 uint32_t DllCntl;
203 uint32_t MpllSs1;
204 uint32_t MpllSs2;
205};
206
207typedef struct SMU7_Discrete_MemoryLevel SMU7_Discrete_MemoryLevel;
208
209struct SMU7_Discrete_LinkLevel
210{
211 uint8_t PcieGenSpeed;
212 uint8_t PcieLaneCount;
213 uint8_t EnabledForActivity;
214 uint8_t Padding;
215 uint32_t DownT;
216 uint32_t UpT;
217 uint32_t Reserved;
218};
219
220typedef struct SMU7_Discrete_LinkLevel SMU7_Discrete_LinkLevel;
221
222
223struct SMU7_Discrete_MCArbDramTimingTableEntry
224{
225 uint32_t McArbDramTiming;
226 uint32_t McArbDramTiming2;
227 uint8_t McArbBurstTime;
228 uint8_t padding[3];
229};
230
231typedef struct SMU7_Discrete_MCArbDramTimingTableEntry SMU7_Discrete_MCArbDramTimingTableEntry;
232
233struct SMU7_Discrete_MCArbDramTimingTable
234{
235 SMU7_Discrete_MCArbDramTimingTableEntry entries[SMU__NUM_SCLK_DPM_STATE][SMU__NUM_MCLK_DPM_LEVELS];
236};
237
238typedef struct SMU7_Discrete_MCArbDramTimingTable SMU7_Discrete_MCArbDramTimingTable;
239
240struct SMU7_Discrete_UvdLevel
241{
242 uint32_t VclkFrequency;
243 uint32_t DclkFrequency;
244 uint16_t MinVddc;
245 uint8_t MinVddcPhases;
246 uint8_t VclkDivider;
247 uint8_t DclkDivider;
248 uint8_t padding[3];
249};
250
251typedef struct SMU7_Discrete_UvdLevel SMU7_Discrete_UvdLevel;
252
253struct SMU7_Discrete_ExtClkLevel
254{
255 uint32_t Frequency;
256 uint16_t MinVoltage;
257 uint8_t MinPhases;
258 uint8_t Divider;
259};
260
261typedef struct SMU7_Discrete_ExtClkLevel SMU7_Discrete_ExtClkLevel;
262
263struct SMU7_Discrete_StateInfo
264{
265 uint32_t SclkFrequency;
266 uint32_t MclkFrequency;
267 uint32_t VclkFrequency;
268 uint32_t DclkFrequency;
269 uint32_t SamclkFrequency;
270 uint32_t AclkFrequency;
271 uint32_t EclkFrequency;
272 uint16_t MvddVoltage;
273 uint16_t padding16;
274 uint8_t DisplayWatermark;
275 uint8_t McArbIndex;
276 uint8_t McRegIndex;
277 uint8_t SeqIndex;
278 uint8_t SclkDid;
279 int8_t SclkIndex;
280 int8_t MclkIndex;
281 uint8_t PCIeGen;
282
283};
284
285typedef struct SMU7_Discrete_StateInfo SMU7_Discrete_StateInfo;
286
287
288struct SMU7_Discrete_DpmTable
289{
290 SMU7_PIDController GraphicsPIDController;
291 SMU7_PIDController MemoryPIDController;
292 SMU7_PIDController LinkPIDController;
293
294 uint32_t SystemFlags;
295
296
297 uint32_t SmioMaskVddcVid;
298 uint32_t SmioMaskVddcPhase;
299 uint32_t SmioMaskVddciVid;
300 uint32_t SmioMaskMvddVid;
301
302 uint32_t VddcLevelCount;
303 uint32_t VddciLevelCount;
304 uint32_t MvddLevelCount;
305
306 SMU7_Discrete_VoltageLevel VddcLevel [SMU7_MAX_LEVELS_VDDC];
307// SMU7_Discrete_VoltageLevel VddcStandardReference [SMU7_MAX_LEVELS_VDDC];
308 SMU7_Discrete_VoltageLevel VddciLevel [SMU7_MAX_LEVELS_VDDCI];
309 SMU7_Discrete_VoltageLevel MvddLevel [SMU7_MAX_LEVELS_MVDD];
310
311 uint8_t GraphicsDpmLevelCount;
312 uint8_t MemoryDpmLevelCount;
313 uint8_t LinkLevelCount;
314 uint8_t UvdLevelCount;
315 uint8_t VceLevelCount;
316 uint8_t AcpLevelCount;
317 uint8_t SamuLevelCount;
318 uint8_t MasterDeepSleepControl;
319 uint32_t Reserved[5];
320// uint32_t SamuDefaultLevel;
321
322 SMU7_Discrete_GraphicsLevel GraphicsLevel [SMU7_MAX_LEVELS_GRAPHICS];
323 SMU7_Discrete_MemoryLevel MemoryACPILevel;
324 SMU7_Discrete_MemoryLevel MemoryLevel [SMU7_MAX_LEVELS_MEMORY];
325 SMU7_Discrete_LinkLevel LinkLevel [SMU7_MAX_LEVELS_LINK];
326 SMU7_Discrete_ACPILevel ACPILevel;
327 SMU7_Discrete_UvdLevel UvdLevel [SMU7_MAX_LEVELS_UVD];
328 SMU7_Discrete_ExtClkLevel VceLevel [SMU7_MAX_LEVELS_VCE];
329 SMU7_Discrete_ExtClkLevel AcpLevel [SMU7_MAX_LEVELS_ACP];
330 SMU7_Discrete_ExtClkLevel SamuLevel [SMU7_MAX_LEVELS_SAMU];
331 SMU7_Discrete_Ulv Ulv;
332
333 uint32_t SclkStepSize;
334 uint32_t Smio [SMU7_MAX_ENTRIES_SMIO];
335
336 uint8_t UvdBootLevel;
337 uint8_t VceBootLevel;
338 uint8_t AcpBootLevel;
339 uint8_t SamuBootLevel;
340
341 uint8_t UVDInterval;
342 uint8_t VCEInterval;
343 uint8_t ACPInterval;
344 uint8_t SAMUInterval;
345
346 uint8_t GraphicsBootLevel;
347 uint8_t GraphicsVoltageChangeEnable;
348 uint8_t GraphicsThermThrottleEnable;
349 uint8_t GraphicsInterval;
350
351 uint8_t VoltageInterval;
352 uint8_t ThermalInterval;
353 uint16_t TemperatureLimitHigh;
354
355 uint16_t TemperatureLimitLow;
356 uint8_t MemoryBootLevel;
357 uint8_t MemoryVoltageChangeEnable;
358
359 uint8_t MemoryInterval;
360 uint8_t MemoryThermThrottleEnable;
361 uint16_t VddcVddciDelta;
362
363 uint16_t VoltageResponseTime;
364 uint16_t PhaseResponseTime;
365
366 uint8_t PCIeBootLinkLevel;
367 uint8_t PCIeGenInterval;
368 uint8_t DTEInterval;
369 uint8_t DTEMode;
370
371 uint8_t SVI2Enable;
372 uint8_t VRHotGpio;
373 uint8_t AcDcGpio;
374 uint8_t ThermGpio;
375
376 uint16_t PPM_PkgPwrLimit;
377 uint16_t PPM_TemperatureLimit;
378
379 uint16_t DefaultTdp;
380 uint16_t TargetTdp;
381
382 uint16_t FpsHighT;
383 uint16_t FpsLowT;
384
385 uint16_t BAPMTI_R [SMU7_DTE_ITERATIONS][SMU7_DTE_SOURCES][SMU7_DTE_SINKS];
386 uint16_t BAPMTI_RC [SMU7_DTE_ITERATIONS][SMU7_DTE_SOURCES][SMU7_DTE_SINKS];
387
388 uint8_t DTEAmbientTempBase;
389 uint8_t DTETjOffset;
390 uint8_t GpuTjMax;
391 uint8_t GpuTjHyst;
392
393 uint16_t BootVddc;
394 uint16_t BootVddci;
395
396 uint16_t BootMVdd;
397 uint16_t padding;
398
399 uint32_t BAPM_TEMP_GRADIENT;
400
401 uint32_t LowSclkInterruptT;
402};
403
404typedef struct SMU7_Discrete_DpmTable SMU7_Discrete_DpmTable;
405
406#define SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE 16
407#define SMU7_DISCRETE_MC_REGISTER_ARRAY_SET_COUNT SMU7_MAX_LEVELS_MEMORY
408
409struct SMU7_Discrete_MCRegisterAddress
410{
411 uint16_t s0;
412 uint16_t s1;
413};
414
415typedef struct SMU7_Discrete_MCRegisterAddress SMU7_Discrete_MCRegisterAddress;
416
417struct SMU7_Discrete_MCRegisterSet
418{
419 uint32_t value[SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE];
420};
421
422typedef struct SMU7_Discrete_MCRegisterSet SMU7_Discrete_MCRegisterSet;
423
424struct SMU7_Discrete_MCRegisters
425{
426 uint8_t last;
427 uint8_t reserved[3];
428 SMU7_Discrete_MCRegisterAddress address[SMU7_DISCRETE_MC_REGISTER_ARRAY_SIZE];
429 SMU7_Discrete_MCRegisterSet data[SMU7_DISCRETE_MC_REGISTER_ARRAY_SET_COUNT];
430};
431
432typedef struct SMU7_Discrete_MCRegisters SMU7_Discrete_MCRegisters;
433
434struct SMU7_Discrete_PmFuses {
435 // dw0-dw1
436 uint8_t BapmVddCVidHiSidd[8];
437
438 // dw2-dw3
439 uint8_t BapmVddCVidLoSidd[8];
440
441 // dw4-dw5
442 uint8_t VddCVid[8];
443
444 // dw6
445 uint8_t SviLoadLineEn;
446 uint8_t SviLoadLineVddC;
447 uint8_t SviLoadLineTrimVddC;
448 uint8_t SviLoadLineOffsetVddC;
449
450 // dw7
451 uint16_t TDC_VDDC_PkgLimit;
452 uint8_t TDC_VDDC_ThrottleReleaseLimitPerc;
453 uint8_t TDC_MAWt;
454
455 // dw8
456 uint8_t TdcWaterfallCtl;
457 uint8_t LPMLTemperatureMin;
458 uint8_t LPMLTemperatureMax;
459 uint8_t Reserved;
460
461 // dw9-dw10
462 uint8_t BapmVddCVidHiSidd2[8];
463
464 // dw11-dw12
465 uint32_t Reserved6[2];
466
467 // dw13-dw16
468 uint8_t GnbLPML[16];
469
470 // dw17
471 uint8_t GnbLPMLMaxVid;
472 uint8_t GnbLPMLMinVid;
473 uint8_t Reserved1[2];
474
475 // dw18
476 uint16_t BapmVddCBaseLeakageHiSidd;
477 uint16_t BapmVddCBaseLeakageLoSidd;
478};
479
480typedef struct SMU7_Discrete_PmFuses SMU7_Discrete_PmFuses;
481
482
483#pragma pack(pop)
484
485#endif
486
diff --git a/drivers/gpu/drm/radeon/smu7_fusion.h b/drivers/gpu/drm/radeon/smu7_fusion.h
new file mode 100644
index 000000000000..78ada9ffd508
--- /dev/null
+++ b/drivers/gpu/drm/radeon/smu7_fusion.h
@@ -0,0 +1,300 @@
1/*
2 * Copyright 2013 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 SMU7_FUSION_H
25#define SMU7_FUSION_H
26
27#include "smu7.h"
28
29#pragma pack(push, 1)
30
31#define SMU7_DTE_ITERATIONS 5
32#define SMU7_DTE_SOURCES 5
33#define SMU7_DTE_SINKS 3
34#define SMU7_NUM_CPU_TES 2
35#define SMU7_NUM_GPU_TES 1
36#define SMU7_NUM_NON_TES 2
37
38// All 'soft registers' should be uint32_t.
39struct SMU7_SoftRegisters
40{
41 uint32_t RefClockFrequency;
42 uint32_t PmTimerP;
43 uint32_t FeatureEnables;
44 uint32_t HandshakeDisables;
45
46 uint8_t DisplayPhy1Config;
47 uint8_t DisplayPhy2Config;
48 uint8_t DisplayPhy3Config;
49 uint8_t DisplayPhy4Config;
50
51 uint8_t DisplayPhy5Config;
52 uint8_t DisplayPhy6Config;
53 uint8_t DisplayPhy7Config;
54 uint8_t DisplayPhy8Config;
55
56 uint32_t AverageGraphicsA;
57 uint32_t AverageMemoryA;
58 uint32_t AverageGioA;
59
60 uint8_t SClkDpmEnabledLevels;
61 uint8_t MClkDpmEnabledLevels;
62 uint8_t LClkDpmEnabledLevels;
63 uint8_t PCIeDpmEnabledLevels;
64
65 uint8_t UVDDpmEnabledLevels;
66 uint8_t SAMUDpmEnabledLevels;
67 uint8_t ACPDpmEnabledLevels;
68 uint8_t VCEDpmEnabledLevels;
69
70 uint32_t DRAM_LOG_ADDR_H;
71 uint32_t DRAM_LOG_ADDR_L;
72 uint32_t DRAM_LOG_PHY_ADDR_H;
73 uint32_t DRAM_LOG_PHY_ADDR_L;
74 uint32_t DRAM_LOG_BUFF_SIZE;
75 uint32_t UlvEnterC;
76 uint32_t UlvTime;
77 uint32_t Reserved[3];
78
79};
80
81typedef struct SMU7_SoftRegisters SMU7_SoftRegisters;
82
83struct SMU7_Fusion_GraphicsLevel
84{
85 uint32_t MinVddNb;
86
87 uint32_t SclkFrequency;
88
89 uint8_t Vid;
90 uint8_t VidOffset;
91 uint16_t AT;
92
93 uint8_t PowerThrottle;
94 uint8_t GnbSlow;
95 uint8_t ForceNbPs1;
96 uint8_t SclkDid;
97
98 uint8_t DisplayWatermark;
99 uint8_t EnabledForActivity;
100 uint8_t EnabledForThrottle;
101 uint8_t UpH;
102
103 uint8_t DownH;
104 uint8_t VoltageDownH;
105 uint8_t DeepSleepDivId;
106
107 uint8_t ClkBypassCntl;
108
109 uint32_t reserved;
110};
111
112typedef struct SMU7_Fusion_GraphicsLevel SMU7_Fusion_GraphicsLevel;
113
114struct SMU7_Fusion_GIOLevel
115{
116 uint8_t EnabledForActivity;
117 uint8_t LclkDid;
118 uint8_t Vid;
119 uint8_t VoltageDownH;
120
121 uint32_t MinVddNb;
122
123 uint16_t ResidencyCounter;
124 uint8_t UpH;
125 uint8_t DownH;
126
127 uint32_t LclkFrequency;
128
129 uint8_t ActivityLevel;
130 uint8_t EnabledForThrottle;
131
132 uint8_t ClkBypassCntl;
133
134 uint8_t padding;
135};
136
137typedef struct SMU7_Fusion_GIOLevel SMU7_Fusion_GIOLevel;
138
139// UVD VCLK/DCLK state (level) definition.
140struct SMU7_Fusion_UvdLevel
141{
142 uint32_t VclkFrequency;
143 uint32_t DclkFrequency;
144 uint16_t MinVddNb;
145 uint8_t VclkDivider;
146 uint8_t DclkDivider;
147
148 uint8_t VClkBypassCntl;
149 uint8_t DClkBypassCntl;
150
151 uint8_t padding[2];
152
153};
154
155typedef struct SMU7_Fusion_UvdLevel SMU7_Fusion_UvdLevel;
156
157// Clocks for other external blocks (VCE, ACP, SAMU).
158struct SMU7_Fusion_ExtClkLevel
159{
160 uint32_t Frequency;
161 uint16_t MinVoltage;
162 uint8_t Divider;
163 uint8_t ClkBypassCntl;
164
165 uint32_t Reserved;
166};
167typedef struct SMU7_Fusion_ExtClkLevel SMU7_Fusion_ExtClkLevel;
168
169struct SMU7_Fusion_ACPILevel
170{
171 uint32_t Flags;
172 uint32_t MinVddNb;
173 uint32_t SclkFrequency;
174 uint8_t SclkDid;
175 uint8_t GnbSlow;
176 uint8_t ForceNbPs1;
177 uint8_t DisplayWatermark;
178 uint8_t DeepSleepDivId;
179 uint8_t padding[3];
180};
181
182typedef struct SMU7_Fusion_ACPILevel SMU7_Fusion_ACPILevel;
183
184struct SMU7_Fusion_NbDpm
185{
186 uint8_t DpmXNbPsHi;
187 uint8_t DpmXNbPsLo;
188 uint8_t Dpm0PgNbPsHi;
189 uint8_t Dpm0PgNbPsLo;
190 uint8_t EnablePsi1;
191 uint8_t SkipDPM0;
192 uint8_t SkipPG;
193 uint8_t Hysteresis;
194 uint8_t EnableDpmPstatePoll;
195 uint8_t padding[3];
196};
197
198typedef struct SMU7_Fusion_NbDpm SMU7_Fusion_NbDpm;
199
200struct SMU7_Fusion_StateInfo
201{
202 uint32_t SclkFrequency;
203 uint32_t LclkFrequency;
204 uint32_t VclkFrequency;
205 uint32_t DclkFrequency;
206 uint32_t SamclkFrequency;
207 uint32_t AclkFrequency;
208 uint32_t EclkFrequency;
209 uint8_t DisplayWatermark;
210 uint8_t McArbIndex;
211 int8_t SclkIndex;
212 int8_t MclkIndex;
213};
214
215typedef struct SMU7_Fusion_StateInfo SMU7_Fusion_StateInfo;
216
217struct SMU7_Fusion_DpmTable
218{
219 uint32_t SystemFlags;
220
221 SMU7_PIDController GraphicsPIDController;
222 SMU7_PIDController GioPIDController;
223
224 uint8_t GraphicsDpmLevelCount;
225 uint8_t GIOLevelCount;
226 uint8_t UvdLevelCount;
227 uint8_t VceLevelCount;
228
229 uint8_t AcpLevelCount;
230 uint8_t SamuLevelCount;
231 uint16_t FpsHighT;
232
233 SMU7_Fusion_GraphicsLevel GraphicsLevel [SMU__NUM_SCLK_DPM_STATE];
234 SMU7_Fusion_ACPILevel ACPILevel;
235 SMU7_Fusion_UvdLevel UvdLevel [SMU7_MAX_LEVELS_UVD];
236 SMU7_Fusion_ExtClkLevel VceLevel [SMU7_MAX_LEVELS_VCE];
237 SMU7_Fusion_ExtClkLevel AcpLevel [SMU7_MAX_LEVELS_ACP];
238 SMU7_Fusion_ExtClkLevel SamuLevel [SMU7_MAX_LEVELS_SAMU];
239
240 uint8_t UvdBootLevel;
241 uint8_t VceBootLevel;
242 uint8_t AcpBootLevel;
243 uint8_t SamuBootLevel;
244 uint8_t UVDInterval;
245 uint8_t VCEInterval;
246 uint8_t ACPInterval;
247 uint8_t SAMUInterval;
248
249 uint8_t GraphicsBootLevel;
250 uint8_t GraphicsInterval;
251 uint8_t GraphicsThermThrottleEnable;
252 uint8_t GraphicsVoltageChangeEnable;
253
254 uint8_t GraphicsClkSlowEnable;
255 uint8_t GraphicsClkSlowDivider;
256 uint16_t FpsLowT;
257
258 uint32_t DisplayCac;
259 uint32_t LowSclkInterruptT;
260
261 uint32_t DRAM_LOG_ADDR_H;
262 uint32_t DRAM_LOG_ADDR_L;
263 uint32_t DRAM_LOG_PHY_ADDR_H;
264 uint32_t DRAM_LOG_PHY_ADDR_L;
265 uint32_t DRAM_LOG_BUFF_SIZE;
266
267};
268
269struct SMU7_Fusion_GIODpmTable
270{
271
272 SMU7_Fusion_GIOLevel GIOLevel [SMU7_MAX_LEVELS_GIO];
273
274 SMU7_PIDController GioPIDController;
275
276 uint32_t GIOLevelCount;
277
278 uint8_t Enable;
279 uint8_t GIOVoltageChangeEnable;
280 uint8_t GIOBootLevel;
281 uint8_t padding;
282 uint8_t padding1[2];
283 uint8_t TargetState;
284 uint8_t CurrenttState;
285 uint8_t ThrottleOnHtc;
286 uint8_t ThermThrottleStatus;
287 uint8_t ThermThrottleTempSelect;
288 uint8_t ThermThrottleEnable;
289 uint16_t TemperatureLimitHigh;
290 uint16_t TemperatureLimitLow;
291
292};
293
294typedef struct SMU7_Fusion_DpmTable SMU7_Fusion_DpmTable;
295typedef struct SMU7_Fusion_GIODpmTable SMU7_Fusion_GIODpmTable;
296
297#pragma pack(pop)
298
299#endif
300
diff --git a/drivers/gpu/drm/radeon/sumo_dpm.c b/drivers/gpu/drm/radeon/sumo_dpm.c
index c0a850319908..864761c0120e 100644
--- a/drivers/gpu/drm/radeon/sumo_dpm.c
+++ b/drivers/gpu/drm/radeon/sumo_dpm.c
@@ -1483,6 +1483,7 @@ static int sumo_parse_power_table(struct radeon_device *rdev)
1483 rdev->pm.dpm.backbias_response_time = le16_to_cpu(power_info->pplib.usBackbiasTime); 1483 rdev->pm.dpm.backbias_response_time = le16_to_cpu(power_info->pplib.usBackbiasTime);
1484 rdev->pm.dpm.voltage_response_time = le16_to_cpu(power_info->pplib.usVoltageTime); 1484 rdev->pm.dpm.voltage_response_time = le16_to_cpu(power_info->pplib.usVoltageTime);
1485 for (i = 0; i < state_array->ucNumEntries; i++) { 1485 for (i = 0; i < state_array->ucNumEntries; i++) {
1486 u8 *idx;
1486 power_state = (union pplib_power_state *)power_state_offset; 1487 power_state = (union pplib_power_state *)power_state_offset;
1487 non_clock_array_index = power_state->v2.nonClockInfoIndex; 1488 non_clock_array_index = power_state->v2.nonClockInfoIndex;
1488 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) 1489 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
@@ -1496,12 +1497,15 @@ static int sumo_parse_power_table(struct radeon_device *rdev)
1496 } 1497 }
1497 rdev->pm.dpm.ps[i].ps_priv = ps; 1498 rdev->pm.dpm.ps[i].ps_priv = ps;
1498 k = 0; 1499 k = 0;
1500 idx = (u8 *)&power_state->v2.clockInfoIndex[0];
1499 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) { 1501 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
1500 clock_array_index = power_state->v2.clockInfoIndex[j]; 1502 clock_array_index = idx[j];
1501 if (k >= SUMO_MAX_HARDWARE_POWERLEVELS) 1503 if (k >= SUMO_MAX_HARDWARE_POWERLEVELS)
1502 break; 1504 break;
1505
1503 clock_info = (union pplib_clock_info *) 1506 clock_info = (union pplib_clock_info *)
1504 &clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize]; 1507 ((u8 *)&clock_info_array->clockInfo[0] +
1508 (clock_array_index * clock_info_array->ucEntrySize));
1505 sumo_parse_pplib_clock_info(rdev, 1509 sumo_parse_pplib_clock_info(rdev,
1506 &rdev->pm.dpm.ps[i], k, 1510 &rdev->pm.dpm.ps[i], k,
1507 clock_info); 1511 clock_info);
@@ -1530,6 +1534,20 @@ u32 sumo_convert_vid2_to_vid7(struct radeon_device *rdev,
1530 return vid_mapping_table->entries[vid_mapping_table->num_entries - 1].vid_7bit; 1534 return vid_mapping_table->entries[vid_mapping_table->num_entries - 1].vid_7bit;
1531} 1535}
1532 1536
1537u32 sumo_convert_vid7_to_vid2(struct radeon_device *rdev,
1538 struct sumo_vid_mapping_table *vid_mapping_table,
1539 u32 vid_7bit)
1540{
1541 u32 i;
1542
1543 for (i = 0; i < vid_mapping_table->num_entries; i++) {
1544 if (vid_mapping_table->entries[i].vid_7bit == vid_7bit)
1545 return vid_mapping_table->entries[i].vid_2bit;
1546 }
1547
1548 return vid_mapping_table->entries[vid_mapping_table->num_entries - 1].vid_2bit;
1549}
1550
1533static u16 sumo_convert_voltage_index_to_value(struct radeon_device *rdev, 1551static u16 sumo_convert_voltage_index_to_value(struct radeon_device *rdev,
1534 u32 vid_2bit) 1552 u32 vid_2bit)
1535{ 1553{
diff --git a/drivers/gpu/drm/radeon/sumo_dpm.h b/drivers/gpu/drm/radeon/sumo_dpm.h
index 07dda299c784..db1ea32a907b 100644
--- a/drivers/gpu/drm/radeon/sumo_dpm.h
+++ b/drivers/gpu/drm/radeon/sumo_dpm.h
@@ -202,6 +202,9 @@ void sumo_construct_vid_mapping_table(struct radeon_device *rdev,
202u32 sumo_convert_vid2_to_vid7(struct radeon_device *rdev, 202u32 sumo_convert_vid2_to_vid7(struct radeon_device *rdev,
203 struct sumo_vid_mapping_table *vid_mapping_table, 203 struct sumo_vid_mapping_table *vid_mapping_table,
204 u32 vid_2bit); 204 u32 vid_2bit);
205u32 sumo_convert_vid7_to_vid2(struct radeon_device *rdev,
206 struct sumo_vid_mapping_table *vid_mapping_table,
207 u32 vid_7bit);
205u32 sumo_get_sleep_divider_from_id(u32 id); 208u32 sumo_get_sleep_divider_from_id(u32 id);
206u32 sumo_get_sleep_divider_id_from_clock(struct radeon_device *rdev, 209u32 sumo_get_sleep_divider_id_from_clock(struct radeon_device *rdev,
207 u32 sclk, 210 u32 sclk,
diff --git a/drivers/gpu/drm/radeon/trinity_dpm.c b/drivers/gpu/drm/radeon/trinity_dpm.c
index a1eb5f59939f..b07b7b8f1aff 100644
--- a/drivers/gpu/drm/radeon/trinity_dpm.c
+++ b/drivers/gpu/drm/radeon/trinity_dpm.c
@@ -1675,6 +1675,7 @@ static int trinity_parse_power_table(struct radeon_device *rdev)
1675 rdev->pm.dpm.backbias_response_time = le16_to_cpu(power_info->pplib.usBackbiasTime); 1675 rdev->pm.dpm.backbias_response_time = le16_to_cpu(power_info->pplib.usBackbiasTime);
1676 rdev->pm.dpm.voltage_response_time = le16_to_cpu(power_info->pplib.usVoltageTime); 1676 rdev->pm.dpm.voltage_response_time = le16_to_cpu(power_info->pplib.usVoltageTime);
1677 for (i = 0; i < state_array->ucNumEntries; i++) { 1677 for (i = 0; i < state_array->ucNumEntries; i++) {
1678 u8 *idx;
1678 power_state = (union pplib_power_state *)power_state_offset; 1679 power_state = (union pplib_power_state *)power_state_offset;
1679 non_clock_array_index = power_state->v2.nonClockInfoIndex; 1680 non_clock_array_index = power_state->v2.nonClockInfoIndex;
1680 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) 1681 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
@@ -1688,14 +1689,16 @@ static int trinity_parse_power_table(struct radeon_device *rdev)
1688 } 1689 }
1689 rdev->pm.dpm.ps[i].ps_priv = ps; 1690 rdev->pm.dpm.ps[i].ps_priv = ps;
1690 k = 0; 1691 k = 0;
1692 idx = (u8 *)&power_state->v2.clockInfoIndex[0];
1691 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) { 1693 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
1692 clock_array_index = power_state->v2.clockInfoIndex[j]; 1694 clock_array_index = idx[j];
1693 if (clock_array_index >= clock_info_array->ucNumEntries) 1695 if (clock_array_index >= clock_info_array->ucNumEntries)
1694 continue; 1696 continue;
1695 if (k >= SUMO_MAX_HARDWARE_POWERLEVELS) 1697 if (k >= SUMO_MAX_HARDWARE_POWERLEVELS)
1696 break; 1698 break;
1697 clock_info = (union pplib_clock_info *) 1699 clock_info = (union pplib_clock_info *)
1698 &clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize]; 1700 ((u8 *)&clock_info_array->clockInfo[0] +
1701 (clock_array_index * clock_info_array->ucEntrySize));
1699 trinity_parse_pplib_clock_info(rdev, 1702 trinity_parse_pplib_clock_info(rdev,
1700 &rdev->pm.dpm.ps[i], k, 1703 &rdev->pm.dpm.ps[i], k,
1701 clock_info); 1704 clock_info);
diff --git a/drivers/gpu/drm/radeon/uvd_v1_0.c b/drivers/gpu/drm/radeon/uvd_v1_0.c
new file mode 100644
index 000000000000..7266805d9786
--- /dev/null
+++ b/drivers/gpu/drm/radeon/uvd_v1_0.c
@@ -0,0 +1,436 @@
1/*
2 * Copyright 2013 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: Christian König <christian.koenig@amd.com>
23 */
24
25#include <drm/drmP.h>
26#include "radeon.h"
27#include "radeon_asic.h"
28#include "r600d.h"
29
30/**
31 * uvd_v1_0_get_rptr - get read pointer
32 *
33 * @rdev: radeon_device pointer
34 * @ring: radeon_ring pointer
35 *
36 * Returns the current hardware read pointer
37 */
38uint32_t uvd_v1_0_get_rptr(struct radeon_device *rdev,
39 struct radeon_ring *ring)
40{
41 return RREG32(UVD_RBC_RB_RPTR);
42}
43
44/**
45 * uvd_v1_0_get_wptr - get write pointer
46 *
47 * @rdev: radeon_device pointer
48 * @ring: radeon_ring pointer
49 *
50 * Returns the current hardware write pointer
51 */
52uint32_t uvd_v1_0_get_wptr(struct radeon_device *rdev,
53 struct radeon_ring *ring)
54{
55 return RREG32(UVD_RBC_RB_WPTR);
56}
57
58/**
59 * uvd_v1_0_set_wptr - set write pointer
60 *
61 * @rdev: radeon_device pointer
62 * @ring: radeon_ring pointer
63 *
64 * Commits the write pointer to the hardware
65 */
66void uvd_v1_0_set_wptr(struct radeon_device *rdev,
67 struct radeon_ring *ring)
68{
69 WREG32(UVD_RBC_RB_WPTR, ring->wptr);
70}
71
72/**
73 * uvd_v1_0_init - start and test UVD block
74 *
75 * @rdev: radeon_device pointer
76 *
77 * Initialize the hardware, boot up the VCPU and do some testing
78 */
79int uvd_v1_0_init(struct radeon_device *rdev)
80{
81 struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
82 uint32_t tmp;
83 int r;
84
85 /* raise clocks while booting up the VCPU */
86 radeon_set_uvd_clocks(rdev, 53300, 40000);
87
88 r = uvd_v1_0_start(rdev);
89 if (r)
90 goto done;
91
92 ring->ready = true;
93 r = radeon_ring_test(rdev, R600_RING_TYPE_UVD_INDEX, ring);
94 if (r) {
95 ring->ready = false;
96 goto done;
97 }
98
99 r = radeon_ring_lock(rdev, ring, 10);
100 if (r) {
101 DRM_ERROR("radeon: ring failed to lock UVD ring (%d).\n", r);
102 goto done;
103 }
104
105 tmp = PACKET0(UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL, 0);
106 radeon_ring_write(ring, tmp);
107 radeon_ring_write(ring, 0xFFFFF);
108
109 tmp = PACKET0(UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL, 0);
110 radeon_ring_write(ring, tmp);
111 radeon_ring_write(ring, 0xFFFFF);
112
113 tmp = PACKET0(UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL, 0);
114 radeon_ring_write(ring, tmp);
115 radeon_ring_write(ring, 0xFFFFF);
116
117 /* Clear timeout status bits */
118 radeon_ring_write(ring, PACKET0(UVD_SEMA_TIMEOUT_STATUS, 0));
119 radeon_ring_write(ring, 0x8);
120
121 radeon_ring_write(ring, PACKET0(UVD_SEMA_CNTL, 0));
122 radeon_ring_write(ring, 3);
123
124 radeon_ring_unlock_commit(rdev, ring);
125
126done:
127 /* lower clocks again */
128 radeon_set_uvd_clocks(rdev, 0, 0);
129
130 if (!r)
131 DRM_INFO("UVD initialized successfully.\n");
132
133 return r;
134}
135
136/**
137 * uvd_v1_0_fini - stop the hardware block
138 *
139 * @rdev: radeon_device pointer
140 *
141 * Stop the UVD block, mark ring as not ready any more
142 */
143void uvd_v1_0_fini(struct radeon_device *rdev)
144{
145 struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
146
147 uvd_v1_0_stop(rdev);
148 ring->ready = false;
149}
150
151/**
152 * uvd_v1_0_start - start UVD block
153 *
154 * @rdev: radeon_device pointer
155 *
156 * Setup and start the UVD block
157 */
158int uvd_v1_0_start(struct radeon_device *rdev)
159{
160 struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
161 uint32_t rb_bufsz;
162 int i, j, r;
163
164 /* disable byte swapping */
165 u32 lmi_swap_cntl = 0;
166 u32 mp_swap_cntl = 0;
167
168 /* disable clock gating */
169 WREG32(UVD_CGC_GATE, 0);
170
171 /* disable interupt */
172 WREG32_P(UVD_MASTINT_EN, 0, ~(1 << 1));
173
174 /* Stall UMC and register bus before resetting VCPU */
175 WREG32_P(UVD_LMI_CTRL2, 1 << 8, ~(1 << 8));
176 WREG32_P(UVD_RB_ARB_CTRL, 1 << 3, ~(1 << 3));
177 mdelay(1);
178
179 /* put LMI, VCPU, RBC etc... into reset */
180 WREG32(UVD_SOFT_RESET, LMI_SOFT_RESET | VCPU_SOFT_RESET |
181 LBSI_SOFT_RESET | RBC_SOFT_RESET | CSM_SOFT_RESET |
182 CXW_SOFT_RESET | TAP_SOFT_RESET | LMI_UMC_SOFT_RESET);
183 mdelay(5);
184
185 /* take UVD block out of reset */
186 WREG32_P(SRBM_SOFT_RESET, 0, ~SOFT_RESET_UVD);
187 mdelay(5);
188
189 /* initialize UVD memory controller */
190 WREG32(UVD_LMI_CTRL, 0x40 | (1 << 8) | (1 << 13) |
191 (1 << 21) | (1 << 9) | (1 << 20));
192
193#ifdef __BIG_ENDIAN
194 /* swap (8 in 32) RB and IB */
195 lmi_swap_cntl = 0xa;
196 mp_swap_cntl = 0;
197#endif
198 WREG32(UVD_LMI_SWAP_CNTL, lmi_swap_cntl);
199 WREG32(UVD_MP_SWAP_CNTL, mp_swap_cntl);
200
201 WREG32(UVD_MPC_SET_MUXA0, 0x40c2040);
202 WREG32(UVD_MPC_SET_MUXA1, 0x0);
203 WREG32(UVD_MPC_SET_MUXB0, 0x40c2040);
204 WREG32(UVD_MPC_SET_MUXB1, 0x0);
205 WREG32(UVD_MPC_SET_ALU, 0);
206 WREG32(UVD_MPC_SET_MUX, 0x88);
207
208 /* take all subblocks out of reset, except VCPU */
209 WREG32(UVD_SOFT_RESET, VCPU_SOFT_RESET);
210 mdelay(5);
211
212 /* enable VCPU clock */
213 WREG32(UVD_VCPU_CNTL, 1 << 9);
214
215 /* enable UMC */
216 WREG32_P(UVD_LMI_CTRL2, 0, ~(1 << 8));
217
218 /* boot up the VCPU */
219 WREG32(UVD_SOFT_RESET, 0);
220 mdelay(10);
221
222 WREG32_P(UVD_RB_ARB_CTRL, 0, ~(1 << 3));
223
224 for (i = 0; i < 10; ++i) {
225 uint32_t status;
226 for (j = 0; j < 100; ++j) {
227 status = RREG32(UVD_STATUS);
228 if (status & 2)
229 break;
230 mdelay(10);
231 }
232 r = 0;
233 if (status & 2)
234 break;
235
236 DRM_ERROR("UVD not responding, trying to reset the VCPU!!!\n");
237 WREG32_P(UVD_SOFT_RESET, VCPU_SOFT_RESET, ~VCPU_SOFT_RESET);
238 mdelay(10);
239 WREG32_P(UVD_SOFT_RESET, 0, ~VCPU_SOFT_RESET);
240 mdelay(10);
241 r = -1;
242 }
243
244 if (r) {
245 DRM_ERROR("UVD not responding, giving up!!!\n");
246 return r;
247 }
248
249 /* enable interupt */
250 WREG32_P(UVD_MASTINT_EN, 3<<1, ~(3 << 1));
251
252 /* force RBC into idle state */
253 WREG32(UVD_RBC_RB_CNTL, 0x11010101);
254
255 /* Set the write pointer delay */
256 WREG32(UVD_RBC_RB_WPTR_CNTL, 0);
257
258 /* programm the 4GB memory segment for rptr and ring buffer */
259 WREG32(UVD_LMI_EXT40_ADDR, upper_32_bits(ring->gpu_addr) |
260 (0x7 << 16) | (0x1 << 31));
261
262 /* Initialize the ring buffer's read and write pointers */
263 WREG32(UVD_RBC_RB_RPTR, 0x0);
264
265 ring->wptr = ring->rptr = RREG32(UVD_RBC_RB_RPTR);
266 WREG32(UVD_RBC_RB_WPTR, ring->wptr);
267
268 /* set the ring address */
269 WREG32(UVD_RBC_RB_BASE, ring->gpu_addr);
270
271 /* Set ring buffer size */
272 rb_bufsz = order_base_2(ring->ring_size);
273 rb_bufsz = (0x1 << 8) | rb_bufsz;
274 WREG32_P(UVD_RBC_RB_CNTL, rb_bufsz, ~0x11f1f);
275
276 return 0;
277}
278
279/**
280 * uvd_v1_0_stop - stop UVD block
281 *
282 * @rdev: radeon_device pointer
283 *
284 * stop the UVD block
285 */
286void uvd_v1_0_stop(struct radeon_device *rdev)
287{
288 /* force RBC into idle state */
289 WREG32(UVD_RBC_RB_CNTL, 0x11010101);
290
291 /* Stall UMC and register bus before resetting VCPU */
292 WREG32_P(UVD_LMI_CTRL2, 1 << 8, ~(1 << 8));
293 WREG32_P(UVD_RB_ARB_CTRL, 1 << 3, ~(1 << 3));
294 mdelay(1);
295
296 /* put VCPU into reset */
297 WREG32(UVD_SOFT_RESET, VCPU_SOFT_RESET);
298 mdelay(5);
299
300 /* disable VCPU clock */
301 WREG32(UVD_VCPU_CNTL, 0x0);
302
303 /* Unstall UMC and register bus */
304 WREG32_P(UVD_LMI_CTRL2, 0, ~(1 << 8));
305 WREG32_P(UVD_RB_ARB_CTRL, 0, ~(1 << 3));
306}
307
308/**
309 * uvd_v1_0_ring_test - register write test
310 *
311 * @rdev: radeon_device pointer
312 * @ring: radeon_ring pointer
313 *
314 * Test if we can successfully write to the context register
315 */
316int uvd_v1_0_ring_test(struct radeon_device *rdev, struct radeon_ring *ring)
317{
318 uint32_t tmp = 0;
319 unsigned i;
320 int r;
321
322 WREG32(UVD_CONTEXT_ID, 0xCAFEDEAD);
323 r = radeon_ring_lock(rdev, ring, 3);
324 if (r) {
325 DRM_ERROR("radeon: cp failed to lock ring %d (%d).\n",
326 ring->idx, r);
327 return r;
328 }
329 radeon_ring_write(ring, PACKET0(UVD_CONTEXT_ID, 0));
330 radeon_ring_write(ring, 0xDEADBEEF);
331 radeon_ring_unlock_commit(rdev, ring);
332 for (i = 0; i < rdev->usec_timeout; i++) {
333 tmp = RREG32(UVD_CONTEXT_ID);
334 if (tmp == 0xDEADBEEF)
335 break;
336 DRM_UDELAY(1);
337 }
338
339 if (i < rdev->usec_timeout) {
340 DRM_INFO("ring test on %d succeeded in %d usecs\n",
341 ring->idx, i);
342 } else {
343 DRM_ERROR("radeon: ring %d test failed (0x%08X)\n",
344 ring->idx, tmp);
345 r = -EINVAL;
346 }
347 return r;
348}
349
350/**
351 * uvd_v1_0_semaphore_emit - emit semaphore command
352 *
353 * @rdev: radeon_device pointer
354 * @ring: radeon_ring pointer
355 * @semaphore: semaphore to emit commands for
356 * @emit_wait: true if we should emit a wait command
357 *
358 * Emit a semaphore command (either wait or signal) to the UVD ring.
359 */
360void uvd_v1_0_semaphore_emit(struct radeon_device *rdev,
361 struct radeon_ring *ring,
362 struct radeon_semaphore *semaphore,
363 bool emit_wait)
364{
365 uint64_t addr = semaphore->gpu_addr;
366
367 radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_LOW, 0));
368 radeon_ring_write(ring, (addr >> 3) & 0x000FFFFF);
369
370 radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_HIGH, 0));
371 radeon_ring_write(ring, (addr >> 23) & 0x000FFFFF);
372
373 radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0));
374 radeon_ring_write(ring, emit_wait ? 1 : 0);
375}
376
377/**
378 * uvd_v1_0_ib_execute - execute indirect buffer
379 *
380 * @rdev: radeon_device pointer
381 * @ib: indirect buffer to execute
382 *
383 * Write ring commands to execute the indirect buffer
384 */
385void uvd_v1_0_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
386{
387 struct radeon_ring *ring = &rdev->ring[ib->ring];
388
389 radeon_ring_write(ring, PACKET0(UVD_RBC_IB_BASE, 0));
390 radeon_ring_write(ring, ib->gpu_addr);
391 radeon_ring_write(ring, PACKET0(UVD_RBC_IB_SIZE, 0));
392 radeon_ring_write(ring, ib->length_dw);
393}
394
395/**
396 * uvd_v1_0_ib_test - test ib execution
397 *
398 * @rdev: radeon_device pointer
399 * @ring: radeon_ring pointer
400 *
401 * Test if we can successfully execute an IB
402 */
403int uvd_v1_0_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
404{
405 struct radeon_fence *fence = NULL;
406 int r;
407
408 r = radeon_set_uvd_clocks(rdev, 53300, 40000);
409 if (r) {
410 DRM_ERROR("radeon: failed to raise UVD clocks (%d).\n", r);
411 return r;
412 }
413
414 r = radeon_uvd_get_create_msg(rdev, ring->idx, 1, NULL);
415 if (r) {
416 DRM_ERROR("radeon: failed to get create msg (%d).\n", r);
417 goto error;
418 }
419
420 r = radeon_uvd_get_destroy_msg(rdev, ring->idx, 1, &fence);
421 if (r) {
422 DRM_ERROR("radeon: failed to get destroy ib (%d).\n", r);
423 goto error;
424 }
425
426 r = radeon_fence_wait(fence, false);
427 if (r) {
428 DRM_ERROR("radeon: fence wait failed (%d).\n", r);
429 goto error;
430 }
431 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
432error:
433 radeon_fence_unref(&fence);
434 radeon_set_uvd_clocks(rdev, 0, 0);
435 return r;
436}
diff --git a/drivers/gpu/drm/radeon/uvd_v2_2.c b/drivers/gpu/drm/radeon/uvd_v2_2.c
new file mode 100644
index 000000000000..b19ef4951085
--- /dev/null
+++ b/drivers/gpu/drm/radeon/uvd_v2_2.c
@@ -0,0 +1,165 @@
1/*
2 * Copyright 2013 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: Christian König <christian.koenig@amd.com>
23 */
24
25#include <linux/firmware.h>
26#include <drm/drmP.h>
27#include "radeon.h"
28#include "radeon_asic.h"
29#include "rv770d.h"
30
31/**
32 * uvd_v2_2_fence_emit - emit an fence & trap command
33 *
34 * @rdev: radeon_device pointer
35 * @fence: fence to emit
36 *
37 * Write a fence and a trap command to the ring.
38 */
39void uvd_v2_2_fence_emit(struct radeon_device *rdev,
40 struct radeon_fence *fence)
41{
42 struct radeon_ring *ring = &rdev->ring[fence->ring];
43 uint64_t addr = rdev->fence_drv[fence->ring].gpu_addr;
44
45 radeon_ring_write(ring, PACKET0(UVD_CONTEXT_ID, 0));
46 radeon_ring_write(ring, fence->seq);
47 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA0, 0));
48 radeon_ring_write(ring, addr & 0xffffffff);
49 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA1, 0));
50 radeon_ring_write(ring, upper_32_bits(addr) & 0xff);
51 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_CMD, 0));
52 radeon_ring_write(ring, 0);
53
54 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA0, 0));
55 radeon_ring_write(ring, 0);
56 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_DATA1, 0));
57 radeon_ring_write(ring, 0);
58 radeon_ring_write(ring, PACKET0(UVD_GPCOM_VCPU_CMD, 0));
59 radeon_ring_write(ring, 2);
60 return;
61}
62
63/**
64 * uvd_v2_2_resume - memory controller programming
65 *
66 * @rdev: radeon_device pointer
67 *
68 * Let the UVD memory controller know it's offsets
69 */
70int uvd_v2_2_resume(struct radeon_device *rdev)
71{
72 uint64_t addr;
73 uint32_t chip_id, size;
74 int r;
75
76 r = radeon_uvd_resume(rdev);
77 if (r)
78 return r;
79
80 /* programm the VCPU memory controller bits 0-27 */
81 addr = rdev->uvd.gpu_addr >> 3;
82 size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 4) >> 3;
83 WREG32(UVD_VCPU_CACHE_OFFSET0, addr);
84 WREG32(UVD_VCPU_CACHE_SIZE0, size);
85
86 addr += size;
87 size = RADEON_UVD_STACK_SIZE >> 3;
88 WREG32(UVD_VCPU_CACHE_OFFSET1, addr);
89 WREG32(UVD_VCPU_CACHE_SIZE1, size);
90
91 addr += size;
92 size = RADEON_UVD_HEAP_SIZE >> 3;
93 WREG32(UVD_VCPU_CACHE_OFFSET2, addr);
94 WREG32(UVD_VCPU_CACHE_SIZE2, size);
95
96 /* bits 28-31 */
97 addr = (rdev->uvd.gpu_addr >> 28) & 0xF;
98 WREG32(UVD_LMI_ADDR_EXT, (addr << 12) | (addr << 0));
99
100 /* bits 32-39 */
101 addr = (rdev->uvd.gpu_addr >> 32) & 0xFF;
102 WREG32(UVD_LMI_EXT40_ADDR, addr | (0x9 << 16) | (0x1 << 31));
103
104 /* tell firmware which hardware it is running on */
105 switch (rdev->family) {
106 default:
107 return -EINVAL;
108 case CHIP_RV710:
109 chip_id = 0x01000005;
110 break;
111 case CHIP_RV730:
112 chip_id = 0x01000006;
113 break;
114 case CHIP_RV740:
115 chip_id = 0x01000007;
116 break;
117 case CHIP_CYPRESS:
118 case CHIP_HEMLOCK:
119 chip_id = 0x01000008;
120 break;
121 case CHIP_JUNIPER:
122 chip_id = 0x01000009;
123 break;
124 case CHIP_REDWOOD:
125 chip_id = 0x0100000a;
126 break;
127 case CHIP_CEDAR:
128 chip_id = 0x0100000b;
129 break;
130 case CHIP_SUMO:
131 case CHIP_SUMO2:
132 chip_id = 0x0100000c;
133 break;
134 case CHIP_PALM:
135 chip_id = 0x0100000e;
136 break;
137 case CHIP_CAYMAN:
138 chip_id = 0x0100000f;
139 break;
140 case CHIP_BARTS:
141 chip_id = 0x01000010;
142 break;
143 case CHIP_TURKS:
144 chip_id = 0x01000011;
145 break;
146 case CHIP_CAICOS:
147 chip_id = 0x01000012;
148 break;
149 case CHIP_TAHITI:
150 chip_id = 0x01000014;
151 break;
152 case CHIP_VERDE:
153 chip_id = 0x01000015;
154 break;
155 case CHIP_PITCAIRN:
156 chip_id = 0x01000016;
157 break;
158 case CHIP_ARUBA:
159 chip_id = 0x01000017;
160 break;
161 }
162 WREG32(UVD_VCPU_CHIP_ID, chip_id);
163
164 return 0;
165}
diff --git a/drivers/gpu/drm/radeon/uvd_v3_1.c b/drivers/gpu/drm/radeon/uvd_v3_1.c
new file mode 100644
index 000000000000..5b6fa1f62d4e
--- /dev/null
+++ b/drivers/gpu/drm/radeon/uvd_v3_1.c
@@ -0,0 +1,55 @@
1/*
2 * Copyright 2013 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: Christian König <christian.koenig@amd.com>
23 */
24
25#include <drm/drmP.h>
26#include "radeon.h"
27#include "radeon_asic.h"
28#include "nid.h"
29
30/**
31 * uvd_v3_1_semaphore_emit - emit semaphore command
32 *
33 * @rdev: radeon_device pointer
34 * @ring: radeon_ring pointer
35 * @semaphore: semaphore to emit commands for
36 * @emit_wait: true if we should emit a wait command
37 *
38 * Emit a semaphore command (either wait or signal) to the UVD ring.
39 */
40void uvd_v3_1_semaphore_emit(struct radeon_device *rdev,
41 struct radeon_ring *ring,
42 struct radeon_semaphore *semaphore,
43 bool emit_wait)
44{
45 uint64_t addr = semaphore->gpu_addr;
46
47 radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_LOW, 0));
48 radeon_ring_write(ring, (addr >> 3) & 0x000FFFFF);
49
50 radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_HIGH, 0));
51 radeon_ring_write(ring, (addr >> 23) & 0x000FFFFF);
52
53 radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0));
54 radeon_ring_write(ring, 0x80 | (emit_wait ? 1 : 0));
55}
diff --git a/drivers/gpu/drm/radeon/uvd_v4_2.c b/drivers/gpu/drm/radeon/uvd_v4_2.c
new file mode 100644
index 000000000000..d04d5073eef2
--- /dev/null
+++ b/drivers/gpu/drm/radeon/uvd_v4_2.c
@@ -0,0 +1,68 @@
1/*
2 * Copyright 2013 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: Christian König <christian.koenig@amd.com>
23 */
24
25#include <linux/firmware.h>
26#include <drm/drmP.h>
27#include "radeon.h"
28#include "radeon_asic.h"
29#include "cikd.h"
30
31/**
32 * uvd_v4_2_resume - memory controller programming
33 *
34 * @rdev: radeon_device pointer
35 *
36 * Let the UVD memory controller know it's offsets
37 */
38int uvd_v4_2_resume(struct radeon_device *rdev)
39{
40 uint64_t addr;
41 uint32_t size;
42
43 /* programm the VCPU memory controller bits 0-27 */
44 addr = rdev->uvd.gpu_addr >> 3;
45 size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 4) >> 3;
46 WREG32(UVD_VCPU_CACHE_OFFSET0, addr);
47 WREG32(UVD_VCPU_CACHE_SIZE0, size);
48
49 addr += size;
50 size = RADEON_UVD_STACK_SIZE >> 3;
51 WREG32(UVD_VCPU_CACHE_OFFSET1, addr);
52 WREG32(UVD_VCPU_CACHE_SIZE1, size);
53
54 addr += size;
55 size = RADEON_UVD_HEAP_SIZE >> 3;
56 WREG32(UVD_VCPU_CACHE_OFFSET2, addr);
57 WREG32(UVD_VCPU_CACHE_SIZE2, size);
58
59 /* bits 28-31 */
60 addr = (rdev->uvd.gpu_addr >> 28) & 0xF;
61 WREG32(UVD_LMI_ADDR_EXT, (addr << 12) | (addr << 0));
62
63 /* bits 32-39 */
64 addr = (rdev->uvd.gpu_addr >> 32) & 0xFF;
65 WREG32(UVD_LMI_EXT40_ADDR, addr | (0x9 << 16) | (0x1 << 31));
66
67 return 0;
68}
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
index 3751730764a5..1a0bf07fe54b 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
@@ -29,7 +29,9 @@
29#include <drm/drmP.h> 29#include <drm/drmP.h>
30#include <drm/ttm/ttm_bo_driver.h> 30#include <drm/ttm/ttm_bo_driver.h>
31 31
32#define VMW_PPN_SIZE sizeof(unsigned long) 32#define VMW_PPN_SIZE (sizeof(unsigned long))
33/* A future safe maximum remap size. */
34#define VMW_PPN_PER_REMAP ((31 * 1024) / VMW_PPN_SIZE)
33 35
34static int vmw_gmr2_bind(struct vmw_private *dev_priv, 36static int vmw_gmr2_bind(struct vmw_private *dev_priv,
35 struct page *pages[], 37 struct page *pages[],
@@ -38,43 +40,61 @@ static int vmw_gmr2_bind(struct vmw_private *dev_priv,
38{ 40{
39 SVGAFifoCmdDefineGMR2 define_cmd; 41 SVGAFifoCmdDefineGMR2 define_cmd;
40 SVGAFifoCmdRemapGMR2 remap_cmd; 42 SVGAFifoCmdRemapGMR2 remap_cmd;
41 uint32_t define_size = sizeof(define_cmd) + 4;
42 uint32_t remap_size = VMW_PPN_SIZE * num_pages + sizeof(remap_cmd) + 4;
43 uint32_t *cmd; 43 uint32_t *cmd;
44 uint32_t *cmd_orig; 44 uint32_t *cmd_orig;
45 uint32_t define_size = sizeof(define_cmd) + sizeof(*cmd);
46 uint32_t remap_num = num_pages / VMW_PPN_PER_REMAP + ((num_pages % VMW_PPN_PER_REMAP) > 0);
47 uint32_t remap_size = VMW_PPN_SIZE * num_pages + (sizeof(remap_cmd) + sizeof(*cmd)) * remap_num;
48 uint32_t remap_pos = 0;
49 uint32_t cmd_size = define_size + remap_size;
45 uint32_t i; 50 uint32_t i;
46 51
47 cmd_orig = cmd = vmw_fifo_reserve(dev_priv, define_size + remap_size); 52 cmd_orig = cmd = vmw_fifo_reserve(dev_priv, cmd_size);
48 if (unlikely(cmd == NULL)) 53 if (unlikely(cmd == NULL))
49 return -ENOMEM; 54 return -ENOMEM;
50 55
51 define_cmd.gmrId = gmr_id; 56 define_cmd.gmrId = gmr_id;
52 define_cmd.numPages = num_pages; 57 define_cmd.numPages = num_pages;
53 58
59 *cmd++ = SVGA_CMD_DEFINE_GMR2;
60 memcpy(cmd, &define_cmd, sizeof(define_cmd));
61 cmd += sizeof(define_cmd) / sizeof(*cmd);
62
63 /*
64 * Need to split the command if there are too many
65 * pages that goes into the gmr.
66 */
67
54 remap_cmd.gmrId = gmr_id; 68 remap_cmd.gmrId = gmr_id;
55 remap_cmd.flags = (VMW_PPN_SIZE > sizeof(*cmd)) ? 69 remap_cmd.flags = (VMW_PPN_SIZE > sizeof(*cmd)) ?
56 SVGA_REMAP_GMR2_PPN64 : SVGA_REMAP_GMR2_PPN32; 70 SVGA_REMAP_GMR2_PPN64 : SVGA_REMAP_GMR2_PPN32;
57 remap_cmd.offsetPages = 0;
58 remap_cmd.numPages = num_pages;
59 71
60 *cmd++ = SVGA_CMD_DEFINE_GMR2; 72 while (num_pages > 0) {
61 memcpy(cmd, &define_cmd, sizeof(define_cmd)); 73 unsigned long nr = min(num_pages, (unsigned long)VMW_PPN_PER_REMAP);
62 cmd += sizeof(define_cmd) / sizeof(uint32); 74
75 remap_cmd.offsetPages = remap_pos;
76 remap_cmd.numPages = nr;
63 77
64 *cmd++ = SVGA_CMD_REMAP_GMR2; 78 *cmd++ = SVGA_CMD_REMAP_GMR2;
65 memcpy(cmd, &remap_cmd, sizeof(remap_cmd)); 79 memcpy(cmd, &remap_cmd, sizeof(remap_cmd));
66 cmd += sizeof(remap_cmd) / sizeof(uint32); 80 cmd += sizeof(remap_cmd) / sizeof(*cmd);
67 81
68 for (i = 0; i < num_pages; ++i) { 82 for (i = 0; i < nr; ++i) {
69 if (VMW_PPN_SIZE <= 4) 83 if (VMW_PPN_SIZE <= 4)
70 *cmd = page_to_pfn(*pages++); 84 *cmd = page_to_pfn(*pages++);
71 else 85 else
72 *((uint64_t *)cmd) = page_to_pfn(*pages++); 86 *((uint64_t *)cmd) = page_to_pfn(*pages++);
73 87
74 cmd += VMW_PPN_SIZE / sizeof(*cmd); 88 cmd += VMW_PPN_SIZE / sizeof(*cmd);
89 }
90
91 num_pages -= nr;
92 remap_pos += nr;
75 } 93 }
76 94
77 vmw_fifo_commit(dev_priv, define_size + remap_size); 95 BUG_ON(cmd != cmd_orig + cmd_size / sizeof(*cmd));
96
97 vmw_fifo_commit(dev_priv, cmd_size);
78 98
79 return 0; 99 return 0;
80} 100}
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c
index 5207591a598c..cd33084c7860 100644
--- a/drivers/hid/hid-logitech-dj.c
+++ b/drivers/hid/hid-logitech-dj.c
@@ -192,6 +192,7 @@ static struct hid_ll_driver logi_dj_ll_driver;
192static int logi_dj_output_hidraw_report(struct hid_device *hid, u8 * buf, 192static int logi_dj_output_hidraw_report(struct hid_device *hid, u8 * buf,
193 size_t count, 193 size_t count,
194 unsigned char report_type); 194 unsigned char report_type);
195static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
195 196
196static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev, 197static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev,
197 struct dj_report *dj_report) 198 struct dj_report *dj_report)
@@ -232,6 +233,7 @@ static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
232 if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] & 233 if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] &
233 SPFUNCTION_DEVICE_LIST_EMPTY) { 234 SPFUNCTION_DEVICE_LIST_EMPTY) {
234 dbg_hid("%s: device list is empty\n", __func__); 235 dbg_hid("%s: device list is empty\n", __func__);
236 djrcv_dev->querying_devices = false;
235 return; 237 return;
236 } 238 }
237 239
@@ -242,6 +244,12 @@ static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
242 return; 244 return;
243 } 245 }
244 246
247 if (djrcv_dev->paired_dj_devices[dj_report->device_index]) {
248 /* The device is already known. No need to reallocate it. */
249 dbg_hid("%s: device is already known\n", __func__);
250 return;
251 }
252
245 dj_hiddev = hid_allocate_device(); 253 dj_hiddev = hid_allocate_device();
246 if (IS_ERR(dj_hiddev)) { 254 if (IS_ERR(dj_hiddev)) {
247 dev_err(&djrcv_hdev->dev, "%s: hid_allocate_device failed\n", 255 dev_err(&djrcv_hdev->dev, "%s: hid_allocate_device failed\n",
@@ -305,6 +313,7 @@ static void delayedwork_callback(struct work_struct *work)
305 struct dj_report dj_report; 313 struct dj_report dj_report;
306 unsigned long flags; 314 unsigned long flags;
307 int count; 315 int count;
316 int retval;
308 317
309 dbg_hid("%s\n", __func__); 318 dbg_hid("%s\n", __func__);
310 319
@@ -337,6 +346,25 @@ static void delayedwork_callback(struct work_struct *work)
337 logi_dj_recv_destroy_djhid_device(djrcv_dev, &dj_report); 346 logi_dj_recv_destroy_djhid_device(djrcv_dev, &dj_report);
338 break; 347 break;
339 default: 348 default:
349 /* A normal report (i. e. not belonging to a pair/unpair notification)
350 * arriving here, means that the report arrived but we did not have a
351 * paired dj_device associated to the report's device_index, this
352 * means that the original "device paired" notification corresponding
353 * to this dj_device never arrived to this driver. The reason is that
354 * hid-core discards all packets coming from a device while probe() is
355 * executing. */
356 if (!djrcv_dev->paired_dj_devices[dj_report.device_index]) {
357 /* ok, we don't know the device, just re-ask the
358 * receiver for the list of connected devices. */
359 retval = logi_dj_recv_query_paired_devices(djrcv_dev);
360 if (!retval) {
361 /* everything went fine, so just leave */
362 break;
363 }
364 dev_err(&djrcv_dev->hdev->dev,
365 "%s:logi_dj_recv_query_paired_devices "
366 "error:%d\n", __func__, retval);
367 }
340 dbg_hid("%s: unexpected report type\n", __func__); 368 dbg_hid("%s: unexpected report type\n", __func__);
341 } 369 }
342} 370}
@@ -367,6 +395,12 @@ static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
367 if (!djdev) { 395 if (!djdev) {
368 dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]" 396 dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
369 " is NULL, index %d\n", dj_report->device_index); 397 " is NULL, index %d\n", dj_report->device_index);
398 kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
399
400 if (schedule_work(&djrcv_dev->work) == 0) {
401 dbg_hid("%s: did not schedule the work item, was already "
402 "queued\n", __func__);
403 }
370 return; 404 return;
371 } 405 }
372 406
@@ -397,6 +431,12 @@ static void logi_dj_recv_forward_report(struct dj_receiver_dev *djrcv_dev,
397 if (dj_device == NULL) { 431 if (dj_device == NULL) {
398 dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]" 432 dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
399 " is NULL, index %d\n", dj_report->device_index); 433 " is NULL, index %d\n", dj_report->device_index);
434 kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
435
436 if (schedule_work(&djrcv_dev->work) == 0) {
437 dbg_hid("%s: did not schedule the work item, was already "
438 "queued\n", __func__);
439 }
400 return; 440 return;
401 } 441 }
402 442
@@ -444,6 +484,10 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
444 struct dj_report *dj_report; 484 struct dj_report *dj_report;
445 int retval; 485 int retval;
446 486
487 /* no need to protect djrcv_dev->querying_devices */
488 if (djrcv_dev->querying_devices)
489 return 0;
490
447 dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL); 491 dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
448 if (!dj_report) 492 if (!dj_report)
449 return -ENOMEM; 493 return -ENOMEM;
@@ -455,6 +499,7 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
455 return retval; 499 return retval;
456} 500}
457 501
502
458static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev, 503static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
459 unsigned timeout) 504 unsigned timeout)
460{ 505{
diff --git a/drivers/hid/hid-logitech-dj.h b/drivers/hid/hid-logitech-dj.h
index fd28a5e0ca3b..4a4000340ce1 100644
--- a/drivers/hid/hid-logitech-dj.h
+++ b/drivers/hid/hid-logitech-dj.h
@@ -101,6 +101,7 @@ struct dj_receiver_dev {
101 struct work_struct work; 101 struct work_struct work;
102 struct kfifo notif_fifo; 102 struct kfifo notif_fifo;
103 spinlock_t lock; 103 spinlock_t lock;
104 bool querying_devices;
104}; 105};
105 106
106struct dj_device { 107struct dj_device {
diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c
index ecbc74923d06..87fbe2924cfa 100644
--- a/drivers/hid/hid-sony.c
+++ b/drivers/hid/hid-sony.c
@@ -369,7 +369,8 @@ static int sony_mapping(struct hid_device *hdev, struct hid_input *hi,
369 if (sc->quirks & PS3REMOTE) 369 if (sc->quirks & PS3REMOTE)
370 return ps3remote_mapping(hdev, hi, field, usage, bit, max); 370 return ps3remote_mapping(hdev, hi, field, usage, bit, max);
371 371
372 return -1; 372 /* Let hid-core decide for the others */
373 return 0;
373} 374}
374 375
375/* 376/*
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
index a7451632ceb4..6f1feb2c2e97 100644
--- a/drivers/hid/hidraw.c
+++ b/drivers/hid/hidraw.c
@@ -518,7 +518,6 @@ int hidraw_connect(struct hid_device *hid)
518 goto out; 518 goto out;
519 } 519 }
520 520
521 mutex_unlock(&minors_lock);
522 init_waitqueue_head(&dev->wait); 521 init_waitqueue_head(&dev->wait);
523 INIT_LIST_HEAD(&dev->list); 522 INIT_LIST_HEAD(&dev->list);
524 523
@@ -528,6 +527,7 @@ int hidraw_connect(struct hid_device *hid)
528 dev->exist = 1; 527 dev->exist = 1;
529 hid->hidraw = dev; 528 hid->hidraw = dev;
530 529
530 mutex_unlock(&minors_lock);
531out: 531out:
532 return result; 532 return result;
533 533
diff --git a/drivers/hwmon/adt7470.c b/drivers/hwmon/adt7470.c
index 0f34bca9f5e5..6099f50b28aa 100644
--- a/drivers/hwmon/adt7470.c
+++ b/drivers/hwmon/adt7470.c
@@ -215,7 +215,7 @@ static inline int adt7470_write_word_data(struct i2c_client *client, u8 reg,
215 u16 value) 215 u16 value)
216{ 216{
217 return i2c_smbus_write_byte_data(client, reg, value & 0xFF) 217 return i2c_smbus_write_byte_data(client, reg, value & 0xFF)
218 && i2c_smbus_write_byte_data(client, reg + 1, value >> 8); 218 || i2c_smbus_write_byte_data(client, reg + 1, value >> 8);
219} 219}
220 220
221static void adt7470_init_client(struct i2c_client *client) 221static void adt7470_init_client(struct i2c_client *client)
diff --git a/drivers/hwmon/max6697.c b/drivers/hwmon/max6697.c
index 328fb0353c17..a41b5f3fc506 100644
--- a/drivers/hwmon/max6697.c
+++ b/drivers/hwmon/max6697.c
@@ -605,12 +605,12 @@ static int max6697_init_chip(struct i2c_client *client)
605 if (ret < 0) 605 if (ret < 0)
606 return ret; 606 return ret;
607 ret = i2c_smbus_write_byte_data(client, MAX6581_REG_IDEALITY, 607 ret = i2c_smbus_write_byte_data(client, MAX6581_REG_IDEALITY,
608 pdata->ideality_mask >> 1); 608 pdata->ideality_value);
609 if (ret < 0) 609 if (ret < 0)
610 return ret; 610 return ret;
611 ret = i2c_smbus_write_byte_data(client, 611 ret = i2c_smbus_write_byte_data(client,
612 MAX6581_REG_IDEALITY_SELECT, 612 MAX6581_REG_IDEALITY_SELECT,
613 pdata->ideality_value); 613 pdata->ideality_mask >> 1);
614 if (ret < 0) 614 if (ret < 0)
615 return ret; 615 return ret;
616 } 616 }
diff --git a/drivers/i2c/busses/i2c-kempld.c b/drivers/i2c/busses/i2c-kempld.c
index ccec916bc3eb..af8f65fb1c05 100644
--- a/drivers/i2c/busses/i2c-kempld.c
+++ b/drivers/i2c/busses/i2c-kempld.c
@@ -246,9 +246,9 @@ static void kempld_i2c_device_init(struct kempld_i2c_data *i2c)
246 bus_frequency = KEMPLD_I2C_FREQ_MAX; 246 bus_frequency = KEMPLD_I2C_FREQ_MAX;
247 247
248 if (pld->info.spec_major == 1) 248 if (pld->info.spec_major == 1)
249 prescale = pld->pld_clock / bus_frequency * 5 - 1000; 249 prescale = pld->pld_clock / (bus_frequency * 5) - 1000;
250 else 250 else
251 prescale = pld->pld_clock / bus_frequency * 4 - 3000; 251 prescale = pld->pld_clock / (bus_frequency * 4) - 3000;
252 252
253 if (prescale < 0) 253 if (prescale < 0)
254 prescale = 0; 254 prescale = 0;
diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c
index df8ff5aea5b5..e2e9a0dade96 100644
--- a/drivers/i2c/busses/i2c-mxs.c
+++ b/drivers/i2c/busses/i2c-mxs.c
@@ -493,7 +493,7 @@ static int mxs_i2c_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg,
493 * based on this empirical measurement and a lot of previous frobbing. 493 * based on this empirical measurement and a lot of previous frobbing.
494 */ 494 */
495 i2c->cmd_err = 0; 495 i2c->cmd_err = 0;
496 if (msg->len < 8) { 496 if (0) { /* disable PIO mode until a proper fix is made */
497 ret = mxs_i2c_pio_setup_xfer(adap, msg, flags); 497 ret = mxs_i2c_pio_setup_xfer(adap, msg, flags);
498 if (ret) 498 if (ret)
499 mxs_i2c_reset(i2c); 499 mxs_i2c_reset(i2c);
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index 0ad208a69c29..3ceac3e91dde 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -60,7 +60,6 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
60{ 60{
61 unsigned int stepconfig; 61 unsigned int stepconfig;
62 int i, steps; 62 int i, steps;
63 u32 step_en;
64 63
65 /* 64 /*
66 * There are 16 configurable steps and 8 analog input 65 * There are 16 configurable steps and 8 analog input
@@ -86,8 +85,7 @@ static void tiadc_step_config(struct tiadc_device *adc_dev)
86 adc_dev->channel_step[i] = steps; 85 adc_dev->channel_step[i] = steps;
87 steps++; 86 steps++;
88 } 87 }
89 step_en = get_adc_step_mask(adc_dev); 88
90 am335x_tsc_se_set(adc_dev->mfd_tscadc, step_en);
91} 89}
92 90
93static const char * const chan_name_ain[] = { 91static const char * const chan_name_ain[] = {
@@ -142,10 +140,22 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
142 int *val, int *val2, long mask) 140 int *val, int *val2, long mask)
143{ 141{
144 struct tiadc_device *adc_dev = iio_priv(indio_dev); 142 struct tiadc_device *adc_dev = iio_priv(indio_dev);
145 int i; 143 int i, map_val;
146 unsigned int fifo1count, read; 144 unsigned int fifo1count, read, stepid;
147 u32 step = UINT_MAX; 145 u32 step = UINT_MAX;
148 bool found = false; 146 bool found = false;
147 u32 step_en;
148 unsigned long timeout = jiffies + usecs_to_jiffies
149 (IDLE_TIMEOUT * adc_dev->channels);
150 step_en = get_adc_step_mask(adc_dev);
151 am335x_tsc_se_set(adc_dev->mfd_tscadc, step_en);
152
153 /* Wait for ADC sequencer to complete sampling */
154 while (tiadc_readl(adc_dev, REG_ADCFSM) & SEQ_STATUS) {
155 if (time_after(jiffies, timeout))
156 return -EAGAIN;
157 }
158 map_val = chan->channel + TOTAL_CHANNELS;
149 159
150 /* 160 /*
151 * When the sub-system is first enabled, 161 * When the sub-system is first enabled,
@@ -170,12 +180,16 @@ static int tiadc_read_raw(struct iio_dev *indio_dev,
170 fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT); 180 fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
171 for (i = 0; i < fifo1count; i++) { 181 for (i = 0; i < fifo1count; i++) {
172 read = tiadc_readl(adc_dev, REG_FIFO1); 182 read = tiadc_readl(adc_dev, REG_FIFO1);
173 if (read >> 16 == step) { 183 stepid = read & FIFOREAD_CHNLID_MASK;
174 *val = read & 0xfff; 184 stepid = stepid >> 0x10;
185
186 if (stepid == map_val) {
187 read = read & FIFOREAD_DATA_MASK;
175 found = true; 188 found = true;
189 *val = read;
176 } 190 }
177 } 191 }
178 am335x_tsc_se_update(adc_dev->mfd_tscadc); 192
179 if (found == false) 193 if (found == false)
180 return -EBUSY; 194 return -EBUSY;
181 return IIO_VAL_INT; 195 return IIO_VAL_INT;
diff --git a/drivers/iio/industrialio-trigger.c b/drivers/iio/industrialio-trigger.c
index ea8a4146620d..0dd9bb873130 100644
--- a/drivers/iio/industrialio-trigger.c
+++ b/drivers/iio/industrialio-trigger.c
@@ -127,12 +127,17 @@ static struct iio_trigger *iio_trigger_find_by_name(const char *name,
127void iio_trigger_poll(struct iio_trigger *trig, s64 time) 127void iio_trigger_poll(struct iio_trigger *trig, s64 time)
128{ 128{
129 int i; 129 int i;
130 if (!trig->use_count) 130
131 for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) 131 if (!atomic_read(&trig->use_count)) {
132 if (trig->subirqs[i].enabled) { 132 atomic_set(&trig->use_count, CONFIG_IIO_CONSUMERS_PER_TRIGGER);
133 trig->use_count++; 133
134 for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) {
135 if (trig->subirqs[i].enabled)
134 generic_handle_irq(trig->subirq_base + i); 136 generic_handle_irq(trig->subirq_base + i);
135 } 137 else
138 iio_trigger_notify_done(trig);
139 }
140 }
136} 141}
137EXPORT_SYMBOL(iio_trigger_poll); 142EXPORT_SYMBOL(iio_trigger_poll);
138 143
@@ -146,19 +151,24 @@ EXPORT_SYMBOL(iio_trigger_generic_data_rdy_poll);
146void iio_trigger_poll_chained(struct iio_trigger *trig, s64 time) 151void iio_trigger_poll_chained(struct iio_trigger *trig, s64 time)
147{ 152{
148 int i; 153 int i;
149 if (!trig->use_count) 154
150 for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) 155 if (!atomic_read(&trig->use_count)) {
151 if (trig->subirqs[i].enabled) { 156 atomic_set(&trig->use_count, CONFIG_IIO_CONSUMERS_PER_TRIGGER);
152 trig->use_count++; 157
158 for (i = 0; i < CONFIG_IIO_CONSUMERS_PER_TRIGGER; i++) {
159 if (trig->subirqs[i].enabled)
153 handle_nested_irq(trig->subirq_base + i); 160 handle_nested_irq(trig->subirq_base + i);
154 } 161 else
162 iio_trigger_notify_done(trig);
163 }
164 }
155} 165}
156EXPORT_SYMBOL(iio_trigger_poll_chained); 166EXPORT_SYMBOL(iio_trigger_poll_chained);
157 167
158void iio_trigger_notify_done(struct iio_trigger *trig) 168void iio_trigger_notify_done(struct iio_trigger *trig)
159{ 169{
160 trig->use_count--; 170 if (atomic_dec_and_test(&trig->use_count) && trig->ops &&
161 if (trig->use_count == 0 && trig->ops && trig->ops->try_reenable) 171 trig->ops->try_reenable)
162 if (trig->ops->try_reenable(trig)) 172 if (trig->ops->try_reenable(trig))
163 /* Missed an interrupt so launch new poll now */ 173 /* Missed an interrupt so launch new poll now */
164 iio_trigger_poll(trig, 0); 174 iio_trigger_poll(trig, 0);
diff --git a/drivers/iio/light/adjd_s311.c b/drivers/iio/light/adjd_s311.c
index 5f4749e60b04..c1cd5698b8ae 100644
--- a/drivers/iio/light/adjd_s311.c
+++ b/drivers/iio/light/adjd_s311.c
@@ -232,7 +232,8 @@ static int adjd_s311_read_raw(struct iio_dev *indio_dev,
232 232
233 switch (mask) { 233 switch (mask) {
234 case IIO_CHAN_INFO_RAW: 234 case IIO_CHAN_INFO_RAW:
235 ret = adjd_s311_read_data(indio_dev, chan->address, val); 235 ret = adjd_s311_read_data(indio_dev,
236 ADJD_S311_DATA_REG(chan->address), val);
236 if (ret < 0) 237 if (ret < 0)
237 return ret; 238 return ret;
238 return IIO_VAL_INT; 239 return IIO_VAL_INT;
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index f1c279fabe64..7c0f9535fb7d 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -423,7 +423,7 @@ static int cma_resolve_ib_dev(struct rdma_id_private *id_priv)
423 struct sockaddr_ib *addr; 423 struct sockaddr_ib *addr;
424 union ib_gid gid, sgid, *dgid; 424 union ib_gid gid, sgid, *dgid;
425 u16 pkey, index; 425 u16 pkey, index;
426 u8 port, p; 426 u8 p;
427 int i; 427 int i;
428 428
429 cma_dev = NULL; 429 cma_dev = NULL;
@@ -443,7 +443,7 @@ static int cma_resolve_ib_dev(struct rdma_id_private *id_priv)
443 if (!memcmp(&gid, dgid, sizeof(gid))) { 443 if (!memcmp(&gid, dgid, sizeof(gid))) {
444 cma_dev = cur_dev; 444 cma_dev = cur_dev;
445 sgid = gid; 445 sgid = gid;
446 port = p; 446 id_priv->id.port_num = p;
447 goto found; 447 goto found;
448 } 448 }
449 449
@@ -451,7 +451,7 @@ static int cma_resolve_ib_dev(struct rdma_id_private *id_priv)
451 dgid->global.subnet_prefix)) { 451 dgid->global.subnet_prefix)) {
452 cma_dev = cur_dev; 452 cma_dev = cur_dev;
453 sgid = gid; 453 sgid = gid;
454 port = p; 454 id_priv->id.port_num = p;
455 } 455 }
456 } 456 }
457 } 457 }
@@ -462,7 +462,6 @@ static int cma_resolve_ib_dev(struct rdma_id_private *id_priv)
462 462
463found: 463found:
464 cma_attach_to_dev(id_priv, cma_dev); 464 cma_attach_to_dev(id_priv, cma_dev);
465 id_priv->id.port_num = port;
466 addr = (struct sockaddr_ib *) cma_src_addr(id_priv); 465 addr = (struct sockaddr_ib *) cma_src_addr(id_priv);
467 memcpy(&addr->sib_addr, &sgid, sizeof sgid); 466 memcpy(&addr->sib_addr, &sgid, sizeof sgid);
468 cma_translate_ib(addr, &id_priv->id.route.addr.dev_addr); 467 cma_translate_ib(addr, &id_priv->id.route.addr.dev_addr);
@@ -880,7 +879,8 @@ static int cma_save_net_info(struct rdma_cm_id *id, struct rdma_cm_id *listen_id
880{ 879{
881 struct cma_hdr *hdr; 880 struct cma_hdr *hdr;
882 881
883 if (listen_id->route.addr.src_addr.ss_family == AF_IB) { 882 if ((listen_id->route.addr.src_addr.ss_family == AF_IB) &&
883 (ib_event->event == IB_CM_REQ_RECEIVED)) {
884 cma_save_ib_info(id, listen_id, ib_event->param.req_rcvd.primary_path); 884 cma_save_ib_info(id, listen_id, ib_event->param.req_rcvd.primary_path);
885 return 0; 885 return 0;
886 } 886 }
@@ -2677,29 +2677,32 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
2677{ 2677{
2678 struct ib_cm_sidr_req_param req; 2678 struct ib_cm_sidr_req_param req;
2679 struct ib_cm_id *id; 2679 struct ib_cm_id *id;
2680 void *private_data;
2680 int offset, ret; 2681 int offset, ret;
2681 2682
2683 memset(&req, 0, sizeof req);
2682 offset = cma_user_data_offset(id_priv); 2684 offset = cma_user_data_offset(id_priv);
2683 req.private_data_len = offset + conn_param->private_data_len; 2685 req.private_data_len = offset + conn_param->private_data_len;
2684 if (req.private_data_len < conn_param->private_data_len) 2686 if (req.private_data_len < conn_param->private_data_len)
2685 return -EINVAL; 2687 return -EINVAL;
2686 2688
2687 if (req.private_data_len) { 2689 if (req.private_data_len) {
2688 req.private_data = kzalloc(req.private_data_len, GFP_ATOMIC); 2690 private_data = kzalloc(req.private_data_len, GFP_ATOMIC);
2689 if (!req.private_data) 2691 if (!private_data)
2690 return -ENOMEM; 2692 return -ENOMEM;
2691 } else { 2693 } else {
2692 req.private_data = NULL; 2694 private_data = NULL;
2693 } 2695 }
2694 2696
2695 if (conn_param->private_data && conn_param->private_data_len) 2697 if (conn_param->private_data && conn_param->private_data_len)
2696 memcpy((void *) req.private_data + offset, 2698 memcpy(private_data + offset, conn_param->private_data,
2697 conn_param->private_data, conn_param->private_data_len); 2699 conn_param->private_data_len);
2698 2700
2699 if (req.private_data) { 2701 if (private_data) {
2700 ret = cma_format_hdr((void *) req.private_data, id_priv); 2702 ret = cma_format_hdr(private_data, id_priv);
2701 if (ret) 2703 if (ret)
2702 goto out; 2704 goto out;
2705 req.private_data = private_data;
2703 } 2706 }
2704 2707
2705 id = ib_create_cm_id(id_priv->id.device, cma_sidr_rep_handler, 2708 id = ib_create_cm_id(id_priv->id.device, cma_sidr_rep_handler,
@@ -2721,7 +2724,7 @@ static int cma_resolve_ib_udp(struct rdma_id_private *id_priv,
2721 id_priv->cm_id.ib = NULL; 2724 id_priv->cm_id.ib = NULL;
2722 } 2725 }
2723out: 2726out:
2724 kfree(req.private_data); 2727 kfree(private_data);
2725 return ret; 2728 return ret;
2726} 2729}
2727 2730
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c
index dc3fd1e8af07..4c837e66516b 100644
--- a/drivers/infiniband/core/mad.c
+++ b/drivers/infiniband/core/mad.c
@@ -2663,6 +2663,7 @@ static int ib_mad_port_start(struct ib_mad_port_private *port_priv)
2663 int ret, i; 2663 int ret, i;
2664 struct ib_qp_attr *attr; 2664 struct ib_qp_attr *attr;
2665 struct ib_qp *qp; 2665 struct ib_qp *qp;
2666 u16 pkey_index;
2666 2667
2667 attr = kmalloc(sizeof *attr, GFP_KERNEL); 2668 attr = kmalloc(sizeof *attr, GFP_KERNEL);
2668 if (!attr) { 2669 if (!attr) {
@@ -2670,6 +2671,11 @@ static int ib_mad_port_start(struct ib_mad_port_private *port_priv)
2670 return -ENOMEM; 2671 return -ENOMEM;
2671 } 2672 }
2672 2673
2674 ret = ib_find_pkey(port_priv->device, port_priv->port_num,
2675 IB_DEFAULT_PKEY_FULL, &pkey_index);
2676 if (ret)
2677 pkey_index = 0;
2678
2673 for (i = 0; i < IB_MAD_QPS_CORE; i++) { 2679 for (i = 0; i < IB_MAD_QPS_CORE; i++) {
2674 qp = port_priv->qp_info[i].qp; 2680 qp = port_priv->qp_info[i].qp;
2675 if (!qp) 2681 if (!qp)
@@ -2680,7 +2686,7 @@ static int ib_mad_port_start(struct ib_mad_port_private *port_priv)
2680 * one is needed for the Reset to Init transition 2686 * one is needed for the Reset to Init transition
2681 */ 2687 */
2682 attr->qp_state = IB_QPS_INIT; 2688 attr->qp_state = IB_QPS_INIT;
2683 attr->pkey_index = 0; 2689 attr->pkey_index = pkey_index;
2684 attr->qkey = (qp->qp_num == 0) ? 0 : IB_QP1_QKEY; 2690 attr->qkey = (qp->qp_num == 0) ? 0 : IB_QP1_QKEY;
2685 ret = ib_modify_qp(qp, attr, IB_QP_STATE | 2691 ret = ib_modify_qp(qp, attr, IB_QP_STATE |
2686 IB_QP_PKEY_INDEX | IB_QP_QKEY); 2692 IB_QP_PKEY_INDEX | IB_QP_QKEY);
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
index e87f2201b220..d2283837d451 100644
--- a/drivers/infiniband/hw/cxgb3/iwch_provider.c
+++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c
@@ -226,6 +226,7 @@ static struct ib_cq *iwch_create_cq(struct ib_device *ibdev, int entries, int ve
226 mm->len = PAGE_ALIGN(((1UL << uresp.size_log2) + 1) * 226 mm->len = PAGE_ALIGN(((1UL << uresp.size_log2) + 1) *
227 sizeof(struct t3_cqe)); 227 sizeof(struct t3_cqe));
228 uresp.memsize = mm->len; 228 uresp.memsize = mm->len;
229 uresp.reserved = 0;
229 resplen = sizeof uresp; 230 resplen = sizeof uresp;
230 } 231 }
231 if (ib_copy_to_udata(udata, &uresp, resplen)) { 232 if (ib_copy_to_udata(udata, &uresp, resplen)) {
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c
index 232040447e8a..a4975e1654a6 100644
--- a/drivers/infiniband/hw/cxgb4/qp.c
+++ b/drivers/infiniband/hw/cxgb4/qp.c
@@ -1657,6 +1657,8 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd, struct ib_qp_init_attr *attrs,
1657 if (mm5) { 1657 if (mm5) {
1658 uresp.ma_sync_key = ucontext->key; 1658 uresp.ma_sync_key = ucontext->key;
1659 ucontext->key += PAGE_SIZE; 1659 ucontext->key += PAGE_SIZE;
1660 } else {
1661 uresp.ma_sync_key = 0;
1660 } 1662 }
1661 uresp.sq_key = ucontext->key; 1663 uresp.sq_key = ucontext->key;
1662 ucontext->key += PAGE_SIZE; 1664 ucontext->key += PAGE_SIZE;
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c
index 4d599cedbb0b..f2a3f48107e7 100644
--- a/drivers/infiniband/hw/mlx4/mad.c
+++ b/drivers/infiniband/hw/mlx4/mad.c
@@ -1511,8 +1511,14 @@ static int create_pv_sqp(struct mlx4_ib_demux_pv_ctx *ctx,
1511 1511
1512 memset(&attr, 0, sizeof attr); 1512 memset(&attr, 0, sizeof attr);
1513 attr.qp_state = IB_QPS_INIT; 1513 attr.qp_state = IB_QPS_INIT;
1514 attr.pkey_index = 1514 ret = 0;
1515 to_mdev(ctx->ib_dev)->pkeys.virt2phys_pkey[ctx->slave][ctx->port - 1][0]; 1515 if (create_tun)
1516 ret = find_slave_port_pkey_ix(to_mdev(ctx->ib_dev), ctx->slave,
1517 ctx->port, IB_DEFAULT_PKEY_FULL,
1518 &attr.pkey_index);
1519 if (ret || !create_tun)
1520 attr.pkey_index =
1521 to_mdev(ctx->ib_dev)->pkeys.virt2phys_pkey[ctx->slave][ctx->port - 1][0];
1516 attr.qkey = IB_QP1_QKEY; 1522 attr.qkey = IB_QP1_QKEY;
1517 attr.port_num = ctx->port; 1523 attr.port_num = ctx->port;
1518 ret = ib_modify_qp(tun_qp->qp, &attr, qp_attr_mask_INIT); 1524 ret = ib_modify_qp(tun_qp->qp, &attr, qp_attr_mask_INIT);
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 8000fff4d444..3f831de9a4d8 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -619,7 +619,8 @@ static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev,
619 619
620 resp.tot_uuars = req.total_num_uuars; 620 resp.tot_uuars = req.total_num_uuars;
621 resp.num_ports = dev->mdev.caps.num_ports; 621 resp.num_ports = dev->mdev.caps.num_ports;
622 err = ib_copy_to_udata(udata, &resp, sizeof(resp)); 622 err = ib_copy_to_udata(udata, &resp,
623 sizeof(resp) - sizeof(resp.reserved));
623 if (err) 624 if (err)
624 goto out_uars; 625 goto out_uars;
625 626
@@ -1426,7 +1427,8 @@ static int init_one(struct pci_dev *pdev,
1426 if (err) 1427 if (err)
1427 goto err_eqs; 1428 goto err_eqs;
1428 1429
1429 if (ib_register_device(&dev->ib_dev, NULL)) 1430 err = ib_register_device(&dev->ib_dev, NULL);
1431 if (err)
1430 goto err_rsrc; 1432 goto err_rsrc;
1431 1433
1432 err = create_umr_res(dev); 1434 err = create_umr_res(dev);
@@ -1434,8 +1436,9 @@ static int init_one(struct pci_dev *pdev,
1434 goto err_dev; 1436 goto err_dev;
1435 1437
1436 for (i = 0; i < ARRAY_SIZE(mlx5_class_attributes); i++) { 1438 for (i = 0; i < ARRAY_SIZE(mlx5_class_attributes); i++) {
1437 if (device_create_file(&dev->ib_dev.dev, 1439 err = device_create_file(&dev->ib_dev.dev,
1438 mlx5_class_attributes[i])) 1440 mlx5_class_attributes[i]);
1441 if (err)
1439 goto err_umrc; 1442 goto err_umrc;
1440 } 1443 }
1441 1444
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index 16ac54c9819f..045f8cdbd303 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -199,7 +199,7 @@ static int set_rq_size(struct mlx5_ib_dev *dev, struct ib_qp_cap *cap,
199 199
200static int sq_overhead(enum ib_qp_type qp_type) 200static int sq_overhead(enum ib_qp_type qp_type)
201{ 201{
202 int size; 202 int size = 0;
203 203
204 switch (qp_type) { 204 switch (qp_type) {
205 case IB_QPT_XRC_INI: 205 case IB_QPT_XRC_INI:
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c
index 418004c93feb..90200245c5eb 100644
--- a/drivers/infiniband/hw/nes/nes_hw.c
+++ b/drivers/infiniband/hw/nes/nes_hw.c
@@ -3570,10 +3570,10 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev,
3570 tcp_state = (aeq_info & NES_AEQE_TCP_STATE_MASK) >> NES_AEQE_TCP_STATE_SHIFT; 3570 tcp_state = (aeq_info & NES_AEQE_TCP_STATE_MASK) >> NES_AEQE_TCP_STATE_SHIFT;
3571 iwarp_state = (aeq_info & NES_AEQE_IWARP_STATE_MASK) >> NES_AEQE_IWARP_STATE_SHIFT; 3571 iwarp_state = (aeq_info & NES_AEQE_IWARP_STATE_MASK) >> NES_AEQE_IWARP_STATE_SHIFT;
3572 nes_debug(NES_DBG_AEQ, "aeid = 0x%04X, qp-cq id = %d, aeqe = %p," 3572 nes_debug(NES_DBG_AEQ, "aeid = 0x%04X, qp-cq id = %d, aeqe = %p,"
3573 " Tcp state = %d, iWARP state = %d\n", 3573 " Tcp state = %s, iWARP state = %s\n",
3574 async_event_id, 3574 async_event_id,
3575 le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]), aeqe, 3575 le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]), aeqe,
3576 tcp_state, iwarp_state); 3576 nes_tcp_state_str[tcp_state], nes_iwarp_state_str[iwarp_state]);
3577 3577
3578 aeqe_cq_id = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]); 3578 aeqe_cq_id = le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX]);
3579 if (aeq_info & NES_AEQE_QP) { 3579 if (aeq_info & NES_AEQE_QP) {
diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c
index 8f67fe2e91e6..5b53ca5a2284 100644
--- a/drivers/infiniband/hw/nes/nes_verbs.c
+++ b/drivers/infiniband/hw/nes/nes_verbs.c
@@ -1384,6 +1384,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
1384 1384
1385 if (ibpd->uobject) { 1385 if (ibpd->uobject) {
1386 uresp.mmap_sq_db_index = nesqp->mmap_sq_db_index; 1386 uresp.mmap_sq_db_index = nesqp->mmap_sq_db_index;
1387 uresp.mmap_rq_db_index = 0;
1387 uresp.actual_sq_size = sq_size; 1388 uresp.actual_sq_size = sq_size;
1388 uresp.actual_rq_size = rq_size; 1389 uresp.actual_rq_size = rq_size;
1389 uresp.qp_id = nesqp->hwqp.qp_id; 1390 uresp.qp_id = nesqp->hwqp.qp_id;
@@ -1767,7 +1768,7 @@ static struct ib_cq *nes_create_cq(struct ib_device *ibdev, int entries,
1767 resp.cq_id = nescq->hw_cq.cq_number; 1768 resp.cq_id = nescq->hw_cq.cq_number;
1768 resp.cq_size = nescq->hw_cq.cq_size; 1769 resp.cq_size = nescq->hw_cq.cq_size;
1769 resp.mmap_db_index = 0; 1770 resp.mmap_db_index = 0;
1770 if (ib_copy_to_udata(udata, &resp, sizeof resp)) { 1771 if (ib_copy_to_udata(udata, &resp, sizeof resp - sizeof resp.reserved)) {
1771 nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num); 1772 nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1772 kfree(nescq); 1773 kfree(nescq);
1773 return ERR_PTR(-EFAULT); 1774 return ERR_PTR(-EFAULT);
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_ah.c b/drivers/infiniband/hw/ocrdma/ocrdma_ah.c
index a877a8ed7907..f4c587c68f64 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_ah.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_ah.c
@@ -29,7 +29,6 @@
29#include <net/netevent.h> 29#include <net/netevent.h>
30 30
31#include <rdma/ib_addr.h> 31#include <rdma/ib_addr.h>
32#include <rdma/ib_cache.h>
33 32
34#include "ocrdma.h" 33#include "ocrdma.h"
35#include "ocrdma_verbs.h" 34#include "ocrdma_verbs.h"
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
index dcfbab177faa..f36630e4b6be 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
@@ -242,6 +242,7 @@ struct ib_ucontext *ocrdma_alloc_ucontext(struct ib_device *ibdev,
242 memset(ctx->ah_tbl.va, 0, map_len); 242 memset(ctx->ah_tbl.va, 0, map_len);
243 ctx->ah_tbl.len = map_len; 243 ctx->ah_tbl.len = map_len;
244 244
245 memset(&resp, 0, sizeof(resp));
245 resp.ah_tbl_len = ctx->ah_tbl.len; 246 resp.ah_tbl_len = ctx->ah_tbl.len;
246 resp.ah_tbl_page = ctx->ah_tbl.pa; 247 resp.ah_tbl_page = ctx->ah_tbl.pa;
247 248
@@ -253,7 +254,6 @@ struct ib_ucontext *ocrdma_alloc_ucontext(struct ib_device *ibdev,
253 resp.wqe_size = dev->attr.wqe_size; 254 resp.wqe_size = dev->attr.wqe_size;
254 resp.rqe_size = dev->attr.rqe_size; 255 resp.rqe_size = dev->attr.rqe_size;
255 resp.dpp_wqe_size = dev->attr.wqe_size; 256 resp.dpp_wqe_size = dev->attr.wqe_size;
256 resp.rsvd = 0;
257 257
258 memcpy(resp.fw_ver, dev->attr.fw_ver, sizeof(resp.fw_ver)); 258 memcpy(resp.fw_ver, dev->attr.fw_ver, sizeof(resp.fw_ver));
259 status = ib_copy_to_udata(udata, &resp, sizeof(resp)); 259 status = ib_copy_to_udata(udata, &resp, sizeof(resp));
@@ -338,6 +338,7 @@ static int ocrdma_copy_pd_uresp(struct ocrdma_pd *pd,
338 struct ocrdma_alloc_pd_uresp rsp; 338 struct ocrdma_alloc_pd_uresp rsp;
339 struct ocrdma_ucontext *uctx = get_ocrdma_ucontext(ib_ctx); 339 struct ocrdma_ucontext *uctx = get_ocrdma_ucontext(ib_ctx);
340 340
341 memset(&rsp, 0, sizeof(rsp));
341 rsp.id = pd->id; 342 rsp.id = pd->id;
342 rsp.dpp_enabled = pd->dpp_enabled; 343 rsp.dpp_enabled = pd->dpp_enabled;
343 db_page_addr = pd->dev->nic_info.unmapped_db + 344 db_page_addr = pd->dev->nic_info.unmapped_db +
@@ -692,6 +693,7 @@ static int ocrdma_copy_cq_uresp(struct ocrdma_cq *cq, struct ib_udata *udata,
692 struct ocrdma_ucontext *uctx; 693 struct ocrdma_ucontext *uctx;
693 struct ocrdma_create_cq_uresp uresp; 694 struct ocrdma_create_cq_uresp uresp;
694 695
696 memset(&uresp, 0, sizeof(uresp));
695 uresp.cq_id = cq->id; 697 uresp.cq_id = cq->id;
696 uresp.page_size = cq->len; 698 uresp.page_size = cq->len;
697 uresp.num_pages = 1; 699 uresp.num_pages = 1;
@@ -1460,6 +1462,7 @@ static int ocrdma_copy_srq_uresp(struct ocrdma_srq *srq, struct ib_udata *udata)
1460 int status; 1462 int status;
1461 struct ocrdma_create_srq_uresp uresp; 1463 struct ocrdma_create_srq_uresp uresp;
1462 1464
1465 memset(&uresp, 0, sizeof(uresp));
1463 uresp.rq_dbid = srq->rq.dbid; 1466 uresp.rq_dbid = srq->rq.dbid;
1464 uresp.num_rq_pages = 1; 1467 uresp.num_rq_pages = 1;
1465 uresp.rq_page_addr[0] = srq->rq.pa; 1468 uresp.rq_page_addr[0] = srq->rq.pa;
diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c
index 21e8b09d4bf8..016e7429adf6 100644
--- a/drivers/infiniband/hw/qib/qib_iba7322.c
+++ b/drivers/infiniband/hw/qib/qib_iba7322.c
@@ -1596,6 +1596,8 @@ static void sdma_7322_p_errors(struct qib_pportdata *ppd, u64 errs)
1596 struct qib_devdata *dd = ppd->dd; 1596 struct qib_devdata *dd = ppd->dd;
1597 1597
1598 errs &= QIB_E_P_SDMAERRS; 1598 errs &= QIB_E_P_SDMAERRS;
1599 err_decode(ppd->cpspec->sdmamsgbuf, sizeof(ppd->cpspec->sdmamsgbuf),
1600 errs, qib_7322p_error_msgs);
1599 1601
1600 if (errs & QIB_E_P_SDMAUNEXPDATA) 1602 if (errs & QIB_E_P_SDMAUNEXPDATA)
1601 qib_dev_err(dd, "IB%u:%u SDmaUnexpData\n", dd->unit, 1603 qib_dev_err(dd, "IB%u:%u SDmaUnexpData\n", dd->unit,
diff --git a/drivers/infiniband/hw/qib/qib_sdma.c b/drivers/infiniband/hw/qib/qib_sdma.c
index 32162d355370..9b5322d8cd5a 100644
--- a/drivers/infiniband/hw/qib/qib_sdma.c
+++ b/drivers/infiniband/hw/qib/qib_sdma.c
@@ -717,7 +717,7 @@ void dump_sdma_state(struct qib_pportdata *ppd)
717 struct qib_sdma_txreq *txp, *txpnext; 717 struct qib_sdma_txreq *txp, *txpnext;
718 __le64 *descqp; 718 __le64 *descqp;
719 u64 desc[2]; 719 u64 desc[2];
720 dma_addr_t addr; 720 u64 addr;
721 u16 gen, dwlen, dwoffset; 721 u16 gen, dwlen, dwoffset;
722 u16 head, tail, cnt; 722 u16 head, tail, cnt;
723 723
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index 2cfa76f5d99e..196b1d13cbcb 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -932,12 +932,47 @@ int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port)
932 return 0; 932 return 0;
933} 933}
934 934
935/*
936 * Takes whatever value which is in pkey index 0 and updates priv->pkey
937 * returns 0 if the pkey value was changed.
938 */
939static inline int update_parent_pkey(struct ipoib_dev_priv *priv)
940{
941 int result;
942 u16 prev_pkey;
943
944 prev_pkey = priv->pkey;
945 result = ib_query_pkey(priv->ca, priv->port, 0, &priv->pkey);
946 if (result) {
947 ipoib_warn(priv, "ib_query_pkey port %d failed (ret = %d)\n",
948 priv->port, result);
949 return result;
950 }
951
952 priv->pkey |= 0x8000;
953
954 if (prev_pkey != priv->pkey) {
955 ipoib_dbg(priv, "pkey changed from 0x%x to 0x%x\n",
956 prev_pkey, priv->pkey);
957 /*
958 * Update the pkey in the broadcast address, while making sure to set
959 * the full membership bit, so that we join the right broadcast group.
960 */
961 priv->dev->broadcast[8] = priv->pkey >> 8;
962 priv->dev->broadcast[9] = priv->pkey & 0xff;
963 return 0;
964 }
965
966 return 1;
967}
968
935static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv, 969static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv,
936 enum ipoib_flush_level level) 970 enum ipoib_flush_level level)
937{ 971{
938 struct ipoib_dev_priv *cpriv; 972 struct ipoib_dev_priv *cpriv;
939 struct net_device *dev = priv->dev; 973 struct net_device *dev = priv->dev;
940 u16 new_index; 974 u16 new_index;
975 int result;
941 976
942 mutex_lock(&priv->vlan_mutex); 977 mutex_lock(&priv->vlan_mutex);
943 978
@@ -951,6 +986,10 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv,
951 mutex_unlock(&priv->vlan_mutex); 986 mutex_unlock(&priv->vlan_mutex);
952 987
953 if (!test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) { 988 if (!test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) {
989 /* for non-child devices must check/update the pkey value here */
990 if (level == IPOIB_FLUSH_HEAVY &&
991 !test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags))
992 update_parent_pkey(priv);
954 ipoib_dbg(priv, "Not flushing - IPOIB_FLAG_INITIALIZED not set.\n"); 993 ipoib_dbg(priv, "Not flushing - IPOIB_FLAG_INITIALIZED not set.\n");
955 return; 994 return;
956 } 995 }
@@ -961,21 +1000,32 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv,
961 } 1000 }
962 1001
963 if (level == IPOIB_FLUSH_HEAVY) { 1002 if (level == IPOIB_FLUSH_HEAVY) {
964 if (ib_find_pkey(priv->ca, priv->port, priv->pkey, &new_index)) { 1003 /* child devices chase their origin pkey value, while non-child
965 clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags); 1004 * (parent) devices should always takes what present in pkey index 0
966 ipoib_ib_dev_down(dev, 0); 1005 */
967 ipoib_ib_dev_stop(dev, 0); 1006 if (test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
968 if (ipoib_pkey_dev_delay_open(dev)) 1007 if (ib_find_pkey(priv->ca, priv->port, priv->pkey, &new_index)) {
1008 clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
1009 ipoib_ib_dev_down(dev, 0);
1010 ipoib_ib_dev_stop(dev, 0);
1011 if (ipoib_pkey_dev_delay_open(dev))
1012 return;
1013 }
1014 /* restart QP only if P_Key index is changed */
1015 if (test_and_set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags) &&
1016 new_index == priv->pkey_index) {
1017 ipoib_dbg(priv, "Not flushing - P_Key index not changed.\n");
969 return; 1018 return;
1019 }
1020 priv->pkey_index = new_index;
1021 } else {
1022 result = update_parent_pkey(priv);
1023 /* restart QP only if P_Key value changed */
1024 if (result) {
1025 ipoib_dbg(priv, "Not flushing - P_Key value not changed.\n");
1026 return;
1027 }
970 } 1028 }
971
972 /* restart QP only if P_Key index is changed */
973 if (test_and_set_bit(IPOIB_PKEY_ASSIGNED, &priv->flags) &&
974 new_index == priv->pkey_index) {
975 ipoib_dbg(priv, "Not flushing - P_Key index not changed.\n");
976 return;
977 }
978 priv->pkey_index = new_index;
979 } 1029 }
980 1030
981 if (level == IPOIB_FLUSH_LIGHT) { 1031 if (level == IPOIB_FLUSH_LIGHT) {
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index b6e049a3c7a8..c6f71a88c55c 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -1461,7 +1461,7 @@ static ssize_t create_child(struct device *dev,
1461 if (sscanf(buf, "%i", &pkey) != 1) 1461 if (sscanf(buf, "%i", &pkey) != 1)
1462 return -EINVAL; 1462 return -EINVAL;
1463 1463
1464 if (pkey < 0 || pkey > 0xffff) 1464 if (pkey <= 0 || pkey > 0xffff || pkey == 0x8000)
1465 return -EINVAL; 1465 return -EINVAL;
1466 1466
1467 /* 1467 /*
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c
index 74685936c948..f81abe16cf09 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c
@@ -119,6 +119,15 @@ static int ipoib_new_child_link(struct net *src_net, struct net_device *dev,
119 } else 119 } else
120 child_pkey = nla_get_u16(data[IFLA_IPOIB_PKEY]); 120 child_pkey = nla_get_u16(data[IFLA_IPOIB_PKEY]);
121 121
122 if (child_pkey == 0 || child_pkey == 0x8000)
123 return -EINVAL;
124
125 /*
126 * Set the full membership bit, so that we join the right
127 * broadcast group, etc.
128 */
129 child_pkey |= 0x8000;
130
122 err = __ipoib_vlan_add(ppriv, netdev_priv(dev), child_pkey, IPOIB_RTNL_CHILD); 131 err = __ipoib_vlan_add(ppriv, netdev_priv(dev), child_pkey, IPOIB_RTNL_CHILD);
123 132
124 if (!err && data) 133 if (!err && data)
diff --git a/drivers/macintosh/windfarm_rm31.c b/drivers/macintosh/windfarm_rm31.c
index 0b9a79b2f48a..82fc86a90c1a 100644
--- a/drivers/macintosh/windfarm_rm31.c
+++ b/drivers/macintosh/windfarm_rm31.c
@@ -439,15 +439,15 @@ static void backside_setup_pid(void)
439 439
440/* Slots fan */ 440/* Slots fan */
441static const struct wf_pid_param slots_param = { 441static const struct wf_pid_param slots_param = {
442 .interval = 5, 442 .interval = 1,
443 .history_len = 2, 443 .history_len = 20,
444 .gd = 30 << 20, 444 .gd = 0,
445 .gp = 5 << 20, 445 .gp = 0,
446 .gr = 0, 446 .gr = 0x00100000,
447 .itarget = 40 << 16, 447 .itarget = 3200000,
448 .additive = 1, 448 .additive = 0,
449 .min = 300, 449 .min = 20,
450 .max = 4000, 450 .max = 100,
451}; 451};
452 452
453static void slots_fan_tick(void) 453static void slots_fan_tick(void)
diff --git a/drivers/md/dm-cache-policy-mq.c b/drivers/md/dm-cache-policy-mq.c
index dc112a7137fe..4296155090b2 100644
--- a/drivers/md/dm-cache-policy-mq.c
+++ b/drivers/md/dm-cache-policy-mq.c
@@ -959,23 +959,21 @@ out:
959 return r; 959 return r;
960} 960}
961 961
962static void remove_mapping(struct mq_policy *mq, dm_oblock_t oblock) 962static void mq_remove_mapping(struct dm_cache_policy *p, dm_oblock_t oblock)
963{ 963{
964 struct entry *e = hash_lookup(mq, oblock); 964 struct mq_policy *mq = to_mq_policy(p);
965 struct entry *e;
966
967 mutex_lock(&mq->lock);
968
969 e = hash_lookup(mq, oblock);
965 970
966 BUG_ON(!e || !e->in_cache); 971 BUG_ON(!e || !e->in_cache);
967 972
968 del(mq, e); 973 del(mq, e);
969 e->in_cache = false; 974 e->in_cache = false;
970 push(mq, e); 975 push(mq, e);
971}
972 976
973static void mq_remove_mapping(struct dm_cache_policy *p, dm_oblock_t oblock)
974{
975 struct mq_policy *mq = to_mq_policy(p);
976
977 mutex_lock(&mq->lock);
978 remove_mapping(mq, oblock);
979 mutex_unlock(&mq->lock); 977 mutex_unlock(&mq->lock);
980} 978}
981 979
diff --git a/drivers/media/i2c/ml86v7667.c b/drivers/media/i2c/ml86v7667.c
index efdc873e58d1..a9857022f71d 100644
--- a/drivers/media/i2c/ml86v7667.c
+++ b/drivers/media/i2c/ml86v7667.c
@@ -117,7 +117,7 @@ static int ml86v7667_s_ctrl(struct v4l2_ctrl *ctrl)
117{ 117{
118 struct v4l2_subdev *sd = to_sd(ctrl); 118 struct v4l2_subdev *sd = to_sd(ctrl);
119 struct i2c_client *client = v4l2_get_subdevdata(sd); 119 struct i2c_client *client = v4l2_get_subdevdata(sd);
120 int ret; 120 int ret = -EINVAL;
121 121
122 switch (ctrl->id) { 122 switch (ctrl->id) {
123 case V4L2_CID_BRIGHTNESS: 123 case V4L2_CID_BRIGHTNESS:
@@ -157,7 +157,7 @@ static int ml86v7667_s_ctrl(struct v4l2_ctrl *ctrl)
157 break; 157 break;
158 } 158 }
159 159
160 return 0; 160 return ret;
161} 161}
162 162
163static int ml86v7667_querystd(struct v4l2_subdev *sd, v4l2_std_id *std) 163static int ml86v7667_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
index df4ada880e42..bd9405df1bd6 100644
--- a/drivers/media/platform/coda.c
+++ b/drivers/media/platform/coda.c
@@ -1987,7 +1987,7 @@ MODULE_DEVICE_TABLE(platform, coda_platform_ids);
1987 1987
1988#ifdef CONFIG_OF 1988#ifdef CONFIG_OF
1989static const struct of_device_id coda_dt_ids[] = { 1989static const struct of_device_id coda_dt_ids[] = {
1990 { .compatible = "fsl,imx27-vpu", .data = &coda_platform_ids[CODA_IMX27] }, 1990 { .compatible = "fsl,imx27-vpu", .data = &coda_devdata[CODA_IMX27] },
1991 { .compatible = "fsl,imx53-vpu", .data = &coda_devdata[CODA_IMX53] }, 1991 { .compatible = "fsl,imx53-vpu", .data = &coda_devdata[CODA_IMX53] },
1992 { /* sentinel */ } 1992 { /* sentinel */ }
1993}; 1993};
diff --git a/drivers/media/platform/s5p-g2d/g2d.c b/drivers/media/platform/s5p-g2d/g2d.c
index 553d87e5ceab..fd6289d60cde 100644
--- a/drivers/media/platform/s5p-g2d/g2d.c
+++ b/drivers/media/platform/s5p-g2d/g2d.c
@@ -784,6 +784,7 @@ static int g2d_probe(struct platform_device *pdev)
784 } 784 }
785 *vfd = g2d_videodev; 785 *vfd = g2d_videodev;
786 vfd->lock = &dev->mutex; 786 vfd->lock = &dev->mutex;
787 vfd->v4l2_dev = &dev->v4l2_dev;
787 ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0); 788 ret = video_register_device(vfd, VFL_TYPE_GRABBER, 0);
788 if (ret) { 789 if (ret) {
789 v4l2_err(&dev->v4l2_dev, "Failed to register video device\n"); 790 v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c b/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c
index 5296385153d5..4f6dd42c9adb 100644
--- a/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c
+++ b/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c
@@ -344,7 +344,7 @@ static int vidioc_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
344 pix_mp->num_planes = 2; 344 pix_mp->num_planes = 2;
345 /* Set pixelformat to the format in which MFC 345 /* Set pixelformat to the format in which MFC
346 outputs the decoded frame */ 346 outputs the decoded frame */
347 pix_mp->pixelformat = V4L2_PIX_FMT_NV12MT; 347 pix_mp->pixelformat = ctx->dst_fmt->fourcc;
348 pix_mp->plane_fmt[0].bytesperline = ctx->buf_width; 348 pix_mp->plane_fmt[0].bytesperline = ctx->buf_width;
349 pix_mp->plane_fmt[0].sizeimage = ctx->luma_size; 349 pix_mp->plane_fmt[0].sizeimage = ctx->luma_size;
350 pix_mp->plane_fmt[1].bytesperline = ctx->buf_width; 350 pix_mp->plane_fmt[1].bytesperline = ctx->buf_width;
@@ -382,10 +382,16 @@ static int vidioc_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
382 mfc_err("Unsupported format for source.\n"); 382 mfc_err("Unsupported format for source.\n");
383 return -EINVAL; 383 return -EINVAL;
384 } 384 }
385 if (!IS_MFCV6(dev) && (fmt->fourcc == V4L2_PIX_FMT_VP8)) { 385 if (fmt->codec_mode == S5P_FIMV_CODEC_NONE) {
386 mfc_err("Not supported format.\n"); 386 mfc_err("Unknown codec\n");
387 return -EINVAL; 387 return -EINVAL;
388 } 388 }
389 if (!IS_MFCV6(dev)) {
390 if (fmt->fourcc == V4L2_PIX_FMT_VP8) {
391 mfc_err("Not supported format.\n");
392 return -EINVAL;
393 }
394 }
389 } else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { 395 } else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
390 fmt = find_format(f, MFC_FMT_RAW); 396 fmt = find_format(f, MFC_FMT_RAW);
391 if (!fmt) { 397 if (!fmt) {
@@ -411,7 +417,6 @@ static int vidioc_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
411 struct s5p_mfc_dev *dev = video_drvdata(file); 417 struct s5p_mfc_dev *dev = video_drvdata(file);
412 struct s5p_mfc_ctx *ctx = fh_to_ctx(priv); 418 struct s5p_mfc_ctx *ctx = fh_to_ctx(priv);
413 int ret = 0; 419 int ret = 0;
414 struct s5p_mfc_fmt *fmt;
415 struct v4l2_pix_format_mplane *pix_mp; 420 struct v4l2_pix_format_mplane *pix_mp;
416 421
417 mfc_debug_enter(); 422 mfc_debug_enter();
@@ -425,54 +430,32 @@ static int vidioc_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
425 goto out; 430 goto out;
426 } 431 }
427 if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { 432 if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
428 fmt = find_format(f, MFC_FMT_RAW); 433 /* dst_fmt is validated by call to vidioc_try_fmt */
429 if (!fmt) { 434 ctx->dst_fmt = find_format(f, MFC_FMT_RAW);
430 mfc_err("Unsupported format for source.\n"); 435 ret = 0;
431 return -EINVAL;
432 }
433 if (!IS_MFCV6(dev) && (fmt->fourcc != V4L2_PIX_FMT_NV12MT)) {
434 mfc_err("Not supported format.\n");
435 return -EINVAL;
436 } else if (IS_MFCV6(dev) &&
437 (fmt->fourcc == V4L2_PIX_FMT_NV12MT)) {
438 mfc_err("Not supported format.\n");
439 return -EINVAL;
440 }
441 ctx->dst_fmt = fmt;
442 mfc_debug_leave();
443 return ret;
444 } else if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
445 mfc_err("Wrong type error for S_FMT : %d", f->type);
446 return -EINVAL;
447 }
448 fmt = find_format(f, MFC_FMT_DEC);
449 if (!fmt || fmt->codec_mode == S5P_MFC_CODEC_NONE) {
450 mfc_err("Unknown codec\n");
451 ret = -EINVAL;
452 goto out; 436 goto out;
453 } 437 } else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
454 if (fmt->type != MFC_FMT_DEC) { 438 /* src_fmt is validated by call to vidioc_try_fmt */
455 mfc_err("Wrong format selected, you should choose " 439 ctx->src_fmt = find_format(f, MFC_FMT_DEC);
456 "format for decoding\n"); 440 ctx->codec_mode = ctx->src_fmt->codec_mode;
441 mfc_debug(2, "The codec number is: %d\n", ctx->codec_mode);
442 pix_mp->height = 0;
443 pix_mp->width = 0;
444 if (pix_mp->plane_fmt[0].sizeimage)
445 ctx->dec_src_buf_size = pix_mp->plane_fmt[0].sizeimage;
446 else
447 pix_mp->plane_fmt[0].sizeimage = ctx->dec_src_buf_size =
448 DEF_CPB_SIZE;
449 pix_mp->plane_fmt[0].bytesperline = 0;
450 ctx->state = MFCINST_INIT;
451 ret = 0;
452 goto out;
453 } else {
454 mfc_err("Wrong type error for S_FMT : %d", f->type);
457 ret = -EINVAL; 455 ret = -EINVAL;
458 goto out; 456 goto out;
459 } 457 }
460 if (!IS_MFCV6(dev) && (fmt->fourcc == V4L2_PIX_FMT_VP8)) { 458
461 mfc_err("Not supported format.\n");
462 return -EINVAL;
463 }
464 ctx->src_fmt = fmt;
465 ctx->codec_mode = fmt->codec_mode;
466 mfc_debug(2, "The codec number is: %d\n", ctx->codec_mode);
467 pix_mp->height = 0;
468 pix_mp->width = 0;
469 if (pix_mp->plane_fmt[0].sizeimage)
470 ctx->dec_src_buf_size = pix_mp->plane_fmt[0].sizeimage;
471 else
472 pix_mp->plane_fmt[0].sizeimage = ctx->dec_src_buf_size =
473 DEF_CPB_SIZE;
474 pix_mp->plane_fmt[0].bytesperline = 0;
475 ctx->state = MFCINST_INIT;
476out: 459out:
477 mfc_debug_leave(); 460 mfc_debug_leave();
478 return ret; 461 return ret;
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c
index 2549967b2f85..59e56f4c8ce3 100644
--- a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c
+++ b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c
@@ -906,6 +906,7 @@ static int vidioc_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
906 906
907static int vidioc_try_fmt(struct file *file, void *priv, struct v4l2_format *f) 907static int vidioc_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
908{ 908{
909 struct s5p_mfc_dev *dev = video_drvdata(file);
909 struct s5p_mfc_fmt *fmt; 910 struct s5p_mfc_fmt *fmt;
910 struct v4l2_pix_format_mplane *pix_fmt_mp = &f->fmt.pix_mp; 911 struct v4l2_pix_format_mplane *pix_fmt_mp = &f->fmt.pix_mp;
911 912
@@ -930,6 +931,18 @@ static int vidioc_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
930 return -EINVAL; 931 return -EINVAL;
931 } 932 }
932 933
934 if (!IS_MFCV6(dev)) {
935 if (fmt->fourcc == V4L2_PIX_FMT_NV12MT_16X16) {
936 mfc_err("Not supported format.\n");
937 return -EINVAL;
938 }
939 } else if (IS_MFCV6(dev)) {
940 if (fmt->fourcc == V4L2_PIX_FMT_NV12MT) {
941 mfc_err("Not supported format.\n");
942 return -EINVAL;
943 }
944 }
945
933 if (fmt->num_planes != pix_fmt_mp->num_planes) { 946 if (fmt->num_planes != pix_fmt_mp->num_planes) {
934 mfc_err("failed to try output format\n"); 947 mfc_err("failed to try output format\n");
935 return -EINVAL; 948 return -EINVAL;
@@ -947,7 +960,6 @@ static int vidioc_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
947{ 960{
948 struct s5p_mfc_dev *dev = video_drvdata(file); 961 struct s5p_mfc_dev *dev = video_drvdata(file);
949 struct s5p_mfc_ctx *ctx = fh_to_ctx(priv); 962 struct s5p_mfc_ctx *ctx = fh_to_ctx(priv);
950 struct s5p_mfc_fmt *fmt;
951 struct v4l2_pix_format_mplane *pix_fmt_mp = &f->fmt.pix_mp; 963 struct v4l2_pix_format_mplane *pix_fmt_mp = &f->fmt.pix_mp;
952 int ret = 0; 964 int ret = 0;
953 965
@@ -960,13 +972,9 @@ static int vidioc_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
960 goto out; 972 goto out;
961 } 973 }
962 if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { 974 if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
963 fmt = find_format(f, MFC_FMT_ENC); 975 /* dst_fmt is validated by call to vidioc_try_fmt */
964 if (!fmt) { 976 ctx->dst_fmt = find_format(f, MFC_FMT_ENC);
965 mfc_err("failed to set capture format\n");
966 return -EINVAL;
967 }
968 ctx->state = MFCINST_INIT; 977 ctx->state = MFCINST_INIT;
969 ctx->dst_fmt = fmt;
970 ctx->codec_mode = ctx->dst_fmt->codec_mode; 978 ctx->codec_mode = ctx->dst_fmt->codec_mode;
971 ctx->enc_dst_buf_size = pix_fmt_mp->plane_fmt[0].sizeimage; 979 ctx->enc_dst_buf_size = pix_fmt_mp->plane_fmt[0].sizeimage;
972 pix_fmt_mp->plane_fmt[0].bytesperline = 0; 980 pix_fmt_mp->plane_fmt[0].bytesperline = 0;
@@ -987,28 +995,8 @@ static int vidioc_s_fmt(struct file *file, void *priv, struct v4l2_format *f)
987 } 995 }
988 mfc_debug(2, "Got instance number: %d\n", ctx->inst_no); 996 mfc_debug(2, "Got instance number: %d\n", ctx->inst_no);
989 } else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { 997 } else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
990 fmt = find_format(f, MFC_FMT_RAW); 998 /* src_fmt is validated by call to vidioc_try_fmt */
991 if (!fmt) { 999 ctx->src_fmt = find_format(f, MFC_FMT_RAW);
992 mfc_err("failed to set output format\n");
993 return -EINVAL;
994 }
995
996 if (!IS_MFCV6(dev) &&
997 (fmt->fourcc == V4L2_PIX_FMT_NV12MT_16X16)) {
998 mfc_err("Not supported format.\n");
999 return -EINVAL;
1000 } else if (IS_MFCV6(dev) &&
1001 (fmt->fourcc == V4L2_PIX_FMT_NV12MT)) {
1002 mfc_err("Not supported format.\n");
1003 return -EINVAL;
1004 }
1005
1006 if (fmt->num_planes != pix_fmt_mp->num_planes) {
1007 mfc_err("failed to set output format\n");
1008 ret = -EINVAL;
1009 goto out;
1010 }
1011 ctx->src_fmt = fmt;
1012 ctx->img_width = pix_fmt_mp->width; 1000 ctx->img_width = pix_fmt_mp->width;
1013 ctx->img_height = pix_fmt_mp->height; 1001 ctx->img_height = pix_fmt_mp->height;
1014 mfc_debug(2, "codec number: %d\n", ctx->src_fmt->codec_mode); 1002 mfc_debug(2, "codec number: %d\n", ctx->src_fmt->codec_mode);
diff --git a/drivers/media/usb/em28xx/em28xx-i2c.c b/drivers/media/usb/em28xx/em28xx-i2c.c
index 4851cc2e4a4d..c4ff9739a7ae 100644
--- a/drivers/media/usb/em28xx/em28xx-i2c.c
+++ b/drivers/media/usb/em28xx/em28xx-i2c.c
@@ -726,7 +726,7 @@ static int em28xx_i2c_eeprom(struct em28xx *dev, unsigned bus,
726 726
727 *eedata = data; 727 *eedata = data;
728 *eedata_len = len; 728 *eedata_len = len;
729 dev_config = (void *)eedata; 729 dev_config = (void *)*eedata;
730 730
731 switch (le16_to_cpu(dev_config->chip_conf) >> 4 & 0x3) { 731 switch (le16_to_cpu(dev_config->chip_conf) >> 4 & 0x3) {
732 case 0: 732 case 0:
diff --git a/drivers/media/usb/hdpvr/hdpvr-core.c b/drivers/media/usb/hdpvr/hdpvr-core.c
index cb694055ba7d..6e5070774dc2 100644
--- a/drivers/media/usb/hdpvr/hdpvr-core.c
+++ b/drivers/media/usb/hdpvr/hdpvr-core.c
@@ -303,6 +303,11 @@ static int hdpvr_probe(struct usb_interface *interface,
303 303
304 dev->workqueue = 0; 304 dev->workqueue = 0;
305 305
306 /* init video transfer queues first of all */
307 /* to prevent oops in hdpvr_delete() on error paths */
308 INIT_LIST_HEAD(&dev->free_buff_list);
309 INIT_LIST_HEAD(&dev->rec_buff_list);
310
306 /* register v4l2_device early so it can be used for printks */ 311 /* register v4l2_device early so it can be used for printks */
307 if (v4l2_device_register(&interface->dev, &dev->v4l2_dev)) { 312 if (v4l2_device_register(&interface->dev, &dev->v4l2_dev)) {
308 dev_err(&interface->dev, "v4l2_device_register failed\n"); 313 dev_err(&interface->dev, "v4l2_device_register failed\n");
@@ -325,10 +330,6 @@ static int hdpvr_probe(struct usb_interface *interface,
325 if (!dev->workqueue) 330 if (!dev->workqueue)
326 goto error; 331 goto error;
327 332
328 /* init video transfer queues */
329 INIT_LIST_HEAD(&dev->free_buff_list);
330 INIT_LIST_HEAD(&dev->rec_buff_list);
331
332 dev->options = hdpvr_default_options; 333 dev->options = hdpvr_default_options;
333 334
334 if (default_video_input < HDPVR_VIDEO_INPUTS) 335 if (default_video_input < HDPVR_VIDEO_INPUTS)
@@ -405,7 +406,7 @@ static int hdpvr_probe(struct usb_interface *interface,
405 video_nr[atomic_inc_return(&dev_nr)]); 406 video_nr[atomic_inc_return(&dev_nr)]);
406 if (retval < 0) { 407 if (retval < 0) {
407 v4l2_err(&dev->v4l2_dev, "registering videodev failed\n"); 408 v4l2_err(&dev->v4l2_dev, "registering videodev failed\n");
408 goto error; 409 goto reg_fail;
409 } 410 }
410 411
411 /* let the user know what node this device is now attached to */ 412 /* let the user know what node this device is now attached to */
diff --git a/drivers/media/usb/usbtv/Kconfig b/drivers/media/usb/usbtv/Kconfig
index 8864436464bf..7c5b86006ee6 100644
--- a/drivers/media/usb/usbtv/Kconfig
+++ b/drivers/media/usb/usbtv/Kconfig
@@ -1,6 +1,6 @@
1config VIDEO_USBTV 1config VIDEO_USBTV
2 tristate "USBTV007 video capture support" 2 tristate "USBTV007 video capture support"
3 depends on VIDEO_DEV 3 depends on VIDEO_V4L2
4 select VIDEOBUF2_VMALLOC 4 select VIDEOBUF2_VMALLOC
5 5
6 ---help--- 6 ---help---
diff --git a/drivers/media/usb/usbtv/usbtv.c b/drivers/media/usb/usbtv/usbtv.c
index bf43f874685e..91650173941a 100644
--- a/drivers/media/usb/usbtv/usbtv.c
+++ b/drivers/media/usb/usbtv/usbtv.c
@@ -57,7 +57,7 @@
57#define USBTV_CHUNK_SIZE 256 57#define USBTV_CHUNK_SIZE 256
58#define USBTV_CHUNK 240 58#define USBTV_CHUNK 240
59#define USBTV_CHUNKS (USBTV_WIDTH * USBTV_HEIGHT \ 59#define USBTV_CHUNKS (USBTV_WIDTH * USBTV_HEIGHT \
60 / 2 / USBTV_CHUNK) 60 / 4 / USBTV_CHUNK)
61 61
62/* Chunk header. */ 62/* Chunk header. */
63#define USBTV_MAGIC_OK(chunk) ((be32_to_cpu(chunk[0]) & 0xff000000) \ 63#define USBTV_MAGIC_OK(chunk) ((be32_to_cpu(chunk[0]) & 0xff000000) \
@@ -89,6 +89,7 @@ struct usbtv {
89 /* Number of currently processed frame, useful find 89 /* Number of currently processed frame, useful find
90 * out when a new one begins. */ 90 * out when a new one begins. */
91 u32 frame_id; 91 u32 frame_id;
92 int chunks_done;
92 93
93 int iso_size; 94 int iso_size;
94 unsigned int sequence; 95 unsigned int sequence;
@@ -202,6 +203,26 @@ static int usbtv_setup_capture(struct usbtv *usbtv)
202 return 0; 203 return 0;
203} 204}
204 205
206/* Copy data from chunk into a frame buffer, deinterlacing the data
207 * into every second line. Unfortunately, they don't align nicely into
208 * 720 pixel lines, as the chunk is 240 words long, which is 480 pixels.
209 * Therefore, we break down the chunk into two halves before copyting,
210 * so that we can interleave a line if needed. */
211static void usbtv_chunk_to_vbuf(u32 *frame, u32 *src, int chunk_no, int odd)
212{
213 int half;
214
215 for (half = 0; half < 2; half++) {
216 int part_no = chunk_no * 2 + half;
217 int line = part_no / 3;
218 int part_index = (line * 2 + !odd) * 3 + (part_no % 3);
219
220 u32 *dst = &frame[part_index * USBTV_CHUNK/2];
221 memcpy(dst, src, USBTV_CHUNK/2 * sizeof(*src));
222 src += USBTV_CHUNK/2;
223 }
224}
225
205/* Called for each 256-byte image chunk. 226/* Called for each 256-byte image chunk.
206 * First word identifies the chunk, followed by 240 words of image 227 * First word identifies the chunk, followed by 240 words of image
207 * data and padding. */ 228 * data and padding. */
@@ -218,17 +239,17 @@ static void usbtv_image_chunk(struct usbtv *usbtv, u32 *chunk)
218 frame_id = USBTV_FRAME_ID(chunk); 239 frame_id = USBTV_FRAME_ID(chunk);
219 odd = USBTV_ODD(chunk); 240 odd = USBTV_ODD(chunk);
220 chunk_no = USBTV_CHUNK_NO(chunk); 241 chunk_no = USBTV_CHUNK_NO(chunk);
221
222 /* Deinterlace. TODO: Use interlaced frame format. */
223 chunk_no = (chunk_no - chunk_no % 3) * 2 + chunk_no % 3;
224 chunk_no += !odd * 3;
225
226 if (chunk_no >= USBTV_CHUNKS) 242 if (chunk_no >= USBTV_CHUNKS)
227 return; 243 return;
228 244
229 /* Beginning of a frame. */ 245 /* Beginning of a frame. */
230 if (chunk_no == 0) 246 if (chunk_no == 0) {
231 usbtv->frame_id = frame_id; 247 usbtv->frame_id = frame_id;
248 usbtv->chunks_done = 0;
249 }
250
251 if (usbtv->frame_id != frame_id)
252 return;
232 253
233 spin_lock_irqsave(&usbtv->buflock, flags); 254 spin_lock_irqsave(&usbtv->buflock, flags);
234 if (list_empty(&usbtv->bufs)) { 255 if (list_empty(&usbtv->bufs)) {
@@ -241,19 +262,23 @@ static void usbtv_image_chunk(struct usbtv *usbtv, u32 *chunk)
241 buf = list_first_entry(&usbtv->bufs, struct usbtv_buf, list); 262 buf = list_first_entry(&usbtv->bufs, struct usbtv_buf, list);
242 frame = vb2_plane_vaddr(&buf->vb, 0); 263 frame = vb2_plane_vaddr(&buf->vb, 0);
243 264
244 /* Copy the chunk. */ 265 /* Copy the chunk data. */
245 memcpy(&frame[chunk_no * USBTV_CHUNK], &chunk[1], 266 usbtv_chunk_to_vbuf(frame, &chunk[1], chunk_no, odd);
246 USBTV_CHUNK * sizeof(chunk[1])); 267 usbtv->chunks_done++;
247 268
248 /* Last chunk in a frame, signalling an end */ 269 /* Last chunk in a frame, signalling an end */
249 if (usbtv->frame_id && chunk_no == USBTV_CHUNKS-1) { 270 if (odd && chunk_no == USBTV_CHUNKS-1) {
250 int size = vb2_plane_size(&buf->vb, 0); 271 int size = vb2_plane_size(&buf->vb, 0);
272 enum vb2_buffer_state state = usbtv->chunks_done ==
273 USBTV_CHUNKS ?
274 VB2_BUF_STATE_DONE :
275 VB2_BUF_STATE_ERROR;
251 276
252 buf->vb.v4l2_buf.field = V4L2_FIELD_INTERLACED; 277 buf->vb.v4l2_buf.field = V4L2_FIELD_INTERLACED;
253 buf->vb.v4l2_buf.sequence = usbtv->sequence++; 278 buf->vb.v4l2_buf.sequence = usbtv->sequence++;
254 v4l2_get_timestamp(&buf->vb.v4l2_buf.timestamp); 279 v4l2_get_timestamp(&buf->vb.v4l2_buf.timestamp);
255 vb2_set_plane_payload(&buf->vb, 0, size); 280 vb2_set_plane_payload(&buf->vb, 0, size);
256 vb2_buffer_done(&buf->vb, VB2_BUF_STATE_DONE); 281 vb2_buffer_done(&buf->vb, state);
257 list_del(&buf->list); 282 list_del(&buf->list);
258 } 283 }
259 284
@@ -518,7 +543,7 @@ static int usbtv_queue_setup(struct vb2_queue *vq,
518 if (*nbuffers < 2) 543 if (*nbuffers < 2)
519 *nbuffers = 2; 544 *nbuffers = 2;
520 *nplanes = 1; 545 *nplanes = 1;
521 sizes[0] = USBTV_CHUNK * USBTV_CHUNKS * sizeof(u32); 546 sizes[0] = USBTV_WIDTH * USBTV_HEIGHT / 2 * sizeof(u32);
522 547
523 return 0; 548 return 0;
524} 549}
diff --git a/drivers/net/arcnet/arcnet.c b/drivers/net/arcnet/arcnet.c
index a746ba272f04..a956053608f9 100644
--- a/drivers/net/arcnet/arcnet.c
+++ b/drivers/net/arcnet/arcnet.c
@@ -1007,7 +1007,7 @@ static void arcnet_rx(struct net_device *dev, int bufnum)
1007 1007
1008 soft = &pkt.soft.rfc1201; 1008 soft = &pkt.soft.rfc1201;
1009 1009
1010 lp->hw.copy_from_card(dev, bufnum, 0, &pkt, sizeof(ARC_HDR_SIZE)); 1010 lp->hw.copy_from_card(dev, bufnum, 0, &pkt, ARC_HDR_SIZE);
1011 if (pkt.hard.offset[0]) { 1011 if (pkt.hard.offset[0]) {
1012 ofs = pkt.hard.offset[0]; 1012 ofs = pkt.hard.offset[0];
1013 length = 256 - ofs; 1013 length = 256 - ofs;
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 07f257d44a1e..e48cb339c0c6 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -3714,11 +3714,17 @@ static int bond_neigh_init(struct neighbour *n)
3714 * The bonding ndo_neigh_setup is called at init time beofre any 3714 * The bonding ndo_neigh_setup is called at init time beofre any
3715 * slave exists. So we must declare proxy setup function which will 3715 * slave exists. So we must declare proxy setup function which will
3716 * be used at run time to resolve the actual slave neigh param setup. 3716 * be used at run time to resolve the actual slave neigh param setup.
3717 *
3718 * It's also called by master devices (such as vlans) to setup their
3719 * underlying devices. In that case - do nothing, we're already set up from
3720 * our init.
3717 */ 3721 */
3718static int bond_neigh_setup(struct net_device *dev, 3722static int bond_neigh_setup(struct net_device *dev,
3719 struct neigh_parms *parms) 3723 struct neigh_parms *parms)
3720{ 3724{
3721 parms->neigh_setup = bond_neigh_init; 3725 /* modify only our neigh_parms */
3726 if (parms->dev == dev)
3727 parms->neigh_setup = bond_neigh_init;
3722 3728
3723 return 0; 3729 return 0;
3724} 3730}
diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c
index 6aa7b3266c80..ac6177d3befc 100644
--- a/drivers/net/can/usb/esd_usb2.c
+++ b/drivers/net/can/usb/esd_usb2.c
@@ -412,10 +412,20 @@ static void esd_usb2_read_bulk_callback(struct urb *urb)
412 412
413 switch (msg->msg.hdr.cmd) { 413 switch (msg->msg.hdr.cmd) {
414 case CMD_CAN_RX: 414 case CMD_CAN_RX:
415 if (msg->msg.rx.net >= dev->net_count) {
416 dev_err(dev->udev->dev.parent, "format error\n");
417 break;
418 }
419
415 esd_usb2_rx_can_msg(dev->nets[msg->msg.rx.net], msg); 420 esd_usb2_rx_can_msg(dev->nets[msg->msg.rx.net], msg);
416 break; 421 break;
417 422
418 case CMD_CAN_TX: 423 case CMD_CAN_TX:
424 if (msg->msg.txdone.net >= dev->net_count) {
425 dev_err(dev->udev->dev.parent, "format error\n");
426 break;
427 }
428
419 esd_usb2_tx_done_msg(dev->nets[msg->msg.txdone.net], 429 esd_usb2_tx_done_msg(dev->nets[msg->msg.txdone.net],
420 msg); 430 msg);
421 break; 431 break;
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb.c b/drivers/net/can/usb/peak_usb/pcan_usb.c
index 25723d8ee201..925ab8ec9329 100644
--- a/drivers/net/can/usb/peak_usb/pcan_usb.c
+++ b/drivers/net/can/usb/peak_usb/pcan_usb.c
@@ -649,7 +649,7 @@ static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len)
649 if ((mc->ptr + rec_len) > mc->end) 649 if ((mc->ptr + rec_len) > mc->end)
650 goto decode_failed; 650 goto decode_failed;
651 651
652 memcpy(cf->data, mc->ptr, rec_len); 652 memcpy(cf->data, mc->ptr, cf->can_dlc);
653 mc->ptr += rec_len; 653 mc->ptr += rec_len;
654 } 654 }
655 655
diff --git a/drivers/net/can/usb/usb_8dev.c b/drivers/net/can/usb/usb_8dev.c
index cbd388eea682..8becd3d838b5 100644
--- a/drivers/net/can/usb/usb_8dev.c
+++ b/drivers/net/can/usb/usb_8dev.c
@@ -779,6 +779,7 @@ static int usb_8dev_start(struct usb_8dev_priv *priv)
779 usb_unanchor_urb(urb); 779 usb_unanchor_urb(urb);
780 usb_free_coherent(priv->udev, RX_BUFFER_SIZE, buf, 780 usb_free_coherent(priv->udev, RX_BUFFER_SIZE, buf,
781 urb->transfer_dma); 781 urb->transfer_dma);
782 usb_free_urb(urb);
782 break; 783 break;
783 } 784 }
784 785
diff --git a/drivers/net/ethernet/allwinner/Kconfig b/drivers/net/ethernet/allwinner/Kconfig
index 53ad213e865b..d8d95d4cd45a 100644
--- a/drivers/net/ethernet/allwinner/Kconfig
+++ b/drivers/net/ethernet/allwinner/Kconfig
@@ -3,19 +3,20 @@
3# 3#
4 4
5config NET_VENDOR_ALLWINNER 5config NET_VENDOR_ALLWINNER
6 bool "Allwinner devices" 6 bool "Allwinner devices"
7 default y 7 default y
8 depends on ARCH_SUNXI
9 ---help---
10 If you have a network (Ethernet) card belonging to this
11 class, say Y and read the Ethernet-HOWTO, available from
12 <http://www.tldp.org/docs.html#howto>.
13 8
14 Note that the answer to this question doesn't directly 9 depends on ARCH_SUNXI
15 affect the kernel: saying N will just cause the configurator 10 ---help---
16 to skip all the questions about Allwinner cards. If you say Y, 11 If you have a network (Ethernet) card belonging to this
17 you will be asked for your specific card in the following 12 class, say Y and read the Ethernet-HOWTO, available from
18 questions. 13 <http://www.tldp.org/docs.html#howto>.
14
15 Note that the answer to this question doesn't directly
16 affect the kernel: saying N will just cause the configurator
17 to skip all the questions about Allwinner cards. If you say Y,
18 you will be asked for your specific card in the following
19 questions.
19 20
20if NET_VENDOR_ALLWINNER 21if NET_VENDOR_ALLWINNER
21 22
@@ -26,6 +27,7 @@ config SUN4I_EMAC
26 select CRC32 27 select CRC32
27 select MII 28 select MII
28 select PHYLIB 29 select PHYLIB
30 select MDIO_SUN4I
29 ---help--- 31 ---help---
30 Support for Allwinner A10 EMAC ethernet driver. 32 Support for Allwinner A10 EMAC ethernet driver.
31 33
diff --git a/drivers/net/ethernet/arc/emac_main.c b/drivers/net/ethernet/arc/emac_main.c
index f1b121ee5525..55d79cb53a79 100644
--- a/drivers/net/ethernet/arc/emac_main.c
+++ b/drivers/net/ethernet/arc/emac_main.c
@@ -199,7 +199,7 @@ static int arc_emac_rx(struct net_device *ndev, int budget)
199 struct arc_emac_priv *priv = netdev_priv(ndev); 199 struct arc_emac_priv *priv = netdev_priv(ndev);
200 unsigned int work_done; 200 unsigned int work_done;
201 201
202 for (work_done = 0; work_done <= budget; work_done++) { 202 for (work_done = 0; work_done < budget; work_done++) {
203 unsigned int *last_rx_bd = &priv->last_rx_bd; 203 unsigned int *last_rx_bd = &priv->last_rx_bd;
204 struct net_device_stats *stats = &priv->stats; 204 struct net_device_stats *stats = &priv->stats;
205 struct buffer_state *rx_buff = &priv->rx_buff[*last_rx_bd]; 205 struct buffer_state *rx_buff = &priv->rx_buff[*last_rx_bd];
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c.h b/drivers/net/ethernet/atheros/atl1c/atl1c.h
index b2bf324631dc..0f0556526ba9 100644
--- a/drivers/net/ethernet/atheros/atl1c/atl1c.h
+++ b/drivers/net/ethernet/atheros/atl1c/atl1c.h
@@ -520,6 +520,9 @@ struct atl1c_adapter {
520 struct net_device *netdev; 520 struct net_device *netdev;
521 struct pci_dev *pdev; 521 struct pci_dev *pdev;
522 struct napi_struct napi; 522 struct napi_struct napi;
523 struct page *rx_page;
524 unsigned int rx_page_offset;
525 unsigned int rx_frag_size;
523 struct atl1c_hw hw; 526 struct atl1c_hw hw;
524 struct atl1c_hw_stats hw_stats; 527 struct atl1c_hw_stats hw_stats;
525 struct mii_if_info mii; /* MII interface info */ 528 struct mii_if_info mii; /* MII interface info */
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
index 786a87483298..a36a760ada28 100644
--- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
+++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
@@ -481,10 +481,15 @@ static int atl1c_set_mac_addr(struct net_device *netdev, void *p)
481static void atl1c_set_rxbufsize(struct atl1c_adapter *adapter, 481static void atl1c_set_rxbufsize(struct atl1c_adapter *adapter,
482 struct net_device *dev) 482 struct net_device *dev)
483{ 483{
484 unsigned int head_size;
484 int mtu = dev->mtu; 485 int mtu = dev->mtu;
485 486
486 adapter->rx_buffer_len = mtu > AT_RX_BUF_SIZE ? 487 adapter->rx_buffer_len = mtu > AT_RX_BUF_SIZE ?
487 roundup(mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN, 8) : AT_RX_BUF_SIZE; 488 roundup(mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN, 8) : AT_RX_BUF_SIZE;
489
490 head_size = SKB_DATA_ALIGN(adapter->rx_buffer_len + NET_SKB_PAD) +
491 SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
492 adapter->rx_frag_size = roundup_pow_of_two(head_size);
488} 493}
489 494
490static netdev_features_t atl1c_fix_features(struct net_device *netdev, 495static netdev_features_t atl1c_fix_features(struct net_device *netdev,
@@ -952,6 +957,10 @@ static void atl1c_free_ring_resources(struct atl1c_adapter *adapter)
952 kfree(adapter->tpd_ring[0].buffer_info); 957 kfree(adapter->tpd_ring[0].buffer_info);
953 adapter->tpd_ring[0].buffer_info = NULL; 958 adapter->tpd_ring[0].buffer_info = NULL;
954 } 959 }
960 if (adapter->rx_page) {
961 put_page(adapter->rx_page);
962 adapter->rx_page = NULL;
963 }
955} 964}
956 965
957/** 966/**
@@ -1639,6 +1648,35 @@ static inline void atl1c_rx_checksum(struct atl1c_adapter *adapter,
1639 skb_checksum_none_assert(skb); 1648 skb_checksum_none_assert(skb);
1640} 1649}
1641 1650
1651static struct sk_buff *atl1c_alloc_skb(struct atl1c_adapter *adapter)
1652{
1653 struct sk_buff *skb;
1654 struct page *page;
1655
1656 if (adapter->rx_frag_size > PAGE_SIZE)
1657 return netdev_alloc_skb(adapter->netdev,
1658 adapter->rx_buffer_len);
1659
1660 page = adapter->rx_page;
1661 if (!page) {
1662 adapter->rx_page = page = alloc_page(GFP_ATOMIC);
1663 if (unlikely(!page))
1664 return NULL;
1665 adapter->rx_page_offset = 0;
1666 }
1667
1668 skb = build_skb(page_address(page) + adapter->rx_page_offset,
1669 adapter->rx_frag_size);
1670 if (likely(skb)) {
1671 adapter->rx_page_offset += adapter->rx_frag_size;
1672 if (adapter->rx_page_offset >= PAGE_SIZE)
1673 adapter->rx_page = NULL;
1674 else
1675 get_page(page);
1676 }
1677 return skb;
1678}
1679
1642static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter) 1680static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter)
1643{ 1681{
1644 struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring; 1682 struct atl1c_rfd_ring *rfd_ring = &adapter->rfd_ring;
@@ -1660,7 +1698,7 @@ static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter)
1660 while (next_info->flags & ATL1C_BUFFER_FREE) { 1698 while (next_info->flags & ATL1C_BUFFER_FREE) {
1661 rfd_desc = ATL1C_RFD_DESC(rfd_ring, rfd_next_to_use); 1699 rfd_desc = ATL1C_RFD_DESC(rfd_ring, rfd_next_to_use);
1662 1700
1663 skb = netdev_alloc_skb(adapter->netdev, adapter->rx_buffer_len); 1701 skb = atl1c_alloc_skb(adapter);
1664 if (unlikely(!skb)) { 1702 if (unlikely(!skb)) {
1665 if (netif_msg_rx_err(adapter)) 1703 if (netif_msg_rx_err(adapter))
1666 dev_warn(&pdev->dev, "alloc rx buffer failed\n"); 1704 dev_warn(&pdev->dev, "alloc rx buffer failed\n");
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
index dedbd76c033e..00b88cbfde25 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
@@ -486,7 +486,7 @@ struct bnx2x_fastpath {
486 486
487 struct napi_struct napi; 487 struct napi_struct napi;
488 488
489#ifdef CONFIG_NET_LL_RX_POLL 489#ifdef CONFIG_NET_RX_BUSY_POLL
490 unsigned int state; 490 unsigned int state;
491#define BNX2X_FP_STATE_IDLE 0 491#define BNX2X_FP_STATE_IDLE 0
492#define BNX2X_FP_STATE_NAPI (1 << 0) /* NAPI owns this FP */ 492#define BNX2X_FP_STATE_NAPI (1 << 0) /* NAPI owns this FP */
@@ -498,7 +498,7 @@ struct bnx2x_fastpath {
498#define BNX2X_FP_USER_PEND (BNX2X_FP_STATE_POLL | BNX2X_FP_STATE_POLL_YIELD) 498#define BNX2X_FP_USER_PEND (BNX2X_FP_STATE_POLL | BNX2X_FP_STATE_POLL_YIELD)
499 /* protect state */ 499 /* protect state */
500 spinlock_t lock; 500 spinlock_t lock;
501#endif /* CONFIG_NET_LL_RX_POLL */ 501#endif /* CONFIG_NET_RX_BUSY_POLL */
502 502
503 union host_hc_status_block status_blk; 503 union host_hc_status_block status_blk;
504 /* chip independent shortcuts into sb structure */ 504 /* chip independent shortcuts into sb structure */
@@ -572,7 +572,7 @@ struct bnx2x_fastpath {
572#define bnx2x_fp_stats(bp, fp) (&((bp)->fp_stats[(fp)->index])) 572#define bnx2x_fp_stats(bp, fp) (&((bp)->fp_stats[(fp)->index]))
573#define bnx2x_fp_qstats(bp, fp) (&((bp)->fp_stats[(fp)->index].eth_q_stats)) 573#define bnx2x_fp_qstats(bp, fp) (&((bp)->fp_stats[(fp)->index].eth_q_stats))
574 574
575#ifdef CONFIG_NET_LL_RX_POLL 575#ifdef CONFIG_NET_RX_BUSY_POLL
576static inline void bnx2x_fp_init_lock(struct bnx2x_fastpath *fp) 576static inline void bnx2x_fp_init_lock(struct bnx2x_fastpath *fp)
577{ 577{
578 spin_lock_init(&fp->lock); 578 spin_lock_init(&fp->lock);
@@ -680,7 +680,7 @@ static inline bool bnx2x_fp_ll_polling(struct bnx2x_fastpath *fp)
680{ 680{
681 return false; 681 return false;
682} 682}
683#endif /* CONFIG_NET_LL_RX_POLL */ 683#endif /* CONFIG_NET_RX_BUSY_POLL */
684 684
685/* Use 2500 as a mini-jumbo MTU for FCoE */ 685/* Use 2500 as a mini-jumbo MTU for FCoE */
686#define BNX2X_FCOE_MINI_JUMBO_MTU 2500 686#define BNX2X_FCOE_MINI_JUMBO_MTU 2500
@@ -1333,6 +1333,8 @@ enum {
1333 BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN, 1333 BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN,
1334 BNX2X_SP_RTNL_VFPF_STORM_RX_MODE, 1334 BNX2X_SP_RTNL_VFPF_STORM_RX_MODE,
1335 BNX2X_SP_RTNL_HYPERVISOR_VLAN, 1335 BNX2X_SP_RTNL_HYPERVISOR_VLAN,
1336 BNX2X_SP_RTNL_TX_STOP,
1337 BNX2X_SP_RTNL_TX_RESUME,
1336}; 1338};
1337 1339
1338struct bnx2x_prev_path_list { 1340struct bnx2x_prev_path_list {
@@ -1502,6 +1504,7 @@ struct bnx2x {
1502#define BC_SUPPORTS_DCBX_MSG_NON_PMF (1 << 21) 1504#define BC_SUPPORTS_DCBX_MSG_NON_PMF (1 << 21)
1503#define IS_VF_FLAG (1 << 22) 1505#define IS_VF_FLAG (1 << 22)
1504#define INTERRUPTS_ENABLED_FLAG (1 << 23) 1506#define INTERRUPTS_ENABLED_FLAG (1 << 23)
1507#define BC_SUPPORTS_RMMOD_CMD (1 << 24)
1505 1508
1506#define BP_NOMCP(bp) ((bp)->flags & NO_MCP_FLAG) 1509#define BP_NOMCP(bp) ((bp)->flags & NO_MCP_FLAG)
1507 1510
@@ -1830,6 +1833,8 @@ struct bnx2x {
1830 1833
1831 int fp_array_size; 1834 int fp_array_size;
1832 u32 dump_preset_idx; 1835 u32 dump_preset_idx;
1836 bool stats_started;
1837 struct semaphore stats_sema;
1833}; 1838};
1834 1839
1835/* Tx queues may be less or equal to Rx queues */ 1840/* Tx queues may be less or equal to Rx queues */
@@ -2451,4 +2456,6 @@ enum bnx2x_pci_bus_speed {
2451 BNX2X_PCI_LINK_SPEED_5000 = 5000, 2456 BNX2X_PCI_LINK_SPEED_5000 = 5000,
2452 BNX2X_PCI_LINK_SPEED_8000 = 8000 2457 BNX2X_PCI_LINK_SPEED_8000 = 8000
2453}; 2458};
2459
2460void bnx2x_set_local_cmng(struct bnx2x *bp);
2454#endif /* bnx2x.h */ 2461#endif /* bnx2x.h */
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index ee350bde1818..f2d1ff10054b 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -3117,7 +3117,7 @@ int bnx2x_poll(struct napi_struct *napi, int budget)
3117 return work_done; 3117 return work_done;
3118} 3118}
3119 3119
3120#ifdef CONFIG_NET_LL_RX_POLL 3120#ifdef CONFIG_NET_RX_BUSY_POLL
3121/* must be called with local_bh_disable()d */ 3121/* must be called with local_bh_disable()d */
3122int bnx2x_low_latency_recv(struct napi_struct *napi) 3122int bnx2x_low_latency_recv(struct napi_struct *napi)
3123{ 3123{
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
index 0c94df47e0e8..fcf2761d8828 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.c
@@ -30,10 +30,8 @@
30#include "bnx2x_dcb.h" 30#include "bnx2x_dcb.h"
31 31
32/* forward declarations of dcbx related functions */ 32/* forward declarations of dcbx related functions */
33static int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp);
34static void bnx2x_pfc_set_pfc(struct bnx2x *bp); 33static void bnx2x_pfc_set_pfc(struct bnx2x *bp);
35static void bnx2x_dcbx_update_ets_params(struct bnx2x *bp); 34static void bnx2x_dcbx_update_ets_params(struct bnx2x *bp);
36static int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp);
37static void bnx2x_dcbx_get_ets_pri_pg_tbl(struct bnx2x *bp, 35static void bnx2x_dcbx_get_ets_pri_pg_tbl(struct bnx2x *bp,
38 u32 *set_configuration_ets_pg, 36 u32 *set_configuration_ets_pg,
39 u32 *pri_pg_tbl); 37 u32 *pri_pg_tbl);
@@ -425,30 +423,52 @@ static void bnx2x_pfc_set_pfc(struct bnx2x *bp)
425 bnx2x_pfc_clear(bp); 423 bnx2x_pfc_clear(bp);
426} 424}
427 425
428static int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp) 426int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp)
429{ 427{
430 struct bnx2x_func_state_params func_params = {NULL}; 428 struct bnx2x_func_state_params func_params = {NULL};
429 int rc;
431 430
432 func_params.f_obj = &bp->func_obj; 431 func_params.f_obj = &bp->func_obj;
433 func_params.cmd = BNX2X_F_CMD_TX_STOP; 432 func_params.cmd = BNX2X_F_CMD_TX_STOP;
434 433
434 __set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags);
435 __set_bit(RAMROD_RETRY, &func_params.ramrod_flags);
436
435 DP(BNX2X_MSG_DCB, "STOP TRAFFIC\n"); 437 DP(BNX2X_MSG_DCB, "STOP TRAFFIC\n");
436 return bnx2x_func_state_change(bp, &func_params); 438
439 rc = bnx2x_func_state_change(bp, &func_params);
440 if (rc) {
441 BNX2X_ERR("Unable to hold traffic for HW configuration\n");
442 bnx2x_panic();
443 }
444
445 return rc;
437} 446}
438 447
439static int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp) 448int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp)
440{ 449{
441 struct bnx2x_func_state_params func_params = {NULL}; 450 struct bnx2x_func_state_params func_params = {NULL};
442 struct bnx2x_func_tx_start_params *tx_params = 451 struct bnx2x_func_tx_start_params *tx_params =
443 &func_params.params.tx_start; 452 &func_params.params.tx_start;
453 int rc;
444 454
445 func_params.f_obj = &bp->func_obj; 455 func_params.f_obj = &bp->func_obj;
446 func_params.cmd = BNX2X_F_CMD_TX_START; 456 func_params.cmd = BNX2X_F_CMD_TX_START;
447 457
458 __set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags);
459 __set_bit(RAMROD_RETRY, &func_params.ramrod_flags);
460
448 bnx2x_dcbx_fw_struct(bp, tx_params); 461 bnx2x_dcbx_fw_struct(bp, tx_params);
449 462
450 DP(BNX2X_MSG_DCB, "START TRAFFIC\n"); 463 DP(BNX2X_MSG_DCB, "START TRAFFIC\n");
451 return bnx2x_func_state_change(bp, &func_params); 464
465 rc = bnx2x_func_state_change(bp, &func_params);
466 if (rc) {
467 BNX2X_ERR("Unable to resume traffic after HW configuration\n");
468 bnx2x_panic();
469 }
470
471 return rc;
452} 472}
453 473
454static void bnx2x_dcbx_2cos_limit_update_ets_config(struct bnx2x *bp) 474static void bnx2x_dcbx_2cos_limit_update_ets_config(struct bnx2x *bp)
@@ -744,7 +764,9 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
744 if (IS_MF(bp)) 764 if (IS_MF(bp))
745 bnx2x_link_sync_notify(bp); 765 bnx2x_link_sync_notify(bp);
746 766
747 bnx2x_dcbx_stop_hw_tx(bp); 767 set_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state);
768
769 schedule_delayed_work(&bp->sp_rtnl_task, 0);
748 770
749 return; 771 return;
750 } 772 }
@@ -753,7 +775,13 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
753 bnx2x_pfc_set_pfc(bp); 775 bnx2x_pfc_set_pfc(bp);
754 776
755 bnx2x_dcbx_update_ets_params(bp); 777 bnx2x_dcbx_update_ets_params(bp);
756 bnx2x_dcbx_resume_hw_tx(bp); 778
779 /* ets may affect cmng configuration: reinit it in hw */
780 bnx2x_set_local_cmng(bp);
781
782 set_bit(BNX2X_SP_RTNL_TX_RESUME, &bp->sp_rtnl_state);
783
784 schedule_delayed_work(&bp->sp_rtnl_task, 0);
757 785
758 return; 786 return;
759 case BNX2X_DCBX_STATE_TX_RELEASED: 787 case BNX2X_DCBX_STATE_TX_RELEASED:
@@ -2363,21 +2391,24 @@ static u8 bnx2x_dcbnl_get_featcfg(struct net_device *netdev, int featid,
2363 case DCB_FEATCFG_ATTR_PG: 2391 case DCB_FEATCFG_ATTR_PG:
2364 if (bp->dcbx_local_feat.ets.enabled) 2392 if (bp->dcbx_local_feat.ets.enabled)
2365 *flags |= DCB_FEATCFG_ENABLE; 2393 *flags |= DCB_FEATCFG_ENABLE;
2366 if (bp->dcbx_error & DCBX_LOCAL_ETS_ERROR) 2394 if (bp->dcbx_error & (DCBX_LOCAL_ETS_ERROR |
2395 DCBX_REMOTE_MIB_ERROR))
2367 *flags |= DCB_FEATCFG_ERROR; 2396 *flags |= DCB_FEATCFG_ERROR;
2368 break; 2397 break;
2369 case DCB_FEATCFG_ATTR_PFC: 2398 case DCB_FEATCFG_ATTR_PFC:
2370 if (bp->dcbx_local_feat.pfc.enabled) 2399 if (bp->dcbx_local_feat.pfc.enabled)
2371 *flags |= DCB_FEATCFG_ENABLE; 2400 *flags |= DCB_FEATCFG_ENABLE;
2372 if (bp->dcbx_error & (DCBX_LOCAL_PFC_ERROR | 2401 if (bp->dcbx_error & (DCBX_LOCAL_PFC_ERROR |
2373 DCBX_LOCAL_PFC_MISMATCH)) 2402 DCBX_LOCAL_PFC_MISMATCH |
2403 DCBX_REMOTE_MIB_ERROR))
2374 *flags |= DCB_FEATCFG_ERROR; 2404 *flags |= DCB_FEATCFG_ERROR;
2375 break; 2405 break;
2376 case DCB_FEATCFG_ATTR_APP: 2406 case DCB_FEATCFG_ATTR_APP:
2377 if (bp->dcbx_local_feat.app.enabled) 2407 if (bp->dcbx_local_feat.app.enabled)
2378 *flags |= DCB_FEATCFG_ENABLE; 2408 *flags |= DCB_FEATCFG_ENABLE;
2379 if (bp->dcbx_error & (DCBX_LOCAL_APP_ERROR | 2409 if (bp->dcbx_error & (DCBX_LOCAL_APP_ERROR |
2380 DCBX_LOCAL_APP_MISMATCH)) 2410 DCBX_LOCAL_APP_MISMATCH |
2411 DCBX_REMOTE_MIB_ERROR))
2381 *flags |= DCB_FEATCFG_ERROR; 2412 *flags |= DCB_FEATCFG_ERROR;
2382 break; 2413 break;
2383 default: 2414 default:
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h
index 125bd1b6586f..804b8f64463e 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dcb.h
@@ -199,4 +199,7 @@ extern const struct dcbnl_rtnl_ops bnx2x_dcbnl_ops;
199int bnx2x_dcbnl_update_applist(struct bnx2x *bp, bool delall); 199int bnx2x_dcbnl_update_applist(struct bnx2x *bp, bool delall);
200#endif /* BCM_DCBNL */ 200#endif /* BCM_DCBNL */
201 201
202int bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp);
203int bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp);
204
202#endif /* BNX2X_DCB_H */ 205#endif /* BNX2X_DCB_H */
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
index 5018e52ae2ad..32767f6aa33f 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_hsi.h
@@ -1300,6 +1300,9 @@ struct drv_func_mb {
1300 1300
1301 #define DRV_MSG_CODE_EEE_RESULTS_ACK 0xda000000 1301 #define DRV_MSG_CODE_EEE_RESULTS_ACK 0xda000000
1302 1302
1303 #define DRV_MSG_CODE_RMMOD 0xdb000000
1304 #define REQ_BC_VER_4_RMMOD_CMD 0x0007080f
1305
1303 #define DRV_MSG_CODE_SET_MF_BW 0xe0000000 1306 #define DRV_MSG_CODE_SET_MF_BW 0xe0000000
1304 #define REQ_BC_VER_4_SET_MF_BW 0x00060202 1307 #define REQ_BC_VER_4_SET_MF_BW 0x00060202
1305 #define DRV_MSG_CODE_SET_MF_BW_ACK 0xe1000000 1308 #define DRV_MSG_CODE_SET_MF_BW_ACK 0xe1000000
@@ -1372,6 +1375,8 @@ struct drv_func_mb {
1372 1375
1373 #define FW_MSG_CODE_EEE_RESULS_ACK 0xda100000 1376 #define FW_MSG_CODE_EEE_RESULS_ACK 0xda100000
1374 1377
1378 #define FW_MSG_CODE_RMMOD_ACK 0xdb100000
1379
1375 #define FW_MSG_CODE_SET_MF_BW_SENT 0xe0000000 1380 #define FW_MSG_CODE_SET_MF_BW_SENT 0xe0000000
1376 #define FW_MSG_CODE_SET_MF_BW_DONE 0xe1000000 1381 #define FW_MSG_CODE_SET_MF_BW_DONE 0xe1000000
1377 1382
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index e5da07858a2f..8bdc8b973007 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -2261,6 +2261,23 @@ static void bnx2x_set_requested_fc(struct bnx2x *bp)
2261 bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_BOTH; 2261 bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_BOTH;
2262} 2262}
2263 2263
2264static void bnx2x_init_dropless_fc(struct bnx2x *bp)
2265{
2266 u32 pause_enabled = 0;
2267
2268 if (!CHIP_IS_E1(bp) && bp->dropless_fc && bp->link_vars.link_up) {
2269 if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX)
2270 pause_enabled = 1;
2271
2272 REG_WR(bp, BAR_USTRORM_INTMEM +
2273 USTORM_ETH_PAUSE_ENABLED_OFFSET(BP_PORT(bp)),
2274 pause_enabled);
2275 }
2276
2277 DP(NETIF_MSG_IFUP | NETIF_MSG_LINK, "dropless_fc is %s\n",
2278 pause_enabled ? "enabled" : "disabled");
2279}
2280
2264int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode) 2281int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode)
2265{ 2282{
2266 int rc, cfx_idx = bnx2x_get_link_cfg_idx(bp); 2283 int rc, cfx_idx = bnx2x_get_link_cfg_idx(bp);
@@ -2294,6 +2311,8 @@ int bnx2x_initial_phy_init(struct bnx2x *bp, int load_mode)
2294 2311
2295 bnx2x_release_phy_lock(bp); 2312 bnx2x_release_phy_lock(bp);
2296 2313
2314 bnx2x_init_dropless_fc(bp);
2315
2297 bnx2x_calc_fc_adv(bp); 2316 bnx2x_calc_fc_adv(bp);
2298 2317
2299 if (bp->link_vars.link_up) { 2318 if (bp->link_vars.link_up) {
@@ -2315,6 +2334,8 @@ void bnx2x_link_set(struct bnx2x *bp)
2315 bnx2x_phy_init(&bp->link_params, &bp->link_vars); 2334 bnx2x_phy_init(&bp->link_params, &bp->link_vars);
2316 bnx2x_release_phy_lock(bp); 2335 bnx2x_release_phy_lock(bp);
2317 2336
2337 bnx2x_init_dropless_fc(bp);
2338
2318 bnx2x_calc_fc_adv(bp); 2339 bnx2x_calc_fc_adv(bp);
2319 } else 2340 } else
2320 BNX2X_ERR("Bootcode is missing - can not set link\n"); 2341 BNX2X_ERR("Bootcode is missing - can not set link\n");
@@ -2476,7 +2497,7 @@ static void bnx2x_cmng_fns_init(struct bnx2x *bp, u8 read_cfg, u8 cmng_type)
2476 2497
2477 input.port_rate = bp->link_vars.line_speed; 2498 input.port_rate = bp->link_vars.line_speed;
2478 2499
2479 if (cmng_type == CMNG_FNS_MINMAX) { 2500 if (cmng_type == CMNG_FNS_MINMAX && input.port_rate) {
2480 int vn; 2501 int vn;
2481 2502
2482 /* read mf conf from shmem */ 2503 /* read mf conf from shmem */
@@ -2533,6 +2554,21 @@ static void storm_memset_cmng(struct bnx2x *bp,
2533 } 2554 }
2534} 2555}
2535 2556
2557/* init cmng mode in HW according to local configuration */
2558void bnx2x_set_local_cmng(struct bnx2x *bp)
2559{
2560 int cmng_fns = bnx2x_get_cmng_fns_mode(bp);
2561
2562 if (cmng_fns != CMNG_FNS_NONE) {
2563 bnx2x_cmng_fns_init(bp, false, cmng_fns);
2564 storm_memset_cmng(bp, &bp->cmng, BP_PORT(bp));
2565 } else {
2566 /* rate shaping and fairness are disabled */
2567 DP(NETIF_MSG_IFUP,
2568 "single function mode without fairness\n");
2569 }
2570}
2571
2536/* This function is called upon link interrupt */ 2572/* This function is called upon link interrupt */
2537static void bnx2x_link_attn(struct bnx2x *bp) 2573static void bnx2x_link_attn(struct bnx2x *bp)
2538{ 2574{
@@ -2541,20 +2577,9 @@ static void bnx2x_link_attn(struct bnx2x *bp)
2541 2577
2542 bnx2x_link_update(&bp->link_params, &bp->link_vars); 2578 bnx2x_link_update(&bp->link_params, &bp->link_vars);
2543 2579
2544 if (bp->link_vars.link_up) { 2580 bnx2x_init_dropless_fc(bp);
2545 2581
2546 /* dropless flow control */ 2582 if (bp->link_vars.link_up) {
2547 if (!CHIP_IS_E1(bp) && bp->dropless_fc) {
2548 int port = BP_PORT(bp);
2549 u32 pause_enabled = 0;
2550
2551 if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX)
2552 pause_enabled = 1;
2553
2554 REG_WR(bp, BAR_USTRORM_INTMEM +
2555 USTORM_ETH_PAUSE_ENABLED_OFFSET(port),
2556 pause_enabled);
2557 }
2558 2583
2559 if (bp->link_vars.mac_type != MAC_TYPE_EMAC) { 2584 if (bp->link_vars.mac_type != MAC_TYPE_EMAC) {
2560 struct host_port_stats *pstats; 2585 struct host_port_stats *pstats;
@@ -2568,17 +2593,8 @@ static void bnx2x_link_attn(struct bnx2x *bp)
2568 bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP); 2593 bnx2x_stats_handle(bp, STATS_EVENT_LINK_UP);
2569 } 2594 }
2570 2595
2571 if (bp->link_vars.link_up && bp->link_vars.line_speed) { 2596 if (bp->link_vars.link_up && bp->link_vars.line_speed)
2572 int cmng_fns = bnx2x_get_cmng_fns_mode(bp); 2597 bnx2x_set_local_cmng(bp);
2573
2574 if (cmng_fns != CMNG_FNS_NONE) {
2575 bnx2x_cmng_fns_init(bp, false, cmng_fns);
2576 storm_memset_cmng(bp, &bp->cmng, BP_PORT(bp));
2577 } else
2578 /* rate shaping and fairness are disabled */
2579 DP(NETIF_MSG_IFUP,
2580 "single function mode without fairness\n");
2581 }
2582 2598
2583 __bnx2x_link_report(bp); 2599 __bnx2x_link_report(bp);
2584 2600
@@ -9639,6 +9655,12 @@ sp_rtnl_not_reset:
9639 &bp->sp_rtnl_state)) 9655 &bp->sp_rtnl_state))
9640 bnx2x_pf_set_vfs_vlan(bp); 9656 bnx2x_pf_set_vfs_vlan(bp);
9641 9657
9658 if (test_and_clear_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state))
9659 bnx2x_dcbx_stop_hw_tx(bp);
9660
9661 if (test_and_clear_bit(BNX2X_SP_RTNL_TX_RESUME, &bp->sp_rtnl_state))
9662 bnx2x_dcbx_resume_hw_tx(bp);
9663
9642 /* work which needs rtnl lock not-taken (as it takes the lock itself and 9664 /* work which needs rtnl lock not-taken (as it takes the lock itself and
9643 * can be called from other contexts as well) 9665 * can be called from other contexts as well)
9644 */ 9666 */
@@ -10362,6 +10384,10 @@ static void bnx2x_get_common_hwinfo(struct bnx2x *bp)
10362 10384
10363 bp->flags |= (val >= REQ_BC_VER_4_DCBX_ADMIN_MSG_NON_PMF) ? 10385 bp->flags |= (val >= REQ_BC_VER_4_DCBX_ADMIN_MSG_NON_PMF) ?
10364 BC_SUPPORTS_DCBX_MSG_NON_PMF : 0; 10386 BC_SUPPORTS_DCBX_MSG_NON_PMF : 0;
10387
10388 bp->flags |= (val >= REQ_BC_VER_4_RMMOD_CMD) ?
10389 BC_SUPPORTS_RMMOD_CMD : 0;
10390
10365 boot_mode = SHMEM_RD(bp, 10391 boot_mode = SHMEM_RD(bp,
10366 dev_info.port_feature_config[BP_PORT(bp)].mba_config) & 10392 dev_info.port_feature_config[BP_PORT(bp)].mba_config) &
10367 PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK; 10393 PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK;
@@ -11137,6 +11163,9 @@ static bool bnx2x_get_dropless_info(struct bnx2x *bp)
11137 int tmp; 11163 int tmp;
11138 u32 cfg; 11164 u32 cfg;
11139 11165
11166 if (IS_VF(bp))
11167 return 0;
11168
11140 if (IS_MF(bp) && !CHIP_IS_E1x(bp)) { 11169 if (IS_MF(bp) && !CHIP_IS_E1x(bp)) {
11141 /* Take function: tmp = func */ 11170 /* Take function: tmp = func */
11142 tmp = BP_ABS_FUNC(bp); 11171 tmp = BP_ABS_FUNC(bp);
@@ -11524,6 +11553,7 @@ static int bnx2x_init_bp(struct bnx2x *bp)
11524 mutex_init(&bp->port.phy_mutex); 11553 mutex_init(&bp->port.phy_mutex);
11525 mutex_init(&bp->fw_mb_mutex); 11554 mutex_init(&bp->fw_mb_mutex);
11526 spin_lock_init(&bp->stats_lock); 11555 spin_lock_init(&bp->stats_lock);
11556 sema_init(&bp->stats_sema, 1);
11527 11557
11528 INIT_DELAYED_WORK(&bp->sp_task, bnx2x_sp_task); 11558 INIT_DELAYED_WORK(&bp->sp_task, bnx2x_sp_task);
11529 INIT_DELAYED_WORK(&bp->sp_rtnl_task, bnx2x_sp_rtnl_task); 11559 INIT_DELAYED_WORK(&bp->sp_rtnl_task, bnx2x_sp_rtnl_task);
@@ -12026,7 +12056,7 @@ static const struct net_device_ops bnx2x_netdev_ops = {
12026 .ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn, 12056 .ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn,
12027#endif 12057#endif
12028 12058
12029#ifdef CONFIG_NET_LL_RX_POLL 12059#ifdef CONFIG_NET_RX_BUSY_POLL
12030 .ndo_busy_poll = bnx2x_low_latency_recv, 12060 .ndo_busy_poll = bnx2x_low_latency_recv,
12031#endif 12061#endif
12032}; 12062};
@@ -12817,13 +12847,17 @@ static void __bnx2x_remove(struct pci_dev *pdev,
12817 bnx2x_dcbnl_update_applist(bp, true); 12847 bnx2x_dcbnl_update_applist(bp, true);
12818#endif 12848#endif
12819 12849
12850 if (IS_PF(bp) &&
12851 !BP_NOMCP(bp) &&
12852 (bp->flags & BC_SUPPORTS_RMMOD_CMD))
12853 bnx2x_fw_command(bp, DRV_MSG_CODE_RMMOD, 0);
12854
12820 /* Close the interface - either directly or implicitly */ 12855 /* Close the interface - either directly or implicitly */
12821 if (remove_netdev) { 12856 if (remove_netdev) {
12822 unregister_netdev(dev); 12857 unregister_netdev(dev);
12823 } else { 12858 } else {
12824 rtnl_lock(); 12859 rtnl_lock();
12825 if (netif_running(dev)) 12860 dev_close(dev);
12826 bnx2x_close(dev);
12827 rtnl_unlock(); 12861 rtnl_unlock();
12828 } 12862 }
12829 12863
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
index 95861efb5051..ad83f4b48777 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
@@ -1747,11 +1747,8 @@ void bnx2x_iov_init_dq(struct bnx2x *bp)
1747 1747
1748void bnx2x_iov_init_dmae(struct bnx2x *bp) 1748void bnx2x_iov_init_dmae(struct bnx2x *bp)
1749{ 1749{
1750 DP(BNX2X_MSG_IOV, "SRIOV is %s\n", IS_SRIOV(bp) ? "ON" : "OFF"); 1750 if (pci_find_ext_capability(bp->pdev, PCI_EXT_CAP_ID_SRIOV))
1751 if (!IS_SRIOV(bp)) 1751 REG_WR(bp, DMAE_REG_BACKWARD_COMP_EN, 0);
1752 return;
1753
1754 REG_WR(bp, DMAE_REG_BACKWARD_COMP_EN, 0);
1755} 1752}
1756 1753
1757static int bnx2x_vf_bus(struct bnx2x *bp, int vfid) 1754static int bnx2x_vf_bus(struct bnx2x *bp, int vfid)
@@ -3084,8 +3081,9 @@ void bnx2x_disable_sriov(struct bnx2x *bp)
3084 pci_disable_sriov(bp->pdev); 3081 pci_disable_sriov(bp->pdev);
3085} 3082}
3086 3083
3087static int bnx2x_vf_ndo_sanity(struct bnx2x *bp, int vfidx, 3084static int bnx2x_vf_ndo_prep(struct bnx2x *bp, int vfidx,
3088 struct bnx2x_virtf *vf) 3085 struct bnx2x_virtf **vf,
3086 struct pf_vf_bulletin_content **bulletin)
3089{ 3087{
3090 if (bp->state != BNX2X_STATE_OPEN) { 3088 if (bp->state != BNX2X_STATE_OPEN) {
3091 BNX2X_ERR("vf ndo called though PF is down\n"); 3089 BNX2X_ERR("vf ndo called though PF is down\n");
@@ -3103,12 +3101,22 @@ static int bnx2x_vf_ndo_sanity(struct bnx2x *bp, int vfidx,
3103 return -EINVAL; 3101 return -EINVAL;
3104 } 3102 }
3105 3103
3106 if (!vf) { 3104 /* init members */
3105 *vf = BP_VF(bp, vfidx);
3106 *bulletin = BP_VF_BULLETIN(bp, vfidx);
3107
3108 if (!*vf) {
3107 BNX2X_ERR("vf ndo called but vf was null. vfidx was %d\n", 3109 BNX2X_ERR("vf ndo called but vf was null. vfidx was %d\n",
3108 vfidx); 3110 vfidx);
3109 return -EINVAL; 3111 return -EINVAL;
3110 } 3112 }
3111 3113
3114 if (!*bulletin) {
3115 BNX2X_ERR("vf ndo called but Bulletin Board struct is null. vfidx was %d\n",
3116 vfidx);
3117 return -EINVAL;
3118 }
3119
3112 return 0; 3120 return 0;
3113} 3121}
3114 3122
@@ -3116,17 +3124,19 @@ int bnx2x_get_vf_config(struct net_device *dev, int vfidx,
3116 struct ifla_vf_info *ivi) 3124 struct ifla_vf_info *ivi)
3117{ 3125{
3118 struct bnx2x *bp = netdev_priv(dev); 3126 struct bnx2x *bp = netdev_priv(dev);
3119 struct bnx2x_virtf *vf = BP_VF(bp, vfidx); 3127 struct bnx2x_virtf *vf = NULL;
3120 struct bnx2x_vlan_mac_obj *mac_obj = &bnx2x_vfq(vf, 0, mac_obj); 3128 struct pf_vf_bulletin_content *bulletin = NULL;
3121 struct bnx2x_vlan_mac_obj *vlan_obj = &bnx2x_vfq(vf, 0, vlan_obj); 3129 struct bnx2x_vlan_mac_obj *mac_obj;
3122 struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx); 3130 struct bnx2x_vlan_mac_obj *vlan_obj;
3123 int rc; 3131 int rc;
3124 3132
3125 /* sanity */ 3133 /* sanity and init */
3126 rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf); 3134 rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin);
3127 if (rc) 3135 if (rc)
3128 return rc; 3136 return rc;
3129 if (!mac_obj || !vlan_obj || !bulletin) { 3137 mac_obj = &bnx2x_vfq(vf, 0, mac_obj);
3138 vlan_obj = &bnx2x_vfq(vf, 0, vlan_obj);
3139 if (!mac_obj || !vlan_obj) {
3130 BNX2X_ERR("VF partially initialized\n"); 3140 BNX2X_ERR("VF partially initialized\n");
3131 return -EINVAL; 3141 return -EINVAL;
3132 } 3142 }
@@ -3183,11 +3193,11 @@ int bnx2x_set_vf_mac(struct net_device *dev, int vfidx, u8 *mac)
3183{ 3193{
3184 struct bnx2x *bp = netdev_priv(dev); 3194 struct bnx2x *bp = netdev_priv(dev);
3185 int rc, q_logical_state; 3195 int rc, q_logical_state;
3186 struct bnx2x_virtf *vf = BP_VF(bp, vfidx); 3196 struct bnx2x_virtf *vf = NULL;
3187 struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx); 3197 struct pf_vf_bulletin_content *bulletin = NULL;
3188 3198
3189 /* sanity */ 3199 /* sanity and init */
3190 rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf); 3200 rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin);
3191 if (rc) 3201 if (rc)
3192 return rc; 3202 return rc;
3193 if (!is_valid_ether_addr(mac)) { 3203 if (!is_valid_ether_addr(mac)) {
@@ -3249,11 +3259,11 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos)
3249{ 3259{
3250 struct bnx2x *bp = netdev_priv(dev); 3260 struct bnx2x *bp = netdev_priv(dev);
3251 int rc, q_logical_state; 3261 int rc, q_logical_state;
3252 struct bnx2x_virtf *vf = BP_VF(bp, vfidx); 3262 struct bnx2x_virtf *vf = NULL;
3253 struct pf_vf_bulletin_content *bulletin = BP_VF_BULLETIN(bp, vfidx); 3263 struct pf_vf_bulletin_content *bulletin = NULL;
3254 3264
3255 /* sanity */ 3265 /* sanity and init */
3256 rc = bnx2x_vf_ndo_sanity(bp, vfidx, vf); 3266 rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin);
3257 if (rc) 3267 if (rc)
3258 return rc; 3268 return rc;
3259 3269
@@ -3463,7 +3473,7 @@ int bnx2x_vf_pci_alloc(struct bnx2x *bp)
3463alloc_mem_err: 3473alloc_mem_err:
3464 BNX2X_PCI_FREE(bp->vf2pf_mbox, bp->vf2pf_mbox_mapping, 3474 BNX2X_PCI_FREE(bp->vf2pf_mbox, bp->vf2pf_mbox_mapping,
3465 sizeof(struct bnx2x_vf_mbx_msg)); 3475 sizeof(struct bnx2x_vf_mbx_msg));
3466 BNX2X_PCI_FREE(bp->vf2pf_mbox, bp->vf2pf_mbox_mapping, 3476 BNX2X_PCI_FREE(bp->vf2pf_mbox, bp->pf2vf_bulletin_mapping,
3467 sizeof(union pf_vf_bulletin)); 3477 sizeof(union pf_vf_bulletin));
3468 return -ENOMEM; 3478 return -ENOMEM;
3469} 3479}
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c
index 98366abd02bd..d63d1327b051 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c
@@ -221,7 +221,8 @@ static int bnx2x_stats_comp(struct bnx2x *bp)
221 * Statistics service functions 221 * Statistics service functions
222 */ 222 */
223 223
224static void bnx2x_stats_pmf_update(struct bnx2x *bp) 224/* should be called under stats_sema */
225static void __bnx2x_stats_pmf_update(struct bnx2x *bp)
225{ 226{
226 struct dmae_command *dmae; 227 struct dmae_command *dmae;
227 u32 opcode; 228 u32 opcode;
@@ -518,7 +519,8 @@ static void bnx2x_func_stats_init(struct bnx2x *bp)
518 *stats_comp = 0; 519 *stats_comp = 0;
519} 520}
520 521
521static void bnx2x_stats_start(struct bnx2x *bp) 522/* should be called under stats_sema */
523static void __bnx2x_stats_start(struct bnx2x *bp)
522{ 524{
523 /* vfs travel through here as part of the statistics FSM, but no action 525 /* vfs travel through here as part of the statistics FSM, but no action
524 * is required 526 * is required
@@ -534,13 +536,34 @@ static void bnx2x_stats_start(struct bnx2x *bp)
534 536
535 bnx2x_hw_stats_post(bp); 537 bnx2x_hw_stats_post(bp);
536 bnx2x_storm_stats_post(bp); 538 bnx2x_storm_stats_post(bp);
539
540 bp->stats_started = true;
541}
542
543static void bnx2x_stats_start(struct bnx2x *bp)
544{
545 if (down_timeout(&bp->stats_sema, HZ/10))
546 BNX2X_ERR("Unable to acquire stats lock\n");
547 __bnx2x_stats_start(bp);
548 up(&bp->stats_sema);
537} 549}
538 550
539static void bnx2x_stats_pmf_start(struct bnx2x *bp) 551static void bnx2x_stats_pmf_start(struct bnx2x *bp)
540{ 552{
553 if (down_timeout(&bp->stats_sema, HZ/10))
554 BNX2X_ERR("Unable to acquire stats lock\n");
541 bnx2x_stats_comp(bp); 555 bnx2x_stats_comp(bp);
542 bnx2x_stats_pmf_update(bp); 556 __bnx2x_stats_pmf_update(bp);
543 bnx2x_stats_start(bp); 557 __bnx2x_stats_start(bp);
558 up(&bp->stats_sema);
559}
560
561static void bnx2x_stats_pmf_update(struct bnx2x *bp)
562{
563 if (down_timeout(&bp->stats_sema, HZ/10))
564 BNX2X_ERR("Unable to acquire stats lock\n");
565 __bnx2x_stats_pmf_update(bp);
566 up(&bp->stats_sema);
544} 567}
545 568
546static void bnx2x_stats_restart(struct bnx2x *bp) 569static void bnx2x_stats_restart(struct bnx2x *bp)
@@ -550,8 +573,11 @@ static void bnx2x_stats_restart(struct bnx2x *bp)
550 */ 573 */
551 if (IS_VF(bp)) 574 if (IS_VF(bp))
552 return; 575 return;
576 if (down_timeout(&bp->stats_sema, HZ/10))
577 BNX2X_ERR("Unable to acquire stats lock\n");
553 bnx2x_stats_comp(bp); 578 bnx2x_stats_comp(bp);
554 bnx2x_stats_start(bp); 579 __bnx2x_stats_start(bp);
580 up(&bp->stats_sema);
555} 581}
556 582
557static void bnx2x_bmac_stats_update(struct bnx2x *bp) 583static void bnx2x_bmac_stats_update(struct bnx2x *bp)
@@ -888,9 +914,7 @@ static int bnx2x_storm_stats_validate_counters(struct bnx2x *bp)
888 /* Make sure we use the value of the counter 914 /* Make sure we use the value of the counter
889 * used for sending the last stats ramrod. 915 * used for sending the last stats ramrod.
890 */ 916 */
891 spin_lock_bh(&bp->stats_lock);
892 cur_stats_counter = bp->stats_counter - 1; 917 cur_stats_counter = bp->stats_counter - 1;
893 spin_unlock_bh(&bp->stats_lock);
894 918
895 /* are storm stats valid? */ 919 /* are storm stats valid? */
896 if (le16_to_cpu(counters->xstats_counter) != cur_stats_counter) { 920 if (le16_to_cpu(counters->xstats_counter) != cur_stats_counter) {
@@ -1227,12 +1251,18 @@ static void bnx2x_stats_update(struct bnx2x *bp)
1227{ 1251{
1228 u32 *stats_comp = bnx2x_sp(bp, stats_comp); 1252 u32 *stats_comp = bnx2x_sp(bp, stats_comp);
1229 1253
1230 if (bnx2x_edebug_stats_stopped(bp)) 1254 /* we run update from timer context, so give up
1255 * if somebody is in the middle of transition
1256 */
1257 if (down_trylock(&bp->stats_sema))
1231 return; 1258 return;
1232 1259
1260 if (bnx2x_edebug_stats_stopped(bp) || !bp->stats_started)
1261 goto out;
1262
1233 if (IS_PF(bp)) { 1263 if (IS_PF(bp)) {
1234 if (*stats_comp != DMAE_COMP_VAL) 1264 if (*stats_comp != DMAE_COMP_VAL)
1235 return; 1265 goto out;
1236 1266
1237 if (bp->port.pmf) 1267 if (bp->port.pmf)
1238 bnx2x_hw_stats_update(bp); 1268 bnx2x_hw_stats_update(bp);
@@ -1242,7 +1272,7 @@ static void bnx2x_stats_update(struct bnx2x *bp)
1242 BNX2X_ERR("storm stats were not updated for 3 times\n"); 1272 BNX2X_ERR("storm stats were not updated for 3 times\n");
1243 bnx2x_panic(); 1273 bnx2x_panic();
1244 } 1274 }
1245 return; 1275 goto out;
1246 } 1276 }
1247 } else { 1277 } else {
1248 /* vf doesn't collect HW statistics, and doesn't get completions 1278 /* vf doesn't collect HW statistics, and doesn't get completions
@@ -1256,7 +1286,7 @@ static void bnx2x_stats_update(struct bnx2x *bp)
1256 1286
1257 /* vf is done */ 1287 /* vf is done */
1258 if (IS_VF(bp)) 1288 if (IS_VF(bp))
1259 return; 1289 goto out;
1260 1290
1261 if (netif_msg_timer(bp)) { 1291 if (netif_msg_timer(bp)) {
1262 struct bnx2x_eth_stats *estats = &bp->eth_stats; 1292 struct bnx2x_eth_stats *estats = &bp->eth_stats;
@@ -1267,6 +1297,9 @@ static void bnx2x_stats_update(struct bnx2x *bp)
1267 1297
1268 bnx2x_hw_stats_post(bp); 1298 bnx2x_hw_stats_post(bp);
1269 bnx2x_storm_stats_post(bp); 1299 bnx2x_storm_stats_post(bp);
1300
1301out:
1302 up(&bp->stats_sema);
1270} 1303}
1271 1304
1272static void bnx2x_port_stats_stop(struct bnx2x *bp) 1305static void bnx2x_port_stats_stop(struct bnx2x *bp)
@@ -1332,6 +1365,11 @@ static void bnx2x_stats_stop(struct bnx2x *bp)
1332{ 1365{
1333 int update = 0; 1366 int update = 0;
1334 1367
1368 if (down_timeout(&bp->stats_sema, HZ/10))
1369 BNX2X_ERR("Unable to acquire stats lock\n");
1370
1371 bp->stats_started = false;
1372
1335 bnx2x_stats_comp(bp); 1373 bnx2x_stats_comp(bp);
1336 1374
1337 if (bp->port.pmf) 1375 if (bp->port.pmf)
@@ -1348,6 +1386,8 @@ static void bnx2x_stats_stop(struct bnx2x *bp)
1348 bnx2x_hw_stats_post(bp); 1386 bnx2x_hw_stats_post(bp);
1349 bnx2x_stats_comp(bp); 1387 bnx2x_stats_comp(bp);
1350 } 1388 }
1389
1390 up(&bp->stats_sema);
1351} 1391}
1352 1392
1353static void bnx2x_stats_do_nothing(struct bnx2x *bp) 1393static void bnx2x_stats_do_nothing(struct bnx2x *bp)
@@ -1376,15 +1416,17 @@ static const struct {
1376void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event) 1416void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event)
1377{ 1417{
1378 enum bnx2x_stats_state state; 1418 enum bnx2x_stats_state state;
1419 void (*action)(struct bnx2x *bp);
1379 if (unlikely(bp->panic)) 1420 if (unlikely(bp->panic))
1380 return; 1421 return;
1381 1422
1382 spin_lock_bh(&bp->stats_lock); 1423 spin_lock_bh(&bp->stats_lock);
1383 state = bp->stats_state; 1424 state = bp->stats_state;
1384 bp->stats_state = bnx2x_stats_stm[state][event].next_state; 1425 bp->stats_state = bnx2x_stats_stm[state][event].next_state;
1426 action = bnx2x_stats_stm[state][event].action;
1385 spin_unlock_bh(&bp->stats_lock); 1427 spin_unlock_bh(&bp->stats_lock);
1386 1428
1387 bnx2x_stats_stm[state][event].action(bp); 1429 action(bp);
1388 1430
1389 if ((event != STATS_EVENT_UPDATE) || netif_msg_timer(bp)) 1431 if ((event != STATS_EVENT_UPDATE) || netif_msg_timer(bp))
1390 DP(BNX2X_MSG_STATS, "state %d -> event %d -> state %d\n", 1432 DP(BNX2X_MSG_STATS, "state %d -> event %d -> state %d\n",
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index d964f302ac94..0da2214ef1b9 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -17625,7 +17625,8 @@ err_out_free_res:
17625 pci_release_regions(pdev); 17625 pci_release_regions(pdev);
17626 17626
17627err_out_disable_pdev: 17627err_out_disable_pdev:
17628 pci_disable_device(pdev); 17628 if (pci_is_enabled(pdev))
17629 pci_disable_device(pdev);
17629 pci_set_drvdata(pdev, NULL); 17630 pci_set_drvdata(pdev, NULL);
17630 return err; 17631 return err;
17631} 17632}
@@ -17773,7 +17774,8 @@ static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev,
17773 17774
17774 rtnl_lock(); 17775 rtnl_lock();
17775 17776
17776 if (!netif_running(netdev)) 17777 /* We probably don't have netdev yet */
17778 if (!netdev || !netif_running(netdev))
17777 goto done; 17779 goto done;
17778 17780
17779 tg3_phy_stop(tp); 17781 tg3_phy_stop(tp);
@@ -17794,8 +17796,10 @@ static pci_ers_result_t tg3_io_error_detected(struct pci_dev *pdev,
17794 17796
17795done: 17797done:
17796 if (state == pci_channel_io_perm_failure) { 17798 if (state == pci_channel_io_perm_failure) {
17797 tg3_napi_enable(tp); 17799 if (netdev) {
17798 dev_close(netdev); 17800 tg3_napi_enable(tp);
17801 dev_close(netdev);
17802 }
17799 err = PCI_ERS_RESULT_DISCONNECT; 17803 err = PCI_ERS_RESULT_DISCONNECT;
17800 } else { 17804 } else {
17801 pci_disable_device(pdev); 17805 pci_disable_device(pdev);
@@ -17825,7 +17829,8 @@ static pci_ers_result_t tg3_io_slot_reset(struct pci_dev *pdev)
17825 rtnl_lock(); 17829 rtnl_lock();
17826 17830
17827 if (pci_enable_device(pdev)) { 17831 if (pci_enable_device(pdev)) {
17828 netdev_err(netdev, "Cannot re-enable PCI device after reset.\n"); 17832 dev_err(&pdev->dev,
17833 "Cannot re-enable PCI device after reset.\n");
17829 goto done; 17834 goto done;
17830 } 17835 }
17831 17836
@@ -17833,7 +17838,7 @@ static pci_ers_result_t tg3_io_slot_reset(struct pci_dev *pdev)
17833 pci_restore_state(pdev); 17838 pci_restore_state(pdev);
17834 pci_save_state(pdev); 17839 pci_save_state(pdev);
17835 17840
17836 if (!netif_running(netdev)) { 17841 if (!netdev || !netif_running(netdev)) {
17837 rc = PCI_ERS_RESULT_RECOVERED; 17842 rc = PCI_ERS_RESULT_RECOVERED;
17838 goto done; 17843 goto done;
17839 } 17844 }
@@ -17845,7 +17850,7 @@ static pci_ers_result_t tg3_io_slot_reset(struct pci_dev *pdev)
17845 rc = PCI_ERS_RESULT_RECOVERED; 17850 rc = PCI_ERS_RESULT_RECOVERED;
17846 17851
17847done: 17852done:
17848 if (rc != PCI_ERS_RESULT_RECOVERED && netif_running(netdev)) { 17853 if (rc != PCI_ERS_RESULT_RECOVERED && netdev && netif_running(netdev)) {
17849 tg3_napi_enable(tp); 17854 tg3_napi_enable(tp);
17850 dev_close(netdev); 17855 dev_close(netdev);
17851 } 17856 }
diff --git a/drivers/net/ethernet/chelsio/cxgb3/sge.c b/drivers/net/ethernet/chelsio/cxgb3/sge.c
index 687ec4a8bb48..9c89dc8fe105 100644
--- a/drivers/net/ethernet/chelsio/cxgb3/sge.c
+++ b/drivers/net/ethernet/chelsio/cxgb3/sge.c
@@ -455,11 +455,6 @@ static int alloc_pg_chunk(struct adapter *adapter, struct sge_fl *q,
455 q->pg_chunk.offset = 0; 455 q->pg_chunk.offset = 0;
456 mapping = pci_map_page(adapter->pdev, q->pg_chunk.page, 456 mapping = pci_map_page(adapter->pdev, q->pg_chunk.page,
457 0, q->alloc_size, PCI_DMA_FROMDEVICE); 457 0, q->alloc_size, PCI_DMA_FROMDEVICE);
458 if (unlikely(pci_dma_mapping_error(adapter->pdev, mapping))) {
459 __free_pages(q->pg_chunk.page, order);
460 q->pg_chunk.page = NULL;
461 return -EIO;
462 }
463 q->pg_chunk.mapping = mapping; 458 q->pg_chunk.mapping = mapping;
464 } 459 }
465 sd->pg_chunk = q->pg_chunk; 460 sd->pg_chunk = q->pg_chunk;
@@ -954,75 +949,40 @@ static inline unsigned int calc_tx_descs(const struct sk_buff *skb)
954 return flits_to_desc(flits); 949 return flits_to_desc(flits);
955} 950}
956 951
957
958/* map_skb - map a packet main body and its page fragments
959 * @pdev: the PCI device
960 * @skb: the packet
961 * @addr: placeholder to save the mapped addresses
962 *
963 * map the main body of an sk_buff and its page fragments, if any.
964 */
965static int map_skb(struct pci_dev *pdev, const struct sk_buff *skb,
966 dma_addr_t *addr)
967{
968 const skb_frag_t *fp, *end;
969 const struct skb_shared_info *si;
970
971 *addr = pci_map_single(pdev, skb->data, skb_headlen(skb),
972 PCI_DMA_TODEVICE);
973 if (pci_dma_mapping_error(pdev, *addr))
974 goto out_err;
975
976 si = skb_shinfo(skb);
977 end = &si->frags[si->nr_frags];
978
979 for (fp = si->frags; fp < end; fp++) {
980 *++addr = skb_frag_dma_map(&pdev->dev, fp, 0, skb_frag_size(fp),
981 DMA_TO_DEVICE);
982 if (pci_dma_mapping_error(pdev, *addr))
983 goto unwind;
984 }
985 return 0;
986
987unwind:
988 while (fp-- > si->frags)
989 dma_unmap_page(&pdev->dev, *--addr, skb_frag_size(fp),
990 DMA_TO_DEVICE);
991
992 pci_unmap_single(pdev, addr[-1], skb_headlen(skb), PCI_DMA_TODEVICE);
993out_err:
994 return -ENOMEM;
995}
996
997/** 952/**
998 * write_sgl - populate a scatter/gather list for a packet 953 * make_sgl - populate a scatter/gather list for a packet
999 * @skb: the packet 954 * @skb: the packet
1000 * @sgp: the SGL to populate 955 * @sgp: the SGL to populate
1001 * @start: start address of skb main body data to include in the SGL 956 * @start: start address of skb main body data to include in the SGL
1002 * @len: length of skb main body data to include in the SGL 957 * @len: length of skb main body data to include in the SGL
1003 * @addr: the list of the mapped addresses 958 * @pdev: the PCI device
1004 * 959 *
1005 * Copies the scatter/gather list for the buffers that make up a packet 960 * Generates a scatter/gather list for the buffers that make up a packet
1006 * and returns the SGL size in 8-byte words. The caller must size the SGL 961 * and returns the SGL size in 8-byte words. The caller must size the SGL
1007 * appropriately. 962 * appropriately.
1008 */ 963 */
1009static inline unsigned int write_sgl(const struct sk_buff *skb, 964static inline unsigned int make_sgl(const struct sk_buff *skb,
1010 struct sg_ent *sgp, unsigned char *start, 965 struct sg_ent *sgp, unsigned char *start,
1011 unsigned int len, const dma_addr_t *addr) 966 unsigned int len, struct pci_dev *pdev)
1012{ 967{
1013 unsigned int i, j = 0, k = 0, nfrags; 968 dma_addr_t mapping;
969 unsigned int i, j = 0, nfrags;
1014 970
1015 if (len) { 971 if (len) {
972 mapping = pci_map_single(pdev, start, len, PCI_DMA_TODEVICE);
1016 sgp->len[0] = cpu_to_be32(len); 973 sgp->len[0] = cpu_to_be32(len);
1017 sgp->addr[j++] = cpu_to_be64(addr[k++]); 974 sgp->addr[0] = cpu_to_be64(mapping);
975 j = 1;
1018 } 976 }
1019 977
1020 nfrags = skb_shinfo(skb)->nr_frags; 978 nfrags = skb_shinfo(skb)->nr_frags;
1021 for (i = 0; i < nfrags; i++) { 979 for (i = 0; i < nfrags; i++) {
1022 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; 980 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
1023 981
982 mapping = skb_frag_dma_map(&pdev->dev, frag, 0, skb_frag_size(frag),
983 DMA_TO_DEVICE);
1024 sgp->len[j] = cpu_to_be32(skb_frag_size(frag)); 984 sgp->len[j] = cpu_to_be32(skb_frag_size(frag));
1025 sgp->addr[j] = cpu_to_be64(addr[k++]); 985 sgp->addr[j] = cpu_to_be64(mapping);
1026 j ^= 1; 986 j ^= 1;
1027 if (j == 0) 987 if (j == 0)
1028 ++sgp; 988 ++sgp;
@@ -1178,7 +1138,7 @@ static void write_tx_pkt_wr(struct adapter *adap, struct sk_buff *skb,
1178 const struct port_info *pi, 1138 const struct port_info *pi,
1179 unsigned int pidx, unsigned int gen, 1139 unsigned int pidx, unsigned int gen,
1180 struct sge_txq *q, unsigned int ndesc, 1140 struct sge_txq *q, unsigned int ndesc,
1181 unsigned int compl, const dma_addr_t *addr) 1141 unsigned int compl)
1182{ 1142{
1183 unsigned int flits, sgl_flits, cntrl, tso_info; 1143 unsigned int flits, sgl_flits, cntrl, tso_info;
1184 struct sg_ent *sgp, sgl[MAX_SKB_FRAGS / 2 + 1]; 1144 struct sg_ent *sgp, sgl[MAX_SKB_FRAGS / 2 + 1];
@@ -1236,7 +1196,7 @@ static void write_tx_pkt_wr(struct adapter *adap, struct sk_buff *skb,
1236 } 1196 }
1237 1197
1238 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl; 1198 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl;
1239 sgl_flits = write_sgl(skb, sgp, skb->data, skb_headlen(skb), addr); 1199 sgl_flits = make_sgl(skb, sgp, skb->data, skb_headlen(skb), adap->pdev);
1240 1200
1241 write_wr_hdr_sgl(ndesc, skb, d, pidx, q, sgl, flits, sgl_flits, gen, 1201 write_wr_hdr_sgl(ndesc, skb, d, pidx, q, sgl, flits, sgl_flits, gen,
1242 htonl(V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | compl), 1202 htonl(V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | compl),
@@ -1267,7 +1227,6 @@ netdev_tx_t t3_eth_xmit(struct sk_buff *skb, struct net_device *dev)
1267 struct netdev_queue *txq; 1227 struct netdev_queue *txq;
1268 struct sge_qset *qs; 1228 struct sge_qset *qs;
1269 struct sge_txq *q; 1229 struct sge_txq *q;
1270 dma_addr_t addr[MAX_SKB_FRAGS + 1];
1271 1230
1272 /* 1231 /*
1273 * The chip min packet length is 9 octets but play safe and reject 1232 * The chip min packet length is 9 octets but play safe and reject
@@ -1296,11 +1255,6 @@ netdev_tx_t t3_eth_xmit(struct sk_buff *skb, struct net_device *dev)
1296 return NETDEV_TX_BUSY; 1255 return NETDEV_TX_BUSY;
1297 } 1256 }
1298 1257
1299 if (unlikely(map_skb(adap->pdev, skb, addr) < 0)) {
1300 dev_kfree_skb(skb);
1301 return NETDEV_TX_OK;
1302 }
1303
1304 q->in_use += ndesc; 1258 q->in_use += ndesc;
1305 if (unlikely(credits - ndesc < q->stop_thres)) { 1259 if (unlikely(credits - ndesc < q->stop_thres)) {
1306 t3_stop_tx_queue(txq, qs, q); 1260 t3_stop_tx_queue(txq, qs, q);
@@ -1358,7 +1312,7 @@ netdev_tx_t t3_eth_xmit(struct sk_buff *skb, struct net_device *dev)
1358 if (likely(!skb_shared(skb))) 1312 if (likely(!skb_shared(skb)))
1359 skb_orphan(skb); 1313 skb_orphan(skb);
1360 1314
1361 write_tx_pkt_wr(adap, skb, pi, pidx, gen, q, ndesc, compl, addr); 1315 write_tx_pkt_wr(adap, skb, pi, pidx, gen, q, ndesc, compl);
1362 check_ring_tx_db(adap, q); 1316 check_ring_tx_db(adap, q);
1363 return NETDEV_TX_OK; 1317 return NETDEV_TX_OK;
1364} 1318}
@@ -1623,8 +1577,7 @@ static void setup_deferred_unmapping(struct sk_buff *skb, struct pci_dev *pdev,
1623 */ 1577 */
1624static void write_ofld_wr(struct adapter *adap, struct sk_buff *skb, 1578static void write_ofld_wr(struct adapter *adap, struct sk_buff *skb,
1625 struct sge_txq *q, unsigned int pidx, 1579 struct sge_txq *q, unsigned int pidx,
1626 unsigned int gen, unsigned int ndesc, 1580 unsigned int gen, unsigned int ndesc)
1627 const dma_addr_t *addr)
1628{ 1581{
1629 unsigned int sgl_flits, flits; 1582 unsigned int sgl_flits, flits;
1630 struct work_request_hdr *from; 1583 struct work_request_hdr *from;
@@ -1645,9 +1598,9 @@ static void write_ofld_wr(struct adapter *adap, struct sk_buff *skb,
1645 1598
1646 flits = skb_transport_offset(skb) / 8; 1599 flits = skb_transport_offset(skb) / 8;
1647 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl; 1600 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl;
1648 sgl_flits = write_sgl(skb, sgp, skb_transport_header(skb), 1601 sgl_flits = make_sgl(skb, sgp, skb_transport_header(skb),
1649 skb_tail_pointer(skb) - 1602 skb->tail - skb->transport_header,
1650 skb_transport_header(skb), addr); 1603 adap->pdev);
1651 if (need_skb_unmap()) { 1604 if (need_skb_unmap()) {
1652 setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits); 1605 setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits);
1653 skb->destructor = deferred_unmap_destructor; 1606 skb->destructor = deferred_unmap_destructor;
@@ -1705,11 +1658,6 @@ again: reclaim_completed_tx(adap, q, TX_RECLAIM_CHUNK);
1705 goto again; 1658 goto again;
1706 } 1659 }
1707 1660
1708 if (map_skb(adap->pdev, skb, (dma_addr_t *)skb->head)) {
1709 spin_unlock(&q->lock);
1710 return NET_XMIT_SUCCESS;
1711 }
1712
1713 gen = q->gen; 1661 gen = q->gen;
1714 q->in_use += ndesc; 1662 q->in_use += ndesc;
1715 pidx = q->pidx; 1663 pidx = q->pidx;
@@ -1720,7 +1668,7 @@ again: reclaim_completed_tx(adap, q, TX_RECLAIM_CHUNK);
1720 } 1668 }
1721 spin_unlock(&q->lock); 1669 spin_unlock(&q->lock);
1722 1670
1723 write_ofld_wr(adap, skb, q, pidx, gen, ndesc, (dma_addr_t *)skb->head); 1671 write_ofld_wr(adap, skb, q, pidx, gen, ndesc);
1724 check_ring_tx_db(adap, q); 1672 check_ring_tx_db(adap, q);
1725 return NET_XMIT_SUCCESS; 1673 return NET_XMIT_SUCCESS;
1726} 1674}
@@ -1738,7 +1686,6 @@ static void restart_offloadq(unsigned long data)
1738 struct sge_txq *q = &qs->txq[TXQ_OFLD]; 1686 struct sge_txq *q = &qs->txq[TXQ_OFLD];
1739 const struct port_info *pi = netdev_priv(qs->netdev); 1687 const struct port_info *pi = netdev_priv(qs->netdev);
1740 struct adapter *adap = pi->adapter; 1688 struct adapter *adap = pi->adapter;
1741 unsigned int written = 0;
1742 1689
1743 spin_lock(&q->lock); 1690 spin_lock(&q->lock);
1744again: reclaim_completed_tx(adap, q, TX_RECLAIM_CHUNK); 1691again: reclaim_completed_tx(adap, q, TX_RECLAIM_CHUNK);
@@ -1758,14 +1705,10 @@ again: reclaim_completed_tx(adap, q, TX_RECLAIM_CHUNK);
1758 break; 1705 break;
1759 } 1706 }
1760 1707
1761 if (map_skb(adap->pdev, skb, (dma_addr_t *)skb->head))
1762 break;
1763
1764 gen = q->gen; 1708 gen = q->gen;
1765 q->in_use += ndesc; 1709 q->in_use += ndesc;
1766 pidx = q->pidx; 1710 pidx = q->pidx;
1767 q->pidx += ndesc; 1711 q->pidx += ndesc;
1768 written += ndesc;
1769 if (q->pidx >= q->size) { 1712 if (q->pidx >= q->size) {
1770 q->pidx -= q->size; 1713 q->pidx -= q->size;
1771 q->gen ^= 1; 1714 q->gen ^= 1;
@@ -1773,8 +1716,7 @@ again: reclaim_completed_tx(adap, q, TX_RECLAIM_CHUNK);
1773 __skb_unlink(skb, &q->sendq); 1716 __skb_unlink(skb, &q->sendq);
1774 spin_unlock(&q->lock); 1717 spin_unlock(&q->lock);
1775 1718
1776 write_ofld_wr(adap, skb, q, pidx, gen, ndesc, 1719 write_ofld_wr(adap, skb, q, pidx, gen, ndesc);
1777 (dma_addr_t *)skb->head);
1778 spin_lock(&q->lock); 1720 spin_lock(&q->lock);
1779 } 1721 }
1780 spin_unlock(&q->lock); 1722 spin_unlock(&q->lock);
@@ -1784,9 +1726,8 @@ again: reclaim_completed_tx(adap, q, TX_RECLAIM_CHUNK);
1784 set_bit(TXQ_LAST_PKT_DB, &q->flags); 1726 set_bit(TXQ_LAST_PKT_DB, &q->flags);
1785#endif 1727#endif
1786 wmb(); 1728 wmb();
1787 if (likely(written)) 1729 t3_write_reg(adap, A_SG_KDOORBELL,
1788 t3_write_reg(adap, A_SG_KDOORBELL, 1730 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1789 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1790} 1731}
1791 1732
1792/** 1733/**
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index 6e6e0a117ee2..8ec5d74ad44d 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -3048,6 +3048,9 @@ int be_cmd_get_func_config(struct be_adapter *adapter)
3048 3048
3049 adapter->max_event_queues = le16_to_cpu(desc->eq_count); 3049 adapter->max_event_queues = le16_to_cpu(desc->eq_count);
3050 adapter->if_cap_flags = le32_to_cpu(desc->cap_flags); 3050 adapter->if_cap_flags = le32_to_cpu(desc->cap_flags);
3051
3052 /* Clear flags that driver is not interested in */
3053 adapter->if_cap_flags &= BE_IF_CAP_FLAGS_WANT;
3051 } 3054 }
3052err: 3055err:
3053 mutex_unlock(&adapter->mbox_lock); 3056 mutex_unlock(&adapter->mbox_lock);
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
index 5228d88c5a02..1b3b9e886412 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
@@ -563,6 +563,12 @@ enum be_if_flags {
563 BE_IF_FLAGS_MULTICAST = 0x1000 563 BE_IF_FLAGS_MULTICAST = 0x1000
564}; 564};
565 565
566#define BE_IF_CAP_FLAGS_WANT (BE_IF_FLAGS_RSS | BE_IF_FLAGS_PROMISCUOUS |\
567 BE_IF_FLAGS_BROADCAST | BE_IF_FLAGS_VLAN_PROMISCUOUS |\
568 BE_IF_FLAGS_VLAN | BE_IF_FLAGS_MCAST_PROMISCUOUS |\
569 BE_IF_FLAGS_PASS_L3L4_ERRORS | BE_IF_FLAGS_MULTICAST |\
570 BE_IF_FLAGS_UNTAGGED)
571
566/* An RX interface is an object with one or more MAC addresses and 572/* An RX interface is an object with one or more MAC addresses and
567 * filtering capabilities. */ 573 * filtering capabilities. */
568struct be_cmd_req_if_create { 574struct be_cmd_req_if_create {
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 181edb522450..4559c35eea13 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -2563,8 +2563,8 @@ static int be_close(struct net_device *netdev)
2563 /* Wait for all pending tx completions to arrive so that 2563 /* Wait for all pending tx completions to arrive so that
2564 * all tx skbs are freed. 2564 * all tx skbs are freed.
2565 */ 2565 */
2566 be_tx_compl_clean(adapter);
2567 netif_tx_disable(netdev); 2566 netif_tx_disable(netdev);
2567 be_tx_compl_clean(adapter);
2568 2568
2569 be_rx_qs_destroy(adapter); 2569 be_rx_qs_destroy(adapter);
2570 2570
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index 2b0a0ea4f8e7..ae236009f1a8 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -259,6 +259,7 @@ struct bufdesc_ex {
259struct fec_enet_delayed_work { 259struct fec_enet_delayed_work {
260 struct delayed_work delay_work; 260 struct delayed_work delay_work;
261 bool timeout; 261 bool timeout;
262 bool trig_tx;
262}; 263};
263 264
264/* The FEC buffer descriptors track the ring buffers. The rx_bd_base and 265/* The FEC buffer descriptors track the ring buffers. The rx_bd_base and
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index d3ad5ea711d3..77ea0db0bbfc 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -93,6 +93,20 @@ static void set_multicast_list(struct net_device *ndev);
93#define FEC_QUIRK_HAS_CSUM (1 << 5) 93#define FEC_QUIRK_HAS_CSUM (1 << 5)
94/* Controller has hardware vlan support */ 94/* Controller has hardware vlan support */
95#define FEC_QUIRK_HAS_VLAN (1 << 6) 95#define FEC_QUIRK_HAS_VLAN (1 << 6)
96/* ENET IP errata ERR006358
97 *
98 * If the ready bit in the transmit buffer descriptor (TxBD[R]) is previously
99 * detected as not set during a prior frame transmission, then the
100 * ENET_TDAR[TDAR] bit is cleared at a later time, even if additional TxBDs
101 * were added to the ring and the ENET_TDAR[TDAR] bit is set. This results in
102 * If the ready bit in the transmit buffer descriptor (TxBD[R]) is previously
103 * detected as not set during a prior frame transmission, then the
104 * ENET_TDAR[TDAR] bit is cleared at a later time, even if additional TxBDs
105 * were added to the ring and the ENET_TDAR[TDAR] bit is set. This results in
106 * frames not being transmitted until there is a 0-to-1 transition on
107 * ENET_TDAR[TDAR].
108 */
109#define FEC_QUIRK_ERR006358 (1 << 7)
96 110
97static struct platform_device_id fec_devtype[] = { 111static struct platform_device_id fec_devtype[] = {
98 { 112 {
@@ -112,7 +126,7 @@ static struct platform_device_id fec_devtype[] = {
112 .name = "imx6q-fec", 126 .name = "imx6q-fec",
113 .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT | 127 .driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
114 FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM | 128 FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
115 FEC_QUIRK_HAS_VLAN, 129 FEC_QUIRK_HAS_VLAN | FEC_QUIRK_ERR006358,
116 }, { 130 }, {
117 .name = "mvf600-fec", 131 .name = "mvf600-fec",
118 .driver_data = FEC_QUIRK_ENET_MAC, 132 .driver_data = FEC_QUIRK_ENET_MAC,
@@ -275,16 +289,11 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
275 struct fec_enet_private *fep = netdev_priv(ndev); 289 struct fec_enet_private *fep = netdev_priv(ndev);
276 const struct platform_device_id *id_entry = 290 const struct platform_device_id *id_entry =
277 platform_get_device_id(fep->pdev); 291 platform_get_device_id(fep->pdev);
278 struct bufdesc *bdp; 292 struct bufdesc *bdp, *bdp_pre;
279 void *bufaddr; 293 void *bufaddr;
280 unsigned short status; 294 unsigned short status;
281 unsigned int index; 295 unsigned int index;
282 296
283 if (!fep->link) {
284 /* Link is down or auto-negotiation is in progress. */
285 return NETDEV_TX_BUSY;
286 }
287
288 /* Fill in a Tx ring entry */ 297 /* Fill in a Tx ring entry */
289 bdp = fep->cur_tx; 298 bdp = fep->cur_tx;
290 299
@@ -370,6 +379,15 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
370 ebdp->cbd_esc |= BD_ENET_TX_PINS; 379 ebdp->cbd_esc |= BD_ENET_TX_PINS;
371 } 380 }
372 } 381 }
382
383 bdp_pre = fec_enet_get_prevdesc(bdp, fep->bufdesc_ex);
384 if ((id_entry->driver_data & FEC_QUIRK_ERR006358) &&
385 !(bdp_pre->cbd_sc & BD_ENET_TX_READY)) {
386 fep->delay_work.trig_tx = true;
387 schedule_delayed_work(&(fep->delay_work.delay_work),
388 msecs_to_jiffies(1));
389 }
390
373 /* If this was the last BD in the ring, start at the beginning again. */ 391 /* If this was the last BD in the ring, start at the beginning again. */
374 if (status & BD_ENET_TX_WRAP) 392 if (status & BD_ENET_TX_WRAP)
375 bdp = fep->tx_bd_base; 393 bdp = fep->tx_bd_base;
@@ -689,6 +707,11 @@ static void fec_enet_work(struct work_struct *work)
689 fec_restart(fep->netdev, fep->full_duplex); 707 fec_restart(fep->netdev, fep->full_duplex);
690 netif_wake_queue(fep->netdev); 708 netif_wake_queue(fep->netdev);
691 } 709 }
710
711 if (fep->delay_work.trig_tx) {
712 fep->delay_work.trig_tx = false;
713 writel(0, fep->hwp + FEC_X_DES_ACTIVE);
714 }
692} 715}
693 716
694static void 717static void
@@ -2279,4 +2302,5 @@ static struct platform_driver fec_driver = {
2279 2302
2280module_platform_driver(fec_driver); 2303module_platform_driver(fec_driver);
2281 2304
2305MODULE_ALIAS("platform:"DRIVER_NAME);
2282MODULE_LICENSE("GPL"); 2306MODULE_LICENSE("GPL");
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 6a0c1b66ce54..c1d72c03cb59 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -3739,9 +3739,8 @@ static void igb_set_rx_mode(struct net_device *netdev)
3739 rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_VFE); 3739 rctl &= ~(E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_VFE);
3740 3740
3741 if (netdev->flags & IFF_PROMISC) { 3741 if (netdev->flags & IFF_PROMISC) {
3742 u32 mrqc = rd32(E1000_MRQC);
3743 /* retain VLAN HW filtering if in VT mode */ 3742 /* retain VLAN HW filtering if in VT mode */
3744 if (mrqc & E1000_MRQC_ENABLE_VMDQ) 3743 if (adapter->vfs_allocated_count)
3745 rctl |= E1000_RCTL_VFE; 3744 rctl |= E1000_RCTL_VFE;
3746 rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE); 3745 rctl |= (E1000_RCTL_UPE | E1000_RCTL_MPE);
3747 vmolr |= (E1000_VMOLR_ROPE | E1000_VMOLR_MPME); 3746 vmolr |= (E1000_VMOLR_ROPE | E1000_VMOLR_MPME);
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index 7be725cdfea8..a6494e5daffe 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -54,7 +54,7 @@
54 54
55#include <net/busy_poll.h> 55#include <net/busy_poll.h>
56 56
57#ifdef CONFIG_NET_LL_RX_POLL 57#ifdef CONFIG_NET_RX_BUSY_POLL
58#define LL_EXTENDED_STATS 58#define LL_EXTENDED_STATS
59#endif 59#endif
60/* common prefix used by pr_<> macros */ 60/* common prefix used by pr_<> macros */
@@ -366,7 +366,7 @@ struct ixgbe_q_vector {
366 struct rcu_head rcu; /* to avoid race with update stats on free */ 366 struct rcu_head rcu; /* to avoid race with update stats on free */
367 char name[IFNAMSIZ + 9]; 367 char name[IFNAMSIZ + 9];
368 368
369#ifdef CONFIG_NET_LL_RX_POLL 369#ifdef CONFIG_NET_RX_BUSY_POLL
370 unsigned int state; 370 unsigned int state;
371#define IXGBE_QV_STATE_IDLE 0 371#define IXGBE_QV_STATE_IDLE 0
372#define IXGBE_QV_STATE_NAPI 1 /* NAPI owns this QV */ 372#define IXGBE_QV_STATE_NAPI 1 /* NAPI owns this QV */
@@ -377,12 +377,12 @@ struct ixgbe_q_vector {
377#define IXGBE_QV_YIELD (IXGBE_QV_STATE_NAPI_YIELD | IXGBE_QV_STATE_POLL_YIELD) 377#define IXGBE_QV_YIELD (IXGBE_QV_STATE_NAPI_YIELD | IXGBE_QV_STATE_POLL_YIELD)
378#define IXGBE_QV_USER_PEND (IXGBE_QV_STATE_POLL | IXGBE_QV_STATE_POLL_YIELD) 378#define IXGBE_QV_USER_PEND (IXGBE_QV_STATE_POLL | IXGBE_QV_STATE_POLL_YIELD)
379 spinlock_t lock; 379 spinlock_t lock;
380#endif /* CONFIG_NET_LL_RX_POLL */ 380#endif /* CONFIG_NET_RX_BUSY_POLL */
381 381
382 /* for dynamic allocation of rings associated with this q_vector */ 382 /* for dynamic allocation of rings associated with this q_vector */
383 struct ixgbe_ring ring[0] ____cacheline_internodealigned_in_smp; 383 struct ixgbe_ring ring[0] ____cacheline_internodealigned_in_smp;
384}; 384};
385#ifdef CONFIG_NET_LL_RX_POLL 385#ifdef CONFIG_NET_RX_BUSY_POLL
386static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) 386static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector)
387{ 387{
388 388
@@ -462,7 +462,7 @@ static inline bool ixgbe_qv_ll_polling(struct ixgbe_q_vector *q_vector)
462 WARN_ON(!(q_vector->state & IXGBE_QV_LOCKED)); 462 WARN_ON(!(q_vector->state & IXGBE_QV_LOCKED));
463 return q_vector->state & IXGBE_QV_USER_PEND; 463 return q_vector->state & IXGBE_QV_USER_PEND;
464} 464}
465#else /* CONFIG_NET_LL_RX_POLL */ 465#else /* CONFIG_NET_RX_BUSY_POLL */
466static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) 466static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector)
467{ 467{
468} 468}
@@ -491,7 +491,7 @@ static inline bool ixgbe_qv_ll_polling(struct ixgbe_q_vector *q_vector)
491{ 491{
492 return false; 492 return false;
493} 493}
494#endif /* CONFIG_NET_LL_RX_POLL */ 494#endif /* CONFIG_NET_RX_BUSY_POLL */
495 495
496#ifdef CONFIG_IXGBE_HWMON 496#ifdef CONFIG_IXGBE_HWMON
497 497
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c
index ac780770863d..7a77f37a7cbc 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_dcb_82598.c
@@ -108,9 +108,8 @@ s32 ixgbe_dcb_config_tx_desc_arbiter_82598(struct ixgbe_hw *hw,
108 108
109 /* Enable arbiter */ 109 /* Enable arbiter */
110 reg &= ~IXGBE_DPMCS_ARBDIS; 110 reg &= ~IXGBE_DPMCS_ARBDIS;
111 /* Enable DFP and Recycle mode */
112 reg |= (IXGBE_DPMCS_TDPAC | IXGBE_DPMCS_TRM);
113 reg |= IXGBE_DPMCS_TSOEF; 111 reg |= IXGBE_DPMCS_TSOEF;
112
114 /* Configure Max TSO packet size 34KB including payload and headers */ 113 /* Configure Max TSO packet size 34KB including payload and headers */
115 reg |= (0x4 << IXGBE_DPMCS_MTSOS_SHIFT); 114 reg |= (0x4 << IXGBE_DPMCS_MTSOS_SHIFT);
116 115
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index bad8f14b1941..be4b1fb3d0d2 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -1998,7 +1998,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
1998 return total_rx_packets; 1998 return total_rx_packets;
1999} 1999}
2000 2000
2001#ifdef CONFIG_NET_LL_RX_POLL 2001#ifdef CONFIG_NET_RX_BUSY_POLL
2002/* must be called with local_bh_disable()d */ 2002/* must be called with local_bh_disable()d */
2003static int ixgbe_low_latency_recv(struct napi_struct *napi) 2003static int ixgbe_low_latency_recv(struct napi_struct *napi)
2004{ 2004{
@@ -2030,7 +2030,7 @@ static int ixgbe_low_latency_recv(struct napi_struct *napi)
2030 2030
2031 return found; 2031 return found;
2032} 2032}
2033#endif /* CONFIG_NET_LL_RX_POLL */ 2033#endif /* CONFIG_NET_RX_BUSY_POLL */
2034 2034
2035/** 2035/**
2036 * ixgbe_configure_msix - Configure MSI-X hardware 2036 * ixgbe_configure_msix - Configure MSI-X hardware
@@ -7227,7 +7227,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
7227#ifdef CONFIG_NET_POLL_CONTROLLER 7227#ifdef CONFIG_NET_POLL_CONTROLLER
7228 .ndo_poll_controller = ixgbe_netpoll, 7228 .ndo_poll_controller = ixgbe_netpoll,
7229#endif 7229#endif
7230#ifdef CONFIG_NET_LL_RX_POLL 7230#ifdef CONFIG_NET_RX_BUSY_POLL
7231 .ndo_busy_poll = ixgbe_low_latency_recv, 7231 .ndo_busy_poll = ixgbe_low_latency_recv,
7232#endif 7232#endif
7233#ifdef IXGBE_FCOE 7233#ifdef IXGBE_FCOE
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index 712779fb12b7..b017818bccae 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -88,6 +88,8 @@
88#define MVNETA_TX_IN_PRGRS BIT(1) 88#define MVNETA_TX_IN_PRGRS BIT(1)
89#define MVNETA_TX_FIFO_EMPTY BIT(8) 89#define MVNETA_TX_FIFO_EMPTY BIT(8)
90#define MVNETA_RX_MIN_FRAME_SIZE 0x247c 90#define MVNETA_RX_MIN_FRAME_SIZE 0x247c
91#define MVNETA_SGMII_SERDES_CFG 0x24A0
92#define MVNETA_SGMII_SERDES_PROTO 0x0cc7
91#define MVNETA_TYPE_PRIO 0x24bc 93#define MVNETA_TYPE_PRIO 0x24bc
92#define MVNETA_FORCE_UNI BIT(21) 94#define MVNETA_FORCE_UNI BIT(21)
93#define MVNETA_TXQ_CMD_1 0x24e4 95#define MVNETA_TXQ_CMD_1 0x24e4
@@ -655,6 +657,8 @@ static void mvneta_port_sgmii_config(struct mvneta_port *pp)
655 val = mvreg_read(pp, MVNETA_GMAC_CTRL_2); 657 val = mvreg_read(pp, MVNETA_GMAC_CTRL_2);
656 val |= MVNETA_GMAC2_PSC_ENABLE; 658 val |= MVNETA_GMAC2_PSC_ENABLE;
657 mvreg_write(pp, MVNETA_GMAC_CTRL_2, val); 659 mvreg_write(pp, MVNETA_GMAC_CTRL_2, val);
660
661 mvreg_write(pp, MVNETA_SGMII_SERDES_CFG, MVNETA_SGMII_SERDES_PROTO);
658} 662}
659 663
660/* Start the Ethernet port RX and TX activity */ 664/* Start the Ethernet port RX and TX activity */
@@ -2728,28 +2732,24 @@ static int mvneta_probe(struct platform_device *pdev)
2728 2732
2729 pp = netdev_priv(dev); 2733 pp = netdev_priv(dev);
2730 2734
2731 pp->tx_done_timer.function = mvneta_tx_done_timer_callback;
2732 init_timer(&pp->tx_done_timer);
2733 clear_bit(MVNETA_F_TX_DONE_TIMER_BIT, &pp->flags);
2734
2735 pp->weight = MVNETA_RX_POLL_WEIGHT; 2735 pp->weight = MVNETA_RX_POLL_WEIGHT;
2736 pp->phy_node = phy_node; 2736 pp->phy_node = phy_node;
2737 pp->phy_interface = phy_mode; 2737 pp->phy_interface = phy_mode;
2738 2738
2739 pp->base = of_iomap(dn, 0);
2740 if (pp->base == NULL) {
2741 err = -ENOMEM;
2742 goto err_free_irq;
2743 }
2744
2745 pp->clk = devm_clk_get(&pdev->dev, NULL); 2739 pp->clk = devm_clk_get(&pdev->dev, NULL);
2746 if (IS_ERR(pp->clk)) { 2740 if (IS_ERR(pp->clk)) {
2747 err = PTR_ERR(pp->clk); 2741 err = PTR_ERR(pp->clk);
2748 goto err_unmap; 2742 goto err_free_irq;
2749 } 2743 }
2750 2744
2751 clk_prepare_enable(pp->clk); 2745 clk_prepare_enable(pp->clk);
2752 2746
2747 pp->base = of_iomap(dn, 0);
2748 if (pp->base == NULL) {
2749 err = -ENOMEM;
2750 goto err_clk;
2751 }
2752
2753 dt_mac_addr = of_get_mac_address(dn); 2753 dt_mac_addr = of_get_mac_address(dn);
2754 if (dt_mac_addr && is_valid_ether_addr(dt_mac_addr)) { 2754 if (dt_mac_addr && is_valid_ether_addr(dt_mac_addr)) {
2755 mac_from = "device tree"; 2755 mac_from = "device tree";
@@ -2766,6 +2766,9 @@ static int mvneta_probe(struct platform_device *pdev)
2766 } 2766 }
2767 2767
2768 pp->tx_done_timer.data = (unsigned long)dev; 2768 pp->tx_done_timer.data = (unsigned long)dev;
2769 pp->tx_done_timer.function = mvneta_tx_done_timer_callback;
2770 init_timer(&pp->tx_done_timer);
2771 clear_bit(MVNETA_F_TX_DONE_TIMER_BIT, &pp->flags);
2769 2772
2770 pp->tx_ring_size = MVNETA_MAX_TXD; 2773 pp->tx_ring_size = MVNETA_MAX_TXD;
2771 pp->rx_ring_size = MVNETA_MAX_RXD; 2774 pp->rx_ring_size = MVNETA_MAX_RXD;
@@ -2776,7 +2779,7 @@ static int mvneta_probe(struct platform_device *pdev)
2776 err = mvneta_init(pp, phy_addr); 2779 err = mvneta_init(pp, phy_addr);
2777 if (err < 0) { 2780 if (err < 0) {
2778 dev_err(&pdev->dev, "can't init eth hal\n"); 2781 dev_err(&pdev->dev, "can't init eth hal\n");
2779 goto err_clk; 2782 goto err_unmap;
2780 } 2783 }
2781 mvneta_port_power_up(pp, phy_mode); 2784 mvneta_port_power_up(pp, phy_mode);
2782 2785
@@ -2806,10 +2809,10 @@ static int mvneta_probe(struct platform_device *pdev)
2806 2809
2807err_deinit: 2810err_deinit:
2808 mvneta_deinit(pp); 2811 mvneta_deinit(pp);
2809err_clk:
2810 clk_disable_unprepare(pp->clk);
2811err_unmap: 2812err_unmap:
2812 iounmap(pp->base); 2813 iounmap(pp->base);
2814err_clk:
2815 clk_disable_unprepare(pp->clk);
2813err_free_irq: 2816err_free_irq:
2814 irq_dispose_mapping(dev->irq); 2817 irq_dispose_mapping(dev->irq);
2815err_free_netdev: 2818err_free_netdev:
diff --git a/drivers/net/ethernet/marvell/skge.c b/drivers/net/ethernet/marvell/skge.c
index c896079728e1..ef94a591f9e5 100644
--- a/drivers/net/ethernet/marvell/skge.c
+++ b/drivers/net/ethernet/marvell/skge.c
@@ -931,17 +931,20 @@ static int skge_ring_alloc(struct skge_ring *ring, void *vaddr, u32 base)
931} 931}
932 932
933/* Allocate and setup a new buffer for receiving */ 933/* Allocate and setup a new buffer for receiving */
934static void skge_rx_setup(struct skge_port *skge, struct skge_element *e, 934static int skge_rx_setup(struct skge_port *skge, struct skge_element *e,
935 struct sk_buff *skb, unsigned int bufsize) 935 struct sk_buff *skb, unsigned int bufsize)
936{ 936{
937 struct skge_rx_desc *rd = e->desc; 937 struct skge_rx_desc *rd = e->desc;
938 u64 map; 938 dma_addr_t map;
939 939
940 map = pci_map_single(skge->hw->pdev, skb->data, bufsize, 940 map = pci_map_single(skge->hw->pdev, skb->data, bufsize,
941 PCI_DMA_FROMDEVICE); 941 PCI_DMA_FROMDEVICE);
942 942
943 rd->dma_lo = map; 943 if (pci_dma_mapping_error(skge->hw->pdev, map))
944 rd->dma_hi = map >> 32; 944 return -1;
945
946 rd->dma_lo = lower_32_bits(map);
947 rd->dma_hi = upper_32_bits(map);
945 e->skb = skb; 948 e->skb = skb;
946 rd->csum1_start = ETH_HLEN; 949 rd->csum1_start = ETH_HLEN;
947 rd->csum2_start = ETH_HLEN; 950 rd->csum2_start = ETH_HLEN;
@@ -953,6 +956,7 @@ static void skge_rx_setup(struct skge_port *skge, struct skge_element *e,
953 rd->control = BMU_OWN | BMU_STF | BMU_IRQ_EOF | BMU_TCP_CHECK | bufsize; 956 rd->control = BMU_OWN | BMU_STF | BMU_IRQ_EOF | BMU_TCP_CHECK | bufsize;
954 dma_unmap_addr_set(e, mapaddr, map); 957 dma_unmap_addr_set(e, mapaddr, map);
955 dma_unmap_len_set(e, maplen, bufsize); 958 dma_unmap_len_set(e, maplen, bufsize);
959 return 0;
956} 960}
957 961
958/* Resume receiving using existing skb, 962/* Resume receiving using existing skb,
@@ -1014,7 +1018,10 @@ static int skge_rx_fill(struct net_device *dev)
1014 return -ENOMEM; 1018 return -ENOMEM;
1015 1019
1016 skb_reserve(skb, NET_IP_ALIGN); 1020 skb_reserve(skb, NET_IP_ALIGN);
1017 skge_rx_setup(skge, e, skb, skge->rx_buf_size); 1021 if (skge_rx_setup(skge, e, skb, skge->rx_buf_size) < 0) {
1022 dev_kfree_skb(skb);
1023 return -EIO;
1024 }
1018 } while ((e = e->next) != ring->start); 1025 } while ((e = e->next) != ring->start);
1019 1026
1020 ring->to_clean = ring->start; 1027 ring->to_clean = ring->start;
@@ -2544,7 +2551,7 @@ static int skge_up(struct net_device *dev)
2544 2551
2545 BUG_ON(skge->dma & 7); 2552 BUG_ON(skge->dma & 7);
2546 2553
2547 if ((u64)skge->dma >> 32 != ((u64) skge->dma + skge->mem_size) >> 32) { 2554 if (upper_32_bits(skge->dma) != upper_32_bits(skge->dma + skge->mem_size)) {
2548 dev_err(&hw->pdev->dev, "pci_alloc_consistent region crosses 4G boundary\n"); 2555 dev_err(&hw->pdev->dev, "pci_alloc_consistent region crosses 4G boundary\n");
2549 err = -EINVAL; 2556 err = -EINVAL;
2550 goto free_pci_mem; 2557 goto free_pci_mem;
@@ -2729,7 +2736,7 @@ static netdev_tx_t skge_xmit_frame(struct sk_buff *skb,
2729 struct skge_tx_desc *td; 2736 struct skge_tx_desc *td;
2730 int i; 2737 int i;
2731 u32 control, len; 2738 u32 control, len;
2732 u64 map; 2739 dma_addr_t map;
2733 2740
2734 if (skb_padto(skb, ETH_ZLEN)) 2741 if (skb_padto(skb, ETH_ZLEN))
2735 return NETDEV_TX_OK; 2742 return NETDEV_TX_OK;
@@ -2743,11 +2750,14 @@ static netdev_tx_t skge_xmit_frame(struct sk_buff *skb,
2743 e->skb = skb; 2750 e->skb = skb;
2744 len = skb_headlen(skb); 2751 len = skb_headlen(skb);
2745 map = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE); 2752 map = pci_map_single(hw->pdev, skb->data, len, PCI_DMA_TODEVICE);
2753 if (pci_dma_mapping_error(hw->pdev, map))
2754 goto mapping_error;
2755
2746 dma_unmap_addr_set(e, mapaddr, map); 2756 dma_unmap_addr_set(e, mapaddr, map);
2747 dma_unmap_len_set(e, maplen, len); 2757 dma_unmap_len_set(e, maplen, len);
2748 2758
2749 td->dma_lo = map; 2759 td->dma_lo = lower_32_bits(map);
2750 td->dma_hi = map >> 32; 2760 td->dma_hi = upper_32_bits(map);
2751 2761
2752 if (skb->ip_summed == CHECKSUM_PARTIAL) { 2762 if (skb->ip_summed == CHECKSUM_PARTIAL) {
2753 const int offset = skb_checksum_start_offset(skb); 2763 const int offset = skb_checksum_start_offset(skb);
@@ -2778,14 +2788,16 @@ static netdev_tx_t skge_xmit_frame(struct sk_buff *skb,
2778 2788
2779 map = skb_frag_dma_map(&hw->pdev->dev, frag, 0, 2789 map = skb_frag_dma_map(&hw->pdev->dev, frag, 0,
2780 skb_frag_size(frag), DMA_TO_DEVICE); 2790 skb_frag_size(frag), DMA_TO_DEVICE);
2791 if (dma_mapping_error(&hw->pdev->dev, map))
2792 goto mapping_unwind;
2781 2793
2782 e = e->next; 2794 e = e->next;
2783 e->skb = skb; 2795 e->skb = skb;
2784 tf = e->desc; 2796 tf = e->desc;
2785 BUG_ON(tf->control & BMU_OWN); 2797 BUG_ON(tf->control & BMU_OWN);
2786 2798
2787 tf->dma_lo = map; 2799 tf->dma_lo = lower_32_bits(map);
2788 tf->dma_hi = (u64) map >> 32; 2800 tf->dma_hi = upper_32_bits(map);
2789 dma_unmap_addr_set(e, mapaddr, map); 2801 dma_unmap_addr_set(e, mapaddr, map);
2790 dma_unmap_len_set(e, maplen, skb_frag_size(frag)); 2802 dma_unmap_len_set(e, maplen, skb_frag_size(frag));
2791 2803
@@ -2815,6 +2827,26 @@ static netdev_tx_t skge_xmit_frame(struct sk_buff *skb,
2815 } 2827 }
2816 2828
2817 return NETDEV_TX_OK; 2829 return NETDEV_TX_OK;
2830
2831mapping_unwind:
2832 e = skge->tx_ring.to_use;
2833 pci_unmap_single(hw->pdev,
2834 dma_unmap_addr(e, mapaddr),
2835 dma_unmap_len(e, maplen),
2836 PCI_DMA_TODEVICE);
2837 while (i-- > 0) {
2838 e = e->next;
2839 pci_unmap_page(hw->pdev,
2840 dma_unmap_addr(e, mapaddr),
2841 dma_unmap_len(e, maplen),
2842 PCI_DMA_TODEVICE);
2843 }
2844
2845mapping_error:
2846 if (net_ratelimit())
2847 dev_warn(&hw->pdev->dev, "%s: tx mapping error\n", dev->name);
2848 dev_kfree_skb(skb);
2849 return NETDEV_TX_OK;
2818} 2850}
2819 2851
2820 2852
@@ -3045,11 +3077,13 @@ static struct sk_buff *skge_rx_get(struct net_device *dev,
3045 3077
3046 pci_dma_sync_single_for_cpu(skge->hw->pdev, 3078 pci_dma_sync_single_for_cpu(skge->hw->pdev,
3047 dma_unmap_addr(e, mapaddr), 3079 dma_unmap_addr(e, mapaddr),
3048 len, PCI_DMA_FROMDEVICE); 3080 dma_unmap_len(e, maplen),
3081 PCI_DMA_FROMDEVICE);
3049 skb_copy_from_linear_data(e->skb, skb->data, len); 3082 skb_copy_from_linear_data(e->skb, skb->data, len);
3050 pci_dma_sync_single_for_device(skge->hw->pdev, 3083 pci_dma_sync_single_for_device(skge->hw->pdev,
3051 dma_unmap_addr(e, mapaddr), 3084 dma_unmap_addr(e, mapaddr),
3052 len, PCI_DMA_FROMDEVICE); 3085 dma_unmap_len(e, maplen),
3086 PCI_DMA_FROMDEVICE);
3053 skge_rx_reuse(e, skge->rx_buf_size); 3087 skge_rx_reuse(e, skge->rx_buf_size);
3054 } else { 3088 } else {
3055 struct sk_buff *nskb; 3089 struct sk_buff *nskb;
@@ -3058,13 +3092,17 @@ static struct sk_buff *skge_rx_get(struct net_device *dev,
3058 if (!nskb) 3092 if (!nskb)
3059 goto resubmit; 3093 goto resubmit;
3060 3094
3095 if (skge_rx_setup(skge, e, nskb, skge->rx_buf_size) < 0) {
3096 dev_kfree_skb(nskb);
3097 goto resubmit;
3098 }
3099
3061 pci_unmap_single(skge->hw->pdev, 3100 pci_unmap_single(skge->hw->pdev,
3062 dma_unmap_addr(e, mapaddr), 3101 dma_unmap_addr(e, mapaddr),
3063 dma_unmap_len(e, maplen), 3102 dma_unmap_len(e, maplen),
3064 PCI_DMA_FROMDEVICE); 3103 PCI_DMA_FROMDEVICE);
3065 skb = e->skb; 3104 skb = e->skb;
3066 prefetch(skb->data); 3105 prefetch(skb->data);
3067 skge_rx_setup(skge, e, nskb, skge->rx_buf_size);
3068 } 3106 }
3069 3107
3070 skb_put(skb, len); 3108 skb_put(skb, len);
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index 727874f575ce..a28cd801a236 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -223,7 +223,7 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset)
223 case ETH_SS_STATS: 223 case ETH_SS_STATS:
224 return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) + 224 return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) +
225 (priv->tx_ring_num * 2) + 225 (priv->tx_ring_num * 2) +
226#ifdef CONFIG_NET_LL_RX_POLL 226#ifdef CONFIG_NET_RX_BUSY_POLL
227 (priv->rx_ring_num * 5); 227 (priv->rx_ring_num * 5);
228#else 228#else
229 (priv->rx_ring_num * 2); 229 (priv->rx_ring_num * 2);
@@ -276,7 +276,7 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
276 for (i = 0; i < priv->rx_ring_num; i++) { 276 for (i = 0; i < priv->rx_ring_num; i++) {
277 data[index++] = priv->rx_ring[i].packets; 277 data[index++] = priv->rx_ring[i].packets;
278 data[index++] = priv->rx_ring[i].bytes; 278 data[index++] = priv->rx_ring[i].bytes;
279#ifdef CONFIG_NET_LL_RX_POLL 279#ifdef CONFIG_NET_RX_BUSY_POLL
280 data[index++] = priv->rx_ring[i].yields; 280 data[index++] = priv->rx_ring[i].yields;
281 data[index++] = priv->rx_ring[i].misses; 281 data[index++] = priv->rx_ring[i].misses;
282 data[index++] = priv->rx_ring[i].cleaned; 282 data[index++] = priv->rx_ring[i].cleaned;
@@ -344,7 +344,7 @@ static void mlx4_en_get_strings(struct net_device *dev,
344 "rx%d_packets", i); 344 "rx%d_packets", i);
345 sprintf(data + (index++) * ETH_GSTRING_LEN, 345 sprintf(data + (index++) * ETH_GSTRING_LEN,
346 "rx%d_bytes", i); 346 "rx%d_bytes", i);
347#ifdef CONFIG_NET_LL_RX_POLL 347#ifdef CONFIG_NET_RX_BUSY_POLL
348 sprintf(data + (index++) * ETH_GSTRING_LEN, 348 sprintf(data + (index++) * ETH_GSTRING_LEN,
349 "rx%d_napi_yield", i); 349 "rx%d_napi_yield", i);
350 sprintf(data + (index++) * ETH_GSTRING_LEN, 350 sprintf(data + (index++) * ETH_GSTRING_LEN,
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 5eac871399d8..fa37b7a61213 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -68,7 +68,7 @@ int mlx4_en_setup_tc(struct net_device *dev, u8 up)
68 return 0; 68 return 0;
69} 69}
70 70
71#ifdef CONFIG_NET_LL_RX_POLL 71#ifdef CONFIG_NET_RX_BUSY_POLL
72/* must be called with local_bh_disable()d */ 72/* must be called with local_bh_disable()d */
73static int mlx4_en_low_latency_recv(struct napi_struct *napi) 73static int mlx4_en_low_latency_recv(struct napi_struct *napi)
74{ 74{
@@ -94,7 +94,7 @@ static int mlx4_en_low_latency_recv(struct napi_struct *napi)
94 94
95 return done; 95 return done;
96} 96}
97#endif /* CONFIG_NET_LL_RX_POLL */ 97#endif /* CONFIG_NET_RX_BUSY_POLL */
98 98
99#ifdef CONFIG_RFS_ACCEL 99#ifdef CONFIG_RFS_ACCEL
100 100
@@ -2140,7 +2140,7 @@ static const struct net_device_ops mlx4_netdev_ops = {
2140#ifdef CONFIG_RFS_ACCEL 2140#ifdef CONFIG_RFS_ACCEL
2141 .ndo_rx_flow_steer = mlx4_en_filter_rfs, 2141 .ndo_rx_flow_steer = mlx4_en_filter_rfs,
2142#endif 2142#endif
2143#ifdef CONFIG_NET_LL_RX_POLL 2143#ifdef CONFIG_NET_RX_BUSY_POLL
2144 .ndo_busy_poll = mlx4_en_low_latency_recv, 2144 .ndo_busy_poll = mlx4_en_low_latency_recv,
2145#endif 2145#endif
2146}; 2146};
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index 8873d6802c80..6fc6dabc78d5 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -845,16 +845,7 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
845 MLX4_CMD_NATIVE); 845 MLX4_CMD_NATIVE);
846 846
847 if (!err && dev->caps.function != slave) { 847 if (!err && dev->caps.function != slave) {
848 /* if config MAC in DB use it */ 848 def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac;
849 if (priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac)
850 def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac;
851 else {
852 /* set slave default_mac address */
853 MLX4_GET(def_mac, outbox->buf, QUERY_PORT_MAC_OFFSET);
854 def_mac += slave << 8;
855 priv->mfunc.master.vf_admin[slave].vport[vhcr->in_modifier].mac = def_mac;
856 }
857
858 MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET); 849 MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET);
859 850
860 /* get port type - currently only eth is enabled */ 851 /* get port type - currently only eth is enabled */
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index e85af922dcdc..36be3208786a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -371,7 +371,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
371 371
372 dev->caps.sqp_demux = (mlx4_is_master(dev)) ? MLX4_MAX_NUM_SLAVES : 0; 372 dev->caps.sqp_demux = (mlx4_is_master(dev)) ? MLX4_MAX_NUM_SLAVES : 0;
373 373
374 if (!enable_64b_cqe_eqe) { 374 if (!enable_64b_cqe_eqe && !mlx4_is_slave(dev)) {
375 if (dev_cap->flags & 375 if (dev_cap->flags &
376 (MLX4_DEV_CAP_FLAG_64B_CQE | MLX4_DEV_CAP_FLAG_64B_EQE)) { 376 (MLX4_DEV_CAP_FLAG_64B_CQE | MLX4_DEV_CAP_FLAG_64B_EQE)) {
377 mlx4_warn(dev, "64B EQEs/CQEs supported by the device but not enabled\n"); 377 mlx4_warn(dev, "64B EQEs/CQEs supported by the device but not enabled\n");
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index 35fb60e2320c..5e0aa569306a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -292,7 +292,7 @@ struct mlx4_en_rx_ring {
292 void *rx_info; 292 void *rx_info;
293 unsigned long bytes; 293 unsigned long bytes;
294 unsigned long packets; 294 unsigned long packets;
295#ifdef CONFIG_NET_LL_RX_POLL 295#ifdef CONFIG_NET_RX_BUSY_POLL
296 unsigned long yields; 296 unsigned long yields;
297 unsigned long misses; 297 unsigned long misses;
298 unsigned long cleaned; 298 unsigned long cleaned;
@@ -318,7 +318,7 @@ struct mlx4_en_cq {
318 struct mlx4_cqe *buf; 318 struct mlx4_cqe *buf;
319#define MLX4_EN_OPCODE_ERROR 0x1e 319#define MLX4_EN_OPCODE_ERROR 0x1e
320 320
321#ifdef CONFIG_NET_LL_RX_POLL 321#ifdef CONFIG_NET_RX_BUSY_POLL
322 unsigned int state; 322 unsigned int state;
323#define MLX4_EN_CQ_STATE_IDLE 0 323#define MLX4_EN_CQ_STATE_IDLE 0
324#define MLX4_EN_CQ_STATE_NAPI 1 /* NAPI owns this CQ */ 324#define MLX4_EN_CQ_STATE_NAPI 1 /* NAPI owns this CQ */
@@ -329,7 +329,7 @@ struct mlx4_en_cq {
329#define CQ_YIELD (MLX4_EN_CQ_STATE_NAPI_YIELD | MLX4_EN_CQ_STATE_POLL_YIELD) 329#define CQ_YIELD (MLX4_EN_CQ_STATE_NAPI_YIELD | MLX4_EN_CQ_STATE_POLL_YIELD)
330#define CQ_USER_PEND (MLX4_EN_CQ_STATE_POLL | MLX4_EN_CQ_STATE_POLL_YIELD) 330#define CQ_USER_PEND (MLX4_EN_CQ_STATE_POLL | MLX4_EN_CQ_STATE_POLL_YIELD)
331 spinlock_t poll_lock; /* protects from LLS/napi conflicts */ 331 spinlock_t poll_lock; /* protects from LLS/napi conflicts */
332#endif /* CONFIG_NET_LL_RX_POLL */ 332#endif /* CONFIG_NET_RX_BUSY_POLL */
333}; 333};
334 334
335struct mlx4_en_port_profile { 335struct mlx4_en_port_profile {
@@ -580,7 +580,7 @@ struct mlx4_mac_entry {
580 struct rcu_head rcu; 580 struct rcu_head rcu;
581}; 581};
582 582
583#ifdef CONFIG_NET_LL_RX_POLL 583#ifdef CONFIG_NET_RX_BUSY_POLL
584static inline void mlx4_en_cq_init_lock(struct mlx4_en_cq *cq) 584static inline void mlx4_en_cq_init_lock(struct mlx4_en_cq *cq)
585{ 585{
586 spin_lock_init(&cq->poll_lock); 586 spin_lock_init(&cq->poll_lock);
@@ -687,7 +687,7 @@ static inline bool mlx4_en_cq_ll_polling(struct mlx4_en_cq *cq)
687{ 687{
688 return false; 688 return false;
689} 689}
690#endif /* CONFIG_NET_LL_RX_POLL */ 690#endif /* CONFIG_NET_RX_BUSY_POLL */
691 691
692#define MLX4_EN_WOL_DO_MODIFY (1ULL << 63) 692#define MLX4_EN_WOL_DO_MODIFY (1ULL << 63)
693 693
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
index 205753a04cfc..5472cbd34028 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
@@ -46,7 +46,7 @@
46#include "mlx5_core.h" 46#include "mlx5_core.h"
47 47
48enum { 48enum {
49 CMD_IF_REV = 3, 49 CMD_IF_REV = 5,
50}; 50};
51 51
52enum { 52enum {
@@ -282,6 +282,12 @@ const char *mlx5_command_str(int command)
282 case MLX5_CMD_OP_TEARDOWN_HCA: 282 case MLX5_CMD_OP_TEARDOWN_HCA:
283 return "TEARDOWN_HCA"; 283 return "TEARDOWN_HCA";
284 284
285 case MLX5_CMD_OP_ENABLE_HCA:
286 return "MLX5_CMD_OP_ENABLE_HCA";
287
288 case MLX5_CMD_OP_DISABLE_HCA:
289 return "MLX5_CMD_OP_DISABLE_HCA";
290
285 case MLX5_CMD_OP_QUERY_PAGES: 291 case MLX5_CMD_OP_QUERY_PAGES:
286 return "QUERY_PAGES"; 292 return "QUERY_PAGES";
287 293
@@ -1113,7 +1119,13 @@ void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, unsigned long vector)
1113 1119
1114 for (i = 0; i < (1 << cmd->log_sz); i++) { 1120 for (i = 0; i < (1 << cmd->log_sz); i++) {
1115 if (test_bit(i, &vector)) { 1121 if (test_bit(i, &vector)) {
1122 struct semaphore *sem;
1123
1116 ent = cmd->ent_arr[i]; 1124 ent = cmd->ent_arr[i];
1125 if (ent->page_queue)
1126 sem = &cmd->pages_sem;
1127 else
1128 sem = &cmd->sem;
1117 ktime_get_ts(&ent->ts2); 1129 ktime_get_ts(&ent->ts2);
1118 memcpy(ent->out->first.data, ent->lay->out, sizeof(ent->lay->out)); 1130 memcpy(ent->out->first.data, ent->lay->out, sizeof(ent->lay->out));
1119 dump_command(dev, ent, 0); 1131 dump_command(dev, ent, 0);
@@ -1136,10 +1148,7 @@ void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, unsigned long vector)
1136 } else { 1148 } else {
1137 complete(&ent->done); 1149 complete(&ent->done);
1138 } 1150 }
1139 if (ent->page_queue) 1151 up(sem);
1140 up(&cmd->pages_sem);
1141 else
1142 up(&cmd->sem);
1143 } 1152 }
1144 } 1153 }
1145} 1154}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
index c02cbcfd0fb8..443cc4d7b024 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c
@@ -268,7 +268,7 @@ static int mlx5_eq_int(struct mlx5_core_dev *dev, struct mlx5_eq *eq)
268 case MLX5_EVENT_TYPE_PAGE_REQUEST: 268 case MLX5_EVENT_TYPE_PAGE_REQUEST:
269 { 269 {
270 u16 func_id = be16_to_cpu(eqe->data.req_pages.func_id); 270 u16 func_id = be16_to_cpu(eqe->data.req_pages.func_id);
271 s16 npages = be16_to_cpu(eqe->data.req_pages.num_pages); 271 s32 npages = be32_to_cpu(eqe->data.req_pages.num_pages);
272 272
273 mlx5_core_dbg(dev, "page request for func 0x%x, napges %d\n", func_id, npages); 273 mlx5_core_dbg(dev, "page request for func 0x%x, napges %d\n", func_id, npages);
274 mlx5_core_req_pages_handler(dev, func_id, npages); 274 mlx5_core_req_pages_handler(dev, func_id, npages);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fw.c b/drivers/net/ethernet/mellanox/mlx5/core/fw.c
index 72a5222447f5..f012658b6a92 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fw.c
@@ -113,7 +113,7 @@ int mlx5_cmd_query_hca_cap(struct mlx5_core_dev *dev,
113 caps->log_max_srq = out->hca_cap.log_max_srqs & 0x1f; 113 caps->log_max_srq = out->hca_cap.log_max_srqs & 0x1f;
114 caps->local_ca_ack_delay = out->hca_cap.local_ca_ack_delay & 0x1f; 114 caps->local_ca_ack_delay = out->hca_cap.local_ca_ack_delay & 0x1f;
115 caps->log_max_mcg = out->hca_cap.log_max_mcg; 115 caps->log_max_mcg = out->hca_cap.log_max_mcg;
116 caps->max_qp_mcg = be16_to_cpu(out->hca_cap.max_qp_mcg); 116 caps->max_qp_mcg = be32_to_cpu(out->hca_cap.max_qp_mcg) & 0xffffff;
117 caps->max_ra_res_qp = 1 << (out->hca_cap.log_max_ra_res_qp & 0x3f); 117 caps->max_ra_res_qp = 1 << (out->hca_cap.log_max_ra_res_qp & 0x3f);
118 caps->max_ra_req_qp = 1 << (out->hca_cap.log_max_ra_req_qp & 0x3f); 118 caps->max_ra_req_qp = 1 << (out->hca_cap.log_max_ra_req_qp & 0x3f);
119 caps->max_srq_wqes = 1 << out->hca_cap.log_max_srq_sz; 119 caps->max_srq_wqes = 1 << out->hca_cap.log_max_srq_sz;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/health.c b/drivers/net/ethernet/mellanox/mlx5/core/health.c
index 748f10a155c4..3e6670c4a7cd 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/health.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/health.c
@@ -55,33 +55,9 @@ enum {
55}; 55};
56 56
57static DEFINE_SPINLOCK(health_lock); 57static DEFINE_SPINLOCK(health_lock);
58
59static LIST_HEAD(health_list); 58static LIST_HEAD(health_list);
60static struct work_struct health_work; 59static struct work_struct health_work;
61 60
62static health_handler_t reg_handler;
63int mlx5_register_health_report_handler(health_handler_t handler)
64{
65 spin_lock_irq(&health_lock);
66 if (reg_handler) {
67 spin_unlock_irq(&health_lock);
68 return -EEXIST;
69 }
70 reg_handler = handler;
71 spin_unlock_irq(&health_lock);
72
73 return 0;
74}
75EXPORT_SYMBOL(mlx5_register_health_report_handler);
76
77void mlx5_unregister_health_report_handler(void)
78{
79 spin_lock_irq(&health_lock);
80 reg_handler = NULL;
81 spin_unlock_irq(&health_lock);
82}
83EXPORT_SYMBOL(mlx5_unregister_health_report_handler);
84
85static void health_care(struct work_struct *work) 61static void health_care(struct work_struct *work)
86{ 62{
87 struct mlx5_core_health *health, *n; 63 struct mlx5_core_health *health, *n;
@@ -98,11 +74,8 @@ static void health_care(struct work_struct *work)
98 priv = container_of(health, struct mlx5_priv, health); 74 priv = container_of(health, struct mlx5_priv, health);
99 dev = container_of(priv, struct mlx5_core_dev, priv); 75 dev = container_of(priv, struct mlx5_core_dev, priv);
100 mlx5_core_warn(dev, "handling bad device here\n"); 76 mlx5_core_warn(dev, "handling bad device here\n");
77 /* nothing yet */
101 spin_lock_irq(&health_lock); 78 spin_lock_irq(&health_lock);
102 if (reg_handler)
103 reg_handler(dev->pdev, health->health,
104 sizeof(health->health));
105
106 list_del_init(&health->list); 79 list_del_init(&health->list);
107 spin_unlock_irq(&health_lock); 80 spin_unlock_irq(&health_lock);
108 } 81 }
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
index 12242de2b0e3..b47739b0b5f6 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
@@ -249,6 +249,44 @@ static int set_hca_ctrl(struct mlx5_core_dev *dev)
249 return err; 249 return err;
250} 250}
251 251
252static int mlx5_core_enable_hca(struct mlx5_core_dev *dev)
253{
254 int err;
255 struct mlx5_enable_hca_mbox_in in;
256 struct mlx5_enable_hca_mbox_out out;
257
258 memset(&in, 0, sizeof(in));
259 memset(&out, 0, sizeof(out));
260 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_ENABLE_HCA);
261 err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
262 if (err)
263 return err;
264
265 if (out.hdr.status)
266 return mlx5_cmd_status_to_err(&out.hdr);
267
268 return 0;
269}
270
271static int mlx5_core_disable_hca(struct mlx5_core_dev *dev)
272{
273 int err;
274 struct mlx5_disable_hca_mbox_in in;
275 struct mlx5_disable_hca_mbox_out out;
276
277 memset(&in, 0, sizeof(in));
278 memset(&out, 0, sizeof(out));
279 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_DISABLE_HCA);
280 err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
281 if (err)
282 return err;
283
284 if (out.hdr.status)
285 return mlx5_cmd_status_to_err(&out.hdr);
286
287 return 0;
288}
289
252int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev) 290int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev)
253{ 291{
254 struct mlx5_priv *priv = &dev->priv; 292 struct mlx5_priv *priv = &dev->priv;
@@ -304,28 +342,41 @@ int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev)
304 } 342 }
305 343
306 mlx5_pagealloc_init(dev); 344 mlx5_pagealloc_init(dev);
345
346 err = mlx5_core_enable_hca(dev);
347 if (err) {
348 dev_err(&pdev->dev, "enable hca failed\n");
349 goto err_pagealloc_cleanup;
350 }
351
352 err = mlx5_satisfy_startup_pages(dev, 1);
353 if (err) {
354 dev_err(&pdev->dev, "failed to allocate boot pages\n");
355 goto err_disable_hca;
356 }
357
307 err = set_hca_ctrl(dev); 358 err = set_hca_ctrl(dev);
308 if (err) { 359 if (err) {
309 dev_err(&pdev->dev, "set_hca_ctrl failed\n"); 360 dev_err(&pdev->dev, "set_hca_ctrl failed\n");
310 goto err_pagealloc_cleanup; 361 goto reclaim_boot_pages;
311 } 362 }
312 363
313 err = handle_hca_cap(dev); 364 err = handle_hca_cap(dev);
314 if (err) { 365 if (err) {
315 dev_err(&pdev->dev, "handle_hca_cap failed\n"); 366 dev_err(&pdev->dev, "handle_hca_cap failed\n");
316 goto err_pagealloc_cleanup; 367 goto reclaim_boot_pages;
317 } 368 }
318 369
319 err = mlx5_satisfy_startup_pages(dev); 370 err = mlx5_satisfy_startup_pages(dev, 0);
320 if (err) { 371 if (err) {
321 dev_err(&pdev->dev, "failed to allocate startup pages\n"); 372 dev_err(&pdev->dev, "failed to allocate init pages\n");
322 goto err_pagealloc_cleanup; 373 goto reclaim_boot_pages;
323 } 374 }
324 375
325 err = mlx5_pagealloc_start(dev); 376 err = mlx5_pagealloc_start(dev);
326 if (err) { 377 if (err) {
327 dev_err(&pdev->dev, "mlx5_pagealloc_start failed\n"); 378 dev_err(&pdev->dev, "mlx5_pagealloc_start failed\n");
328 goto err_reclaim_pages; 379 goto reclaim_boot_pages;
329 } 380 }
330 381
331 err = mlx5_cmd_init_hca(dev); 382 err = mlx5_cmd_init_hca(dev);
@@ -396,9 +447,12 @@ err_stop_poll:
396err_pagealloc_stop: 447err_pagealloc_stop:
397 mlx5_pagealloc_stop(dev); 448 mlx5_pagealloc_stop(dev);
398 449
399err_reclaim_pages: 450reclaim_boot_pages:
400 mlx5_reclaim_startup_pages(dev); 451 mlx5_reclaim_startup_pages(dev);
401 452
453err_disable_hca:
454 mlx5_core_disable_hca(dev);
455
402err_pagealloc_cleanup: 456err_pagealloc_cleanup:
403 mlx5_pagealloc_cleanup(dev); 457 mlx5_pagealloc_cleanup(dev);
404 mlx5_cmd_cleanup(dev); 458 mlx5_cmd_cleanup(dev);
@@ -434,6 +488,7 @@ void mlx5_dev_cleanup(struct mlx5_core_dev *dev)
434 mlx5_cmd_teardown_hca(dev); 488 mlx5_cmd_teardown_hca(dev);
435 mlx5_pagealloc_stop(dev); 489 mlx5_pagealloc_stop(dev);
436 mlx5_reclaim_startup_pages(dev); 490 mlx5_reclaim_startup_pages(dev);
491 mlx5_core_disable_hca(dev);
437 mlx5_pagealloc_cleanup(dev); 492 mlx5_pagealloc_cleanup(dev);
438 mlx5_cmd_cleanup(dev); 493 mlx5_cmd_cleanup(dev);
439 iounmap(dev->iseg); 494 iounmap(dev->iseg);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
index f0bf46339b28..3a2408d44820 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
@@ -43,10 +43,16 @@ enum {
43 MLX5_PAGES_TAKE = 2 43 MLX5_PAGES_TAKE = 2
44}; 44};
45 45
46enum {
47 MLX5_BOOT_PAGES = 1,
48 MLX5_INIT_PAGES = 2,
49 MLX5_POST_INIT_PAGES = 3
50};
51
46struct mlx5_pages_req { 52struct mlx5_pages_req {
47 struct mlx5_core_dev *dev; 53 struct mlx5_core_dev *dev;
48 u32 func_id; 54 u32 func_id;
49 s16 npages; 55 s32 npages;
50 struct work_struct work; 56 struct work_struct work;
51}; 57};
52 58
@@ -64,27 +70,23 @@ struct mlx5_query_pages_inbox {
64 70
65struct mlx5_query_pages_outbox { 71struct mlx5_query_pages_outbox {
66 struct mlx5_outbox_hdr hdr; 72 struct mlx5_outbox_hdr hdr;
67 u8 reserved[2]; 73 __be16 rsvd;
68 __be16 func_id; 74 __be16 func_id;
69 __be16 init_pages; 75 __be32 num_pages;
70 __be16 num_pages;
71}; 76};
72 77
73struct mlx5_manage_pages_inbox { 78struct mlx5_manage_pages_inbox {
74 struct mlx5_inbox_hdr hdr; 79 struct mlx5_inbox_hdr hdr;
75 __be16 rsvd0; 80 __be16 rsvd;
76 __be16 func_id; 81 __be16 func_id;
77 __be16 rsvd1; 82 __be32 num_entries;
78 __be16 num_entries;
79 u8 rsvd2[16];
80 __be64 pas[0]; 83 __be64 pas[0];
81}; 84};
82 85
83struct mlx5_manage_pages_outbox { 86struct mlx5_manage_pages_outbox {
84 struct mlx5_outbox_hdr hdr; 87 struct mlx5_outbox_hdr hdr;
85 u8 rsvd0[2]; 88 __be32 num_entries;
86 __be16 num_entries; 89 u8 rsvd[4];
87 u8 rsvd1[20];
88 __be64 pas[0]; 90 __be64 pas[0];
89}; 91};
90 92
@@ -146,7 +148,7 @@ static struct page *remove_page(struct mlx5_core_dev *dev, u64 addr)
146} 148}
147 149
148static int mlx5_cmd_query_pages(struct mlx5_core_dev *dev, u16 *func_id, 150static int mlx5_cmd_query_pages(struct mlx5_core_dev *dev, u16 *func_id,
149 s16 *pages, s16 *init_pages) 151 s32 *npages, int boot)
150{ 152{
151 struct mlx5_query_pages_inbox in; 153 struct mlx5_query_pages_inbox in;
152 struct mlx5_query_pages_outbox out; 154 struct mlx5_query_pages_outbox out;
@@ -155,6 +157,8 @@ static int mlx5_cmd_query_pages(struct mlx5_core_dev *dev, u16 *func_id,
155 memset(&in, 0, sizeof(in)); 157 memset(&in, 0, sizeof(in));
156 memset(&out, 0, sizeof(out)); 158 memset(&out, 0, sizeof(out));
157 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_QUERY_PAGES); 159 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_QUERY_PAGES);
160 in.hdr.opmod = boot ? cpu_to_be16(MLX5_BOOT_PAGES) : cpu_to_be16(MLX5_INIT_PAGES);
161
158 err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out)); 162 err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
159 if (err) 163 if (err)
160 return err; 164 return err;
@@ -162,10 +166,7 @@ static int mlx5_cmd_query_pages(struct mlx5_core_dev *dev, u16 *func_id,
162 if (out.hdr.status) 166 if (out.hdr.status)
163 return mlx5_cmd_status_to_err(&out.hdr); 167 return mlx5_cmd_status_to_err(&out.hdr);
164 168
165 if (pages) 169 *npages = be32_to_cpu(out.num_pages);
166 *pages = be16_to_cpu(out.num_pages);
167 if (init_pages)
168 *init_pages = be16_to_cpu(out.init_pages);
169 *func_id = be16_to_cpu(out.func_id); 170 *func_id = be16_to_cpu(out.func_id);
170 171
171 return err; 172 return err;
@@ -219,7 +220,7 @@ static int give_pages(struct mlx5_core_dev *dev, u16 func_id, int npages,
219 in->hdr.opcode = cpu_to_be16(MLX5_CMD_OP_MANAGE_PAGES); 220 in->hdr.opcode = cpu_to_be16(MLX5_CMD_OP_MANAGE_PAGES);
220 in->hdr.opmod = cpu_to_be16(MLX5_PAGES_GIVE); 221 in->hdr.opmod = cpu_to_be16(MLX5_PAGES_GIVE);
221 in->func_id = cpu_to_be16(func_id); 222 in->func_id = cpu_to_be16(func_id);
222 in->num_entries = cpu_to_be16(npages); 223 in->num_entries = cpu_to_be32(npages);
223 err = mlx5_cmd_exec(dev, in, inlen, &out, sizeof(out)); 224 err = mlx5_cmd_exec(dev, in, inlen, &out, sizeof(out));
224 mlx5_core_dbg(dev, "err %d\n", err); 225 mlx5_core_dbg(dev, "err %d\n", err);
225 if (err) { 226 if (err) {
@@ -287,7 +288,7 @@ static int reclaim_pages(struct mlx5_core_dev *dev, u32 func_id, int npages,
287 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_MANAGE_PAGES); 288 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_MANAGE_PAGES);
288 in.hdr.opmod = cpu_to_be16(MLX5_PAGES_TAKE); 289 in.hdr.opmod = cpu_to_be16(MLX5_PAGES_TAKE);
289 in.func_id = cpu_to_be16(func_id); 290 in.func_id = cpu_to_be16(func_id);
290 in.num_entries = cpu_to_be16(npages); 291 in.num_entries = cpu_to_be32(npages);
291 mlx5_core_dbg(dev, "npages %d, outlen %d\n", npages, outlen); 292 mlx5_core_dbg(dev, "npages %d, outlen %d\n", npages, outlen);
292 err = mlx5_cmd_exec(dev, &in, sizeof(in), out, outlen); 293 err = mlx5_cmd_exec(dev, &in, sizeof(in), out, outlen);
293 if (err) { 294 if (err) {
@@ -301,7 +302,7 @@ static int reclaim_pages(struct mlx5_core_dev *dev, u32 func_id, int npages,
301 goto out_free; 302 goto out_free;
302 } 303 }
303 304
304 num_claimed = be16_to_cpu(out->num_entries); 305 num_claimed = be32_to_cpu(out->num_entries);
305 if (nclaimed) 306 if (nclaimed)
306 *nclaimed = num_claimed; 307 *nclaimed = num_claimed;
307 308
@@ -340,7 +341,7 @@ static void pages_work_handler(struct work_struct *work)
340} 341}
341 342
342void mlx5_core_req_pages_handler(struct mlx5_core_dev *dev, u16 func_id, 343void mlx5_core_req_pages_handler(struct mlx5_core_dev *dev, u16 func_id,
343 s16 npages) 344 s32 npages)
344{ 345{
345 struct mlx5_pages_req *req; 346 struct mlx5_pages_req *req;
346 347
@@ -357,19 +358,20 @@ void mlx5_core_req_pages_handler(struct mlx5_core_dev *dev, u16 func_id,
357 queue_work(dev->priv.pg_wq, &req->work); 358 queue_work(dev->priv.pg_wq, &req->work);
358} 359}
359 360
360int mlx5_satisfy_startup_pages(struct mlx5_core_dev *dev) 361int mlx5_satisfy_startup_pages(struct mlx5_core_dev *dev, int boot)
361{ 362{
362 s16 uninitialized_var(init_pages);
363 u16 uninitialized_var(func_id); 363 u16 uninitialized_var(func_id);
364 s32 uninitialized_var(npages);
364 int err; 365 int err;
365 366
366 err = mlx5_cmd_query_pages(dev, &func_id, NULL, &init_pages); 367 err = mlx5_cmd_query_pages(dev, &func_id, &npages, boot);
367 if (err) 368 if (err)
368 return err; 369 return err;
369 370
370 mlx5_core_dbg(dev, "requested %d init pages for func_id 0x%x\n", init_pages, func_id); 371 mlx5_core_dbg(dev, "requested %d %s pages for func_id 0x%x\n",
372 npages, boot ? "boot" : "init", func_id);
371 373
372 return give_pages(dev, func_id, init_pages, 0); 374 return give_pages(dev, func_id, npages, 0);
373} 375}
374 376
375static int optimal_reclaimed_pages(void) 377static int optimal_reclaimed_pages(void)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/uar.c b/drivers/net/ethernet/mellanox/mlx5/core/uar.c
index 71d4a3937200..68f5d9c77c7b 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/uar.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/uar.c
@@ -164,6 +164,7 @@ int mlx5_alloc_uuars(struct mlx5_core_dev *dev, struct mlx5_uuar_info *uuari)
164 uuari->uars[i].map = ioremap(addr, PAGE_SIZE); 164 uuari->uars[i].map = ioremap(addr, PAGE_SIZE);
165 if (!uuari->uars[i].map) { 165 if (!uuari->uars[i].map) {
166 mlx5_cmd_free_uar(dev, uuari->uars[i].index); 166 mlx5_cmd_free_uar(dev, uuari->uars[i].index);
167 err = -ENOMEM;
167 goto out_count; 168 goto out_count;
168 } 169 }
169 mlx5_core_dbg(dev, "allocated uar index 0x%x, mmaped at %p\n", 170 mlx5_core_dbg(dev, "allocated uar index 0x%x, mmaped at %p\n",
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig b/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig
index cb22341a14a8..a588ffde9700 100644
--- a/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/Kconfig
@@ -4,7 +4,7 @@
4 4
5config PCH_GBE 5config PCH_GBE
6 tristate "OKI SEMICONDUCTOR IOH(ML7223/ML7831) GbE" 6 tristate "OKI SEMICONDUCTOR IOH(ML7223/ML7831) GbE"
7 depends on PCI 7 depends on PCI && (X86 || COMPILE_TEST)
8 select MII 8 select MII
9 select PTP_1588_CLOCK_PCH 9 select PTP_1588_CLOCK_PCH
10 ---help--- 10 ---help---
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
index b00cf5665eab..221645e9f182 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
@@ -1400,8 +1400,8 @@ void qlcnic_pci_camqm_write_2M(struct qlcnic_adapter *, u64, u64);
1400#define ADDR_IN_RANGE(addr, low, high) \ 1400#define ADDR_IN_RANGE(addr, low, high) \
1401 (((addr) < (high)) && ((addr) >= (low))) 1401 (((addr) < (high)) && ((addr) >= (low)))
1402 1402
1403#define QLCRD32(adapter, off) \ 1403#define QLCRD32(adapter, off, err) \
1404 (adapter->ahw->hw_ops->read_reg)(adapter, off) 1404 (adapter->ahw->hw_ops->read_reg)(adapter, off, err)
1405 1405
1406#define QLCWR32(adapter, off, val) \ 1406#define QLCWR32(adapter, off, val) \
1407 adapter->ahw->hw_ops->write_reg(adapter, off, val) 1407 adapter->ahw->hw_ops->write_reg(adapter, off, val)
@@ -1604,7 +1604,7 @@ struct qlcnic_nic_template {
1604struct qlcnic_hardware_ops { 1604struct qlcnic_hardware_ops {
1605 void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); 1605 void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
1606 void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); 1606 void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
1607 int (*read_reg) (struct qlcnic_adapter *, ulong); 1607 int (*read_reg) (struct qlcnic_adapter *, ulong, int *);
1608 int (*write_reg) (struct qlcnic_adapter *, ulong, u32); 1608 int (*write_reg) (struct qlcnic_adapter *, ulong, u32);
1609 void (*get_ocm_win) (struct qlcnic_hardware_context *); 1609 void (*get_ocm_win) (struct qlcnic_hardware_context *);
1610 int (*get_mac_address) (struct qlcnic_adapter *, u8 *); 1610 int (*get_mac_address) (struct qlcnic_adapter *, u8 *);
@@ -1662,12 +1662,6 @@ static inline void qlcnic_write_crb(struct qlcnic_adapter *adapter, char *buf,
1662 adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size); 1662 adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size);
1663} 1663}
1664 1664
1665static inline int qlcnic_hw_read_wx_2M(struct qlcnic_adapter *adapter,
1666 ulong off)
1667{
1668 return adapter->ahw->hw_ops->read_reg(adapter, off);
1669}
1670
1671static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter, 1665static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter,
1672 ulong off, u32 data) 1666 ulong off, u32 data)
1673{ 1667{
@@ -1869,7 +1863,8 @@ static inline void qlcnic_free_mac_list(struct qlcnic_adapter *adapter)
1869 1863
1870static inline void qlcnic_set_mac_filter_count(struct qlcnic_adapter *adapter) 1864static inline void qlcnic_set_mac_filter_count(struct qlcnic_adapter *adapter)
1871{ 1865{
1872 adapter->ahw->hw_ops->set_mac_filter_count(adapter); 1866 if (adapter->ahw->hw_ops->set_mac_filter_count)
1867 adapter->ahw->hw_ops->set_mac_filter_count(adapter);
1873} 1868}
1874 1869
1875static inline void qlcnic_dev_request_reset(struct qlcnic_adapter *adapter, 1870static inline void qlcnic_dev_request_reset(struct qlcnic_adapter *adapter,
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index 0913c623a67e..9d4bb7f83904 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -228,17 +228,17 @@ static int __qlcnic_set_win_base(struct qlcnic_adapter *adapter, u32 addr)
228 return 0; 228 return 0;
229} 229}
230 230
231int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr) 231int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr,
232 int *err)
232{ 233{
233 int ret;
234 struct qlcnic_hardware_context *ahw = adapter->ahw; 234 struct qlcnic_hardware_context *ahw = adapter->ahw;
235 235
236 ret = __qlcnic_set_win_base(adapter, (u32) addr); 236 *err = __qlcnic_set_win_base(adapter, (u32) addr);
237 if (!ret) { 237 if (!*err) {
238 return QLCRDX(ahw, QLCNIC_WILDCARD); 238 return QLCRDX(ahw, QLCNIC_WILDCARD);
239 } else { 239 } else {
240 dev_err(&adapter->pdev->dev, 240 dev_err(&adapter->pdev->dev,
241 "%s failed, addr = 0x%x\n", __func__, (int)addr); 241 "%s failed, addr = 0x%lx\n", __func__, addr);
242 return -EIO; 242 return -EIO;
243 } 243 }
244} 244}
@@ -561,7 +561,7 @@ void qlcnic_83xx_cam_unlock(struct qlcnic_adapter *adapter)
561void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, 561void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
562 loff_t offset, size_t size) 562 loff_t offset, size_t size)
563{ 563{
564 int ret; 564 int ret = 0;
565 u32 data; 565 u32 data;
566 566
567 if (qlcnic_api_lock(adapter)) { 567 if (qlcnic_api_lock(adapter)) {
@@ -571,7 +571,7 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
571 return; 571 return;
572 } 572 }
573 573
574 ret = qlcnic_83xx_rd_reg_indirect(adapter, (u32) offset); 574 data = QLCRD32(adapter, (u32) offset, &ret);
575 qlcnic_api_unlock(adapter); 575 qlcnic_api_unlock(adapter);
576 576
577 if (ret == -EIO) { 577 if (ret == -EIO) {
@@ -580,7 +580,6 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
580 __func__, (u32)offset); 580 __func__, (u32)offset);
581 return; 581 return;
582 } 582 }
583 data = ret;
584 memcpy(buf, &data, size); 583 memcpy(buf, &data, size);
585} 584}
586 585
@@ -2075,18 +2074,25 @@ void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter)
2075static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter, 2074static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter,
2076 u32 data[]) 2075 u32 data[])
2077{ 2076{
2077 struct qlcnic_hardware_context *ahw = adapter->ahw;
2078 u8 link_status, duplex; 2078 u8 link_status, duplex;
2079 /* link speed */ 2079 /* link speed */
2080 link_status = LSB(data[3]) & 1; 2080 link_status = LSB(data[3]) & 1;
2081 adapter->ahw->link_speed = MSW(data[2]); 2081 if (link_status) {
2082 adapter->ahw->link_autoneg = MSB(MSW(data[3])); 2082 ahw->link_speed = MSW(data[2]);
2083 adapter->ahw->module_type = MSB(LSW(data[3])); 2083 duplex = LSB(MSW(data[3]));
2084 duplex = LSB(MSW(data[3])); 2084 if (duplex)
2085 if (duplex) 2085 ahw->link_duplex = DUPLEX_FULL;
2086 adapter->ahw->link_duplex = DUPLEX_FULL; 2086 else
2087 else 2087 ahw->link_duplex = DUPLEX_HALF;
2088 adapter->ahw->link_duplex = DUPLEX_HALF; 2088 } else {
2089 adapter->ahw->has_link_events = 1; 2089 ahw->link_speed = SPEED_UNKNOWN;
2090 ahw->link_duplex = DUPLEX_UNKNOWN;
2091 }
2092
2093 ahw->link_autoneg = MSB(MSW(data[3]));
2094 ahw->module_type = MSB(LSW(data[3]));
2095 ahw->has_link_events = 1;
2090 qlcnic_advert_link_change(adapter, link_status); 2096 qlcnic_advert_link_change(adapter, link_status);
2091} 2097}
2092 2098
@@ -2384,9 +2390,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
2384 u32 flash_addr, u8 *p_data, 2390 u32 flash_addr, u8 *p_data,
2385 int count) 2391 int count)
2386{ 2392{
2387 int i, ret; 2393 u32 word, range, flash_offset, addr = flash_addr, ret;
2388 u32 word, range, flash_offset, addr = flash_addr;
2389 ulong indirect_add, direct_window; 2394 ulong indirect_add, direct_window;
2395 int i, err = 0;
2390 2396
2391 flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1); 2397 flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1);
2392 if (addr & 0x3) { 2398 if (addr & 0x3) {
@@ -2404,10 +2410,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
2404 /* Multi sector read */ 2410 /* Multi sector read */
2405 for (i = 0; i < count; i++) { 2411 for (i = 0; i < count; i++) {
2406 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); 2412 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
2407 ret = qlcnic_83xx_rd_reg_indirect(adapter, 2413 ret = QLCRD32(adapter, indirect_add, &err);
2408 indirect_add); 2414 if (err == -EIO)
2409 if (ret == -EIO) 2415 return err;
2410 return -EIO;
2411 2416
2412 word = ret; 2417 word = ret;
2413 *(u32 *)p_data = word; 2418 *(u32 *)p_data = word;
@@ -2428,10 +2433,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
2428 /* Single sector read */ 2433 /* Single sector read */
2429 for (i = 0; i < count; i++) { 2434 for (i = 0; i < count; i++) {
2430 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); 2435 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
2431 ret = qlcnic_83xx_rd_reg_indirect(adapter, 2436 ret = QLCRD32(adapter, indirect_add, &err);
2432 indirect_add); 2437 if (err == -EIO)
2433 if (ret == -EIO) 2438 return err;
2434 return -EIO;
2435 2439
2436 word = ret; 2440 word = ret;
2437 *(u32 *)p_data = word; 2441 *(u32 *)p_data = word;
@@ -2447,10 +2451,13 @@ static int qlcnic_83xx_poll_flash_status_reg(struct qlcnic_adapter *adapter)
2447{ 2451{
2448 u32 status; 2452 u32 status;
2449 int retries = QLC_83XX_FLASH_READ_RETRY_COUNT; 2453 int retries = QLC_83XX_FLASH_READ_RETRY_COUNT;
2454 int err = 0;
2450 2455
2451 do { 2456 do {
2452 status = qlcnic_83xx_rd_reg_indirect(adapter, 2457 status = QLCRD32(adapter, QLC_83XX_FLASH_STATUS, &err);
2453 QLC_83XX_FLASH_STATUS); 2458 if (err == -EIO)
2459 return err;
2460
2454 if ((status & QLC_83XX_FLASH_STATUS_READY) == 2461 if ((status & QLC_83XX_FLASH_STATUS_READY) ==
2455 QLC_83XX_FLASH_STATUS_READY) 2462 QLC_83XX_FLASH_STATUS_READY)
2456 break; 2463 break;
@@ -2502,7 +2509,8 @@ int qlcnic_83xx_disable_flash_write(struct qlcnic_adapter *adapter)
2502 2509
2503int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter) 2510int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter)
2504{ 2511{
2505 int ret, mfg_id; 2512 int ret, err = 0;
2513 u32 mfg_id;
2506 2514
2507 if (qlcnic_83xx_lock_flash(adapter)) 2515 if (qlcnic_83xx_lock_flash(adapter))
2508 return -EIO; 2516 return -EIO;
@@ -2517,9 +2525,11 @@ int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter)
2517 return -EIO; 2525 return -EIO;
2518 } 2526 }
2519 2527
2520 mfg_id = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA); 2528 mfg_id = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
2521 if (mfg_id == -EIO) 2529 if (err == -EIO) {
2522 return -EIO; 2530 qlcnic_83xx_unlock_flash(adapter);
2531 return err;
2532 }
2523 2533
2524 adapter->flash_mfg_id = (mfg_id & 0xFF); 2534 adapter->flash_mfg_id = (mfg_id & 0xFF);
2525 qlcnic_83xx_unlock_flash(adapter); 2535 qlcnic_83xx_unlock_flash(adapter);
@@ -2636,7 +2646,7 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
2636 u32 *p_data, int count) 2646 u32 *p_data, int count)
2637{ 2647{
2638 u32 temp; 2648 u32 temp;
2639 int ret = -EIO; 2649 int ret = -EIO, err = 0;
2640 2650
2641 if ((count < QLC_83XX_FLASH_WRITE_MIN) || 2651 if ((count < QLC_83XX_FLASH_WRITE_MIN) ||
2642 (count > QLC_83XX_FLASH_WRITE_MAX)) { 2652 (count > QLC_83XX_FLASH_WRITE_MAX)) {
@@ -2645,8 +2655,10 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
2645 return -EIO; 2655 return -EIO;
2646 } 2656 }
2647 2657
2648 temp = qlcnic_83xx_rd_reg_indirect(adapter, 2658 temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
2649 QLC_83XX_FLASH_SPI_CONTROL); 2659 if (err == -EIO)
2660 return err;
2661
2650 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL, 2662 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL,
2651 (temp | QLC_83XX_FLASH_SPI_CTRL)); 2663 (temp | QLC_83XX_FLASH_SPI_CTRL));
2652 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 2664 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
@@ -2695,13 +2707,18 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
2695 return -EIO; 2707 return -EIO;
2696 } 2708 }
2697 2709
2698 ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_SPI_STATUS); 2710 ret = QLCRD32(adapter, QLC_83XX_FLASH_SPI_STATUS, &err);
2711 if (err == -EIO)
2712 return err;
2713
2699 if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) { 2714 if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) {
2700 dev_err(&adapter->pdev->dev, "%s: failed at %d\n", 2715 dev_err(&adapter->pdev->dev, "%s: failed at %d\n",
2701 __func__, __LINE__); 2716 __func__, __LINE__);
2702 /* Operation failed, clear error bit */ 2717 /* Operation failed, clear error bit */
2703 temp = qlcnic_83xx_rd_reg_indirect(adapter, 2718 temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
2704 QLC_83XX_FLASH_SPI_CONTROL); 2719 if (err == -EIO)
2720 return err;
2721
2705 qlcnic_83xx_wrt_reg_indirect(adapter, 2722 qlcnic_83xx_wrt_reg_indirect(adapter,
2706 QLC_83XX_FLASH_SPI_CONTROL, 2723 QLC_83XX_FLASH_SPI_CONTROL,
2707 (temp | QLC_83XX_FLASH_SPI_CTRL)); 2724 (temp | QLC_83XX_FLASH_SPI_CTRL));
@@ -2823,6 +2840,7 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
2823{ 2840{
2824 int i, j, ret = 0; 2841 int i, j, ret = 0;
2825 u32 temp; 2842 u32 temp;
2843 int err = 0;
2826 2844
2827 /* Check alignment */ 2845 /* Check alignment */
2828 if (addr & 0xF) 2846 if (addr & 0xF)
@@ -2855,8 +2873,12 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
2855 QLCNIC_TA_WRITE_START); 2873 QLCNIC_TA_WRITE_START);
2856 2874
2857 for (j = 0; j < MAX_CTL_CHECK; j++) { 2875 for (j = 0; j < MAX_CTL_CHECK; j++) {
2858 temp = qlcnic_83xx_rd_reg_indirect(adapter, 2876 temp = QLCRD32(adapter, QLCNIC_MS_CTRL, &err);
2859 QLCNIC_MS_CTRL); 2877 if (err == -EIO) {
2878 mutex_unlock(&adapter->ahw->mem_lock);
2879 return err;
2880 }
2881
2860 if ((temp & TA_CTL_BUSY) == 0) 2882 if ((temp & TA_CTL_BUSY) == 0)
2861 break; 2883 break;
2862 } 2884 }
@@ -2878,9 +2900,9 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
2878int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr, 2900int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
2879 u8 *p_data, int count) 2901 u8 *p_data, int count)
2880{ 2902{
2881 int i, ret; 2903 u32 word, addr = flash_addr, ret;
2882 u32 word, addr = flash_addr;
2883 ulong indirect_addr; 2904 ulong indirect_addr;
2905 int i, err = 0;
2884 2906
2885 if (qlcnic_83xx_lock_flash(adapter) != 0) 2907 if (qlcnic_83xx_lock_flash(adapter) != 0)
2886 return -EIO; 2908 return -EIO;
@@ -2900,10 +2922,10 @@ int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
2900 } 2922 }
2901 2923
2902 indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr); 2924 indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr);
2903 ret = qlcnic_83xx_rd_reg_indirect(adapter, 2925 ret = QLCRD32(adapter, indirect_addr, &err);
2904 indirect_addr); 2926 if (err == -EIO)
2905 if (ret == -EIO) 2927 return err;
2906 return -EIO; 2928
2907 word = ret; 2929 word = ret;
2908 *(u32 *)p_data = word; 2930 *(u32 *)p_data = word;
2909 p_data = p_data + 4; 2931 p_data = p_data + 4;
@@ -3014,8 +3036,8 @@ int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter,
3014 } 3036 }
3015 3037
3016 if (ahw->port_type == QLCNIC_XGBE) { 3038 if (ahw->port_type == QLCNIC_XGBE) {
3017 ecmd->supported = SUPPORTED_1000baseT_Full; 3039 ecmd->supported = SUPPORTED_10000baseT_Full;
3018 ecmd->advertising = ADVERTISED_1000baseT_Full; 3040 ecmd->advertising = ADVERTISED_10000baseT_Full;
3019 } else { 3041 } else {
3020 ecmd->supported = (SUPPORTED_10baseT_Half | 3042 ecmd->supported = (SUPPORTED_10baseT_Half |
3021 SUPPORTED_10baseT_Full | 3043 SUPPORTED_10baseT_Full |
@@ -3244,6 +3266,11 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev)
3244 u8 val; 3266 u8 val;
3245 int ret, max_sds_rings = adapter->max_sds_rings; 3267 int ret, max_sds_rings = adapter->max_sds_rings;
3246 3268
3269 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
3270 netdev_info(netdev, "Device is resetting\n");
3271 return -EBUSY;
3272 }
3273
3247 if (qlcnic_get_diag_lock(adapter)) { 3274 if (qlcnic_get_diag_lock(adapter)) {
3248 netdev_info(netdev, "Device in diagnostics mode\n"); 3275 netdev_info(netdev, "Device in diagnostics mode\n");
3249 return -EBUSY; 3276 return -EBUSY;
@@ -3369,7 +3396,8 @@ int qlcnic_83xx_set_pauseparam(struct qlcnic_adapter *adapter,
3369 3396
3370static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter) 3397static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter)
3371{ 3398{
3372 int ret; 3399 int ret, err = 0;
3400 u32 temp;
3373 3401
3374 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 3402 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
3375 QLC_83XX_FLASH_OEM_READ_SIG); 3403 QLC_83XX_FLASH_OEM_READ_SIG);
@@ -3379,8 +3407,11 @@ static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter)
3379 if (ret) 3407 if (ret)
3380 return -EIO; 3408 return -EIO;
3381 3409
3382 ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA); 3410 temp = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
3383 return ret & 0xFF; 3411 if (err == -EIO)
3412 return err;
3413
3414 return temp & 0xFF;
3384} 3415}
3385 3416
3386int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter) 3417int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
index 2548d1403d75..272f56a2e14b 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
@@ -508,7 +508,7 @@ void qlcnic_83xx_add_sysfs(struct qlcnic_adapter *);
508void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *); 508void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *);
509void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t); 509void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
510void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t); 510void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
511int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong); 511int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong, int *);
512int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32); 512int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32);
513void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []); 513void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []);
514int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32); 514int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
index f41dfab1e9a3..345d987aede4 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
@@ -629,7 +629,8 @@ int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter)
629 return -EIO; 629 return -EIO;
630 } 630 }
631 631
632 qlcnic_set_drv_version(adapter); 632 if (adapter->portnum == 0)
633 qlcnic_set_drv_version(adapter);
633 qlcnic_83xx_idc_attach_driver(adapter); 634 qlcnic_83xx_idc_attach_driver(adapter);
634 635
635 return 0; 636 return 0;
@@ -1303,8 +1304,11 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
1303{ 1304{
1304 int i, j; 1305 int i, j;
1305 u32 val = 0, val1 = 0, reg = 0; 1306 u32 val = 0, val1 = 0, reg = 0;
1307 int err = 0;
1306 1308
1307 val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG); 1309 val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err);
1310 if (err == -EIO)
1311 return;
1308 dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val); 1312 dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val);
1309 1313
1310 for (j = 0; j < 2; j++) { 1314 for (j = 0; j < 2; j++) {
@@ -1318,7 +1322,9 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
1318 reg = QLC_83XX_PORT1_THRESHOLD; 1322 reg = QLC_83XX_PORT1_THRESHOLD;
1319 } 1323 }
1320 for (i = 0; i < 8; i++) { 1324 for (i = 0; i < 8; i++) {
1321 val = QLCRD32(adapter, reg + (i * 0x4)); 1325 val = QLCRD32(adapter, reg + (i * 0x4), &err);
1326 if (err == -EIO)
1327 return;
1322 dev_info(&adapter->pdev->dev, "0x%x ", val); 1328 dev_info(&adapter->pdev->dev, "0x%x ", val);
1323 } 1329 }
1324 dev_info(&adapter->pdev->dev, "\n"); 1330 dev_info(&adapter->pdev->dev, "\n");
@@ -1335,8 +1341,10 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
1335 reg = QLC_83XX_PORT1_TC_MC_REG; 1341 reg = QLC_83XX_PORT1_TC_MC_REG;
1336 } 1342 }
1337 for (i = 0; i < 4; i++) { 1343 for (i = 0; i < 4; i++) {
1338 val = QLCRD32(adapter, reg + (i * 0x4)); 1344 val = QLCRD32(adapter, reg + (i * 0x4), &err);
1339 dev_info(&adapter->pdev->dev, "0x%x ", val); 1345 if (err == -EIO)
1346 return;
1347 dev_info(&adapter->pdev->dev, "0x%x ", val);
1340 } 1348 }
1341 dev_info(&adapter->pdev->dev, "\n"); 1349 dev_info(&adapter->pdev->dev, "\n");
1342 } 1350 }
@@ -1352,17 +1360,25 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
1352 reg = QLC_83XX_PORT1_TC_STATS; 1360 reg = QLC_83XX_PORT1_TC_STATS;
1353 } 1361 }
1354 for (i = 7; i >= 0; i--) { 1362 for (i = 7; i >= 0; i--) {
1355 val = QLCRD32(adapter, reg); 1363 val = QLCRD32(adapter, reg, &err);
1364 if (err == -EIO)
1365 return;
1356 val &= ~(0x7 << 29); /* Reset bits 29 to 31 */ 1366 val &= ~(0x7 << 29); /* Reset bits 29 to 31 */
1357 QLCWR32(adapter, reg, (val | (i << 29))); 1367 QLCWR32(adapter, reg, (val | (i << 29)));
1358 val = QLCRD32(adapter, reg); 1368 val = QLCRD32(adapter, reg, &err);
1369 if (err == -EIO)
1370 return;
1359 dev_info(&adapter->pdev->dev, "0x%x ", val); 1371 dev_info(&adapter->pdev->dev, "0x%x ", val);
1360 } 1372 }
1361 dev_info(&adapter->pdev->dev, "\n"); 1373 dev_info(&adapter->pdev->dev, "\n");
1362 } 1374 }
1363 1375
1364 val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD); 1376 val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err);
1365 val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD); 1377 if (err == -EIO)
1378 return;
1379 val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err);
1380 if (err == -EIO)
1381 return;
1366 dev_info(&adapter->pdev->dev, 1382 dev_info(&adapter->pdev->dev,
1367 "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n", 1383 "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n",
1368 val, val1); 1384 val, val1);
@@ -1425,7 +1441,7 @@ static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter)
1425static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) 1441static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
1426{ 1442{
1427 u32 heartbeat, peg_status; 1443 u32 heartbeat, peg_status;
1428 int retries, ret = -EIO; 1444 int retries, ret = -EIO, err = 0;
1429 1445
1430 retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT; 1446 retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT;
1431 p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev, 1447 p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev,
@@ -1453,11 +1469,11 @@ static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
1453 "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n" 1469 "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
1454 "PEG_NET_4_PC: 0x%x\n", peg_status, 1470 "PEG_NET_4_PC: 0x%x\n", peg_status,
1455 QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2), 1471 QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2),
1456 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0), 1472 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0, &err),
1457 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1), 1473 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1, &err),
1458 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2), 1474 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2, &err),
1459 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3), 1475 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3, &err),
1460 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4)); 1476 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4, &err));
1461 1477
1462 if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) 1478 if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
1463 dev_err(&p_dev->pdev->dev, 1479 dev_err(&p_dev->pdev->dev,
@@ -1501,18 +1517,22 @@ int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev)
1501static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr, 1517static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr,
1502 int duration, u32 mask, u32 status) 1518 int duration, u32 mask, u32 status)
1503{ 1519{
1520 int timeout_error, err = 0;
1504 u32 value; 1521 u32 value;
1505 int timeout_error;
1506 u8 retries; 1522 u8 retries;
1507 1523
1508 value = qlcnic_83xx_rd_reg_indirect(p_dev, addr); 1524 value = QLCRD32(p_dev, addr, &err);
1525 if (err == -EIO)
1526 return err;
1509 retries = duration / 10; 1527 retries = duration / 10;
1510 1528
1511 do { 1529 do {
1512 if ((value & mask) != status) { 1530 if ((value & mask) != status) {
1513 timeout_error = 1; 1531 timeout_error = 1;
1514 msleep(duration / 10); 1532 msleep(duration / 10);
1515 value = qlcnic_83xx_rd_reg_indirect(p_dev, addr); 1533 value = QLCRD32(p_dev, addr, &err);
1534 if (err == -EIO)
1535 return err;
1516 } else { 1536 } else {
1517 timeout_error = 0; 1537 timeout_error = 0;
1518 break; 1538 break;
@@ -1606,9 +1626,12 @@ int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev)
1606static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev, 1626static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev,
1607 u32 raddr, u32 waddr) 1627 u32 raddr, u32 waddr)
1608{ 1628{
1609 int value; 1629 int err = 0;
1630 u32 value;
1610 1631
1611 value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr); 1632 value = QLCRD32(p_dev, raddr, &err);
1633 if (err == -EIO)
1634 return;
1612 qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value); 1635 qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
1613} 1636}
1614 1637
@@ -1617,12 +1640,16 @@ static void qlcnic_83xx_rmw_crb_reg(struct qlcnic_adapter *p_dev,
1617 u32 raddr, u32 waddr, 1640 u32 raddr, u32 waddr,
1618 struct qlc_83xx_rmw *p_rmw_hdr) 1641 struct qlc_83xx_rmw *p_rmw_hdr)
1619{ 1642{
1620 int value; 1643 int err = 0;
1644 u32 value;
1621 1645
1622 if (p_rmw_hdr->index_a) 1646 if (p_rmw_hdr->index_a) {
1623 value = p_dev->ahw->reset.array[p_rmw_hdr->index_a]; 1647 value = p_dev->ahw->reset.array[p_rmw_hdr->index_a];
1624 else 1648 } else {
1625 value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr); 1649 value = QLCRD32(p_dev, raddr, &err);
1650 if (err == -EIO)
1651 return;
1652 }
1626 1653
1627 value &= p_rmw_hdr->mask; 1654 value &= p_rmw_hdr->mask;
1628 value <<= p_rmw_hdr->shl; 1655 value <<= p_rmw_hdr->shl;
@@ -1675,7 +1702,7 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
1675 long delay; 1702 long delay;
1676 struct qlc_83xx_entry *entry; 1703 struct qlc_83xx_entry *entry;
1677 struct qlc_83xx_poll *poll; 1704 struct qlc_83xx_poll *poll;
1678 int i; 1705 int i, err = 0;
1679 unsigned long arg1, arg2; 1706 unsigned long arg1, arg2;
1680 1707
1681 poll = (struct qlc_83xx_poll *)((char *)p_hdr + 1708 poll = (struct qlc_83xx_poll *)((char *)p_hdr +
@@ -1699,10 +1726,12 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
1699 arg1, delay, 1726 arg1, delay,
1700 poll->mask, 1727 poll->mask,
1701 poll->status)){ 1728 poll->status)){
1702 qlcnic_83xx_rd_reg_indirect(p_dev, 1729 QLCRD32(p_dev, arg1, &err);
1703 arg1); 1730 if (err == -EIO)
1704 qlcnic_83xx_rd_reg_indirect(p_dev, 1731 return;
1705 arg2); 1732 QLCRD32(p_dev, arg2, &err);
1733 if (err == -EIO)
1734 return;
1706 } 1735 }
1707 } 1736 }
1708 } 1737 }
@@ -1768,7 +1797,7 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
1768 struct qlc_83xx_entry_hdr *p_hdr) 1797 struct qlc_83xx_entry_hdr *p_hdr)
1769{ 1798{
1770 long delay; 1799 long delay;
1771 int index, i, j; 1800 int index, i, j, err;
1772 struct qlc_83xx_quad_entry *entry; 1801 struct qlc_83xx_quad_entry *entry;
1773 struct qlc_83xx_poll *poll; 1802 struct qlc_83xx_poll *poll;
1774 unsigned long addr; 1803 unsigned long addr;
@@ -1788,7 +1817,10 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
1788 poll->mask, poll->status)){ 1817 poll->mask, poll->status)){
1789 index = p_dev->ahw->reset.array_index; 1818 index = p_dev->ahw->reset.array_index;
1790 addr = entry->dr_addr; 1819 addr = entry->dr_addr;
1791 j = qlcnic_83xx_rd_reg_indirect(p_dev, addr); 1820 j = QLCRD32(p_dev, addr, &err);
1821 if (err == -EIO)
1822 return;
1823
1792 p_dev->ahw->reset.array[index++] = j; 1824 p_dev->ahw->reset.array[index++] = j;
1793 1825
1794 if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES) 1826 if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES)
@@ -2123,6 +2155,8 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
2123 set_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status); 2155 set_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status);
2124 qlcnic_83xx_clear_function_resources(adapter); 2156 qlcnic_83xx_clear_function_resources(adapter);
2125 2157
2158 INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
2159
2126 /* register for NIC IDC AEN Events */ 2160 /* register for NIC IDC AEN Events */
2127 qlcnic_83xx_register_nic_idc_func(adapter, 1); 2161 qlcnic_83xx_register_nic_idc_func(adapter, 1);
2128 2162
@@ -2140,8 +2174,6 @@ int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
2140 if (adapter->nic_ops->init_driver(adapter)) 2174 if (adapter->nic_ops->init_driver(adapter))
2141 return -EIO; 2175 return -EIO;
2142 2176
2143 INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
2144
2145 /* Periodically monitor device status */ 2177 /* Periodically monitor device status */
2146 qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work); 2178 qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work);
2147 2179
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
index 0581a484ceb5..d09389b33474 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
@@ -104,7 +104,7 @@ static u32
104qlcnic_poll_rsp(struct qlcnic_adapter *adapter) 104qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
105{ 105{
106 u32 rsp; 106 u32 rsp;
107 int timeout = 0; 107 int timeout = 0, err = 0;
108 108
109 do { 109 do {
110 /* give atleast 1ms for firmware to respond */ 110 /* give atleast 1ms for firmware to respond */
@@ -113,7 +113,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
113 if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT) 113 if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT)
114 return QLCNIC_CDRP_RSP_TIMEOUT; 114 return QLCNIC_CDRP_RSP_TIMEOUT;
115 115
116 rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET); 116 rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET, &err);
117 } while (!QLCNIC_CDRP_IS_RSP(rsp)); 117 } while (!QLCNIC_CDRP_IS_RSP(rsp));
118 118
119 return rsp; 119 return rsp;
@@ -122,7 +122,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
122int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, 122int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
123 struct qlcnic_cmd_args *cmd) 123 struct qlcnic_cmd_args *cmd)
124{ 124{
125 int i; 125 int i, err = 0;
126 u32 rsp; 126 u32 rsp;
127 u32 signature; 127 u32 signature;
128 struct pci_dev *pdev = adapter->pdev; 128 struct pci_dev *pdev = adapter->pdev;
@@ -148,7 +148,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
148 dev_err(&pdev->dev, "card response timeout.\n"); 148 dev_err(&pdev->dev, "card response timeout.\n");
149 cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT; 149 cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
150 } else if (rsp == QLCNIC_CDRP_RSP_FAIL) { 150 } else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
151 cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1)); 151 cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1), &err);
152 switch (cmd->rsp.arg[0]) { 152 switch (cmd->rsp.arg[0]) {
153 case QLCNIC_RCODE_INVALID_ARGS: 153 case QLCNIC_RCODE_INVALID_ARGS:
154 fmt = "CDRP invalid args: [%d]\n"; 154 fmt = "CDRP invalid args: [%d]\n";
@@ -175,7 +175,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
175 cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS; 175 cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS;
176 176
177 for (i = 1; i < cmd->rsp.num; i++) 177 for (i = 1; i < cmd->rsp.num; i++)
178 cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i)); 178 cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i), &err);
179 179
180 /* Release semaphore */ 180 /* Release semaphore */
181 qlcnic_api_unlock(adapter); 181 qlcnic_api_unlock(adapter);
@@ -210,10 +210,10 @@ int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter, u32 fw_cmd)
210 if (err) { 210 if (err) {
211 dev_info(&adapter->pdev->dev, 211 dev_info(&adapter->pdev->dev,
212 "Failed to set driver version in firmware\n"); 212 "Failed to set driver version in firmware\n");
213 return -EIO; 213 err = -EIO;
214 } 214 }
215 215 qlcnic_free_mbx_args(&cmd);
216 return 0; 216 return err;
217} 217}
218 218
219int 219int
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index 700a46324d09..7aac23ab31d1 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -150,6 +150,7 @@ static const char qlcnic_gstrings_test[][ETH_GSTRING_LEN] = {
150 "Link_Test_on_offline", 150 "Link_Test_on_offline",
151 "Interrupt_Test_offline", 151 "Interrupt_Test_offline",
152 "Internal_Loopback_offline", 152 "Internal_Loopback_offline",
153 "External_Loopback_offline",
153 "EEPROM_Test_offline" 154 "EEPROM_Test_offline"
154}; 155};
155 156
@@ -266,7 +267,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter,
266{ 267{
267 struct qlcnic_hardware_context *ahw = adapter->ahw; 268 struct qlcnic_hardware_context *ahw = adapter->ahw;
268 u32 speed, reg; 269 u32 speed, reg;
269 int check_sfp_module = 0; 270 int check_sfp_module = 0, err = 0;
270 u16 pcifn = ahw->pci_func; 271 u16 pcifn = ahw->pci_func;
271 272
272 /* read which mode */ 273 /* read which mode */
@@ -289,7 +290,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter,
289 290
290 } else if (adapter->ahw->port_type == QLCNIC_XGBE) { 291 } else if (adapter->ahw->port_type == QLCNIC_XGBE) {
291 u32 val = 0; 292 u32 val = 0;
292 val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR); 293 val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR, &err);
293 294
294 if (val == QLCNIC_PORT_MODE_802_3_AP) { 295 if (val == QLCNIC_PORT_MODE_802_3_AP) {
295 ecmd->supported = SUPPORTED_1000baseT_Full; 296 ecmd->supported = SUPPORTED_1000baseT_Full;
@@ -300,9 +301,13 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter,
300 } 301 }
301 302
302 if (netif_running(adapter->netdev) && ahw->has_link_events) { 303 if (netif_running(adapter->netdev) && ahw->has_link_events) {
303 reg = QLCRD32(adapter, P3P_LINK_SPEED_REG(pcifn)); 304 if (ahw->linkup) {
304 speed = P3P_LINK_SPEED_VAL(pcifn, reg); 305 reg = QLCRD32(adapter,
305 ahw->link_speed = speed * P3P_LINK_SPEED_MHZ; 306 P3P_LINK_SPEED_REG(pcifn), &err);
307 speed = P3P_LINK_SPEED_VAL(pcifn, reg);
308 ahw->link_speed = speed * P3P_LINK_SPEED_MHZ;
309 }
310
306 ethtool_cmd_speed_set(ecmd, ahw->link_speed); 311 ethtool_cmd_speed_set(ecmd, ahw->link_speed);
307 ecmd->autoneg = ahw->link_autoneg; 312 ecmd->autoneg = ahw->link_autoneg;
308 ecmd->duplex = ahw->link_duplex; 313 ecmd->duplex = ahw->link_duplex;
@@ -463,13 +468,14 @@ static int qlcnic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
463static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter, 468static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter,
464 u32 *regs_buff) 469 u32 *regs_buff)
465{ 470{
466 int i, j = 0; 471 int i, j = 0, err = 0;
467 472
468 for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++) 473 for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++)
469 regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]); 474 regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]);
470 j = 0; 475 j = 0;
471 while (ext_diag_registers[j] != -1) 476 while (ext_diag_registers[j] != -1)
472 regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++]); 477 regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++],
478 &err);
473 return i; 479 return i;
474} 480}
475 481
@@ -519,13 +525,16 @@ qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
519static u32 qlcnic_test_link(struct net_device *dev) 525static u32 qlcnic_test_link(struct net_device *dev)
520{ 526{
521 struct qlcnic_adapter *adapter = netdev_priv(dev); 527 struct qlcnic_adapter *adapter = netdev_priv(dev);
528 int err = 0;
522 u32 val; 529 u32 val;
523 530
524 if (qlcnic_83xx_check(adapter)) { 531 if (qlcnic_83xx_check(adapter)) {
525 val = qlcnic_83xx_test_link(adapter); 532 val = qlcnic_83xx_test_link(adapter);
526 return (val & 1) ? 0 : 1; 533 return (val & 1) ? 0 : 1;
527 } 534 }
528 val = QLCRD32(adapter, CRB_XG_STATE_P3P); 535 val = QLCRD32(adapter, CRB_XG_STATE_P3P, &err);
536 if (err == -EIO)
537 return err;
529 val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val); 538 val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val);
530 return (val == XG_LINK_UP_P3P) ? 0 : 1; 539 return (val == XG_LINK_UP_P3P) ? 0 : 1;
531} 540}
@@ -658,6 +667,7 @@ qlcnic_get_pauseparam(struct net_device *netdev,
658{ 667{
659 struct qlcnic_adapter *adapter = netdev_priv(netdev); 668 struct qlcnic_adapter *adapter = netdev_priv(netdev);
660 int port = adapter->ahw->physical_port; 669 int port = adapter->ahw->physical_port;
670 int err = 0;
661 __u32 val; 671 __u32 val;
662 672
663 if (qlcnic_83xx_check(adapter)) { 673 if (qlcnic_83xx_check(adapter)) {
@@ -668,9 +678,13 @@ qlcnic_get_pauseparam(struct net_device *netdev,
668 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) 678 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
669 return; 679 return;
670 /* get flow control settings */ 680 /* get flow control settings */
671 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port)); 681 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err);
682 if (err == -EIO)
683 return;
672 pause->rx_pause = qlcnic_gb_get_rx_flowctl(val); 684 pause->rx_pause = qlcnic_gb_get_rx_flowctl(val);
673 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL); 685 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err);
686 if (err == -EIO)
687 return;
674 switch (port) { 688 switch (port) {
675 case 0: 689 case 0:
676 pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val)); 690 pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val));
@@ -690,7 +704,9 @@ qlcnic_get_pauseparam(struct net_device *netdev,
690 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) 704 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
691 return; 705 return;
692 pause->rx_pause = 1; 706 pause->rx_pause = 1;
693 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL); 707 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err);
708 if (err == -EIO)
709 return;
694 if (port == 0) 710 if (port == 0)
695 pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val)); 711 pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val));
696 else 712 else
@@ -707,6 +723,7 @@ qlcnic_set_pauseparam(struct net_device *netdev,
707{ 723{
708 struct qlcnic_adapter *adapter = netdev_priv(netdev); 724 struct qlcnic_adapter *adapter = netdev_priv(netdev);
709 int port = adapter->ahw->physical_port; 725 int port = adapter->ahw->physical_port;
726 int err = 0;
710 __u32 val; 727 __u32 val;
711 728
712 if (qlcnic_83xx_check(adapter)) 729 if (qlcnic_83xx_check(adapter))
@@ -717,7 +734,9 @@ qlcnic_set_pauseparam(struct net_device *netdev,
717 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) 734 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
718 return -EIO; 735 return -EIO;
719 /* set flow control */ 736 /* set flow control */
720 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port)); 737 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err);
738 if (err == -EIO)
739 return err;
721 740
722 if (pause->rx_pause) 741 if (pause->rx_pause)
723 qlcnic_gb_rx_flowctl(val); 742 qlcnic_gb_rx_flowctl(val);
@@ -728,7 +747,9 @@ qlcnic_set_pauseparam(struct net_device *netdev,
728 val); 747 val);
729 QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val); 748 QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val);
730 /* set autoneg */ 749 /* set autoneg */
731 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL); 750 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err);
751 if (err == -EIO)
752 return err;
732 switch (port) { 753 switch (port) {
733 case 0: 754 case 0:
734 if (pause->tx_pause) 755 if (pause->tx_pause)
@@ -764,7 +785,9 @@ qlcnic_set_pauseparam(struct net_device *netdev,
764 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) 785 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
765 return -EIO; 786 return -EIO;
766 787
767 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL); 788 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err);
789 if (err == -EIO)
790 return err;
768 if (port == 0) { 791 if (port == 0) {
769 if (pause->tx_pause) 792 if (pause->tx_pause)
770 qlcnic_xg_unset_xg0_mask(val); 793 qlcnic_xg_unset_xg0_mask(val);
@@ -788,11 +811,14 @@ static int qlcnic_reg_test(struct net_device *dev)
788{ 811{
789 struct qlcnic_adapter *adapter = netdev_priv(dev); 812 struct qlcnic_adapter *adapter = netdev_priv(dev);
790 u32 data_read; 813 u32 data_read;
814 int err = 0;
791 815
792 if (qlcnic_83xx_check(adapter)) 816 if (qlcnic_83xx_check(adapter))
793 return qlcnic_83xx_reg_test(adapter); 817 return qlcnic_83xx_reg_test(adapter);
794 818
795 data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0)); 819 data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0), &err);
820 if (err == -EIO)
821 return err;
796 if ((data_read & 0xffff) != adapter->pdev->vendor) 822 if ((data_read & 0xffff) != adapter->pdev->vendor)
797 return 1; 823 return 1;
798 824
@@ -1026,8 +1052,15 @@ qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test,
1026 if (data[3]) 1052 if (data[3])
1027 eth_test->flags |= ETH_TEST_FL_FAILED; 1053 eth_test->flags |= ETH_TEST_FL_FAILED;
1028 1054
1029 data[4] = qlcnic_eeprom_test(dev); 1055 if (eth_test->flags & ETH_TEST_FL_EXTERNAL_LB) {
1030 if (data[4]) 1056 data[4] = qlcnic_loopback_test(dev, QLCNIC_ELB_MODE);
1057 if (data[4])
1058 eth_test->flags |= ETH_TEST_FL_FAILED;
1059 eth_test->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE;
1060 }
1061
1062 data[5] = qlcnic_eeprom_test(dev);
1063 if (data[5])
1031 eth_test->flags |= ETH_TEST_FL_FAILED; 1064 eth_test->flags |= ETH_TEST_FL_FAILED;
1032 } 1065 }
1033} 1066}
@@ -1257,17 +1290,20 @@ qlcnic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
1257{ 1290{
1258 struct qlcnic_adapter *adapter = netdev_priv(dev); 1291 struct qlcnic_adapter *adapter = netdev_priv(dev);
1259 u32 wol_cfg; 1292 u32 wol_cfg;
1293 int err = 0;
1260 1294
1261 if (qlcnic_83xx_check(adapter)) 1295 if (qlcnic_83xx_check(adapter))
1262 return; 1296 return;
1263 wol->supported = 0; 1297 wol->supported = 0;
1264 wol->wolopts = 0; 1298 wol->wolopts = 0;
1265 1299
1266 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); 1300 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1301 if (err == -EIO)
1302 return;
1267 if (wol_cfg & (1UL << adapter->portnum)) 1303 if (wol_cfg & (1UL << adapter->portnum))
1268 wol->supported |= WAKE_MAGIC; 1304 wol->supported |= WAKE_MAGIC;
1269 1305
1270 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); 1306 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1271 if (wol_cfg & (1UL << adapter->portnum)) 1307 if (wol_cfg & (1UL << adapter->portnum))
1272 wol->wolopts |= WAKE_MAGIC; 1308 wol->wolopts |= WAKE_MAGIC;
1273} 1309}
@@ -1277,17 +1313,22 @@ qlcnic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
1277{ 1313{
1278 struct qlcnic_adapter *adapter = netdev_priv(dev); 1314 struct qlcnic_adapter *adapter = netdev_priv(dev);
1279 u32 wol_cfg; 1315 u32 wol_cfg;
1316 int err = 0;
1280 1317
1281 if (qlcnic_83xx_check(adapter)) 1318 if (qlcnic_83xx_check(adapter))
1282 return -EOPNOTSUPP; 1319 return -EOPNOTSUPP;
1283 if (wol->wolopts & ~WAKE_MAGIC) 1320 if (wol->wolopts & ~WAKE_MAGIC)
1284 return -EINVAL; 1321 return -EINVAL;
1285 1322
1286 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); 1323 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1324 if (err == -EIO)
1325 return err;
1287 if (!(wol_cfg & (1 << adapter->portnum))) 1326 if (!(wol_cfg & (1 << adapter->portnum)))
1288 return -EOPNOTSUPP; 1327 return -EOPNOTSUPP;
1289 1328
1290 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); 1329 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1330 if (err == -EIO)
1331 return err;
1291 if (wol->wolopts & WAKE_MAGIC) 1332 if (wol->wolopts & WAKE_MAGIC)
1292 wol_cfg |= 1UL << adapter->portnum; 1333 wol_cfg |= 1UL << adapter->portnum;
1293 else 1334 else
@@ -1540,7 +1581,7 @@ qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val)
1540 return 0; 1581 return 0;
1541 case QLCNIC_SET_QUIESCENT: 1582 case QLCNIC_SET_QUIESCENT:
1542 case QLCNIC_RESET_QUIESCENT: 1583 case QLCNIC_RESET_QUIESCENT:
1543 state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE); 1584 state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
1544 if (state == QLCNIC_DEV_FAILED || (state == QLCNIC_DEV_BADBAD)) 1585 if (state == QLCNIC_DEV_FAILED || (state == QLCNIC_DEV_BADBAD))
1545 netdev_info(netdev, "Device in FAILED state\n"); 1586 netdev_info(netdev, "Device in FAILED state\n");
1546 return 0; 1587 return 0;
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
index 5b5d2edf125d..4d5f59b2d153 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
@@ -317,16 +317,20 @@ static void qlcnic_write_window_reg(u32 addr, void __iomem *bar0, u32 data)
317int 317int
318qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg) 318qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg)
319{ 319{
320 int done = 0, timeout = 0; 320 int timeout = 0;
321 int err = 0;
322 u32 done = 0;
321 323
322 while (!done) { 324 while (!done) {
323 done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem))); 325 done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem)),
326 &err);
324 if (done == 1) 327 if (done == 1)
325 break; 328 break;
326 if (++timeout >= QLCNIC_PCIE_SEM_TIMEOUT) { 329 if (++timeout >= QLCNIC_PCIE_SEM_TIMEOUT) {
327 dev_err(&adapter->pdev->dev, 330 dev_err(&adapter->pdev->dev,
328 "Failed to acquire sem=%d lock; holdby=%d\n", 331 "Failed to acquire sem=%d lock; holdby=%d\n",
329 sem, id_reg ? QLCRD32(adapter, id_reg) : -1); 332 sem,
333 id_reg ? QLCRD32(adapter, id_reg, &err) : -1);
330 return -EIO; 334 return -EIO;
331 } 335 }
332 msleep(1); 336 msleep(1);
@@ -341,19 +345,22 @@ qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg)
341void 345void
342qlcnic_pcie_sem_unlock(struct qlcnic_adapter *adapter, int sem) 346qlcnic_pcie_sem_unlock(struct qlcnic_adapter *adapter, int sem)
343{ 347{
344 QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem))); 348 int err = 0;
349
350 QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem)), &err);
345} 351}
346 352
347int qlcnic_ind_rd(struct qlcnic_adapter *adapter, u32 addr) 353int qlcnic_ind_rd(struct qlcnic_adapter *adapter, u32 addr)
348{ 354{
355 int err = 0;
349 u32 data; 356 u32 data;
350 357
351 if (qlcnic_82xx_check(adapter)) 358 if (qlcnic_82xx_check(adapter))
352 qlcnic_read_window_reg(addr, adapter->ahw->pci_base0, &data); 359 qlcnic_read_window_reg(addr, adapter->ahw->pci_base0, &data);
353 else { 360 else {
354 data = qlcnic_83xx_rd_reg_indirect(adapter, addr); 361 data = QLCRD32(adapter, addr, &err);
355 if (data == -EIO) 362 if (err == -EIO)
356 return -EIO; 363 return err;
357 } 364 }
358 return data; 365 return data;
359} 366}
@@ -516,20 +523,18 @@ void __qlcnic_set_multi(struct net_device *netdev, u16 vlan)
516 if (netdev->flags & IFF_PROMISC) { 523 if (netdev->flags & IFF_PROMISC) {
517 if (!(adapter->flags & QLCNIC_PROMISC_DISABLED)) 524 if (!(adapter->flags & QLCNIC_PROMISC_DISABLED))
518 mode = VPORT_MISS_MODE_ACCEPT_ALL; 525 mode = VPORT_MISS_MODE_ACCEPT_ALL;
519 } else if (netdev->flags & IFF_ALLMULTI) { 526 } else if ((netdev->flags & IFF_ALLMULTI) ||
520 if (netdev_mc_count(netdev) > ahw->max_mc_count) { 527 (netdev_mc_count(netdev) > ahw->max_mc_count)) {
521 mode = VPORT_MISS_MODE_ACCEPT_MULTI; 528 mode = VPORT_MISS_MODE_ACCEPT_MULTI;
522 } else if (!netdev_mc_empty(netdev) && 529 } else if (!netdev_mc_empty(netdev) &&
523 !qlcnic_sriov_vf_check(adapter)) { 530 !qlcnic_sriov_vf_check(adapter)) {
524 netdev_for_each_mc_addr(ha, netdev) 531 netdev_for_each_mc_addr(ha, netdev)
525 qlcnic_nic_add_mac(adapter, ha->addr, 532 qlcnic_nic_add_mac(adapter, ha->addr, vlan);
526 vlan);
527 }
528 if (mode != VPORT_MISS_MODE_ACCEPT_MULTI &&
529 qlcnic_sriov_vf_check(adapter))
530 qlcnic_vf_add_mc_list(netdev, vlan);
531 } 533 }
532 534
535 if (qlcnic_sriov_vf_check(adapter))
536 qlcnic_vf_add_mc_list(netdev, vlan);
537
533 /* configure unicast MAC address, if there is not sufficient space 538 /* configure unicast MAC address, if there is not sufficient space
534 * to store all the unicast addresses then enable promiscuous mode 539 * to store all the unicast addresses then enable promiscuous mode
535 */ 540 */
@@ -1161,7 +1166,8 @@ int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *adapter, ulong off,
1161 return -EIO; 1166 return -EIO;
1162} 1167}
1163 1168
1164int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off) 1169int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off,
1170 int *err)
1165{ 1171{
1166 unsigned long flags; 1172 unsigned long flags;
1167 int rv; 1173 int rv;
@@ -1417,7 +1423,7 @@ int qlcnic_pci_mem_read_2M(struct qlcnic_adapter *adapter, u64 off, u64 *data)
1417 1423
1418int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter) 1424int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter)
1419{ 1425{
1420 int offset, board_type, magic; 1426 int offset, board_type, magic, err = 0;
1421 struct pci_dev *pdev = adapter->pdev; 1427 struct pci_dev *pdev = adapter->pdev;
1422 1428
1423 offset = QLCNIC_FW_MAGIC_OFFSET; 1429 offset = QLCNIC_FW_MAGIC_OFFSET;
@@ -1437,7 +1443,9 @@ int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter)
1437 adapter->ahw->board_type = board_type; 1443 adapter->ahw->board_type = board_type;
1438 1444
1439 if (board_type == QLCNIC_BRDTYPE_P3P_4_GB_MM) { 1445 if (board_type == QLCNIC_BRDTYPE_P3P_4_GB_MM) {
1440 u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I); 1446 u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I, &err);
1447 if (err == -EIO)
1448 return err;
1441 if ((gpio & 0x8000) == 0) 1449 if ((gpio & 0x8000) == 0)
1442 board_type = QLCNIC_BRDTYPE_P3P_10G_TP; 1450 board_type = QLCNIC_BRDTYPE_P3P_10G_TP;
1443 } 1451 }
@@ -1477,10 +1485,13 @@ int
1477qlcnic_wol_supported(struct qlcnic_adapter *adapter) 1485qlcnic_wol_supported(struct qlcnic_adapter *adapter)
1478{ 1486{
1479 u32 wol_cfg; 1487 u32 wol_cfg;
1488 int err = 0;
1480 1489
1481 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); 1490 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1482 if (wol_cfg & (1UL << adapter->portnum)) { 1491 if (wol_cfg & (1UL << adapter->portnum)) {
1483 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); 1492 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1493 if (err == -EIO)
1494 return err;
1484 if (wol_cfg & (1 << adapter->portnum)) 1495 if (wol_cfg & (1 << adapter->portnum))
1485 return 1; 1496 return 1;
1486 } 1497 }
@@ -1541,6 +1552,7 @@ void qlcnic_82xx_get_func_no(struct qlcnic_adapter *adapter)
1541void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf, 1552void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
1542 loff_t offset, size_t size) 1553 loff_t offset, size_t size)
1543{ 1554{
1555 int err = 0;
1544 u32 data; 1556 u32 data;
1545 u64 qmdata; 1557 u64 qmdata;
1546 1558
@@ -1548,7 +1560,7 @@ void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
1548 qlcnic_pci_camqm_read_2M(adapter, offset, &qmdata); 1560 qlcnic_pci_camqm_read_2M(adapter, offset, &qmdata);
1549 memcpy(buf, &qmdata, size); 1561 memcpy(buf, &qmdata, size);
1550 } else { 1562 } else {
1551 data = QLCRD32(adapter, offset); 1563 data = QLCRD32(adapter, offset, &err);
1552 memcpy(buf, &data, size); 1564 memcpy(buf, &data, size);
1553 } 1565 }
1554} 1566}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
index 2c22504f57aa..4a71b28effcb 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
@@ -154,7 +154,7 @@ struct qlcnic_hardware_context;
154struct qlcnic_adapter; 154struct qlcnic_adapter;
155 155
156int qlcnic_82xx_start_firmware(struct qlcnic_adapter *); 156int qlcnic_82xx_start_firmware(struct qlcnic_adapter *);
157int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong); 157int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong, int *);
158int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *, ulong, u32); 158int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *, ulong, u32);
159int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int); 159int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int);
160int qlcnic_82xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32); 160int qlcnic_82xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
index d28336fc65ab..974d62607e13 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
@@ -142,7 +142,7 @@ void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter)
142 buffrag->length, PCI_DMA_TODEVICE); 142 buffrag->length, PCI_DMA_TODEVICE);
143 buffrag->dma = 0ULL; 143 buffrag->dma = 0ULL;
144 } 144 }
145 for (j = 0; j < cmd_buf->frag_count; j++) { 145 for (j = 1; j < cmd_buf->frag_count; j++) {
146 buffrag++; 146 buffrag++;
147 if (buffrag->dma) { 147 if (buffrag->dma) {
148 pci_unmap_page(adapter->pdev, buffrag->dma, 148 pci_unmap_page(adapter->pdev, buffrag->dma,
@@ -286,10 +286,11 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter)
286{ 286{
287 long timeout = 0; 287 long timeout = 0;
288 long done = 0; 288 long done = 0;
289 int err = 0;
289 290
290 cond_resched(); 291 cond_resched();
291 while (done == 0) { 292 while (done == 0) {
292 done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS); 293 done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS, &err);
293 done &= 2; 294 done &= 2;
294 if (++timeout >= QLCNIC_MAX_ROM_WAIT_USEC) { 295 if (++timeout >= QLCNIC_MAX_ROM_WAIT_USEC) {
295 dev_err(&adapter->pdev->dev, 296 dev_err(&adapter->pdev->dev,
@@ -304,6 +305,8 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter)
304static int do_rom_fast_read(struct qlcnic_adapter *adapter, 305static int do_rom_fast_read(struct qlcnic_adapter *adapter,
305 u32 addr, u32 *valp) 306 u32 addr, u32 *valp)
306{ 307{
308 int err = 0;
309
307 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ADDRESS, addr); 310 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ADDRESS, addr);
308 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 311 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
309 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 3); 312 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 3);
@@ -317,7 +320,9 @@ static int do_rom_fast_read(struct qlcnic_adapter *adapter,
317 udelay(10); 320 udelay(10);
318 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 321 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
319 322
320 *valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA); 323 *valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA, &err);
324 if (err == -EIO)
325 return err;
321 return 0; 326 return 0;
322} 327}
323 328
@@ -369,11 +374,11 @@ int qlcnic_rom_fast_read(struct qlcnic_adapter *adapter, u32 addr, u32 *valp)
369 374
370int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter) 375int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
371{ 376{
372 int addr, val; 377 int addr, err = 0;
373 int i, n, init_delay; 378 int i, n, init_delay;
374 struct crb_addr_pair *buf; 379 struct crb_addr_pair *buf;
375 unsigned offset; 380 unsigned offset;
376 u32 off; 381 u32 off, val;
377 struct pci_dev *pdev = adapter->pdev; 382 struct pci_dev *pdev = adapter->pdev;
378 383
379 QLC_SHARED_REG_WR32(adapter, QLCNIC_CMDPEG_STATE, 0); 384 QLC_SHARED_REG_WR32(adapter, QLCNIC_CMDPEG_STATE, 0);
@@ -402,7 +407,9 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
402 QLCWR32(adapter, QLCNIC_CRB_NIU + 0xb0000, 0x00); 407 QLCWR32(adapter, QLCNIC_CRB_NIU + 0xb0000, 0x00);
403 408
404 /* halt sre */ 409 /* halt sre */
405 val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000); 410 val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000, &err);
411 if (err == -EIO)
412 return err;
406 QLCWR32(adapter, QLCNIC_CRB_SRE + 0x1000, val & (~(0x1))); 413 QLCWR32(adapter, QLCNIC_CRB_SRE + 0x1000, val & (~(0x1)));
407 414
408 /* halt epg */ 415 /* halt epg */
@@ -719,10 +726,12 @@ qlcnic_check_flash_fw_ver(struct qlcnic_adapter *adapter)
719static int 726static int
720qlcnic_has_mn(struct qlcnic_adapter *adapter) 727qlcnic_has_mn(struct qlcnic_adapter *adapter)
721{ 728{
722 u32 capability; 729 u32 capability = 0;
723 capability = 0; 730 int err = 0;
724 731
725 capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY); 732 capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY, &err);
733 if (err == -EIO)
734 return err;
726 if (capability & QLCNIC_PEG_TUNE_MN_PRESENT) 735 if (capability & QLCNIC_PEG_TUNE_MN_PRESENT)
727 return 1; 736 return 1;
728 737
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
index d3f8797efcc3..6946d354f44f 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
@@ -161,36 +161,68 @@ static inline int qlcnic_82xx_is_lb_pkt(u64 sts_data)
161 return (qlcnic_get_sts_status(sts_data) == STATUS_CKSUM_LOOP) ? 1 : 0; 161 return (qlcnic_get_sts_status(sts_data) == STATUS_CKSUM_LOOP) ? 1 : 0;
162} 162}
163 163
164static void qlcnic_delete_rx_list_mac(struct qlcnic_adapter *adapter,
165 struct qlcnic_filter *fil,
166 void *addr, u16 vlan_id)
167{
168 int ret;
169 u8 op;
170
171 op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD;
172 ret = qlcnic_sre_macaddr_change(adapter, addr, vlan_id, op);
173 if (ret)
174 return;
175
176 op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL;
177 ret = qlcnic_sre_macaddr_change(adapter, addr, vlan_id, op);
178 if (!ret) {
179 hlist_del(&fil->fnode);
180 adapter->rx_fhash.fnum--;
181 }
182}
183
184static struct qlcnic_filter *qlcnic_find_mac_filter(struct hlist_head *head,
185 void *addr, u16 vlan_id)
186{
187 struct qlcnic_filter *tmp_fil = NULL;
188 struct hlist_node *n;
189
190 hlist_for_each_entry_safe(tmp_fil, n, head, fnode) {
191 if (!memcmp(tmp_fil->faddr, addr, ETH_ALEN) &&
192 tmp_fil->vlan_id == vlan_id)
193 return tmp_fil;
194 }
195
196 return NULL;
197}
198
164void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb, 199void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb,
165 int loopback_pkt, u16 vlan_id) 200 int loopback_pkt, u16 vlan_id)
166{ 201{
167 struct ethhdr *phdr = (struct ethhdr *)(skb->data); 202 struct ethhdr *phdr = (struct ethhdr *)(skb->data);
168 struct qlcnic_filter *fil, *tmp_fil; 203 struct qlcnic_filter *fil, *tmp_fil;
169 struct hlist_node *n;
170 struct hlist_head *head; 204 struct hlist_head *head;
171 unsigned long time; 205 unsigned long time;
172 u64 src_addr = 0; 206 u64 src_addr = 0;
173 u8 hindex, found = 0, op; 207 u8 hindex, op;
174 int ret; 208 int ret;
175 209
176 memcpy(&src_addr, phdr->h_source, ETH_ALEN); 210 memcpy(&src_addr, phdr->h_source, ETH_ALEN);
211 hindex = qlcnic_mac_hash(src_addr) &
212 (adapter->fhash.fbucket_size - 1);
177 213
178 if (loopback_pkt) { 214 if (loopback_pkt) {
179 if (adapter->rx_fhash.fnum >= adapter->rx_fhash.fmax) 215 if (adapter->rx_fhash.fnum >= adapter->rx_fhash.fmax)
180 return; 216 return;
181 217
182 hindex = qlcnic_mac_hash(src_addr) &
183 (adapter->fhash.fbucket_size - 1);
184 head = &(adapter->rx_fhash.fhead[hindex]); 218 head = &(adapter->rx_fhash.fhead[hindex]);
185 219
186 hlist_for_each_entry_safe(tmp_fil, n, head, fnode) { 220 tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id);
187 if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) && 221 if (tmp_fil) {
188 tmp_fil->vlan_id == vlan_id) { 222 time = tmp_fil->ftime;
189 time = tmp_fil->ftime; 223 if (time_after(jiffies, QLCNIC_READD_AGE * HZ + time))
190 if (jiffies > (QLCNIC_READD_AGE * HZ + time)) 224 tmp_fil->ftime = jiffies;
191 tmp_fil->ftime = jiffies; 225 return;
192 return;
193 }
194 } 226 }
195 227
196 fil = kzalloc(sizeof(struct qlcnic_filter), GFP_ATOMIC); 228 fil = kzalloc(sizeof(struct qlcnic_filter), GFP_ATOMIC);
@@ -205,36 +237,37 @@ void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb,
205 adapter->rx_fhash.fnum++; 237 adapter->rx_fhash.fnum++;
206 spin_unlock(&adapter->rx_mac_learn_lock); 238 spin_unlock(&adapter->rx_mac_learn_lock);
207 } else { 239 } else {
208 hindex = qlcnic_mac_hash(src_addr) & 240 head = &adapter->fhash.fhead[hindex];
209 (adapter->fhash.fbucket_size - 1);
210 head = &(adapter->rx_fhash.fhead[hindex]);
211 spin_lock(&adapter->rx_mac_learn_lock);
212 hlist_for_each_entry_safe(tmp_fil, n, head, fnode) {
213 if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) &&
214 tmp_fil->vlan_id == vlan_id) {
215 found = 1;
216 break;
217 }
218 }
219 241
220 if (!found) { 242 spin_lock(&adapter->mac_learn_lock);
221 spin_unlock(&adapter->rx_mac_learn_lock);
222 return;
223 }
224 243
225 op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; 244 tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id);
226 ret = qlcnic_sre_macaddr_change(adapter, (u8 *)&src_addr, 245 if (tmp_fil) {
227 vlan_id, op);
228 if (!ret) {
229 op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL; 246 op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL;
230 ret = qlcnic_sre_macaddr_change(adapter, 247 ret = qlcnic_sre_macaddr_change(adapter,
231 (u8 *)&src_addr, 248 (u8 *)&src_addr,
232 vlan_id, op); 249 vlan_id, op);
233 if (!ret) { 250 if (!ret) {
234 hlist_del(&(tmp_fil->fnode)); 251 hlist_del(&tmp_fil->fnode);
235 adapter->rx_fhash.fnum--; 252 adapter->fhash.fnum--;
236 } 253 }
254
255 spin_unlock(&adapter->mac_learn_lock);
256
257 return;
237 } 258 }
259
260 spin_unlock(&adapter->mac_learn_lock);
261
262 head = &adapter->rx_fhash.fhead[hindex];
263
264 spin_lock(&adapter->rx_mac_learn_lock);
265
266 tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id);
267 if (tmp_fil)
268 qlcnic_delete_rx_list_mac(adapter, tmp_fil, &src_addr,
269 vlan_id);
270
238 spin_unlock(&adapter->rx_mac_learn_lock); 271 spin_unlock(&adapter->rx_mac_learn_lock);
239 } 272 }
240} 273}
@@ -262,7 +295,7 @@ void qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter, u64 *uaddr,
262 295
263 mac_req = (struct qlcnic_mac_req *)&(req->words[0]); 296 mac_req = (struct qlcnic_mac_req *)&(req->words[0]);
264 mac_req->op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; 297 mac_req->op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD;
265 memcpy(mac_req->mac_addr, &uaddr, ETH_ALEN); 298 memcpy(mac_req->mac_addr, uaddr, ETH_ALEN);
266 299
267 vlan_req = (struct qlcnic_vlan_req *)&req->words[1]; 300 vlan_req = (struct qlcnic_vlan_req *)&req->words[1];
268 vlan_req->vlan_id = cpu_to_le16(vlan_id); 301 vlan_req->vlan_id = cpu_to_le16(vlan_id);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index 4528f8ec333b..bc05d016c859 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -977,8 +977,8 @@ qlcnic_check_options(struct qlcnic_adapter *adapter)
977static int 977static int
978qlcnic_initialize_nic(struct qlcnic_adapter *adapter) 978qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
979{ 979{
980 int err;
981 struct qlcnic_info nic_info; 980 struct qlcnic_info nic_info;
981 int err = 0;
982 982
983 memset(&nic_info, 0, sizeof(struct qlcnic_info)); 983 memset(&nic_info, 0, sizeof(struct qlcnic_info));
984 err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func); 984 err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func);
@@ -993,7 +993,9 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
993 993
994 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) { 994 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
995 u32 temp; 995 u32 temp;
996 temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2); 996 temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2, &err);
997 if (err == -EIO)
998 return err;
997 adapter->ahw->extra_capability[0] = temp; 999 adapter->ahw->extra_capability[0] = temp;
998 } 1000 }
999 adapter->ahw->max_mac_filters = nic_info.max_mac_filters; 1001 adapter->ahw->max_mac_filters = nic_info.max_mac_filters;
@@ -1383,6 +1385,8 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter)
1383 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) { 1385 if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
1384 if (qlcnic_82xx_check(adapter)) 1386 if (qlcnic_82xx_check(adapter))
1385 handler = qlcnic_tmp_intr; 1387 handler = qlcnic_tmp_intr;
1388 else
1389 handler = qlcnic_83xx_tmp_intr;
1386 if (!QLCNIC_IS_MSI_FAMILY(adapter)) 1390 if (!QLCNIC_IS_MSI_FAMILY(adapter))
1387 flags |= IRQF_SHARED; 1391 flags |= IRQF_SHARED;
1388 1392
@@ -1531,12 +1535,12 @@ int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
1531 if (netdev->features & NETIF_F_LRO) 1535 if (netdev->features & NETIF_F_LRO)
1532 qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED); 1536 qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED);
1533 1537
1538 set_bit(__QLCNIC_DEV_UP, &adapter->state);
1534 qlcnic_napi_enable(adapter); 1539 qlcnic_napi_enable(adapter);
1535 1540
1536 qlcnic_linkevent_request(adapter, 1); 1541 qlcnic_linkevent_request(adapter, 1);
1537 1542
1538 adapter->ahw->reset_context = 0; 1543 adapter->ahw->reset_context = 0;
1539 set_bit(__QLCNIC_DEV_UP, &adapter->state);
1540 return 0; 1544 return 0;
1541} 1545}
1542 1546
@@ -2139,7 +2143,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2139 if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x && 2143 if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x &&
2140 !!qlcnic_use_msi) 2144 !!qlcnic_use_msi)
2141 dev_warn(&pdev->dev, 2145 dev_warn(&pdev->dev,
2142 "83xx adapter do not support MSI interrupts\n"); 2146 "Device does not support MSI interrupts\n");
2143 2147
2144 err = qlcnic_setup_intr(adapter, 0); 2148 err = qlcnic_setup_intr(adapter, 0);
2145 if (err) { 2149 if (err) {
@@ -2161,7 +2165,8 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2161 if (err) 2165 if (err)
2162 goto err_out_disable_mbx_intr; 2166 goto err_out_disable_mbx_intr;
2163 2167
2164 qlcnic_set_drv_version(adapter); 2168 if (adapter->portnum == 0)
2169 qlcnic_set_drv_version(adapter);
2165 2170
2166 pci_set_drvdata(pdev, adapter); 2171 pci_set_drvdata(pdev, adapter);
2167 2172
@@ -3081,7 +3086,8 @@ done:
3081 adapter->fw_fail_cnt = 0; 3086 adapter->fw_fail_cnt = 0;
3082 adapter->flags &= ~QLCNIC_FW_HANG; 3087 adapter->flags &= ~QLCNIC_FW_HANG;
3083 clear_bit(__QLCNIC_RESETTING, &adapter->state); 3088 clear_bit(__QLCNIC_RESETTING, &adapter->state);
3084 qlcnic_set_drv_version(adapter); 3089 if (adapter->portnum == 0)
3090 qlcnic_set_drv_version(adapter);
3085 3091
3086 if (!qlcnic_clr_drv_state(adapter)) 3092 if (!qlcnic_clr_drv_state(adapter))
3087 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, 3093 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work,
@@ -3093,6 +3099,7 @@ qlcnic_check_health(struct qlcnic_adapter *adapter)
3093{ 3099{
3094 u32 state = 0, heartbeat; 3100 u32 state = 0, heartbeat;
3095 u32 peg_status; 3101 u32 peg_status;
3102 int err = 0;
3096 3103
3097 if (qlcnic_check_temp(adapter)) 3104 if (qlcnic_check_temp(adapter))
3098 goto detach; 3105 goto detach;
@@ -3139,11 +3146,11 @@ qlcnic_check_health(struct qlcnic_adapter *adapter)
3139 "PEG_NET_4_PC: 0x%x\n", 3146 "PEG_NET_4_PC: 0x%x\n",
3140 peg_status, 3147 peg_status,
3141 QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2), 3148 QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2),
3142 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c), 3149 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, &err),
3143 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c), 3150 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, &err),
3144 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c), 3151 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, &err),
3145 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c), 3152 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, &err),
3146 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c)); 3153 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, &err));
3147 if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) 3154 if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
3148 dev_err(&adapter->pdev->dev, 3155 dev_err(&adapter->pdev->dev,
3149 "Firmware aborted with error code 0x00006700. " 3156 "Firmware aborted with error code 0x00006700. "
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
index ab8a6744d402..79e54efe07b9 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
@@ -1084,7 +1084,7 @@ flash_temp:
1084 tmpl_hdr = ahw->fw_dump.tmpl_hdr; 1084 tmpl_hdr = ahw->fw_dump.tmpl_hdr;
1085 tmpl_hdr->drv_cap_mask = QLCNIC_DUMP_MASK_DEF; 1085 tmpl_hdr->drv_cap_mask = QLCNIC_DUMP_MASK_DEF;
1086 1086
1087 if ((tmpl_hdr->version & 0xffffff) >= 0x20001) 1087 if ((tmpl_hdr->version & 0xfffff) >= 0x20001)
1088 ahw->fw_dump.use_pex_dma = true; 1088 ahw->fw_dump.use_pex_dma = true;
1089 else 1089 else
1090 ahw->fw_dump.use_pex_dma = false; 1090 ahw->fw_dump.use_pex_dma = false;
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
index 62380ce89905..5d40045b3cea 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
@@ -562,7 +562,7 @@ static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter,
562 INIT_LIST_HEAD(&adapter->vf_mc_list); 562 INIT_LIST_HEAD(&adapter->vf_mc_list);
563 if (!qlcnic_use_msi_x && !!qlcnic_use_msi) 563 if (!qlcnic_use_msi_x && !!qlcnic_use_msi)
564 dev_warn(&adapter->pdev->dev, 564 dev_warn(&adapter->pdev->dev,
565 "83xx adapter do not support MSI interrupts\n"); 565 "Device does not support MSI interrupts\n");
566 566
567 err = qlcnic_setup_intr(adapter, 1); 567 err = qlcnic_setup_intr(adapter, 1);
568 if (err) { 568 if (err) {
@@ -762,6 +762,7 @@ static int qlcnic_sriov_alloc_bc_mbx_args(struct qlcnic_cmd_args *mbx, u32 type)
762 memset(mbx->rsp.arg, 0, sizeof(u32) * mbx->rsp.num); 762 memset(mbx->rsp.arg, 0, sizeof(u32) * mbx->rsp.num);
763 mbx->req.arg[0] = (type | (mbx->req.num << 16) | 763 mbx->req.arg[0] = (type | (mbx->req.num << 16) |
764 (3 << 29)); 764 (3 << 29));
765 mbx->rsp.arg[0] = (type & 0xffff) | mbx->rsp.num << 16;
765 return 0; 766 return 0;
766 } 767 }
767 } 768 }
@@ -813,6 +814,7 @@ static int qlcnic_sriov_prepare_bc_hdr(struct qlcnic_bc_trans *trans,
813 cmd->req.num = trans->req_pay_size / 4; 814 cmd->req.num = trans->req_pay_size / 4;
814 cmd->rsp.num = trans->rsp_pay_size / 4; 815 cmd->rsp.num = trans->rsp_pay_size / 4;
815 hdr = trans->rsp_hdr; 816 hdr = trans->rsp_hdr;
817 cmd->op_type = trans->req_hdr->op_type;
816 } 818 }
817 819
818 trans->trans_id = seq; 820 trans->trans_id = seq;
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
index ee0c1d307966..eb49cd65378c 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
@@ -635,12 +635,12 @@ static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans,
635 struct qlcnic_cmd_args *cmd) 635 struct qlcnic_cmd_args *cmd)
636{ 636{
637 struct qlcnic_vf_info *vf = trans->vf; 637 struct qlcnic_vf_info *vf = trans->vf;
638 struct qlcnic_adapter *adapter = vf->adapter; 638 struct qlcnic_vport *vp = vf->vp;
639 int err; 639 struct qlcnic_adapter *adapter;
640 u16 func = vf->pci_func; 640 u16 func = vf->pci_func;
641 int err;
641 642
642 cmd->rsp.arg[0] = trans->req_hdr->cmd_op; 643 adapter = vf->adapter;
643 cmd->rsp.arg[0] |= (1 << 16);
644 644
645 if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) { 645 if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) {
646 err = qlcnic_sriov_pf_config_vport(adapter, 1, func); 646 err = qlcnic_sriov_pf_config_vport(adapter, 1, func);
@@ -650,6 +650,8 @@ static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans,
650 qlcnic_sriov_pf_config_vport(adapter, 0, func); 650 qlcnic_sriov_pf_config_vport(adapter, 0, func);
651 } 651 }
652 } else { 652 } else {
653 if (vp->vlan_mode == QLC_GUEST_VLAN_MODE)
654 vp->vlan = 0;
653 err = qlcnic_sriov_pf_config_vport(adapter, 0, func); 655 err = qlcnic_sriov_pf_config_vport(adapter, 0, func);
654 } 656 }
655 657
@@ -1183,7 +1185,7 @@ static int qlcnic_sriov_pf_get_acl_cmd(struct qlcnic_bc_trans *trans,
1183 u8 cmd_op, mode = vp->vlan_mode; 1185 u8 cmd_op, mode = vp->vlan_mode;
1184 1186
1185 cmd_op = trans->req_hdr->cmd_op; 1187 cmd_op = trans->req_hdr->cmd_op;
1186 cmd->rsp.arg[0] = (cmd_op & 0xffff) | 14 << 16 | 1 << 25; 1188 cmd->rsp.arg[0] |= 1 << 25;
1187 1189
1188 switch (mode) { 1190 switch (mode) {
1189 case QLC_GUEST_VLAN_MODE: 1191 case QLC_GUEST_VLAN_MODE:
@@ -1561,6 +1563,7 @@ void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov,
1561 struct qlcnic_vf_info *vf) 1563 struct qlcnic_vf_info *vf)
1562{ 1564{
1563 struct net_device *dev = vf->adapter->netdev; 1565 struct net_device *dev = vf->adapter->netdev;
1566 struct qlcnic_vport *vp = vf->vp;
1564 1567
1565 if (!test_and_clear_bit(QLC_BC_VF_STATE, &vf->state)) { 1568 if (!test_and_clear_bit(QLC_BC_VF_STATE, &vf->state)) {
1566 clear_bit(QLC_BC_VF_FLR, &vf->state); 1569 clear_bit(QLC_BC_VF_FLR, &vf->state);
@@ -1573,6 +1576,9 @@ void qlcnic_sriov_pf_handle_flr(struct qlcnic_sriov *sriov,
1573 return; 1576 return;
1574 } 1577 }
1575 1578
1579 if (vp->vlan_mode == QLC_GUEST_VLAN_MODE)
1580 vp->vlan = 0;
1581
1576 qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr); 1582 qlcnic_sriov_schedule_flr(sriov, vf, qlcnic_sriov_pf_process_flr);
1577 netdev_info(dev, "FLR received for PCI func %d\n", vf->pci_func); 1583 netdev_info(dev, "FLR received for PCI func %d\n", vf->pci_func);
1578} 1584}
@@ -1621,13 +1627,15 @@ int qlcnic_sriov_set_vf_mac(struct net_device *netdev, int vf, u8 *mac)
1621{ 1627{
1622 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1628 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1623 struct qlcnic_sriov *sriov = adapter->ahw->sriov; 1629 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1624 int i, num_vfs = sriov->num_vfs; 1630 int i, num_vfs;
1625 struct qlcnic_vf_info *vf_info; 1631 struct qlcnic_vf_info *vf_info;
1626 u8 *curr_mac; 1632 u8 *curr_mac;
1627 1633
1628 if (!qlcnic_sriov_pf_check(adapter)) 1634 if (!qlcnic_sriov_pf_check(adapter))
1629 return -EOPNOTSUPP; 1635 return -EOPNOTSUPP;
1630 1636
1637 num_vfs = sriov->num_vfs;
1638
1631 if (!is_valid_ether_addr(mac) || vf >= num_vfs) 1639 if (!is_valid_ether_addr(mac) || vf >= num_vfs)
1632 return -EINVAL; 1640 return -EINVAL;
1633 1641
@@ -1741,6 +1749,7 @@ int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf,
1741 1749
1742 switch (vlan) { 1750 switch (vlan) {
1743 case 4095: 1751 case 4095:
1752 vp->vlan = 0;
1744 vp->vlan_mode = QLC_GUEST_VLAN_MODE; 1753 vp->vlan_mode = QLC_GUEST_VLAN_MODE;
1745 break; 1754 break;
1746 case 0: 1755 case 0:
@@ -1759,6 +1768,29 @@ int qlcnic_sriov_set_vf_vlan(struct net_device *netdev, int vf,
1759 return 0; 1768 return 0;
1760} 1769}
1761 1770
1771static inline __u32 qlcnic_sriov_get_vf_vlan(struct qlcnic_adapter *adapter,
1772 struct qlcnic_vport *vp, int vf)
1773{
1774 __u32 vlan = 0;
1775
1776 switch (vp->vlan_mode) {
1777 case QLC_PVID_MODE:
1778 vlan = vp->vlan;
1779 break;
1780 case QLC_GUEST_VLAN_MODE:
1781 vlan = MAX_VLAN_ID;
1782 break;
1783 case QLC_NO_VLAN_MODE:
1784 vlan = 0;
1785 break;
1786 default:
1787 netdev_info(adapter->netdev, "Invalid VLAN mode = %d for VF %d\n",
1788 vp->vlan_mode, vf);
1789 }
1790
1791 return vlan;
1792}
1793
1762int qlcnic_sriov_get_vf_config(struct net_device *netdev, 1794int qlcnic_sriov_get_vf_config(struct net_device *netdev,
1763 int vf, struct ifla_vf_info *ivi) 1795 int vf, struct ifla_vf_info *ivi)
1764{ 1796{
@@ -1774,7 +1806,7 @@ int qlcnic_sriov_get_vf_config(struct net_device *netdev,
1774 1806
1775 vp = sriov->vf_info[vf].vp; 1807 vp = sriov->vf_info[vf].vp;
1776 memcpy(&ivi->mac, vp->mac, ETH_ALEN); 1808 memcpy(&ivi->mac, vp->mac, ETH_ALEN);
1777 ivi->vlan = vp->vlan; 1809 ivi->vlan = qlcnic_sriov_get_vf_vlan(adapter, vp, vf);
1778 ivi->qos = vp->qos; 1810 ivi->qos = vp->qos;
1779 ivi->spoofchk = vp->spoofchk; 1811 ivi->spoofchk = vp->spoofchk;
1780 if (vp->max_tx_bw == MAX_BW) 1812 if (vp->max_tx_bw == MAX_BW)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c
index 10ed82b3baca..660c3f5b2237 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c
@@ -170,9 +170,9 @@ static int qlcnic_82xx_store_beacon(struct qlcnic_adapter *adapter,
170 170
171 if (ahw->extra_capability[0] & QLCNIC_FW_CAPABILITY_2_BEACON) { 171 if (ahw->extra_capability[0] & QLCNIC_FW_CAPABILITY_2_BEACON) {
172 err = qlcnic_get_beacon_state(adapter, &h_beacon_state); 172 err = qlcnic_get_beacon_state(adapter, &h_beacon_state);
173 if (!err) { 173 if (err) {
174 dev_info(&adapter->pdev->dev, 174 netdev_err(adapter->netdev,
175 "Failed to get current beacon state\n"); 175 "Failed to get current beacon state\n");
176 } else { 176 } else {
177 if (h_beacon_state == QLCNIC_BEACON_DISABLE) 177 if (h_beacon_state == QLCNIC_BEACON_DISABLE)
178 ahw->beacon_state = 0; 178 ahw->beacon_state = 0;
diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c
index e6acb9fa5767..d2e591955bdd 100644
--- a/drivers/net/ethernet/realtek/8139cp.c
+++ b/drivers/net/ethernet/realtek/8139cp.c
@@ -478,7 +478,7 @@ rx_status_loop:
478 478
479 while (1) { 479 while (1) {
480 u32 status, len; 480 u32 status, len;
481 dma_addr_t mapping; 481 dma_addr_t mapping, new_mapping;
482 struct sk_buff *skb, *new_skb; 482 struct sk_buff *skb, *new_skb;
483 struct cp_desc *desc; 483 struct cp_desc *desc;
484 const unsigned buflen = cp->rx_buf_sz; 484 const unsigned buflen = cp->rx_buf_sz;
@@ -520,6 +520,14 @@ rx_status_loop:
520 goto rx_next; 520 goto rx_next;
521 } 521 }
522 522
523 new_mapping = dma_map_single(&cp->pdev->dev, new_skb->data, buflen,
524 PCI_DMA_FROMDEVICE);
525 if (dma_mapping_error(&cp->pdev->dev, new_mapping)) {
526 dev->stats.rx_dropped++;
527 kfree_skb(new_skb);
528 goto rx_next;
529 }
530
523 dma_unmap_single(&cp->pdev->dev, mapping, 531 dma_unmap_single(&cp->pdev->dev, mapping,
524 buflen, PCI_DMA_FROMDEVICE); 532 buflen, PCI_DMA_FROMDEVICE);
525 533
@@ -531,12 +539,11 @@ rx_status_loop:
531 539
532 skb_put(skb, len); 540 skb_put(skb, len);
533 541
534 mapping = dma_map_single(&cp->pdev->dev, new_skb->data, buflen,
535 PCI_DMA_FROMDEVICE);
536 cp->rx_skb[rx_tail] = new_skb; 542 cp->rx_skb[rx_tail] = new_skb;
537 543
538 cp_rx_skb(cp, skb, desc); 544 cp_rx_skb(cp, skb, desc);
539 rx++; 545 rx++;
546 mapping = new_mapping;
540 547
541rx_next: 548rx_next:
542 cp->rx_ring[rx_tail].opts2 = 0; 549 cp->rx_ring[rx_tail].opts2 = 0;
@@ -716,6 +723,22 @@ static inline u32 cp_tx_vlan_tag(struct sk_buff *skb)
716 TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00; 723 TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
717} 724}
718 725
726static void unwind_tx_frag_mapping(struct cp_private *cp, struct sk_buff *skb,
727 int first, int entry_last)
728{
729 int frag, index;
730 struct cp_desc *txd;
731 skb_frag_t *this_frag;
732 for (frag = 0; frag+first < entry_last; frag++) {
733 index = first+frag;
734 cp->tx_skb[index] = NULL;
735 txd = &cp->tx_ring[index];
736 this_frag = &skb_shinfo(skb)->frags[frag];
737 dma_unmap_single(&cp->pdev->dev, le64_to_cpu(txd->addr),
738 skb_frag_size(this_frag), PCI_DMA_TODEVICE);
739 }
740}
741
719static netdev_tx_t cp_start_xmit (struct sk_buff *skb, 742static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
720 struct net_device *dev) 743 struct net_device *dev)
721{ 744{
@@ -749,6 +772,9 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
749 772
750 len = skb->len; 773 len = skb->len;
751 mapping = dma_map_single(&cp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE); 774 mapping = dma_map_single(&cp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE);
775 if (dma_mapping_error(&cp->pdev->dev, mapping))
776 goto out_dma_error;
777
752 txd->opts2 = opts2; 778 txd->opts2 = opts2;
753 txd->addr = cpu_to_le64(mapping); 779 txd->addr = cpu_to_le64(mapping);
754 wmb(); 780 wmb();
@@ -786,6 +812,9 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
786 first_len = skb_headlen(skb); 812 first_len = skb_headlen(skb);
787 first_mapping = dma_map_single(&cp->pdev->dev, skb->data, 813 first_mapping = dma_map_single(&cp->pdev->dev, skb->data,
788 first_len, PCI_DMA_TODEVICE); 814 first_len, PCI_DMA_TODEVICE);
815 if (dma_mapping_error(&cp->pdev->dev, first_mapping))
816 goto out_dma_error;
817
789 cp->tx_skb[entry] = skb; 818 cp->tx_skb[entry] = skb;
790 entry = NEXT_TX(entry); 819 entry = NEXT_TX(entry);
791 820
@@ -799,6 +828,11 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
799 mapping = dma_map_single(&cp->pdev->dev, 828 mapping = dma_map_single(&cp->pdev->dev,
800 skb_frag_address(this_frag), 829 skb_frag_address(this_frag),
801 len, PCI_DMA_TODEVICE); 830 len, PCI_DMA_TODEVICE);
831 if (dma_mapping_error(&cp->pdev->dev, mapping)) {
832 unwind_tx_frag_mapping(cp, skb, first_entry, entry);
833 goto out_dma_error;
834 }
835
802 eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; 836 eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0;
803 837
804 ctrl = eor | len | DescOwn; 838 ctrl = eor | len | DescOwn;
@@ -859,11 +893,16 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
859 if (TX_BUFFS_AVAIL(cp) <= (MAX_SKB_FRAGS + 1)) 893 if (TX_BUFFS_AVAIL(cp) <= (MAX_SKB_FRAGS + 1))
860 netif_stop_queue(dev); 894 netif_stop_queue(dev);
861 895
896out_unlock:
862 spin_unlock_irqrestore(&cp->lock, intr_flags); 897 spin_unlock_irqrestore(&cp->lock, intr_flags);
863 898
864 cpw8(TxPoll, NormalTxPoll); 899 cpw8(TxPoll, NormalTxPoll);
865 900
866 return NETDEV_TX_OK; 901 return NETDEV_TX_OK;
902out_dma_error:
903 kfree_skb(skb);
904 cp->dev->stats.tx_dropped++;
905 goto out_unlock;
867} 906}
868 907
869/* Set or clear the multicast filter for this adaptor. 908/* Set or clear the multicast filter for this adaptor.
@@ -1054,6 +1093,10 @@ static int cp_refill_rx(struct cp_private *cp)
1054 1093
1055 mapping = dma_map_single(&cp->pdev->dev, skb->data, 1094 mapping = dma_map_single(&cp->pdev->dev, skb->data,
1056 cp->rx_buf_sz, PCI_DMA_FROMDEVICE); 1095 cp->rx_buf_sz, PCI_DMA_FROMDEVICE);
1096 if (dma_mapping_error(&cp->pdev->dev, mapping)) {
1097 kfree_skb(skb);
1098 goto err_out;
1099 }
1057 cp->rx_skb[i] = skb; 1100 cp->rx_skb[i] = skb;
1058 1101
1059 cp->rx_ring[i].opts2 = 0; 1102 cp->rx_ring[i].opts2 = 0;
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
index 4106a743ca74..85e5c97191dd 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -3689,7 +3689,7 @@ static void rtl_phy_work(struct rtl8169_private *tp)
3689 if (tp->link_ok(ioaddr)) 3689 if (tp->link_ok(ioaddr))
3690 return; 3690 return;
3691 3691
3692 netif_warn(tp, link, tp->dev, "PHY reset until link up\n"); 3692 netif_dbg(tp, link, tp->dev, "PHY reset until link up\n");
3693 3693
3694 tp->phy_reset_enable(tp); 3694 tp->phy_reset_enable(tp);
3695 3695
@@ -6468,6 +6468,8 @@ static int rtl8169_close(struct net_device *dev)
6468 rtl8169_down(dev); 6468 rtl8169_down(dev);
6469 rtl_unlock_work(tp); 6469 rtl_unlock_work(tp);
6470 6470
6471 cancel_work_sync(&tp->wk.work);
6472
6471 free_irq(pdev->irq, dev); 6473 free_irq(pdev->irq, dev);
6472 6474
6473 dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, 6475 dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
@@ -6793,8 +6795,6 @@ static void rtl_remove_one(struct pci_dev *pdev)
6793 rtl8168_driver_stop(tp); 6795 rtl8168_driver_stop(tp);
6794 } 6796 }
6795 6797
6796 cancel_work_sync(&tp->wk.work);
6797
6798 netif_napi_del(&tp->napi); 6798 netif_napi_del(&tp->napi);
6799 6799
6800 unregister_netdev(dev); 6800 unregister_netdev(dev);
@@ -7088,7 +7088,7 @@ rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
7088 7088
7089 RTL_W8(Cfg9346, Cfg9346_Unlock); 7089 RTL_W8(Cfg9346, Cfg9346_Unlock);
7090 RTL_W8(Config1, RTL_R8(Config1) | PMEnable); 7090 RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
7091 RTL_W8(Config5, RTL_R8(Config5) & PMEStatus); 7091 RTL_W8(Config5, RTL_R8(Config5) & (BWF | MWF | UWF | LanWake | PMEStatus));
7092 if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0) 7092 if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
7093 tp->features |= RTL_FEATURE_WOL; 7093 tp->features |= RTL_FEATURE_WOL;
7094 if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0) 7094 if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
diff --git a/drivers/net/ethernet/sfc/filter.c b/drivers/net/ethernet/sfc/filter.c
index b74a60ab9ac7..30d744235d27 100644
--- a/drivers/net/ethernet/sfc/filter.c
+++ b/drivers/net/ethernet/sfc/filter.c
@@ -675,7 +675,7 @@ s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec,
675 BUILD_BUG_ON(EFX_FILTER_INDEX_UC_DEF != 0); 675 BUILD_BUG_ON(EFX_FILTER_INDEX_UC_DEF != 0);
676 BUILD_BUG_ON(EFX_FILTER_INDEX_MC_DEF != 676 BUILD_BUG_ON(EFX_FILTER_INDEX_MC_DEF !=
677 EFX_FILTER_MC_DEF - EFX_FILTER_UC_DEF); 677 EFX_FILTER_MC_DEF - EFX_FILTER_UC_DEF);
678 rep_index = spec->type - EFX_FILTER_INDEX_UC_DEF; 678 rep_index = spec->type - EFX_FILTER_UC_DEF;
679 ins_index = rep_index; 679 ins_index = rep_index;
680 680
681 spin_lock_bh(&state->lock); 681 spin_lock_bh(&state->lock);
@@ -1209,7 +1209,9 @@ int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
1209 EFX_BUG_ON_PARANOID(skb_headlen(skb) < nhoff + 4 * ip->ihl + 4); 1209 EFX_BUG_ON_PARANOID(skb_headlen(skb) < nhoff + 4 * ip->ihl + 4);
1210 ports = (const __be16 *)(skb->data + nhoff + 4 * ip->ihl); 1210 ports = (const __be16 *)(skb->data + nhoff + 4 * ip->ihl);
1211 1211
1212 efx_filter_init_rx(&spec, EFX_FILTER_PRI_HINT, 0, rxq_index); 1212 efx_filter_init_rx(&spec, EFX_FILTER_PRI_HINT,
1213 efx->rx_scatter ? EFX_FILTER_FLAG_RX_SCATTER : 0,
1214 rxq_index);
1213 rc = efx_filter_set_ipv4_full(&spec, ip->protocol, 1215 rc = efx_filter_set_ipv4_full(&spec, ip->protocol,
1214 ip->daddr, ports[1], ip->saddr, ports[0]); 1216 ip->daddr, ports[1], ip->saddr, ports[0]);
1215 if (rc) 1217 if (rc)
diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c
index eb4aea3fe793..f5d7ad75e479 100644
--- a/drivers/net/ethernet/sis/sis900.c
+++ b/drivers/net/ethernet/sis/sis900.c
@@ -1318,7 +1318,7 @@ static void sis900_timer(unsigned long data)
1318 if (duplex){ 1318 if (duplex){
1319 sis900_set_mode(sis_priv, speed, duplex); 1319 sis900_set_mode(sis_priv, speed, duplex);
1320 sis630_set_eq(net_dev, sis_priv->chipset_rev); 1320 sis630_set_eq(net_dev, sis_priv->chipset_rev);
1321 netif_start_queue(net_dev); 1321 netif_carrier_on(net_dev);
1322 } 1322 }
1323 1323
1324 sis_priv->timer.expires = jiffies + HZ; 1324 sis_priv->timer.expires = jiffies + HZ;
@@ -1336,10 +1336,8 @@ static void sis900_timer(unsigned long data)
1336 status = sis900_default_phy(net_dev); 1336 status = sis900_default_phy(net_dev);
1337 mii_phy = sis_priv->mii; 1337 mii_phy = sis_priv->mii;
1338 1338
1339 if (status & MII_STAT_LINK){ 1339 if (status & MII_STAT_LINK)
1340 sis900_check_mode(net_dev, mii_phy); 1340 sis900_check_mode(net_dev, mii_phy);
1341 netif_carrier_on(net_dev);
1342 }
1343 } else { 1341 } else {
1344 /* Link ON -> OFF */ 1342 /* Link ON -> OFF */
1345 if (!(status & MII_STAT_LINK)){ 1343 if (!(status & MII_STAT_LINK)){
@@ -1612,12 +1610,6 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
1612 unsigned int index_cur_tx, index_dirty_tx; 1610 unsigned int index_cur_tx, index_dirty_tx;
1613 unsigned int count_dirty_tx; 1611 unsigned int count_dirty_tx;
1614 1612
1615 /* Don't transmit data before the complete of auto-negotiation */
1616 if(!sis_priv->autong_complete){
1617 netif_stop_queue(net_dev);
1618 return NETDEV_TX_BUSY;
1619 }
1620
1621 spin_lock_irqsave(&sis_priv->lock, flags); 1613 spin_lock_irqsave(&sis_priv->lock, flags);
1622 1614
1623 /* Calculate the next Tx descriptor entry. */ 1615 /* Calculate the next Tx descriptor entry. */
diff --git a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
index c9d942a5c335..1ef9d8a555aa 100644
--- a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
+++ b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
@@ -33,10 +33,15 @@ static unsigned int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
33 struct stmmac_priv *priv = (struct stmmac_priv *)p; 33 struct stmmac_priv *priv = (struct stmmac_priv *)p;
34 unsigned int txsize = priv->dma_tx_size; 34 unsigned int txsize = priv->dma_tx_size;
35 unsigned int entry = priv->cur_tx % txsize; 35 unsigned int entry = priv->cur_tx % txsize;
36 struct dma_desc *desc = priv->dma_tx + entry; 36 struct dma_desc *desc;
37 unsigned int nopaged_len = skb_headlen(skb); 37 unsigned int nopaged_len = skb_headlen(skb);
38 unsigned int bmax, len; 38 unsigned int bmax, len;
39 39
40 if (priv->extend_desc)
41 desc = (struct dma_desc *)(priv->dma_etx + entry);
42 else
43 desc = priv->dma_tx + entry;
44
40 if (priv->plat->enh_desc) 45 if (priv->plat->enh_desc)
41 bmax = BUF_SIZE_8KiB; 46 bmax = BUF_SIZE_8KiB;
42 else 47 else
@@ -54,7 +59,11 @@ static unsigned int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
54 STMMAC_RING_MODE); 59 STMMAC_RING_MODE);
55 wmb(); 60 wmb();
56 entry = (++priv->cur_tx) % txsize; 61 entry = (++priv->cur_tx) % txsize;
57 desc = priv->dma_tx + entry; 62
63 if (priv->extend_desc)
64 desc = (struct dma_desc *)(priv->dma_etx + entry);
65 else
66 desc = priv->dma_tx + entry;
58 67
59 desc->des2 = dma_map_single(priv->device, skb->data + bmax, 68 desc->des2 = dma_map_single(priv->device, skb->data + bmax,
60 len, DMA_TO_DEVICE); 69 len, DMA_TO_DEVICE);
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index f2ccb36e8685..0a9bb9d30c3f 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -939,15 +939,20 @@ static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p,
939 939
940 skb = __netdev_alloc_skb(priv->dev, priv->dma_buf_sz + NET_IP_ALIGN, 940 skb = __netdev_alloc_skb(priv->dev, priv->dma_buf_sz + NET_IP_ALIGN,
941 GFP_KERNEL); 941 GFP_KERNEL);
942 if (unlikely(skb == NULL)) { 942 if (!skb) {
943 pr_err("%s: Rx init fails; skb is NULL\n", __func__); 943 pr_err("%s: Rx init fails; skb is NULL\n", __func__);
944 return 1; 944 return -ENOMEM;
945 } 945 }
946 skb_reserve(skb, NET_IP_ALIGN); 946 skb_reserve(skb, NET_IP_ALIGN);
947 priv->rx_skbuff[i] = skb; 947 priv->rx_skbuff[i] = skb;
948 priv->rx_skbuff_dma[i] = dma_map_single(priv->device, skb->data, 948 priv->rx_skbuff_dma[i] = dma_map_single(priv->device, skb->data,
949 priv->dma_buf_sz, 949 priv->dma_buf_sz,
950 DMA_FROM_DEVICE); 950 DMA_FROM_DEVICE);
951 if (dma_mapping_error(priv->device, priv->rx_skbuff_dma[i])) {
952 pr_err("%s: DMA mapping error\n", __func__);
953 dev_kfree_skb_any(skb);
954 return -EINVAL;
955 }
951 956
952 p->des2 = priv->rx_skbuff_dma[i]; 957 p->des2 = priv->rx_skbuff_dma[i];
953 958
@@ -958,6 +963,16 @@ static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p,
958 return 0; 963 return 0;
959} 964}
960 965
966static void stmmac_free_rx_buffers(struct stmmac_priv *priv, int i)
967{
968 if (priv->rx_skbuff[i]) {
969 dma_unmap_single(priv->device, priv->rx_skbuff_dma[i],
970 priv->dma_buf_sz, DMA_FROM_DEVICE);
971 dev_kfree_skb_any(priv->rx_skbuff[i]);
972 }
973 priv->rx_skbuff[i] = NULL;
974}
975
961/** 976/**
962 * init_dma_desc_rings - init the RX/TX descriptor rings 977 * init_dma_desc_rings - init the RX/TX descriptor rings
963 * @dev: net device structure 978 * @dev: net device structure
@@ -965,13 +980,14 @@ static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p,
965 * and allocates the socket buffers. It suppors the chained and ring 980 * and allocates the socket buffers. It suppors the chained and ring
966 * modes. 981 * modes.
967 */ 982 */
968static void init_dma_desc_rings(struct net_device *dev) 983static int init_dma_desc_rings(struct net_device *dev)
969{ 984{
970 int i; 985 int i;
971 struct stmmac_priv *priv = netdev_priv(dev); 986 struct stmmac_priv *priv = netdev_priv(dev);
972 unsigned int txsize = priv->dma_tx_size; 987 unsigned int txsize = priv->dma_tx_size;
973 unsigned int rxsize = priv->dma_rx_size; 988 unsigned int rxsize = priv->dma_rx_size;
974 unsigned int bfsize = 0; 989 unsigned int bfsize = 0;
990 int ret = -ENOMEM;
975 991
976 /* Set the max buffer size according to the DESC mode 992 /* Set the max buffer size according to the DESC mode
977 * and the MTU. Note that RING mode allows 16KiB bsize. 993 * and the MTU. Note that RING mode allows 16KiB bsize.
@@ -992,34 +1008,60 @@ static void init_dma_desc_rings(struct net_device *dev)
992 dma_extended_desc), 1008 dma_extended_desc),
993 &priv->dma_rx_phy, 1009 &priv->dma_rx_phy,
994 GFP_KERNEL); 1010 GFP_KERNEL);
1011 if (!priv->dma_erx)
1012 goto err_dma;
1013
995 priv->dma_etx = dma_alloc_coherent(priv->device, txsize * 1014 priv->dma_etx = dma_alloc_coherent(priv->device, txsize *
996 sizeof(struct 1015 sizeof(struct
997 dma_extended_desc), 1016 dma_extended_desc),
998 &priv->dma_tx_phy, 1017 &priv->dma_tx_phy,
999 GFP_KERNEL); 1018 GFP_KERNEL);
1000 if ((!priv->dma_erx) || (!priv->dma_etx)) 1019 if (!priv->dma_etx) {
1001 return; 1020 dma_free_coherent(priv->device, priv->dma_rx_size *
1021 sizeof(struct dma_extended_desc),
1022 priv->dma_erx, priv->dma_rx_phy);
1023 goto err_dma;
1024 }
1002 } else { 1025 } else {
1003 priv->dma_rx = dma_alloc_coherent(priv->device, rxsize * 1026 priv->dma_rx = dma_alloc_coherent(priv->device, rxsize *
1004 sizeof(struct dma_desc), 1027 sizeof(struct dma_desc),
1005 &priv->dma_rx_phy, 1028 &priv->dma_rx_phy,
1006 GFP_KERNEL); 1029 GFP_KERNEL);
1030 if (!priv->dma_rx)
1031 goto err_dma;
1032
1007 priv->dma_tx = dma_alloc_coherent(priv->device, txsize * 1033 priv->dma_tx = dma_alloc_coherent(priv->device, txsize *
1008 sizeof(struct dma_desc), 1034 sizeof(struct dma_desc),
1009 &priv->dma_tx_phy, 1035 &priv->dma_tx_phy,
1010 GFP_KERNEL); 1036 GFP_KERNEL);
1011 if ((!priv->dma_rx) || (!priv->dma_tx)) 1037 if (!priv->dma_tx) {
1012 return; 1038 dma_free_coherent(priv->device, priv->dma_rx_size *
1039 sizeof(struct dma_desc),
1040 priv->dma_rx, priv->dma_rx_phy);
1041 goto err_dma;
1042 }
1013 } 1043 }
1014 1044
1015 priv->rx_skbuff_dma = kmalloc_array(rxsize, sizeof(dma_addr_t), 1045 priv->rx_skbuff_dma = kmalloc_array(rxsize, sizeof(dma_addr_t),
1016 GFP_KERNEL); 1046 GFP_KERNEL);
1047 if (!priv->rx_skbuff_dma)
1048 goto err_rx_skbuff_dma;
1049
1017 priv->rx_skbuff = kmalloc_array(rxsize, sizeof(struct sk_buff *), 1050 priv->rx_skbuff = kmalloc_array(rxsize, sizeof(struct sk_buff *),
1018 GFP_KERNEL); 1051 GFP_KERNEL);
1052 if (!priv->rx_skbuff)
1053 goto err_rx_skbuff;
1054
1019 priv->tx_skbuff_dma = kmalloc_array(txsize, sizeof(dma_addr_t), 1055 priv->tx_skbuff_dma = kmalloc_array(txsize, sizeof(dma_addr_t),
1020 GFP_KERNEL); 1056 GFP_KERNEL);
1057 if (!priv->tx_skbuff_dma)
1058 goto err_tx_skbuff_dma;
1059
1021 priv->tx_skbuff = kmalloc_array(txsize, sizeof(struct sk_buff *), 1060 priv->tx_skbuff = kmalloc_array(txsize, sizeof(struct sk_buff *),
1022 GFP_KERNEL); 1061 GFP_KERNEL);
1062 if (!priv->tx_skbuff)
1063 goto err_tx_skbuff;
1064
1023 if (netif_msg_probe(priv)) { 1065 if (netif_msg_probe(priv)) {
1024 pr_debug("(%s) dma_rx_phy=0x%08x dma_tx_phy=0x%08x\n", __func__, 1066 pr_debug("(%s) dma_rx_phy=0x%08x dma_tx_phy=0x%08x\n", __func__,
1025 (u32) priv->dma_rx_phy, (u32) priv->dma_tx_phy); 1067 (u32) priv->dma_rx_phy, (u32) priv->dma_tx_phy);
@@ -1034,8 +1076,9 @@ static void init_dma_desc_rings(struct net_device *dev)
1034 else 1076 else
1035 p = priv->dma_rx + i; 1077 p = priv->dma_rx + i;
1036 1078
1037 if (stmmac_init_rx_buffers(priv, p, i)) 1079 ret = stmmac_init_rx_buffers(priv, p, i);
1038 break; 1080 if (ret)
1081 goto err_init_rx_buffers;
1039 1082
1040 if (netif_msg_probe(priv)) 1083 if (netif_msg_probe(priv))
1041 pr_debug("[%p]\t[%p]\t[%x]\n", priv->rx_skbuff[i], 1084 pr_debug("[%p]\t[%p]\t[%x]\n", priv->rx_skbuff[i],
@@ -1081,20 +1124,44 @@ static void init_dma_desc_rings(struct net_device *dev)
1081 1124
1082 if (netif_msg_hw(priv)) 1125 if (netif_msg_hw(priv))
1083 stmmac_display_rings(priv); 1126 stmmac_display_rings(priv);
1127
1128 return 0;
1129err_init_rx_buffers:
1130 while (--i >= 0)
1131 stmmac_free_rx_buffers(priv, i);
1132 kfree(priv->tx_skbuff);
1133err_tx_skbuff:
1134 kfree(priv->tx_skbuff_dma);
1135err_tx_skbuff_dma:
1136 kfree(priv->rx_skbuff);
1137err_rx_skbuff:
1138 kfree(priv->rx_skbuff_dma);
1139err_rx_skbuff_dma:
1140 if (priv->extend_desc) {
1141 dma_free_coherent(priv->device, priv->dma_tx_size *
1142 sizeof(struct dma_extended_desc),
1143 priv->dma_etx, priv->dma_tx_phy);
1144 dma_free_coherent(priv->device, priv->dma_rx_size *
1145 sizeof(struct dma_extended_desc),
1146 priv->dma_erx, priv->dma_rx_phy);
1147 } else {
1148 dma_free_coherent(priv->device,
1149 priv->dma_tx_size * sizeof(struct dma_desc),
1150 priv->dma_tx, priv->dma_tx_phy);
1151 dma_free_coherent(priv->device,
1152 priv->dma_rx_size * sizeof(struct dma_desc),
1153 priv->dma_rx, priv->dma_rx_phy);
1154 }
1155err_dma:
1156 return ret;
1084} 1157}
1085 1158
1086static void dma_free_rx_skbufs(struct stmmac_priv *priv) 1159static void dma_free_rx_skbufs(struct stmmac_priv *priv)
1087{ 1160{
1088 int i; 1161 int i;
1089 1162
1090 for (i = 0; i < priv->dma_rx_size; i++) { 1163 for (i = 0; i < priv->dma_rx_size; i++)
1091 if (priv->rx_skbuff[i]) { 1164 stmmac_free_rx_buffers(priv, i);
1092 dma_unmap_single(priv->device, priv->rx_skbuff_dma[i],
1093 priv->dma_buf_sz, DMA_FROM_DEVICE);
1094 dev_kfree_skb_any(priv->rx_skbuff[i]);
1095 }
1096 priv->rx_skbuff[i] = NULL;
1097 }
1098} 1165}
1099 1166
1100static void dma_free_tx_skbufs(struct stmmac_priv *priv) 1167static void dma_free_tx_skbufs(struct stmmac_priv *priv)
@@ -1560,12 +1627,17 @@ static int stmmac_open(struct net_device *dev)
1560 priv->dma_tx_size = STMMAC_ALIGN(dma_txsize); 1627 priv->dma_tx_size = STMMAC_ALIGN(dma_txsize);
1561 priv->dma_rx_size = STMMAC_ALIGN(dma_rxsize); 1628 priv->dma_rx_size = STMMAC_ALIGN(dma_rxsize);
1562 priv->dma_buf_sz = STMMAC_ALIGN(buf_sz); 1629 priv->dma_buf_sz = STMMAC_ALIGN(buf_sz);
1563 init_dma_desc_rings(dev); 1630
1631 ret = init_dma_desc_rings(dev);
1632 if (ret < 0) {
1633 pr_err("%s: DMA descriptors initialization failed\n", __func__);
1634 goto dma_desc_error;
1635 }
1564 1636
1565 /* DMA initialization and SW reset */ 1637 /* DMA initialization and SW reset */
1566 ret = stmmac_init_dma_engine(priv); 1638 ret = stmmac_init_dma_engine(priv);
1567 if (ret < 0) { 1639 if (ret < 0) {
1568 pr_err("%s: DMA initialization failed\n", __func__); 1640 pr_err("%s: DMA engine initialization failed\n", __func__);
1569 goto init_error; 1641 goto init_error;
1570 } 1642 }
1571 1643
@@ -1672,6 +1744,7 @@ wolirq_error:
1672 1744
1673init_error: 1745init_error:
1674 free_dma_desc_resources(priv); 1746 free_dma_desc_resources(priv);
1747dma_desc_error:
1675 if (priv->phydev) 1748 if (priv->phydev)
1676 phy_disconnect(priv->phydev); 1749 phy_disconnect(priv->phydev);
1677phy_error: 1750phy_error:
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index 05a1674e204f..22a7a4336211 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -1867,7 +1867,7 @@ static int cpsw_probe(struct platform_device *pdev)
1867 1867
1868 while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { 1868 while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) {
1869 for (i = res->start; i <= res->end; i++) { 1869 for (i = res->start; i <= res->end; i++) {
1870 if (request_irq(i, cpsw_interrupt, IRQF_DISABLED, 1870 if (request_irq(i, cpsw_interrupt, 0,
1871 dev_name(&pdev->dev), priv)) { 1871 dev_name(&pdev->dev), priv)) {
1872 dev_err(priv->dev, "error attaching irq\n"); 1872 dev_err(priv->dev, "error attaching irq\n");
1873 goto clean_ale_ret; 1873 goto clean_ale_ret;
diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c
index 07b176bcf929..1a222bce4bd7 100644
--- a/drivers/net/ethernet/ti/davinci_emac.c
+++ b/drivers/net/ethernet/ti/davinci_emac.c
@@ -1568,8 +1568,7 @@ static int emac_dev_open(struct net_device *ndev)
1568 while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { 1568 while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) {
1569 for (i = res->start; i <= res->end; i++) { 1569 for (i = res->start; i <= res->end; i++) {
1570 if (devm_request_irq(&priv->pdev->dev, i, emac_irq, 1570 if (devm_request_irq(&priv->pdev->dev, i, emac_irq,
1571 IRQF_DISABLED, 1571 0, ndev->name, ndev))
1572 ndev->name, ndev))
1573 goto rollback; 1572 goto rollback;
1574 } 1573 }
1575 k++; 1574 k++;
diff --git a/drivers/net/ethernet/via/via-velocity.c b/drivers/net/ethernet/via/via-velocity.c
index 1d6dc41f755d..d01cacf8a7c2 100644
--- a/drivers/net/ethernet/via/via-velocity.c
+++ b/drivers/net/ethernet/via/via-velocity.c
@@ -2100,7 +2100,7 @@ static int velocity_receive_frame(struct velocity_info *vptr, int idx)
2100 2100
2101 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vid); 2101 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vid);
2102 } 2102 }
2103 netif_rx(skb); 2103 netif_receive_skb(skb);
2104 2104
2105 stats->rx_bytes += pkt_len; 2105 stats->rx_bytes += pkt_len;
2106 stats->rx_packets++; 2106 stats->rx_packets++;
@@ -2884,6 +2884,7 @@ out:
2884 return ret; 2884 return ret;
2885 2885
2886err_iounmap: 2886err_iounmap:
2887 netif_napi_del(&vptr->napi);
2887 iounmap(regs); 2888 iounmap(regs);
2888err_free_dev: 2889err_free_dev:
2889 free_netdev(netdev); 2890 free_netdev(netdev);
@@ -2904,6 +2905,7 @@ static int velocity_remove(struct device *dev)
2904 struct velocity_info *vptr = netdev_priv(netdev); 2905 struct velocity_info *vptr = netdev_priv(netdev);
2905 2906
2906 unregister_netdev(netdev); 2907 unregister_netdev(netdev);
2908 netif_napi_del(&vptr->napi);
2907 iounmap(vptr->mac_regs); 2909 iounmap(vptr->mac_regs);
2908 free_netdev(netdev); 2910 free_netdev(netdev);
2909 velocity_nics--; 2911 velocity_nics--;
diff --git a/drivers/net/irda/via-ircc.c b/drivers/net/irda/via-ircc.c
index 51f2bc376101..2dcc60fb37f1 100644
--- a/drivers/net/irda/via-ircc.c
+++ b/drivers/net/irda/via-ircc.c
@@ -210,8 +210,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
210 pci_write_config_byte(pcidev,0x42,(bTmp | 0xf0)); 210 pci_write_config_byte(pcidev,0x42,(bTmp | 0xf0));
211 pci_write_config_byte(pcidev,0x5a,0xc0); 211 pci_write_config_byte(pcidev,0x5a,0xc0);
212 WriteLPCReg(0x28, 0x70 ); 212 WriteLPCReg(0x28, 0x70 );
213 if (via_ircc_open(pcidev, &info, 0x3076) == 0) 213 rc = via_ircc_open(pcidev, &info, 0x3076);
214 rc=0;
215 } else 214 } else
216 rc = -ENODEV; //IR not turn on 215 rc = -ENODEV; //IR not turn on
217 } else { //Not VT1211 216 } else { //Not VT1211
@@ -249,8 +248,7 @@ static int via_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
249 info.irq=FirIRQ; 248 info.irq=FirIRQ;
250 info.dma=FirDRQ1; 249 info.dma=FirDRQ1;
251 info.dma2=FirDRQ0; 250 info.dma2=FirDRQ0;
252 if (via_ircc_open(pcidev, &info, 0x3096) == 0) 251 rc = via_ircc_open(pcidev, &info, 0x3096);
253 rc=0;
254 } else 252 } else
255 rc = -ENODEV; //IR not turn on !!!!! 253 rc = -ENODEV; //IR not turn on !!!!!
256 }//Not VT1211 254 }//Not VT1211
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index 18373b6ae37d..16b43bf544b7 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -337,8 +337,11 @@ static int macvlan_open(struct net_device *dev)
337 int err; 337 int err;
338 338
339 if (vlan->port->passthru) { 339 if (vlan->port->passthru) {
340 if (!(vlan->flags & MACVLAN_FLAG_NOPROMISC)) 340 if (!(vlan->flags & MACVLAN_FLAG_NOPROMISC)) {
341 dev_set_promiscuity(lowerdev, 1); 341 err = dev_set_promiscuity(lowerdev, 1);
342 if (err < 0)
343 goto out;
344 }
342 goto hash_add; 345 goto hash_add;
343 } 346 }
344 347
@@ -736,6 +739,10 @@ static int macvlan_validate(struct nlattr *tb[], struct nlattr *data[])
736 return -EADDRNOTAVAIL; 739 return -EADDRNOTAVAIL;
737 } 740 }
738 741
742 if (data && data[IFLA_MACVLAN_FLAGS] &&
743 nla_get_u16(data[IFLA_MACVLAN_FLAGS]) & ~MACVLAN_FLAG_NOPROMISC)
744 return -EINVAL;
745
739 if (data && data[IFLA_MACVLAN_MODE]) { 746 if (data && data[IFLA_MACVLAN_MODE]) {
740 switch (nla_get_u32(data[IFLA_MACVLAN_MODE])) { 747 switch (nla_get_u32(data[IFLA_MACVLAN_MODE])) {
741 case MACVLAN_MODE_PRIVATE: 748 case MACVLAN_MODE_PRIVATE:
@@ -863,6 +870,18 @@ static int macvlan_changelink(struct net_device *dev,
863 struct nlattr *tb[], struct nlattr *data[]) 870 struct nlattr *tb[], struct nlattr *data[])
864{ 871{
865 struct macvlan_dev *vlan = netdev_priv(dev); 872 struct macvlan_dev *vlan = netdev_priv(dev);
873 enum macvlan_mode mode;
874 bool set_mode = false;
875
876 /* Validate mode, but don't set yet: setting flags may fail. */
877 if (data && data[IFLA_MACVLAN_MODE]) {
878 set_mode = true;
879 mode = nla_get_u32(data[IFLA_MACVLAN_MODE]);
880 /* Passthrough mode can't be set or cleared dynamically */
881 if ((mode == MACVLAN_MODE_PASSTHRU) !=
882 (vlan->mode == MACVLAN_MODE_PASSTHRU))
883 return -EINVAL;
884 }
866 885
867 if (data && data[IFLA_MACVLAN_FLAGS]) { 886 if (data && data[IFLA_MACVLAN_FLAGS]) {
868 __u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); 887 __u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]);
@@ -879,8 +898,8 @@ static int macvlan_changelink(struct net_device *dev,
879 } 898 }
880 vlan->flags = flags; 899 vlan->flags = flags;
881 } 900 }
882 if (data && data[IFLA_MACVLAN_MODE]) 901 if (set_mode)
883 vlan->mode = nla_get_u32(data[IFLA_MACVLAN_MODE]); 902 vlan->mode = mode;
884 return 0; 903 return 0;
885} 904}
886 905
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index a98fb0ed6aef..ea53abb20988 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -68,6 +68,8 @@ static const struct proto_ops macvtap_socket_ops;
68#define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ 68#define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \
69 NETIF_F_TSO6 | NETIF_F_UFO) 69 NETIF_F_TSO6 | NETIF_F_UFO)
70#define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) 70#define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO)
71#define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG)
72
71/* 73/*
72 * RCU usage: 74 * RCU usage:
73 * The macvtap_queue and the macvlan_dev are loosely coupled, the 75 * The macvtap_queue and the macvlan_dev are loosely coupled, the
@@ -278,7 +280,8 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb)
278{ 280{
279 struct macvlan_dev *vlan = netdev_priv(dev); 281 struct macvlan_dev *vlan = netdev_priv(dev);
280 struct macvtap_queue *q = macvtap_get_queue(dev, skb); 282 struct macvtap_queue *q = macvtap_get_queue(dev, skb);
281 netdev_features_t features; 283 netdev_features_t features = TAP_FEATURES;
284
282 if (!q) 285 if (!q)
283 goto drop; 286 goto drop;
284 287
@@ -287,9 +290,11 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb)
287 290
288 skb->dev = dev; 291 skb->dev = dev;
289 /* Apply the forward feature mask so that we perform segmentation 292 /* Apply the forward feature mask so that we perform segmentation
290 * according to users wishes. 293 * according to users wishes. This only works if VNET_HDR is
294 * enabled.
291 */ 295 */
292 features = netif_skb_features(skb) & vlan->tap_features; 296 if (q->flags & IFF_VNET_HDR)
297 features |= vlan->tap_features;
293 if (netif_needs_gso(skb, features)) { 298 if (netif_needs_gso(skb, features)) {
294 struct sk_buff *segs = __skb_gso_segment(skb, features, false); 299 struct sk_buff *segs = __skb_gso_segment(skb, features, false);
295 300
@@ -818,10 +823,13 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
818 skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY; 823 skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
819 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; 824 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
820 } 825 }
821 if (vlan) 826 if (vlan) {
827 local_bh_disable();
822 macvlan_start_xmit(skb, vlan->dev); 828 macvlan_start_xmit(skb, vlan->dev);
823 else 829 local_bh_enable();
830 } else {
824 kfree_skb(skb); 831 kfree_skb(skb);
832 }
825 rcu_read_unlock(); 833 rcu_read_unlock();
826 834
827 return total_len; 835 return total_len;
@@ -912,8 +920,11 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
912done: 920done:
913 rcu_read_lock(); 921 rcu_read_lock();
914 vlan = rcu_dereference(q->vlan); 922 vlan = rcu_dereference(q->vlan);
915 if (vlan) 923 if (vlan) {
924 preempt_disable();
916 macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0); 925 macvlan_count_rx(vlan, copied - vnet_hdr_len, ret == 0, 0);
926 preempt_enable();
927 }
917 rcu_read_unlock(); 928 rcu_read_unlock();
918 929
919 return ret ? ret : copied; 930 return ret ? ret : copied;
@@ -1058,8 +1069,7 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg)
1058 /* tap_features are the same as features on tun/tap and 1069 /* tap_features are the same as features on tun/tap and
1059 * reflect user expectations. 1070 * reflect user expectations.
1060 */ 1071 */
1061 vlan->tap_features = vlan->dev->features & 1072 vlan->tap_features = feature_mask;
1062 (feature_mask | ~TUN_OFFLOADS);
1063 vlan->set_features = features; 1073 vlan->set_features = features;
1064 netdev_update_features(vlan->dev); 1074 netdev_update_features(vlan->dev);
1065 1075
@@ -1155,10 +1165,6 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
1155 TUN_F_TSO_ECN | TUN_F_UFO)) 1165 TUN_F_TSO_ECN | TUN_F_UFO))
1156 return -EINVAL; 1166 return -EINVAL;
1157 1167
1158 /* TODO: only accept frames with the features that
1159 got enabled for forwarded frames */
1160 if (!(q->flags & IFF_VNET_HDR))
1161 return -EINVAL;
1162 rtnl_lock(); 1168 rtnl_lock();
1163 ret = set_offload(q, arg); 1169 ret = set_offload(q, arg);
1164 rtnl_unlock(); 1170 rtnl_unlock();
diff --git a/drivers/net/phy/mdio-sun4i.c b/drivers/net/phy/mdio-sun4i.c
index 61d3f4ebf52e..7f25e49ae37f 100644
--- a/drivers/net/phy/mdio-sun4i.c
+++ b/drivers/net/phy/mdio-sun4i.c
@@ -40,7 +40,7 @@ struct sun4i_mdio_data {
40static int sun4i_mdio_read(struct mii_bus *bus, int mii_id, int regnum) 40static int sun4i_mdio_read(struct mii_bus *bus, int mii_id, int regnum)
41{ 41{
42 struct sun4i_mdio_data *data = bus->priv; 42 struct sun4i_mdio_data *data = bus->priv;
43 unsigned long start_jiffies; 43 unsigned long timeout_jiffies;
44 int value; 44 int value;
45 45
46 /* issue the phy address and reg */ 46 /* issue the phy address and reg */
@@ -49,10 +49,9 @@ static int sun4i_mdio_read(struct mii_bus *bus, int mii_id, int regnum)
49 writel(0x1, data->membase + EMAC_MAC_MCMD_REG); 49 writel(0x1, data->membase + EMAC_MAC_MCMD_REG);
50 50
51 /* Wait read complete */ 51 /* Wait read complete */
52 start_jiffies = jiffies; 52 timeout_jiffies = jiffies + MDIO_TIMEOUT;
53 while (readl(data->membase + EMAC_MAC_MIND_REG) & 0x1) { 53 while (readl(data->membase + EMAC_MAC_MIND_REG) & 0x1) {
54 if (time_after(start_jiffies, 54 if (time_is_before_jiffies(timeout_jiffies))
55 start_jiffies + MDIO_TIMEOUT))
56 return -ETIMEDOUT; 55 return -ETIMEDOUT;
57 msleep(1); 56 msleep(1);
58 } 57 }
@@ -69,7 +68,7 @@ static int sun4i_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
69 u16 value) 68 u16 value)
70{ 69{
71 struct sun4i_mdio_data *data = bus->priv; 70 struct sun4i_mdio_data *data = bus->priv;
72 unsigned long start_jiffies; 71 unsigned long timeout_jiffies;
73 72
74 /* issue the phy address and reg */ 73 /* issue the phy address and reg */
75 writel((mii_id << 8) | regnum, data->membase + EMAC_MAC_MADR_REG); 74 writel((mii_id << 8) | regnum, data->membase + EMAC_MAC_MADR_REG);
@@ -77,10 +76,9 @@ static int sun4i_mdio_write(struct mii_bus *bus, int mii_id, int regnum,
77 writel(0x1, data->membase + EMAC_MAC_MCMD_REG); 76 writel(0x1, data->membase + EMAC_MAC_MCMD_REG);
78 77
79 /* Wait read complete */ 78 /* Wait read complete */
80 start_jiffies = jiffies; 79 timeout_jiffies = jiffies + MDIO_TIMEOUT;
81 while (readl(data->membase + EMAC_MAC_MIND_REG) & 0x1) { 80 while (readl(data->membase + EMAC_MAC_MIND_REG) & 0x1) {
82 if (time_after(start_jiffies, 81 if (time_is_before_jiffies(timeout_jiffies))
83 start_jiffies + MDIO_TIMEOUT))
84 return -ETIMEDOUT; 82 return -ETIMEDOUT;
85 msleep(1); 83 msleep(1);
86 } 84 }
diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
index 8e7af8354342..138de837977f 100644
--- a/drivers/net/phy/realtek.c
+++ b/drivers/net/phy/realtek.c
@@ -23,7 +23,7 @@
23#define RTL821x_INER_INIT 0x6400 23#define RTL821x_INER_INIT 0x6400
24#define RTL821x_INSR 0x13 24#define RTL821x_INSR 0x13
25 25
26#define RTL8211E_INER_LINK_STAT 0x10 26#define RTL8211E_INER_LINK_STATUS 0x400
27 27
28MODULE_DESCRIPTION("Realtek PHY driver"); 28MODULE_DESCRIPTION("Realtek PHY driver");
29MODULE_AUTHOR("Johnson Leung"); 29MODULE_AUTHOR("Johnson Leung");
@@ -57,7 +57,7 @@ static int rtl8211e_config_intr(struct phy_device *phydev)
57 57
58 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) 58 if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
59 err = phy_write(phydev, RTL821x_INER, 59 err = phy_write(phydev, RTL821x_INER,
60 RTL8211E_INER_LINK_STAT); 60 RTL8211E_INER_LINK_STATUS);
61 else 61 else
62 err = phy_write(phydev, RTL821x_INER, 0); 62 err = phy_write(phydev, RTL821x_INER, 0);
63 63
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index db690a372260..71af122edf2d 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1074,8 +1074,9 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
1074 u32 rxhash; 1074 u32 rxhash;
1075 1075
1076 if (!(tun->flags & TUN_NO_PI)) { 1076 if (!(tun->flags & TUN_NO_PI)) {
1077 if ((len -= sizeof(pi)) > total_len) 1077 if (len < sizeof(pi))
1078 return -EINVAL; 1078 return -EINVAL;
1079 len -= sizeof(pi);
1079 1080
1080 if (memcpy_fromiovecend((void *)&pi, iv, 0, sizeof(pi))) 1081 if (memcpy_fromiovecend((void *)&pi, iv, 0, sizeof(pi)))
1081 return -EFAULT; 1082 return -EFAULT;
@@ -1083,8 +1084,9 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
1083 } 1084 }
1084 1085
1085 if (tun->flags & TUN_VNET_HDR) { 1086 if (tun->flags & TUN_VNET_HDR) {
1086 if ((len -= tun->vnet_hdr_sz) > total_len) 1087 if (len < tun->vnet_hdr_sz)
1087 return -EINVAL; 1088 return -EINVAL;
1089 len -= tun->vnet_hdr_sz;
1088 1090
1089 if (memcpy_fromiovecend((void *)&gso, iv, offset, sizeof(gso))) 1091 if (memcpy_fromiovecend((void *)&gso, iv, offset, sizeof(gso)))
1090 return -EFAULT; 1092 return -EFAULT;
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index 1e3c302d94fe..2bc87e3a8141 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c
@@ -1029,10 +1029,10 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
1029 dev->mii.supports_gmii = 1; 1029 dev->mii.supports_gmii = 1;
1030 1030
1031 dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 1031 dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
1032 NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO; 1032 NETIF_F_RXCSUM;
1033 1033
1034 dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 1034 dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
1035 NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO; 1035 NETIF_F_RXCSUM;
1036 1036
1037 /* Enable checksum offload */ 1037 /* Enable checksum offload */
1038 *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP | 1038 *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP |
@@ -1173,7 +1173,6 @@ ax88179_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
1173 if (((skb->len + 8) % frame_size) == 0) 1173 if (((skb->len + 8) % frame_size) == 0)
1174 tx_hdr2 |= 0x80008000; /* Enable padding */ 1174 tx_hdr2 |= 0x80008000; /* Enable padding */
1175 1175
1176 skb_linearize(skb);
1177 headroom = skb_headroom(skb); 1176 headroom = skb_headroom(skb);
1178 tailroom = skb_tailroom(skb); 1177 tailroom = skb_tailroom(skb);
1179 1178
@@ -1317,10 +1316,10 @@ static int ax88179_reset(struct usbnet *dev)
1317 1, 1, tmp); 1316 1, 1, tmp);
1318 1317
1319 dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 1318 dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
1320 NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO; 1319 NETIF_F_RXCSUM;
1321 1320
1322 dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 1321 dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
1323 NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_TSO; 1322 NETIF_F_RXCSUM;
1324 1323
1325 /* Enable checksum offload */ 1324 /* Enable checksum offload */
1326 *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP | 1325 *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP |
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index cba1d46e672e..86292e6aaf49 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -2816,13 +2816,16 @@ exit:
2816static int hso_get_config_data(struct usb_interface *interface) 2816static int hso_get_config_data(struct usb_interface *interface)
2817{ 2817{
2818 struct usb_device *usbdev = interface_to_usbdev(interface); 2818 struct usb_device *usbdev = interface_to_usbdev(interface);
2819 u8 config_data[17]; 2819 u8 *config_data = kmalloc(17, GFP_KERNEL);
2820 u32 if_num = interface->altsetting->desc.bInterfaceNumber; 2820 u32 if_num = interface->altsetting->desc.bInterfaceNumber;
2821 s32 result; 2821 s32 result;
2822 2822
2823 if (!config_data)
2824 return -ENOMEM;
2823 if (usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 2825 if (usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0),
2824 0x86, 0xC0, 0, 0, config_data, 17, 2826 0x86, 0xC0, 0, 0, config_data, 17,
2825 USB_CTRL_SET_TIMEOUT) != 0x11) { 2827 USB_CTRL_SET_TIMEOUT) != 0x11) {
2828 kfree(config_data);
2826 return -EIO; 2829 return -EIO;
2827 } 2830 }
2828 2831
@@ -2873,6 +2876,7 @@ static int hso_get_config_data(struct usb_interface *interface)
2873 if (config_data[16] & 0x1) 2876 if (config_data[16] & 0x1)
2874 result |= HSO_INFO_CRC_BUG; 2877 result |= HSO_INFO_CRC_BUG;
2875 2878
2879 kfree(config_data);
2876 return result; 2880 return result;
2877} 2881}
2878 2882
@@ -2886,6 +2890,11 @@ static int hso_probe(struct usb_interface *interface,
2886 struct hso_shared_int *shared_int; 2890 struct hso_shared_int *shared_int;
2887 struct hso_device *tmp_dev = NULL; 2891 struct hso_device *tmp_dev = NULL;
2888 2892
2893 if (interface->cur_altsetting->desc.bInterfaceClass != 0xFF) {
2894 dev_err(&interface->dev, "Not our interface\n");
2895 return -ENODEV;
2896 }
2897
2889 if_num = interface->altsetting->desc.bInterfaceNumber; 2898 if_num = interface->altsetting->desc.bInterfaceNumber;
2890 2899
2891 /* Get the interface/port specification from either driver_info or from 2900 /* Get the interface/port specification from either driver_info or from
@@ -2895,10 +2904,6 @@ static int hso_probe(struct usb_interface *interface,
2895 else 2904 else
2896 port_spec = hso_get_config_data(interface); 2905 port_spec = hso_get_config_data(interface);
2897 2906
2898 if (interface->cur_altsetting->desc.bInterfaceClass != 0xFF) {
2899 dev_err(&interface->dev, "Not our interface\n");
2900 return -ENODEV;
2901 }
2902 /* Check if we need to switch to alt interfaces prior to port 2907 /* Check if we need to switch to alt interfaces prior to port
2903 * configuration */ 2908 * configuration */
2904 if (interface->num_altsetting > 1) 2909 if (interface->num_altsetting > 1)
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index ee13f9eb740c..11c51f275366 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -344,17 +344,41 @@ static const int multicast_filter_limit = 32;
344static 344static
345int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data) 345int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
346{ 346{
347 return usb_control_msg(tp->udev, usb_rcvctrlpipe(tp->udev, 0), 347 int ret;
348 void *tmp;
349
350 tmp = kmalloc(size, GFP_KERNEL);
351 if (!tmp)
352 return -ENOMEM;
353
354 ret = usb_control_msg(tp->udev, usb_rcvctrlpipe(tp->udev, 0),
348 RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, 355 RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
349 value, index, data, size, 500); 356 value, index, tmp, size, 500);
357
358 memcpy(data, tmp, size);
359 kfree(tmp);
360
361 return ret;
350} 362}
351 363
352static 364static
353int set_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data) 365int set_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
354{ 366{
355 return usb_control_msg(tp->udev, usb_sndctrlpipe(tp->udev, 0), 367 int ret;
368 void *tmp;
369
370 tmp = kmalloc(size, GFP_KERNEL);
371 if (!tmp)
372 return -ENOMEM;
373
374 memcpy(tmp, data, size);
375
376 ret = usb_control_msg(tp->udev, usb_sndctrlpipe(tp->udev, 0),
356 RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE, 377 RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE,
357 value, index, data, size, 500); 378 value, index, tmp, size, 500);
379
380 kfree(tmp);
381 return ret;
358} 382}
359 383
360static int generic_ocp_read(struct r8152 *tp, u16 index, u16 size, 384static int generic_ocp_read(struct r8152 *tp, u16 index, u16 size,
@@ -490,37 +514,31 @@ int usb_ocp_write(struct r8152 *tp, u16 index, u16 byteen, u16 size, void *data)
490 514
491static u32 ocp_read_dword(struct r8152 *tp, u16 type, u16 index) 515static u32 ocp_read_dword(struct r8152 *tp, u16 type, u16 index)
492{ 516{
493 u32 data; 517 __le32 data;
494 518
495 if (type == MCU_TYPE_PLA) 519 generic_ocp_read(tp, index, sizeof(data), &data, type);
496 pla_ocp_read(tp, index, sizeof(data), &data);
497 else
498 usb_ocp_read(tp, index, sizeof(data), &data);
499 520
500 return __le32_to_cpu(data); 521 return __le32_to_cpu(data);
501} 522}
502 523
503static void ocp_write_dword(struct r8152 *tp, u16 type, u16 index, u32 data) 524static void ocp_write_dword(struct r8152 *tp, u16 type, u16 index, u32 data)
504{ 525{
505 if (type == MCU_TYPE_PLA) 526 __le32 tmp = __cpu_to_le32(data);
506 pla_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(data), &data); 527
507 else 528 generic_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(tmp), &tmp, type);
508 usb_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(data), &data);
509} 529}
510 530
511static u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index) 531static u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index)
512{ 532{
513 u32 data; 533 u32 data;
534 __le32 tmp;
514 u8 shift = index & 2; 535 u8 shift = index & 2;
515 536
516 index &= ~3; 537 index &= ~3;
517 538
518 if (type == MCU_TYPE_PLA) 539 generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
519 pla_ocp_read(tp, index, sizeof(data), &data);
520 else
521 usb_ocp_read(tp, index, sizeof(data), &data);
522 540
523 data = __le32_to_cpu(data); 541 data = __le32_to_cpu(tmp);
524 data >>= (shift * 8); 542 data >>= (shift * 8);
525 data &= 0xffff; 543 data &= 0xffff;
526 544
@@ -529,7 +547,8 @@ static u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index)
529 547
530static void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data) 548static void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data)
531{ 549{
532 u32 tmp, mask = 0xffff; 550 u32 mask = 0xffff;
551 __le32 tmp;
533 u16 byen = BYTE_EN_WORD; 552 u16 byen = BYTE_EN_WORD;
534 u8 shift = index & 2; 553 u8 shift = index & 2;
535 554
@@ -542,34 +561,25 @@ static void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data)
542 index &= ~3; 561 index &= ~3;
543 } 562 }
544 563
545 if (type == MCU_TYPE_PLA) 564 generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
546 pla_ocp_read(tp, index, sizeof(tmp), &tmp);
547 else
548 usb_ocp_read(tp, index, sizeof(tmp), &tmp);
549 565
550 tmp = __le32_to_cpu(tmp) & ~mask; 566 data |= __le32_to_cpu(tmp) & ~mask;
551 tmp |= data; 567 tmp = __cpu_to_le32(data);
552 tmp = __cpu_to_le32(tmp);
553 568
554 if (type == MCU_TYPE_PLA) 569 generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type);
555 pla_ocp_write(tp, index, byen, sizeof(tmp), &tmp);
556 else
557 usb_ocp_write(tp, index, byen, sizeof(tmp), &tmp);
558} 570}
559 571
560static u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index) 572static u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index)
561{ 573{
562 u32 data; 574 u32 data;
575 __le32 tmp;
563 u8 shift = index & 3; 576 u8 shift = index & 3;
564 577
565 index &= ~3; 578 index &= ~3;
566 579
567 if (type == MCU_TYPE_PLA) 580 generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
568 pla_ocp_read(tp, index, sizeof(data), &data);
569 else
570 usb_ocp_read(tp, index, sizeof(data), &data);
571 581
572 data = __le32_to_cpu(data); 582 data = __le32_to_cpu(tmp);
573 data >>= (shift * 8); 583 data >>= (shift * 8);
574 data &= 0xff; 584 data &= 0xff;
575 585
@@ -578,7 +588,8 @@ static u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index)
578 588
579static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data) 589static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data)
580{ 590{
581 u32 tmp, mask = 0xff; 591 u32 mask = 0xff;
592 __le32 tmp;
582 u16 byen = BYTE_EN_BYTE; 593 u16 byen = BYTE_EN_BYTE;
583 u8 shift = index & 3; 594 u8 shift = index & 3;
584 595
@@ -591,19 +602,12 @@ static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data)
591 index &= ~3; 602 index &= ~3;
592 } 603 }
593 604
594 if (type == MCU_TYPE_PLA) 605 generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
595 pla_ocp_read(tp, index, sizeof(tmp), &tmp);
596 else
597 usb_ocp_read(tp, index, sizeof(tmp), &tmp);
598 606
599 tmp = __le32_to_cpu(tmp) & ~mask; 607 data |= __le32_to_cpu(tmp) & ~mask;
600 tmp |= data; 608 tmp = __cpu_to_le32(data);
601 tmp = __cpu_to_le32(tmp);
602 609
603 if (type == MCU_TYPE_PLA) 610 generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type);
604 pla_ocp_write(tp, index, byen, sizeof(tmp), &tmp);
605 else
606 usb_ocp_write(tp, index, byen, sizeof(tmp), &tmp);
607} 611}
608 612
609static void r8152_mdio_write(struct r8152 *tp, u32 reg_addr, u32 value) 613static void r8152_mdio_write(struct r8152 *tp, u32 reg_addr, u32 value)
@@ -685,21 +689,14 @@ static void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data)
685static inline void set_ethernet_addr(struct r8152 *tp) 689static inline void set_ethernet_addr(struct r8152 *tp)
686{ 690{
687 struct net_device *dev = tp->netdev; 691 struct net_device *dev = tp->netdev;
688 u8 *node_id; 692 u8 node_id[8] = {0};
689
690 node_id = kmalloc(sizeof(u8) * 8, GFP_KERNEL);
691 if (!node_id) {
692 netif_err(tp, probe, dev, "out of memory");
693 return;
694 }
695 693
696 if (pla_ocp_read(tp, PLA_IDR, sizeof(u8) * 8, node_id) < 0) 694 if (pla_ocp_read(tp, PLA_IDR, sizeof(node_id), node_id) < 0)
697 netif_notice(tp, probe, dev, "inet addr fail\n"); 695 netif_notice(tp, probe, dev, "inet addr fail\n");
698 else { 696 else {
699 memcpy(dev->dev_addr, node_id, dev->addr_len); 697 memcpy(dev->dev_addr, node_id, dev->addr_len);
700 memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); 698 memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
701 } 699 }
702 kfree(node_id);
703} 700}
704 701
705static int rtl8152_set_mac_address(struct net_device *netdev, void *p) 702static int rtl8152_set_mac_address(struct net_device *netdev, void *p)
@@ -882,15 +879,10 @@ static void rtl8152_set_rx_mode(struct net_device *netdev)
882static void _rtl8152_set_rx_mode(struct net_device *netdev) 879static void _rtl8152_set_rx_mode(struct net_device *netdev)
883{ 880{
884 struct r8152 *tp = netdev_priv(netdev); 881 struct r8152 *tp = netdev_priv(netdev);
885 u32 tmp, *mc_filter; /* Multicast hash filter */ 882 u32 mc_filter[2]; /* Multicast hash filter */
883 __le32 tmp[2];
886 u32 ocp_data; 884 u32 ocp_data;
887 885
888 mc_filter = kmalloc(sizeof(u32) * 2, GFP_KERNEL);
889 if (!mc_filter) {
890 netif_err(tp, link, netdev, "out of memory");
891 return;
892 }
893
894 clear_bit(RTL8152_SET_RX_MODE, &tp->flags); 886 clear_bit(RTL8152_SET_RX_MODE, &tp->flags);
895 netif_stop_queue(netdev); 887 netif_stop_queue(netdev);
896 ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR); 888 ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
@@ -918,14 +910,12 @@ static void _rtl8152_set_rx_mode(struct net_device *netdev)
918 } 910 }
919 } 911 }
920 912
921 tmp = mc_filter[0]; 913 tmp[0] = __cpu_to_le32(swab32(mc_filter[1]));
922 mc_filter[0] = __cpu_to_le32(swab32(mc_filter[1])); 914 tmp[1] = __cpu_to_le32(swab32(mc_filter[0]));
923 mc_filter[1] = __cpu_to_le32(swab32(tmp));
924 915
925 pla_ocp_write(tp, PLA_MAR, BYTE_EN_DWORD, sizeof(u32) * 2, mc_filter); 916 pla_ocp_write(tp, PLA_MAR, BYTE_EN_DWORD, sizeof(tmp), tmp);
926 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); 917 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
927 netif_wake_queue(netdev); 918 netif_wake_queue(netdev);
928 kfree(mc_filter);
929} 919}
930 920
931static netdev_tx_t rtl8152_start_xmit(struct sk_buff *skb, 921static netdev_tx_t rtl8152_start_xmit(struct sk_buff *skb,
diff --git a/drivers/net/usb/r815x.c b/drivers/net/usb/r815x.c
index 852392269718..2df2f4fb42a7 100644
--- a/drivers/net/usb/r815x.c
+++ b/drivers/net/usb/r815x.c
@@ -24,34 +24,43 @@
24 24
25static int pla_read_word(struct usb_device *udev, u16 index) 25static int pla_read_word(struct usb_device *udev, u16 index)
26{ 26{
27 int data, ret; 27 int ret;
28 u8 shift = index & 2; 28 u8 shift = index & 2;
29 __le32 ocp_data; 29 __le32 *tmp;
30
31 tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
32 if (!tmp)
33 return -ENOMEM;
30 34
31 index &= ~3; 35 index &= ~3;
32 36
33 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 37 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
34 RTL815x_REQ_GET_REGS, RTL815x_REQT_READ, 38 RTL815x_REQ_GET_REGS, RTL815x_REQT_READ,
35 index, MCU_TYPE_PLA, &ocp_data, sizeof(ocp_data), 39 index, MCU_TYPE_PLA, tmp, sizeof(*tmp), 500);
36 500);
37 if (ret < 0) 40 if (ret < 0)
38 return ret; 41 goto out2;
39 42
40 data = __le32_to_cpu(ocp_data); 43 ret = __le32_to_cpu(*tmp);
41 data >>= (shift * 8); 44 ret >>= (shift * 8);
42 data &= 0xffff; 45 ret &= 0xffff;
43 46
44 return data; 47out2:
48 kfree(tmp);
49 return ret;
45} 50}
46 51
47static int pla_write_word(struct usb_device *udev, u16 index, u32 data) 52static int pla_write_word(struct usb_device *udev, u16 index, u32 data)
48{ 53{
49 __le32 ocp_data; 54 __le32 *tmp;
50 u32 mask = 0xffff; 55 u32 mask = 0xffff;
51 u16 byen = BYTE_EN_WORD; 56 u16 byen = BYTE_EN_WORD;
52 u8 shift = index & 2; 57 u8 shift = index & 2;
53 int ret; 58 int ret;
54 59
60 tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
61 if (!tmp)
62 return -ENOMEM;
63
55 data &= mask; 64 data &= mask;
56 65
57 if (shift) { 66 if (shift) {
@@ -63,19 +72,20 @@ static int pla_write_word(struct usb_device *udev, u16 index, u32 data)
63 72
64 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 73 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
65 RTL815x_REQ_GET_REGS, RTL815x_REQT_READ, 74 RTL815x_REQ_GET_REGS, RTL815x_REQT_READ,
66 index, MCU_TYPE_PLA, &ocp_data, sizeof(ocp_data), 75 index, MCU_TYPE_PLA, tmp, sizeof(*tmp), 500);
67 500);
68 if (ret < 0) 76 if (ret < 0)
69 return ret; 77 goto out3;
70 78
71 data |= __le32_to_cpu(ocp_data) & ~mask; 79 data |= __le32_to_cpu(*tmp) & ~mask;
72 ocp_data = __cpu_to_le32(data); 80 *tmp = __cpu_to_le32(data);
73 81
74 ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 82 ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
75 RTL815x_REQ_SET_REGS, RTL815x_REQT_WRITE, 83 RTL815x_REQ_SET_REGS, RTL815x_REQT_WRITE,
76 index, MCU_TYPE_PLA | byen, &ocp_data, 84 index, MCU_TYPE_PLA | byen, tmp, sizeof(*tmp),
77 sizeof(ocp_data), 500); 85 500);
78 86
87out3:
88 kfree(tmp);
79 return ret; 89 return ret;
80} 90}
81 91
@@ -116,11 +126,18 @@ out1:
116static int r815x_mdio_read(struct net_device *netdev, int phy_id, int reg) 126static int r815x_mdio_read(struct net_device *netdev, int phy_id, int reg)
117{ 127{
118 struct usbnet *dev = netdev_priv(netdev); 128 struct usbnet *dev = netdev_priv(netdev);
129 int ret;
119 130
120 if (phy_id != R815x_PHY_ID) 131 if (phy_id != R815x_PHY_ID)
121 return -EINVAL; 132 return -EINVAL;
122 133
123 return ocp_reg_read(dev, BASE_MII + reg * 2); 134 if (usb_autopm_get_interface(dev->intf) < 0)
135 return -ENODEV;
136
137 ret = ocp_reg_read(dev, BASE_MII + reg * 2);
138
139 usb_autopm_put_interface(dev->intf);
140 return ret;
124} 141}
125 142
126static 143static
@@ -131,7 +148,12 @@ void r815x_mdio_write(struct net_device *netdev, int phy_id, int reg, int val)
131 if (phy_id != R815x_PHY_ID) 148 if (phy_id != R815x_PHY_ID)
132 return; 149 return;
133 150
151 if (usb_autopm_get_interface(dev->intf) < 0)
152 return;
153
134 ocp_reg_write(dev, BASE_MII + reg * 2, val); 154 ocp_reg_write(dev, BASE_MII + reg * 2, val);
155
156 usb_autopm_put_interface(dev->intf);
135} 157}
136 158
137static int r8153_bind(struct usbnet *dev, struct usb_interface *intf) 159static int r8153_bind(struct usbnet *dev, struct usb_interface *intf)
@@ -150,7 +172,7 @@ static int r8153_bind(struct usbnet *dev, struct usb_interface *intf)
150 dev->mii.phy_id = R815x_PHY_ID; 172 dev->mii.phy_id = R815x_PHY_ID;
151 dev->mii.supports_gmii = 1; 173 dev->mii.supports_gmii = 1;
152 174
153 return 0; 175 return status;
154} 176}
155 177
156static int r8152_bind(struct usbnet *dev, struct usb_interface *intf) 178static int r8152_bind(struct usbnet *dev, struct usb_interface *intf)
@@ -169,7 +191,7 @@ static int r8152_bind(struct usbnet *dev, struct usb_interface *intf)
169 dev->mii.phy_id = R815x_PHY_ID; 191 dev->mii.phy_id = R815x_PHY_ID;
170 dev->mii.supports_gmii = 0; 192 dev->mii.supports_gmii = 0;
171 193
172 return 0; 194 return status;
173} 195}
174 196
175static const struct driver_info r8152_info = { 197static const struct driver_info r8152_info = {
diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c
index 75409748c774..66ebbacf066f 100644
--- a/drivers/net/usb/smsc75xx.c
+++ b/drivers/net/usb/smsc75xx.c
@@ -45,7 +45,6 @@
45#define EEPROM_MAC_OFFSET (0x01) 45#define EEPROM_MAC_OFFSET (0x01)
46#define DEFAULT_TX_CSUM_ENABLE (true) 46#define DEFAULT_TX_CSUM_ENABLE (true)
47#define DEFAULT_RX_CSUM_ENABLE (true) 47#define DEFAULT_RX_CSUM_ENABLE (true)
48#define DEFAULT_TSO_ENABLE (true)
49#define SMSC75XX_INTERNAL_PHY_ID (1) 48#define SMSC75XX_INTERNAL_PHY_ID (1)
50#define SMSC75XX_TX_OVERHEAD (8) 49#define SMSC75XX_TX_OVERHEAD (8)
51#define MAX_RX_FIFO_SIZE (20 * 1024) 50#define MAX_RX_FIFO_SIZE (20 * 1024)
@@ -1410,17 +1409,14 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf)
1410 1409
1411 INIT_WORK(&pdata->set_multicast, smsc75xx_deferred_multicast_write); 1410 INIT_WORK(&pdata->set_multicast, smsc75xx_deferred_multicast_write);
1412 1411
1413 if (DEFAULT_TX_CSUM_ENABLE) { 1412 if (DEFAULT_TX_CSUM_ENABLE)
1414 dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; 1413 dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
1415 if (DEFAULT_TSO_ENABLE) 1414
1416 dev->net->features |= NETIF_F_SG |
1417 NETIF_F_TSO | NETIF_F_TSO6;
1418 }
1419 if (DEFAULT_RX_CSUM_ENABLE) 1415 if (DEFAULT_RX_CSUM_ENABLE)
1420 dev->net->features |= NETIF_F_RXCSUM; 1416 dev->net->features |= NETIF_F_RXCSUM;
1421 1417
1422 dev->net->hw_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | 1418 dev->net->hw_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
1423 NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_RXCSUM; 1419 NETIF_F_RXCSUM;
1424 1420
1425 ret = smsc75xx_wait_ready(dev, 0); 1421 ret = smsc75xx_wait_ready(dev, 0);
1426 if (ret < 0) { 1422 if (ret < 0) {
@@ -2200,8 +2196,6 @@ static struct sk_buff *smsc75xx_tx_fixup(struct usbnet *dev,
2200{ 2196{
2201 u32 tx_cmd_a, tx_cmd_b; 2197 u32 tx_cmd_a, tx_cmd_b;
2202 2198
2203 skb_linearize(skb);
2204
2205 if (skb_headroom(skb) < SMSC75XX_TX_OVERHEAD) { 2199 if (skb_headroom(skb) < SMSC75XX_TX_OVERHEAD) {
2206 struct sk_buff *skb2 = 2200 struct sk_buff *skb2 =
2207 skb_copy_expand(skb, SMSC75XX_TX_OVERHEAD, 0, flags); 2201 skb_copy_expand(skb, SMSC75XX_TX_OVERHEAD, 0, flags);
diff --git a/drivers/net/veth.c b/drivers/net/veth.c
index da866523cf20..eee1f19ef1e9 100644
--- a/drivers/net/veth.c
+++ b/drivers/net/veth.c
@@ -269,6 +269,7 @@ static void veth_setup(struct net_device *dev)
269 dev->ethtool_ops = &veth_ethtool_ops; 269 dev->ethtool_ops = &veth_ethtool_ops;
270 dev->features |= NETIF_F_LLTX; 270 dev->features |= NETIF_F_LLTX;
271 dev->features |= VETH_FEATURES; 271 dev->features |= VETH_FEATURES;
272 dev->vlan_features = dev->features;
272 dev->destructor = veth_dev_free; 273 dev->destructor = veth_dev_free;
273 274
274 dev->hw_features = VETH_FEATURES; 275 dev->hw_features = VETH_FEATURES;
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index a5ba8dd7e6be..767f7af3bd40 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -136,7 +136,8 @@ struct vxlan_dev {
136 u32 flags; /* VXLAN_F_* below */ 136 u32 flags; /* VXLAN_F_* below */
137 137
138 struct work_struct sock_work; 138 struct work_struct sock_work;
139 struct work_struct igmp_work; 139 struct work_struct igmp_join;
140 struct work_struct igmp_leave;
140 141
141 unsigned long age_interval; 142 unsigned long age_interval;
142 struct timer_list age_timer; 143 struct timer_list age_timer;
@@ -736,7 +737,6 @@ static bool vxlan_snoop(struct net_device *dev,
736 return false; 737 return false;
737} 738}
738 739
739
740/* See if multicast group is already in use by other ID */ 740/* See if multicast group is already in use by other ID */
741static bool vxlan_group_used(struct vxlan_net *vn, __be32 remote_ip) 741static bool vxlan_group_used(struct vxlan_net *vn, __be32 remote_ip)
742{ 742{
@@ -770,12 +770,13 @@ static void vxlan_sock_release(struct vxlan_net *vn, struct vxlan_sock *vs)
770 queue_work(vxlan_wq, &vs->del_work); 770 queue_work(vxlan_wq, &vs->del_work);
771} 771}
772 772
773/* Callback to update multicast group membership. 773/* Callback to update multicast group membership when first VNI on
774 * Scheduled when vxlan goes up/down. 774 * multicast asddress is brought up
775 * Done as workqueue because ip_mc_join_group acquires RTNL.
775 */ 776 */
776static void vxlan_igmp_work(struct work_struct *work) 777static void vxlan_igmp_join(struct work_struct *work)
777{ 778{
778 struct vxlan_dev *vxlan = container_of(work, struct vxlan_dev, igmp_work); 779 struct vxlan_dev *vxlan = container_of(work, struct vxlan_dev, igmp_join);
779 struct vxlan_net *vn = net_generic(dev_net(vxlan->dev), vxlan_net_id); 780 struct vxlan_net *vn = net_generic(dev_net(vxlan->dev), vxlan_net_id);
780 struct vxlan_sock *vs = vxlan->vn_sock; 781 struct vxlan_sock *vs = vxlan->vn_sock;
781 struct sock *sk = vs->sock->sk; 782 struct sock *sk = vs->sock->sk;
@@ -785,10 +786,27 @@ static void vxlan_igmp_work(struct work_struct *work)
785 }; 786 };
786 787
787 lock_sock(sk); 788 lock_sock(sk);
788 if (vxlan_group_used(vn, vxlan->default_dst.remote_ip)) 789 ip_mc_join_group(sk, &mreq);
789 ip_mc_join_group(sk, &mreq); 790 release_sock(sk);
790 else 791
791 ip_mc_leave_group(sk, &mreq); 792 vxlan_sock_release(vn, vs);
793 dev_put(vxlan->dev);
794}
795
796/* Inverse of vxlan_igmp_join when last VNI is brought down */
797static void vxlan_igmp_leave(struct work_struct *work)
798{
799 struct vxlan_dev *vxlan = container_of(work, struct vxlan_dev, igmp_leave);
800 struct vxlan_net *vn = net_generic(dev_net(vxlan->dev), vxlan_net_id);
801 struct vxlan_sock *vs = vxlan->vn_sock;
802 struct sock *sk = vs->sock->sk;
803 struct ip_mreqn mreq = {
804 .imr_multiaddr.s_addr = vxlan->default_dst.remote_ip,
805 .imr_ifindex = vxlan->default_dst.remote_ifindex,
806 };
807
808 lock_sock(sk);
809 ip_mc_leave_group(sk, &mreq);
792 release_sock(sk); 810 release_sock(sk);
793 811
794 vxlan_sock_release(vn, vs); 812 vxlan_sock_release(vn, vs);
@@ -1359,6 +1377,7 @@ static void vxlan_uninit(struct net_device *dev)
1359/* Start ageing timer and join group when device is brought up */ 1377/* Start ageing timer and join group when device is brought up */
1360static int vxlan_open(struct net_device *dev) 1378static int vxlan_open(struct net_device *dev)
1361{ 1379{
1380 struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id);
1362 struct vxlan_dev *vxlan = netdev_priv(dev); 1381 struct vxlan_dev *vxlan = netdev_priv(dev);
1363 struct vxlan_sock *vs = vxlan->vn_sock; 1382 struct vxlan_sock *vs = vxlan->vn_sock;
1364 1383
@@ -1366,10 +1385,11 @@ static int vxlan_open(struct net_device *dev)
1366 if (!vs) 1385 if (!vs)
1367 return -ENOTCONN; 1386 return -ENOTCONN;
1368 1387
1369 if (IN_MULTICAST(ntohl(vxlan->default_dst.remote_ip))) { 1388 if (IN_MULTICAST(ntohl(vxlan->default_dst.remote_ip)) &&
1389 vxlan_group_used(vn, vxlan->default_dst.remote_ip)) {
1370 vxlan_sock_hold(vs); 1390 vxlan_sock_hold(vs);
1371 dev_hold(dev); 1391 dev_hold(dev);
1372 queue_work(vxlan_wq, &vxlan->igmp_work); 1392 queue_work(vxlan_wq, &vxlan->igmp_join);
1373 } 1393 }
1374 1394
1375 if (vxlan->age_interval) 1395 if (vxlan->age_interval)
@@ -1400,13 +1420,15 @@ static void vxlan_flush(struct vxlan_dev *vxlan)
1400/* Cleanup timer and forwarding table on shutdown */ 1420/* Cleanup timer and forwarding table on shutdown */
1401static int vxlan_stop(struct net_device *dev) 1421static int vxlan_stop(struct net_device *dev)
1402{ 1422{
1423 struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id);
1403 struct vxlan_dev *vxlan = netdev_priv(dev); 1424 struct vxlan_dev *vxlan = netdev_priv(dev);
1404 struct vxlan_sock *vs = vxlan->vn_sock; 1425 struct vxlan_sock *vs = vxlan->vn_sock;
1405 1426
1406 if (vs && IN_MULTICAST(ntohl(vxlan->default_dst.remote_ip))) { 1427 if (vs && IN_MULTICAST(ntohl(vxlan->default_dst.remote_ip)) &&
1428 ! vxlan_group_used(vn, vxlan->default_dst.remote_ip)) {
1407 vxlan_sock_hold(vs); 1429 vxlan_sock_hold(vs);
1408 dev_hold(dev); 1430 dev_hold(dev);
1409 queue_work(vxlan_wq, &vxlan->igmp_work); 1431 queue_work(vxlan_wq, &vxlan->igmp_leave);
1410 } 1432 }
1411 1433
1412 del_timer_sync(&vxlan->age_timer); 1434 del_timer_sync(&vxlan->age_timer);
@@ -1471,7 +1493,8 @@ static void vxlan_setup(struct net_device *dev)
1471 1493
1472 INIT_LIST_HEAD(&vxlan->next); 1494 INIT_LIST_HEAD(&vxlan->next);
1473 spin_lock_init(&vxlan->hash_lock); 1495 spin_lock_init(&vxlan->hash_lock);
1474 INIT_WORK(&vxlan->igmp_work, vxlan_igmp_work); 1496 INIT_WORK(&vxlan->igmp_join, vxlan_igmp_join);
1497 INIT_WORK(&vxlan->igmp_leave, vxlan_igmp_leave);
1475 INIT_WORK(&vxlan->sock_work, vxlan_sock_work); 1498 INIT_WORK(&vxlan->sock_work, vxlan_sock_work);
1476 1499
1477 init_timer_deferrable(&vxlan->age_timer); 1500 init_timer_deferrable(&vxlan->age_timer);
@@ -1770,8 +1793,6 @@ static void vxlan_dellink(struct net_device *dev, struct list_head *head)
1770 struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id); 1793 struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id);
1771 struct vxlan_dev *vxlan = netdev_priv(dev); 1794 struct vxlan_dev *vxlan = netdev_priv(dev);
1772 1795
1773 flush_workqueue(vxlan_wq);
1774
1775 spin_lock(&vn->sock_lock); 1796 spin_lock(&vn->sock_lock);
1776 hlist_del_rcu(&vxlan->hlist); 1797 hlist_del_rcu(&vxlan->hlist);
1777 spin_unlock(&vn->sock_lock); 1798 spin_unlock(&vn->sock_lock);
@@ -1878,10 +1899,12 @@ static __net_exit void vxlan_exit_net(struct net *net)
1878{ 1899{
1879 struct vxlan_net *vn = net_generic(net, vxlan_net_id); 1900 struct vxlan_net *vn = net_generic(net, vxlan_net_id);
1880 struct vxlan_dev *vxlan; 1901 struct vxlan_dev *vxlan;
1902 LIST_HEAD(list);
1881 1903
1882 rtnl_lock(); 1904 rtnl_lock();
1883 list_for_each_entry(vxlan, &vn->vxlan_list, next) 1905 list_for_each_entry(vxlan, &vn->vxlan_list, next)
1884 dev_close(vxlan->dev); 1906 unregister_netdevice_queue(vxlan->dev, &list);
1907 unregister_netdevice_many(&list);
1885 rtnl_unlock(); 1908 rtnl_unlock();
1886} 1909}
1887 1910
diff --git a/drivers/net/wireless/ath/ath10k/Kconfig b/drivers/net/wireless/ath/ath10k/Kconfig
index cde58fe96254..82e8088ca9b4 100644
--- a/drivers/net/wireless/ath/ath10k/Kconfig
+++ b/drivers/net/wireless/ath/ath10k/Kconfig
@@ -1,6 +1,6 @@
1config ATH10K 1config ATH10K
2 tristate "Atheros 802.11ac wireless cards support" 2 tristate "Atheros 802.11ac wireless cards support"
3 depends on MAC80211 3 depends on MAC80211 && HAS_DMA
4 select ATH_COMMON 4 select ATH_COMMON
5 ---help--- 5 ---help---
6 This module adds support for wireless adapters based on 6 This module adds support for wireless adapters based on
diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
index 81b686c6a376..40825d43322e 100644
--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
@@ -325,7 +325,7 @@ ath5k_prepare_multicast(struct ieee80211_hw *hw,
325 struct netdev_hw_addr *ha; 325 struct netdev_hw_addr *ha;
326 326
327 mfilt[0] = 0; 327 mfilt[0] = 0;
328 mfilt[1] = 1; 328 mfilt[1] = 0;
329 329
330 netdev_hw_addr_list_for_each(ha, mc_list) { 330 netdev_hw_addr_list_for_each(ha, mc_list) {
331 /* calculate XOR of eight 6-bit values */ 331 /* calculate XOR of eight 6-bit values */
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
index d1acfe98918a..1576d58291d4 100644
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
@@ -610,7 +610,15 @@ static void ar5008_hw_override_ini(struct ath_hw *ah,
610 REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); 610 REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT));
611 611
612 if (AR_SREV_9280_20_OR_LATER(ah)) { 612 if (AR_SREV_9280_20_OR_LATER(ah)) {
613 val = REG_READ(ah, AR_PCU_MISC_MODE2); 613 /*
614 * For AR9280 and above, there is a new feature that allows
615 * Multicast search based on both MAC Address and Key ID.
616 * By default, this feature is enabled. But since the driver
617 * is not using this feature, we switch it off; otherwise
618 * multicast search based on MAC addr only will fail.
619 */
620 val = REG_READ(ah, AR_PCU_MISC_MODE2) &
621 (~AR_ADHOC_MCAST_KEYID_ENABLE);
614 622
615 if (!AR_SREV_9271(ah)) 623 if (!AR_SREV_9271(ah))
616 val &= ~AR_PCU_MISC_MODE2_HWWAR1; 624 val &= ~AR_PCU_MISC_MODE2_HWWAR1;
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
index 9e582e14da74..5205a3625e84 100644
--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
+++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
@@ -1082,7 +1082,7 @@ static void ath9k_hif_usb_firmware_fail(struct hif_device_usb *hif_dev)
1082 struct device *dev = &hif_dev->udev->dev; 1082 struct device *dev = &hif_dev->udev->dev;
1083 struct device *parent = dev->parent; 1083 struct device *parent = dev->parent;
1084 1084
1085 complete(&hif_dev->fw_done); 1085 complete_all(&hif_dev->fw_done);
1086 1086
1087 if (parent) 1087 if (parent)
1088 device_lock(parent); 1088 device_lock(parent);
@@ -1131,7 +1131,7 @@ static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context)
1131 1131
1132 release_firmware(fw); 1132 release_firmware(fw);
1133 hif_dev->flags |= HIF_USB_READY; 1133 hif_dev->flags |= HIF_USB_READY;
1134 complete(&hif_dev->fw_done); 1134 complete_all(&hif_dev->fw_done);
1135 1135
1136 return; 1136 return;
1137 1137
@@ -1295,7 +1295,9 @@ static void ath9k_hif_usb_disconnect(struct usb_interface *interface)
1295 1295
1296 usb_set_intfdata(interface, NULL); 1296 usb_set_intfdata(interface, NULL);
1297 1297
1298 if (!unplugged && (hif_dev->flags & HIF_USB_START)) 1298 /* If firmware was loaded we should drop it
1299 * go back to first stage bootloader. */
1300 if (!unplugged && (hif_dev->flags & HIF_USB_READY))
1299 ath9k_hif_usb_reboot(udev); 1301 ath9k_hif_usb_reboot(udev);
1300 1302
1301 kfree(hif_dev); 1303 kfree(hif_dev);
@@ -1316,7 +1318,10 @@ static int ath9k_hif_usb_suspend(struct usb_interface *interface,
1316 if (!(hif_dev->flags & HIF_USB_START)) 1318 if (!(hif_dev->flags & HIF_USB_START))
1317 ath9k_htc_suspend(hif_dev->htc_handle); 1319 ath9k_htc_suspend(hif_dev->htc_handle);
1318 1320
1319 ath9k_hif_usb_dealloc_urbs(hif_dev); 1321 wait_for_completion(&hif_dev->fw_done);
1322
1323 if (hif_dev->flags & HIF_USB_READY)
1324 ath9k_hif_usb_dealloc_urbs(hif_dev);
1320 1325
1321 return 0; 1326 return 0;
1322} 1327}
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
index 71a183ffc77f..c3676bf1d6c4 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
@@ -861,6 +861,7 @@ static int ath9k_init_device(struct ath9k_htc_priv *priv,
861 if (error != 0) 861 if (error != 0)
862 goto err_rx; 862 goto err_rx;
863 863
864 ath9k_hw_disable(priv->ah);
864#ifdef CONFIG_MAC80211_LEDS 865#ifdef CONFIG_MAC80211_LEDS
865 /* must be initialized before ieee80211_register_hw */ 866 /* must be initialized before ieee80211_register_hw */
866 priv->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(priv->hw, 867 priv->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(priv->hw,
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index c59ae43b9b35..927992732620 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -146,6 +146,28 @@ static void ath_set_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta,
146 ARRAY_SIZE(bf->rates)); 146 ARRAY_SIZE(bf->rates));
147} 147}
148 148
149static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq,
150 struct sk_buff *skb)
151{
152 int q;
153
154 q = skb_get_queue_mapping(skb);
155 if (txq == sc->tx.uapsdq)
156 txq = sc->tx.txq_map[q];
157
158 if (txq != sc->tx.txq_map[q])
159 return;
160
161 if (WARN_ON(--txq->pending_frames < 0))
162 txq->pending_frames = 0;
163
164 if (txq->stopped &&
165 txq->pending_frames < sc->tx.txq_max_pending[q]) {
166 ieee80211_wake_queue(sc->hw, q);
167 txq->stopped = false;
168 }
169}
170
149static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) 171static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
150{ 172{
151 struct ath_txq *txq = tid->ac->txq; 173 struct ath_txq *txq = tid->ac->txq;
@@ -167,6 +189,7 @@ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
167 if (!bf) { 189 if (!bf) {
168 bf = ath_tx_setup_buffer(sc, txq, tid, skb); 190 bf = ath_tx_setup_buffer(sc, txq, tid, skb);
169 if (!bf) { 191 if (!bf) {
192 ath_txq_skb_done(sc, txq, skb);
170 ieee80211_free_txskb(sc->hw, skb); 193 ieee80211_free_txskb(sc->hw, skb);
171 continue; 194 continue;
172 } 195 }
@@ -811,6 +834,7 @@ ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq,
811 834
812 if (!bf) { 835 if (!bf) {
813 __skb_unlink(skb, &tid->buf_q); 836 __skb_unlink(skb, &tid->buf_q);
837 ath_txq_skb_done(sc, txq, skb);
814 ieee80211_free_txskb(sc->hw, skb); 838 ieee80211_free_txskb(sc->hw, skb);
815 continue; 839 continue;
816 } 840 }
@@ -1824,6 +1848,7 @@ static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_txq *txq,
1824 1848
1825 bf = ath_tx_setup_buffer(sc, txq, tid, skb); 1849 bf = ath_tx_setup_buffer(sc, txq, tid, skb);
1826 if (!bf) { 1850 if (!bf) {
1851 ath_txq_skb_done(sc, txq, skb);
1827 ieee80211_free_txskb(sc->hw, skb); 1852 ieee80211_free_txskb(sc->hw, skb);
1828 return; 1853 return;
1829 } 1854 }
@@ -2090,6 +2115,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
2090 2115
2091 bf = ath_tx_setup_buffer(sc, txq, tid, skb); 2116 bf = ath_tx_setup_buffer(sc, txq, tid, skb);
2092 if (!bf) { 2117 if (!bf) {
2118 ath_txq_skb_done(sc, txq, skb);
2093 if (txctl->paprd) 2119 if (txctl->paprd)
2094 dev_kfree_skb_any(skb); 2120 dev_kfree_skb_any(skb);
2095 else 2121 else
@@ -2189,7 +2215,7 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
2189 struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); 2215 struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
2190 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 2216 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
2191 struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data; 2217 struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data;
2192 int q, padpos, padsize; 2218 int padpos, padsize;
2193 unsigned long flags; 2219 unsigned long flags;
2194 2220
2195 ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); 2221 ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb);
@@ -2225,21 +2251,7 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
2225 spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 2251 spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
2226 2252
2227 __skb_queue_tail(&txq->complete_q, skb); 2253 __skb_queue_tail(&txq->complete_q, skb);
2228 2254 ath_txq_skb_done(sc, txq, skb);
2229 q = skb_get_queue_mapping(skb);
2230 if (txq == sc->tx.uapsdq)
2231 txq = sc->tx.txq_map[q];
2232
2233 if (txq == sc->tx.txq_map[q]) {
2234 if (WARN_ON(--txq->pending_frames < 0))
2235 txq->pending_frames = 0;
2236
2237 if (txq->stopped &&
2238 txq->pending_frames < sc->tx.txq_max_pending[q]) {
2239 ieee80211_wake_queue(sc->hw, q);
2240 txq->stopped = false;
2241 }
2242 }
2243} 2255}
2244 2256
2245static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, 2257static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c
index e8308ec30970..ab636767fbde 100644
--- a/drivers/net/wireless/ath/wil6210/debugfs.c
+++ b/drivers/net/wireless/ath/wil6210/debugfs.c
@@ -145,7 +145,7 @@ static void wil_print_ring(struct seq_file *s, const char *prefix,
145 le16_to_cpu(hdr.type), hdr.flags); 145 le16_to_cpu(hdr.type), hdr.flags);
146 if (len <= MAX_MBOXITEM_SIZE) { 146 if (len <= MAX_MBOXITEM_SIZE) {
147 int n = 0; 147 int n = 0;
148 unsigned char printbuf[16 * 3 + 2]; 148 char printbuf[16 * 3 + 2];
149 unsigned char databuf[MAX_MBOXITEM_SIZE]; 149 unsigned char databuf[MAX_MBOXITEM_SIZE];
150 void __iomem *src = wmi_buffer(wil, d.addr) + 150 void __iomem *src = wmi_buffer(wil, d.addr) +
151 sizeof(struct wil6210_mbox_hdr); 151 sizeof(struct wil6210_mbox_hdr);
@@ -416,7 +416,7 @@ static int wil_txdesc_debugfs_show(struct seq_file *s, void *data)
416 seq_printf(s, " SKB = %p\n", skb); 416 seq_printf(s, " SKB = %p\n", skb);
417 417
418 if (skb) { 418 if (skb) {
419 unsigned char printbuf[16 * 3 + 2]; 419 char printbuf[16 * 3 + 2];
420 int i = 0; 420 int i = 0;
421 int len = le16_to_cpu(d->dma.length); 421 int len = le16_to_cpu(d->dma.length);
422 void *p = skb->data; 422 void *p = skb->data;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index 8e8975562ec3..80099016d21f 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -242,7 +242,7 @@ void brcmf_txflowblock_if(struct brcmf_if *ifp,
242{ 242{
243 unsigned long flags; 243 unsigned long flags;
244 244
245 if (!ifp) 245 if (!ifp || !ifp->ndev)
246 return; 246 return;
247 247
248 brcmf_dbg(TRACE, "enter: idx=%d stop=0x%X reason=%d state=%d\n", 248 brcmf_dbg(TRACE, "enter: idx=%d stop=0x%X reason=%d state=%d\n",
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
index f0d9f7f6c83d..29b1f24c2d0f 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
@@ -1744,13 +1744,14 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
1744 ulong flags; 1744 ulong flags;
1745 int fifo = BRCMF_FWS_FIFO_BCMC; 1745 int fifo = BRCMF_FWS_FIFO_BCMC;
1746 bool multicast = is_multicast_ether_addr(eh->h_dest); 1746 bool multicast = is_multicast_ether_addr(eh->h_dest);
1747 bool pae = eh->h_proto == htons(ETH_P_PAE);
1747 1748
1748 /* determine the priority */ 1749 /* determine the priority */
1749 if (!skb->priority) 1750 if (!skb->priority)
1750 skb->priority = cfg80211_classify8021d(skb); 1751 skb->priority = cfg80211_classify8021d(skb);
1751 1752
1752 drvr->tx_multicast += !!multicast; 1753 drvr->tx_multicast += !!multicast;
1753 if (ntohs(eh->h_proto) == ETH_P_PAE) 1754 if (pae)
1754 atomic_inc(&ifp->pend_8021x_cnt); 1755 atomic_inc(&ifp->pend_8021x_cnt);
1755 1756
1756 if (!brcmf_fws_fc_active(fws)) { 1757 if (!brcmf_fws_fc_active(fws)) {
@@ -1781,6 +1782,11 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb)
1781 brcmf_fws_schedule_deq(fws); 1782 brcmf_fws_schedule_deq(fws);
1782 } else { 1783 } else {
1783 brcmf_err("drop skb: no hanger slot\n"); 1784 brcmf_err("drop skb: no hanger slot\n");
1785 if (pae) {
1786 atomic_dec(&ifp->pend_8021x_cnt);
1787 if (waitqueue_active(&ifp->pend_8021x_wait))
1788 wake_up(&ifp->pend_8021x_wait);
1789 }
1784 brcmu_pkt_buf_free_skb(skb); 1790 brcmu_pkt_buf_free_skb(skb);
1785 } 1791 }
1786 brcmf_fws_unlock(drvr, flags); 1792 brcmf_fws_unlock(drvr, flags);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index 277b37ae7126..7fa71f73cfe8 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -1093,8 +1093,11 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif)
1093 brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n "); 1093 brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n ");
1094 err = brcmf_fil_cmd_data_set(vif->ifp, 1094 err = brcmf_fil_cmd_data_set(vif->ifp,
1095 BRCMF_C_DISASSOC, NULL, 0); 1095 BRCMF_C_DISASSOC, NULL, 0);
1096 if (err) 1096 if (err) {
1097 brcmf_err("WLC_DISASSOC failed (%d)\n", err); 1097 brcmf_err("WLC_DISASSOC failed (%d)\n", err);
1098 cfg80211_disconnected(vif->wdev.netdev, 0,
1099 NULL, 0, GFP_KERNEL);
1100 }
1098 clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state); 1101 clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state);
1099 } 1102 }
1100 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state); 1103 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state);
diff --git a/drivers/net/wireless/cw1200/sta.c b/drivers/net/wireless/cw1200/sta.c
index 7365674366f4..010b252be584 100644
--- a/drivers/net/wireless/cw1200/sta.c
+++ b/drivers/net/wireless/cw1200/sta.c
@@ -1406,11 +1406,8 @@ static void cw1200_do_unjoin(struct cw1200_common *priv)
1406 if (!priv->join_status) 1406 if (!priv->join_status)
1407 goto done; 1407 goto done;
1408 1408
1409 if (priv->join_status > CW1200_JOIN_STATUS_IBSS) { 1409 if (priv->join_status == CW1200_JOIN_STATUS_AP)
1410 wiphy_err(priv->hw->wiphy, "Unexpected: join status: %d\n", 1410 goto done;
1411 priv->join_status);
1412 BUG_ON(1);
1413 }
1414 1411
1415 cancel_work_sync(&priv->update_filtering_work); 1412 cancel_work_sync(&priv->update_filtering_work);
1416 cancel_work_sync(&priv->set_beacon_wakeup_period_work); 1413 cancel_work_sync(&priv->set_beacon_wakeup_period_work);
diff --git a/drivers/net/wireless/cw1200/txrx.c b/drivers/net/wireless/cw1200/txrx.c
index 5862c373d714..e824d4d4a18d 100644
--- a/drivers/net/wireless/cw1200/txrx.c
+++ b/drivers/net/wireless/cw1200/txrx.c
@@ -1165,7 +1165,7 @@ void cw1200_rx_cb(struct cw1200_common *priv,
1165 if (cw1200_handle_action_rx(priv, skb)) 1165 if (cw1200_handle_action_rx(priv, skb))
1166 return; 1166 return;
1167 } else if (ieee80211_is_beacon(frame->frame_control) && 1167 } else if (ieee80211_is_beacon(frame->frame_control) &&
1168 !arg->status && 1168 !arg->status && priv->vif &&
1169 !memcmp(ieee80211_get_SA(frame), priv->vif->bss_conf.bssid, 1169 !memcmp(ieee80211_get_SA(frame), priv->vif->bss_conf.bssid,
1170 ETH_ALEN)) { 1170 ETH_ALEN)) {
1171 const u8 *tim_ie; 1171 const u8 *tim_ie;
diff --git a/drivers/net/wireless/hostap/hostap_ioctl.c b/drivers/net/wireless/hostap/hostap_ioctl.c
index ac074731335a..e5090309824e 100644
--- a/drivers/net/wireless/hostap/hostap_ioctl.c
+++ b/drivers/net/wireless/hostap/hostap_ioctl.c
@@ -523,9 +523,9 @@ static int prism2_ioctl_giwaplist(struct net_device *dev,
523 523
524 data->length = prism2_ap_get_sta_qual(local, addr, qual, IW_MAX_AP, 1); 524 data->length = prism2_ap_get_sta_qual(local, addr, qual, IW_MAX_AP, 1);
525 525
526 memcpy(extra, &addr, sizeof(struct sockaddr) * data->length); 526 memcpy(extra, addr, sizeof(struct sockaddr) * data->length);
527 data->flags = 1; /* has quality information */ 527 data->flags = 1; /* has quality information */
528 memcpy(extra + sizeof(struct sockaddr) * data->length, &qual, 528 memcpy(extra + sizeof(struct sockaddr) * data->length, qual,
529 sizeof(struct iw_quality) * data->length); 529 sizeof(struct iw_quality) * data->length);
530 530
531 kfree(addr); 531 kfree(addr);
diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c
index b9b2bb51e605..f2ed62e37340 100644
--- a/drivers/net/wireless/iwlegacy/4965-mac.c
+++ b/drivers/net/wireless/iwlegacy/4965-mac.c
@@ -4460,12 +4460,12 @@ il4965_irq_tasklet(struct il_priv *il)
4460 * is killed. Hence update the killswitch state here. The 4460 * is killed. Hence update the killswitch state here. The
4461 * rfkill handler will care about restarting if needed. 4461 * rfkill handler will care about restarting if needed.
4462 */ 4462 */
4463 if (!test_bit(S_ALIVE, &il->status)) { 4463 if (hw_rf_kill) {
4464 if (hw_rf_kill) 4464 set_bit(S_RFKILL, &il->status);
4465 set_bit(S_RFKILL, &il->status); 4465 } else {
4466 else 4466 clear_bit(S_RFKILL, &il->status);
4467 clear_bit(S_RFKILL, &il->status);
4468 wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rf_kill); 4467 wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rf_kill);
4468 il_force_reset(il, true);
4469 } 4469 }
4470 4470
4471 handled |= CSR_INT_BIT_RF_KILL; 4471 handled |= CSR_INT_BIT_RF_KILL;
@@ -5334,6 +5334,9 @@ il4965_alive_start(struct il_priv *il)
5334 5334
5335 il->active_rate = RATES_MASK; 5335 il->active_rate = RATES_MASK;
5336 5336
5337 il_power_update_mode(il, true);
5338 D_INFO("Updated power mode\n");
5339
5337 if (il_is_associated(il)) { 5340 if (il_is_associated(il)) {
5338 struct il_rxon_cmd *active_rxon = 5341 struct il_rxon_cmd *active_rxon =
5339 (struct il_rxon_cmd *)&il->active; 5342 (struct il_rxon_cmd *)&il->active;
@@ -5364,9 +5367,6 @@ il4965_alive_start(struct il_priv *il)
5364 D_INFO("ALIVE processing complete.\n"); 5367 D_INFO("ALIVE processing complete.\n");
5365 wake_up(&il->wait_command_queue); 5368 wake_up(&il->wait_command_queue);
5366 5369
5367 il_power_update_mode(il, true);
5368 D_INFO("Updated power mode\n");
5369
5370 return; 5370 return;
5371 5371
5372restart: 5372restart:
diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c
index 3195aad440dd..b03e22ef5462 100644
--- a/drivers/net/wireless/iwlegacy/common.c
+++ b/drivers/net/wireless/iwlegacy/common.c
@@ -4660,6 +4660,7 @@ il_force_reset(struct il_priv *il, bool external)
4660 4660
4661 return 0; 4661 return 0;
4662} 4662}
4663EXPORT_SYMBOL(il_force_reset);
4663 4664
4664int 4665int
4665il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 4666il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
index 822f1a00efbb..319387263e12 100644
--- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
@@ -1068,7 +1068,10 @@ void iwl_chswitch_done(struct iwl_priv *priv, bool is_success)
1068 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) 1068 if (test_bit(STATUS_EXIT_PENDING, &priv->status))
1069 return; 1069 return;
1070 1070
1071 if (test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) 1071 if (!test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status))
1072 return;
1073
1074 if (ctx->vif)
1072 ieee80211_chswitch_done(ctx->vif, is_success); 1075 ieee80211_chswitch_done(ctx->vif, is_success);
1073} 1076}
1074 1077
diff --git a/drivers/net/wireless/iwlwifi/dvm/main.c b/drivers/net/wireless/iwlwifi/dvm/main.c
index 3952ddf2ddb2..1531a4fc0960 100644
--- a/drivers/net/wireless/iwlwifi/dvm/main.c
+++ b/drivers/net/wireless/iwlwifi/dvm/main.c
@@ -758,7 +758,7 @@ int iwl_alive_start(struct iwl_priv *priv)
758 BT_COEX_PRIO_TBL_EVT_INIT_CALIB2); 758 BT_COEX_PRIO_TBL_EVT_INIT_CALIB2);
759 if (ret) 759 if (ret)
760 return ret; 760 return ret;
761 } else { 761 } else if (priv->lib->bt_params) {
762 /* 762 /*
763 * default is 2-wire BT coexexistence support 763 * default is 2-wire BT coexexistence support
764 */ 764 */
diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c
index 7e5e5c2f9f87..83da884cf303 100644
--- a/drivers/net/wireless/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/iwlwifi/mvm/d3.c
@@ -134,7 +134,7 @@ struct wowlan_key_data {
134 struct iwl_wowlan_rsc_tsc_params_cmd *rsc_tsc; 134 struct iwl_wowlan_rsc_tsc_params_cmd *rsc_tsc;
135 struct iwl_wowlan_tkip_params_cmd *tkip; 135 struct iwl_wowlan_tkip_params_cmd *tkip;
136 bool error, use_rsc_tsc, use_tkip; 136 bool error, use_rsc_tsc, use_tkip;
137 int gtk_key_idx; 137 int wep_key_idx;
138}; 138};
139 139
140static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, 140static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
@@ -188,8 +188,8 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
188 wkc.wep_key.key_offset = 0; 188 wkc.wep_key.key_offset = 0;
189 } else { 189 } else {
190 /* others start at 1 */ 190 /* others start at 1 */
191 data->gtk_key_idx++; 191 data->wep_key_idx++;
192 wkc.wep_key.key_offset = data->gtk_key_idx; 192 wkc.wep_key.key_offset = data->wep_key_idx;
193 } 193 }
194 194
195 ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, CMD_SYNC, 195 ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, CMD_SYNC,
@@ -316,8 +316,13 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
316 mvm->ptk_ivlen = key->iv_len; 316 mvm->ptk_ivlen = key->iv_len;
317 mvm->ptk_icvlen = key->icv_len; 317 mvm->ptk_icvlen = key->icv_len;
318 } else { 318 } else {
319 data->gtk_key_idx++; 319 /*
320 key->hw_key_idx = data->gtk_key_idx; 320 * firmware only supports TSC/RSC for a single key,
321 * so if there are multiple keep overwriting them
322 * with new ones -- this relies on mac80211 doing
323 * list_add_tail().
324 */
325 key->hw_key_idx = 1;
321 mvm->gtk_ivlen = key->iv_len; 326 mvm->gtk_ivlen = key->iv_len;
322 mvm->gtk_icvlen = key->icv_len; 327 mvm->gtk_icvlen = key->icv_len;
323 } 328 }
diff --git a/drivers/net/wireless/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
index e56ed2a84888..c24a744910ac 100644
--- a/drivers/net/wireless/iwlwifi/mvm/debugfs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
@@ -988,7 +988,11 @@ void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
988 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 988 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
989 char buf[100]; 989 char buf[100];
990 990
991 if (!dbgfs_dir) 991 /*
992 * Check if debugfs directory already exist before creating it.
993 * This may happen when, for example, resetting hw or suspend-resume
994 */
995 if (!dbgfs_dir || mvmvif->dbgfs_dir)
992 return; 996 return;
993 997
994 mvmvif->dbgfs_dir = debugfs_create_dir("iwlmvm", dbgfs_dir); 998 mvmvif->dbgfs_dir = debugfs_create_dir("iwlmvm", dbgfs_dir);
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
index b60d14151721..365095a0c3b3 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
@@ -69,7 +69,6 @@
69/* Scan Commands, Responses, Notifications */ 69/* Scan Commands, Responses, Notifications */
70 70
71/* Masks for iwl_scan_channel.type flags */ 71/* Masks for iwl_scan_channel.type flags */
72#define SCAN_CHANNEL_TYPE_PASSIVE 0
73#define SCAN_CHANNEL_TYPE_ACTIVE BIT(0) 72#define SCAN_CHANNEL_TYPE_ACTIVE BIT(0)
74#define SCAN_CHANNEL_NARROW_BAND BIT(22) 73#define SCAN_CHANNEL_NARROW_BAND BIT(22)
75 74
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index e08683b20531..f19baf0dea6b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -257,7 +257,11 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
257 if (ret) 257 if (ret)
258 return ret; 258 return ret;
259 259
260 return ieee80211_register_hw(mvm->hw); 260 ret = ieee80211_register_hw(mvm->hw);
261 if (ret)
262 iwl_mvm_leds_exit(mvm);
263
264 return ret;
261} 265}
262 266
263static void iwl_mvm_mac_tx(struct ieee80211_hw *hw, 267static void iwl_mvm_mac_tx(struct ieee80211_hw *hw,
@@ -385,6 +389,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
385 ieee80211_wake_queues(mvm->hw); 389 ieee80211_wake_queues(mvm->hw);
386 390
387 mvm->vif_count = 0; 391 mvm->vif_count = 0;
392 mvm->rx_ba_sessions = 0;
388} 393}
389 394
390static int iwl_mvm_mac_start(struct ieee80211_hw *hw) 395static int iwl_mvm_mac_start(struct ieee80211_hw *hw)
@@ -507,6 +512,27 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
507 goto out_unlock; 512 goto out_unlock;
508 513
509 /* 514 /*
515 * TODO: remove this temporary code.
516 * Currently MVM FW supports power management only on single MAC.
517 * If new interface added, disable PM on existing interface.
518 * P2P device is a special case, since it is handled by FW similary to
519 * scan. If P2P deviced is added, PM remains enabled on existing
520 * interface.
521 * Note: the method below does not count the new interface being added
522 * at this moment.
523 */
524 if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
525 mvm->vif_count++;
526 if (mvm->vif_count > 1) {
527 IWL_DEBUG_MAC80211(mvm,
528 "Disable power on existing interfaces\n");
529 ieee80211_iterate_active_interfaces_atomic(
530 mvm->hw,
531 IEEE80211_IFACE_ITER_NORMAL,
532 iwl_mvm_pm_disable_iterator, mvm);
533 }
534
535 /*
510 * The AP binding flow can be done only after the beacon 536 * The AP binding flow can be done only after the beacon
511 * template is configured (which happens only in the mac80211 537 * template is configured (which happens only in the mac80211
512 * start_ap() flow), and adding the broadcast station can happen 538 * start_ap() flow), and adding the broadcast station can happen
@@ -529,27 +555,6 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
529 goto out_unlock; 555 goto out_unlock;
530 } 556 }
531 557
532 /*
533 * TODO: remove this temporary code.
534 * Currently MVM FW supports power management only on single MAC.
535 * If new interface added, disable PM on existing interface.
536 * P2P device is a special case, since it is handled by FW similary to
537 * scan. If P2P deviced is added, PM remains enabled on existing
538 * interface.
539 * Note: the method below does not count the new interface being added
540 * at this moment.
541 */
542 if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
543 mvm->vif_count++;
544 if (mvm->vif_count > 1) {
545 IWL_DEBUG_MAC80211(mvm,
546 "Disable power on existing interfaces\n");
547 ieee80211_iterate_active_interfaces_atomic(
548 mvm->hw,
549 IEEE80211_IFACE_ITER_NORMAL,
550 iwl_mvm_pm_disable_iterator, mvm);
551 }
552
553 ret = iwl_mvm_mac_ctxt_add(mvm, vif); 558 ret = iwl_mvm_mac_ctxt_add(mvm, vif);
554 if (ret) 559 if (ret)
555 goto out_release; 560 goto out_release;
@@ -1006,6 +1011,21 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
1006 mutex_lock(&mvm->mutex); 1011 mutex_lock(&mvm->mutex);
1007 if (old_state == IEEE80211_STA_NOTEXIST && 1012 if (old_state == IEEE80211_STA_NOTEXIST &&
1008 new_state == IEEE80211_STA_NONE) { 1013 new_state == IEEE80211_STA_NONE) {
1014 /*
1015 * Firmware bug - it'll crash if the beacon interval is less
1016 * than 16. We can't avoid connecting at all, so refuse the
1017 * station state change, this will cause mac80211 to abandon
1018 * attempts to connect to this AP, and eventually wpa_s will
1019 * blacklist the AP...
1020 */
1021 if (vif->type == NL80211_IFTYPE_STATION &&
1022 vif->bss_conf.beacon_int < 16) {
1023 IWL_ERR(mvm,
1024 "AP %pM beacon interval is %d, refusing due to firmware bug!\n",
1025 sta->addr, vif->bss_conf.beacon_int);
1026 ret = -EINVAL;
1027 goto out_unlock;
1028 }
1009 ret = iwl_mvm_add_sta(mvm, vif, sta); 1029 ret = iwl_mvm_add_sta(mvm, vif, sta);
1010 } else if (old_state == IEEE80211_STA_NONE && 1030 } else if (old_state == IEEE80211_STA_NONE &&
1011 new_state == IEEE80211_STA_AUTH) { 1031 new_state == IEEE80211_STA_AUTH) {
@@ -1038,6 +1058,7 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
1038 } else { 1058 } else {
1039 ret = -EIO; 1059 ret = -EIO;
1040 } 1060 }
1061 out_unlock:
1041 mutex_unlock(&mvm->mutex); 1062 mutex_unlock(&mvm->mutex);
1042 1063
1043 return ret; 1064 return ret;
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index d40d7db185d6..420e82d379d9 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -419,6 +419,7 @@ struct iwl_mvm {
419 struct work_struct sta_drained_wk; 419 struct work_struct sta_drained_wk;
420 unsigned long sta_drained[BITS_TO_LONGS(IWL_MVM_STATION_COUNT)]; 420 unsigned long sta_drained[BITS_TO_LONGS(IWL_MVM_STATION_COUNT)];
421 atomic_t pending_frames[IWL_MVM_STATION_COUNT]; 421 atomic_t pending_frames[IWL_MVM_STATION_COUNT];
422 u8 rx_ba_sessions;
422 423
423 /* configured by mac80211 */ 424 /* configured by mac80211 */
424 u32 rts_threshold; 425 u32 rts_threshold;
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c
index 2157b0f8ced5..acdff6b67e04 100644
--- a/drivers/net/wireless/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/iwlwifi/mvm/scan.c
@@ -137,8 +137,8 @@ static void iwl_mvm_scan_fill_ssids(struct iwl_scan_cmd *cmd,
137{ 137{
138 int fw_idx, req_idx; 138 int fw_idx, req_idx;
139 139
140 fw_idx = 0; 140 for (req_idx = req->n_ssids - 1, fw_idx = 0; req_idx > 0;
141 for (req_idx = req->n_ssids - 1; req_idx > 0; req_idx--) { 141 req_idx--, fw_idx++) {
142 cmd->direct_scan[fw_idx].id = WLAN_EID_SSID; 142 cmd->direct_scan[fw_idx].id = WLAN_EID_SSID;
143 cmd->direct_scan[fw_idx].len = req->ssids[req_idx].ssid_len; 143 cmd->direct_scan[fw_idx].len = req->ssids[req_idx].ssid_len;
144 memcpy(cmd->direct_scan[fw_idx].ssid, 144 memcpy(cmd->direct_scan[fw_idx].ssid,
@@ -153,7 +153,9 @@ static void iwl_mvm_scan_fill_ssids(struct iwl_scan_cmd *cmd,
153 * just to notify that this scan is active and not passive. 153 * just to notify that this scan is active and not passive.
154 * In order to notify the FW of the number of SSIDs we wish to scan (including 154 * In order to notify the FW of the number of SSIDs we wish to scan (including
155 * the zero-length one), we need to set the corresponding bits in chan->type, 155 * the zero-length one), we need to set the corresponding bits in chan->type,
156 * one for each SSID, and set the active bit (first). 156 * one for each SSID, and set the active bit (first). The first SSID is already
157 * included in the probe template, so we need to set only req->n_ssids - 1 bits
158 * in addition to the first bit.
157 */ 159 */
158static u16 iwl_mvm_get_active_dwell(enum ieee80211_band band, int n_ssids) 160static u16 iwl_mvm_get_active_dwell(enum ieee80211_band band, int n_ssids)
159{ 161{
@@ -176,19 +178,12 @@ static void iwl_mvm_scan_fill_channels(struct iwl_scan_cmd *cmd,
176 struct iwl_scan_channel *chan = (struct iwl_scan_channel *) 178 struct iwl_scan_channel *chan = (struct iwl_scan_channel *)
177 (cmd->data + le16_to_cpu(cmd->tx_cmd.len)); 179 (cmd->data + le16_to_cpu(cmd->tx_cmd.len));
178 int i; 180 int i;
179 __le32 chan_type_value;
180
181 if (req->n_ssids > 0)
182 chan_type_value = cpu_to_le32(BIT(req->n_ssids + 1) - 1);
183 else
184 chan_type_value = SCAN_CHANNEL_TYPE_PASSIVE;
185 181
186 for (i = 0; i < cmd->channel_count; i++) { 182 for (i = 0; i < cmd->channel_count; i++) {
187 chan->channel = cpu_to_le16(req->channels[i]->hw_value); 183 chan->channel = cpu_to_le16(req->channels[i]->hw_value);
184 chan->type = cpu_to_le32(BIT(req->n_ssids) - 1);
188 if (req->channels[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN) 185 if (req->channels[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN)
189 chan->type = SCAN_CHANNEL_TYPE_PASSIVE; 186 chan->type &= cpu_to_le32(~SCAN_CHANNEL_TYPE_ACTIVE);
190 else
191 chan->type = chan_type_value;
192 chan->active_dwell = cpu_to_le16(active_dwell); 187 chan->active_dwell = cpu_to_le16(active_dwell);
193 chan->passive_dwell = cpu_to_le16(passive_dwell); 188 chan->passive_dwell = cpu_to_le16(passive_dwell);
194 chan->iteration_count = cpu_to_le16(1); 189 chan->iteration_count = cpu_to_le16(1);
diff --git a/drivers/net/wireless/iwlwifi/mvm/sta.c b/drivers/net/wireless/iwlwifi/mvm/sta.c
index 62fe5209093b..563f559b902d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/iwlwifi/mvm/sta.c
@@ -608,6 +608,8 @@ int iwl_mvm_rm_bcast_sta(struct iwl_mvm *mvm, struct iwl_mvm_int_sta *bsta)
608 return ret; 608 return ret;
609} 609}
610 610
611#define IWL_MAX_RX_BA_SESSIONS 16
612
611int iwl_mvm_sta_rx_agg(struct iwl_mvm *mvm, struct ieee80211_sta *sta, 613int iwl_mvm_sta_rx_agg(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
612 int tid, u16 ssn, bool start) 614 int tid, u16 ssn, bool start)
613{ 615{
@@ -618,11 +620,20 @@ int iwl_mvm_sta_rx_agg(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
618 620
619 lockdep_assert_held(&mvm->mutex); 621 lockdep_assert_held(&mvm->mutex);
620 622
623 if (start && mvm->rx_ba_sessions >= IWL_MAX_RX_BA_SESSIONS) {
624 IWL_WARN(mvm, "Not enough RX BA SESSIONS\n");
625 return -ENOSPC;
626 }
627
621 cmd.mac_id_n_color = cpu_to_le32(mvm_sta->mac_id_n_color); 628 cmd.mac_id_n_color = cpu_to_le32(mvm_sta->mac_id_n_color);
622 cmd.sta_id = mvm_sta->sta_id; 629 cmd.sta_id = mvm_sta->sta_id;
623 cmd.add_modify = STA_MODE_MODIFY; 630 cmd.add_modify = STA_MODE_MODIFY;
624 cmd.add_immediate_ba_tid = (u8) tid; 631 if (start) {
625 cmd.add_immediate_ba_ssn = cpu_to_le16(ssn); 632 cmd.add_immediate_ba_tid = (u8) tid;
633 cmd.add_immediate_ba_ssn = cpu_to_le16(ssn);
634 } else {
635 cmd.remove_immediate_ba_tid = (u8) tid;
636 }
626 cmd.modify_mask = start ? STA_MODIFY_ADD_BA_TID : 637 cmd.modify_mask = start ? STA_MODIFY_ADD_BA_TID :
627 STA_MODIFY_REMOVE_BA_TID; 638 STA_MODIFY_REMOVE_BA_TID;
628 639
@@ -648,6 +659,14 @@ int iwl_mvm_sta_rx_agg(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
648 break; 659 break;
649 } 660 }
650 661
662 if (!ret) {
663 if (start)
664 mvm->rx_ba_sessions++;
665 else if (mvm->rx_ba_sessions > 0)
666 /* check that restart flow didn't zero the counter */
667 mvm->rx_ba_sessions--;
668 }
669
651 return ret; 670 return ret;
652} 671}
653 672
@@ -896,6 +915,7 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
896 struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv; 915 struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv;
897 struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid]; 916 struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
898 u16 txq_id; 917 u16 txq_id;
918 enum iwl_mvm_agg_state old_state;
899 919
900 /* 920 /*
901 * First set the agg state to OFF to avoid calling 921 * First set the agg state to OFF to avoid calling
@@ -905,13 +925,17 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
905 txq_id = tid_data->txq_id; 925 txq_id = tid_data->txq_id;
906 IWL_DEBUG_TX_QUEUES(mvm, "Flush AGG: sta %d tid %d q %d state %d\n", 926 IWL_DEBUG_TX_QUEUES(mvm, "Flush AGG: sta %d tid %d q %d state %d\n",
907 mvmsta->sta_id, tid, txq_id, tid_data->state); 927 mvmsta->sta_id, tid, txq_id, tid_data->state);
928 old_state = tid_data->state;
908 tid_data->state = IWL_AGG_OFF; 929 tid_data->state = IWL_AGG_OFF;
909 spin_unlock_bh(&mvmsta->lock); 930 spin_unlock_bh(&mvmsta->lock);
910 931
911 if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true)) 932 if (old_state >= IWL_AGG_ON) {
912 IWL_ERR(mvm, "Couldn't flush the AGG queue\n"); 933 if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true))
934 IWL_ERR(mvm, "Couldn't flush the AGG queue\n");
935
936 iwl_trans_txq_disable(mvm->trans, tid_data->txq_id);
937 }
913 938
914 iwl_trans_txq_disable(mvm->trans, tid_data->txq_id);
915 mvm->queue_to_mac80211[tid_data->txq_id] = 939 mvm->queue_to_mac80211[tid_data->txq_id] =
916 IWL_INVALID_MAC80211_QUEUE; 940 IWL_INVALID_MAC80211_QUEUE;
917 941
diff --git a/drivers/net/wireless/iwlwifi/mvm/time-event.c b/drivers/net/wireless/iwlwifi/mvm/time-event.c
index ad9bbca99213..7fd6fbfbc1b3 100644
--- a/drivers/net/wireless/iwlwifi/mvm/time-event.c
+++ b/drivers/net/wireless/iwlwifi/mvm/time-event.c
@@ -138,6 +138,20 @@ static void iwl_mvm_roc_finished(struct iwl_mvm *mvm)
138 schedule_work(&mvm->roc_done_wk); 138 schedule_work(&mvm->roc_done_wk);
139} 139}
140 140
141static bool iwl_mvm_te_check_disconnect(struct iwl_mvm *mvm,
142 struct ieee80211_vif *vif,
143 const char *errmsg)
144{
145 if (vif->type != NL80211_IFTYPE_STATION)
146 return false;
147 if (vif->bss_conf.assoc && vif->bss_conf.dtim_period)
148 return false;
149 if (errmsg)
150 IWL_ERR(mvm, "%s\n", errmsg);
151 ieee80211_connection_loss(vif);
152 return true;
153}
154
141/* 155/*
142 * Handles a FW notification for an event that is known to the driver. 156 * Handles a FW notification for an event that is known to the driver.
143 * 157 *
@@ -163,8 +177,13 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm,
163 * P2P Device discoveribility, while there are other higher priority 177 * P2P Device discoveribility, while there are other higher priority
164 * events in the system). 178 * events in the system).
165 */ 179 */
166 WARN_ONCE(!le32_to_cpu(notif->status), 180 if (WARN_ONCE(!le32_to_cpu(notif->status),
167 "Failed to schedule time event\n"); 181 "Failed to schedule time event\n")) {
182 if (iwl_mvm_te_check_disconnect(mvm, te_data->vif, NULL)) {
183 iwl_mvm_te_clear_data(mvm, te_data);
184 return;
185 }
186 }
168 187
169 if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_END) { 188 if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_END) {
170 IWL_DEBUG_TE(mvm, 189 IWL_DEBUG_TE(mvm,
@@ -180,14 +199,8 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm,
180 * By now, we should have finished association 199 * By now, we should have finished association
181 * and know the dtim period. 200 * and know the dtim period.
182 */ 201 */
183 if (te_data->vif->type == NL80211_IFTYPE_STATION && 202 iwl_mvm_te_check_disconnect(mvm, te_data->vif,
184 (!te_data->vif->bss_conf.assoc || 203 "No assocation and the time event is over already...");
185 !te_data->vif->bss_conf.dtim_period)) {
186 IWL_ERR(mvm,
187 "No assocation and the time event is over already...\n");
188 ieee80211_connection_loss(te_data->vif);
189 }
190
191 iwl_mvm_te_clear_data(mvm, te_data); 204 iwl_mvm_te_clear_data(mvm, te_data);
192 } else if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_START) { 205 } else if (le32_to_cpu(notif->action) & TE_NOTIF_HOST_EVENT_START) {
193 te_data->running = true; 206 te_data->running = true;
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c
index 81f3ea5b09a4..ff13458efc27 100644
--- a/drivers/net/wireless/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/iwlwifi/pcie/drv.c
@@ -130,6 +130,7 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
130 {IWL_PCI_DEVICE(0x423C, 0x1306, iwl5150_abg_cfg)}, /* Half Mini Card */ 130 {IWL_PCI_DEVICE(0x423C, 0x1306, iwl5150_abg_cfg)}, /* Half Mini Card */
131 {IWL_PCI_DEVICE(0x423C, 0x1221, iwl5150_agn_cfg)}, /* Mini Card */ 131 {IWL_PCI_DEVICE(0x423C, 0x1221, iwl5150_agn_cfg)}, /* Mini Card */
132 {IWL_PCI_DEVICE(0x423C, 0x1321, iwl5150_agn_cfg)}, /* Half Mini Card */ 132 {IWL_PCI_DEVICE(0x423C, 0x1321, iwl5150_agn_cfg)}, /* Half Mini Card */
133 {IWL_PCI_DEVICE(0x423C, 0x1326, iwl5150_abg_cfg)}, /* Half Mini Card */
133 134
134 {IWL_PCI_DEVICE(0x423D, 0x1211, iwl5150_agn_cfg)}, /* Mini Card */ 135 {IWL_PCI_DEVICE(0x423D, 0x1211, iwl5150_agn_cfg)}, /* Mini Card */
135 {IWL_PCI_DEVICE(0x423D, 0x1311, iwl5150_agn_cfg)}, /* Half Mini Card */ 136 {IWL_PCI_DEVICE(0x423D, 0x1311, iwl5150_agn_cfg)}, /* Half Mini Card */
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index 826c15602c46..390e2f058aff 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -670,6 +670,11 @@ static int iwl_trans_pcie_start_hw(struct iwl_trans *trans)
670 return err; 670 return err;
671 } 671 }
672 672
673 /* Reset the entire device */
674 iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
675
676 usleep_range(10, 15);
677
673 iwl_pcie_apm_init(trans); 678 iwl_pcie_apm_init(trans);
674 679
675 /* From now on, the op_mode will be kept updated about RF kill state */ 680 /* From now on, the op_mode will be kept updated about RF kill state */
@@ -1497,16 +1502,16 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
1497 spin_lock_init(&trans_pcie->reg_lock); 1502 spin_lock_init(&trans_pcie->reg_lock);
1498 init_waitqueue_head(&trans_pcie->ucode_write_waitq); 1503 init_waitqueue_head(&trans_pcie->ucode_write_waitq);
1499 1504
1500 /* W/A - seems to solve weird behavior. We need to remove this if we
1501 * don't want to stay in L1 all the time. This wastes a lot of power */
1502 pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
1503 PCIE_LINK_STATE_CLKPM);
1504
1505 if (pci_enable_device(pdev)) { 1505 if (pci_enable_device(pdev)) {
1506 err = -ENODEV; 1506 err = -ENODEV;
1507 goto out_no_pci; 1507 goto out_no_pci;
1508 } 1508 }
1509 1509
1510 /* W/A - seems to solve weird behavior. We need to remove this if we
1511 * don't want to stay in L1 all the time. This wastes a lot of power */
1512 pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
1513 PCIE_LINK_STATE_CLKPM);
1514
1510 pci_set_master(pdev); 1515 pci_set_master(pdev);
1511 1516
1512 err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36)); 1517 err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36));
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c
index ef5fa890a286..89459db4c53b 100644
--- a/drivers/net/wireless/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/mwifiex/cfg80211.c
@@ -1716,9 +1716,9 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
1716 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); 1716 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1717 int ret; 1717 int ret;
1718 1718
1719 if (priv->bss_mode != NL80211_IFTYPE_STATION) { 1719 if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) {
1720 wiphy_err(wiphy, 1720 wiphy_err(wiphy,
1721 "%s: reject infra assoc request in non-STA mode\n", 1721 "%s: reject infra assoc request in non-STA role\n",
1722 dev->name); 1722 dev->name);
1723 return -EINVAL; 1723 return -EINVAL;
1724 } 1724 }
diff --git a/drivers/net/wireless/mwifiex/cfp.c b/drivers/net/wireless/mwifiex/cfp.c
index 988552dece75..5178c4630d89 100644
--- a/drivers/net/wireless/mwifiex/cfp.c
+++ b/drivers/net/wireless/mwifiex/cfp.c
@@ -415,7 +415,8 @@ u32 mwifiex_get_supported_rates(struct mwifiex_private *priv, u8 *rates)
415 u32 k = 0; 415 u32 k = 0;
416 struct mwifiex_adapter *adapter = priv->adapter; 416 struct mwifiex_adapter *adapter = priv->adapter;
417 417
418 if (priv->bss_mode == NL80211_IFTYPE_STATION) { 418 if (priv->bss_mode == NL80211_IFTYPE_STATION ||
419 priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) {
419 switch (adapter->config_bands) { 420 switch (adapter->config_bands) {
420 case BAND_B: 421 case BAND_B:
421 dev_dbg(adapter->dev, "info: infra band=%d " 422 dev_dbg(adapter->dev, "info: infra band=%d "
diff --git a/drivers/net/wireless/mwifiex/init.c b/drivers/net/wireless/mwifiex/init.c
index caaf4bd56b30..2cf8b964e966 100644
--- a/drivers/net/wireless/mwifiex/init.c
+++ b/drivers/net/wireless/mwifiex/init.c
@@ -693,7 +693,7 @@ int mwifiex_dnld_fw(struct mwifiex_adapter *adapter,
693 if (!ret) { 693 if (!ret) {
694 dev_notice(adapter->dev, 694 dev_notice(adapter->dev,
695 "WLAN FW already running! Skip FW dnld\n"); 695 "WLAN FW already running! Skip FW dnld\n");
696 goto done; 696 return 0;
697 } 697 }
698 698
699 poll_num = MAX_FIRMWARE_POLL_TRIES; 699 poll_num = MAX_FIRMWARE_POLL_TRIES;
@@ -719,14 +719,8 @@ int mwifiex_dnld_fw(struct mwifiex_adapter *adapter,
719poll_fw: 719poll_fw:
720 /* Check if the firmware is downloaded successfully or not */ 720 /* Check if the firmware is downloaded successfully or not */
721 ret = adapter->if_ops.check_fw_status(adapter, poll_num); 721 ret = adapter->if_ops.check_fw_status(adapter, poll_num);
722 if (ret) { 722 if (ret)
723 dev_err(adapter->dev, "FW failed to be active in time\n"); 723 dev_err(adapter->dev, "FW failed to be active in time\n");
724 return -1;
725 }
726done:
727 /* re-enable host interrupt for mwifiex after fw dnld is successful */
728 if (adapter->if_ops.enable_int)
729 adapter->if_ops.enable_int(adapter);
730 724
731 return ret; 725 return ret;
732} 726}
diff --git a/drivers/net/wireless/mwifiex/join.c b/drivers/net/wireless/mwifiex/join.c
index 1c8a771e8e81..12e778159ec5 100644
--- a/drivers/net/wireless/mwifiex/join.c
+++ b/drivers/net/wireless/mwifiex/join.c
@@ -1291,8 +1291,10 @@ int mwifiex_associate(struct mwifiex_private *priv,
1291{ 1291{
1292 u8 current_bssid[ETH_ALEN]; 1292 u8 current_bssid[ETH_ALEN];
1293 1293
1294 /* Return error if the adapter or table entry is not marked as infra */ 1294 /* Return error if the adapter is not STA role or table entry
1295 if ((priv->bss_mode != NL80211_IFTYPE_STATION) || 1295 * is not marked as infra.
1296 */
1297 if ((GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) ||
1296 (bss_desc->bss_mode != NL80211_IFTYPE_STATION)) 1298 (bss_desc->bss_mode != NL80211_IFTYPE_STATION))
1297 return -1; 1299 return -1;
1298 1300
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c
index e15ab72fb03d..1753431de361 100644
--- a/drivers/net/wireless/mwifiex/main.c
+++ b/drivers/net/wireless/mwifiex/main.c
@@ -427,6 +427,10 @@ static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)
427 "Cal data request_firmware() failed\n"); 427 "Cal data request_firmware() failed\n");
428 } 428 }
429 429
430 /* enable host interrupt after fw dnld is successful */
431 if (adapter->if_ops.enable_int)
432 adapter->if_ops.enable_int(adapter);
433
430 adapter->init_wait_q_woken = false; 434 adapter->init_wait_q_woken = false;
431 ret = mwifiex_init_fw(adapter); 435 ret = mwifiex_init_fw(adapter);
432 if (ret == -1) { 436 if (ret == -1) {
@@ -478,6 +482,8 @@ err_add_intf:
478 mwifiex_del_virtual_intf(adapter->wiphy, priv->wdev); 482 mwifiex_del_virtual_intf(adapter->wiphy, priv->wdev);
479 rtnl_unlock(); 483 rtnl_unlock();
480err_init_fw: 484err_init_fw:
485 if (adapter->if_ops.disable_int)
486 adapter->if_ops.disable_int(adapter);
481 pr_debug("info: %s: unregister device\n", __func__); 487 pr_debug("info: %s: unregister device\n", __func__);
482 adapter->if_ops.unregister_dev(adapter); 488 adapter->if_ops.unregister_dev(adapter);
483done: 489done:
@@ -855,7 +861,7 @@ mwifiex_add_card(void *card, struct semaphore *sem,
855 INIT_WORK(&adapter->main_work, mwifiex_main_work_queue); 861 INIT_WORK(&adapter->main_work, mwifiex_main_work_queue);
856 862
857 /* Register the device. Fill up the private data structure with relevant 863 /* Register the device. Fill up the private data structure with relevant
858 information from the card and request for the required IRQ. */ 864 information from the card. */
859 if (adapter->if_ops.register_dev(adapter)) { 865 if (adapter->if_ops.register_dev(adapter)) {
860 pr_err("%s: failed to register mwifiex device\n", __func__); 866 pr_err("%s: failed to register mwifiex device\n", __func__);
861 goto err_registerdev; 867 goto err_registerdev;
@@ -919,6 +925,11 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem)
919 if (!adapter) 925 if (!adapter)
920 goto exit_remove; 926 goto exit_remove;
921 927
928 /* We can no longer handle interrupts once we start doing the teardown
929 * below. */
930 if (adapter->if_ops.disable_int)
931 adapter->if_ops.disable_int(adapter);
932
922 adapter->surprise_removed = true; 933 adapter->surprise_removed = true;
923 934
924 /* Stop data */ 935 /* Stop data */
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h
index 3da73d36acdf..253e0bd38e25 100644
--- a/drivers/net/wireless/mwifiex/main.h
+++ b/drivers/net/wireless/mwifiex/main.h
@@ -601,6 +601,7 @@ struct mwifiex_if_ops {
601 int (*register_dev) (struct mwifiex_adapter *); 601 int (*register_dev) (struct mwifiex_adapter *);
602 void (*unregister_dev) (struct mwifiex_adapter *); 602 void (*unregister_dev) (struct mwifiex_adapter *);
603 int (*enable_int) (struct mwifiex_adapter *); 603 int (*enable_int) (struct mwifiex_adapter *);
604 void (*disable_int) (struct mwifiex_adapter *);
604 int (*process_int_status) (struct mwifiex_adapter *); 605 int (*process_int_status) (struct mwifiex_adapter *);
605 int (*host_to_card) (struct mwifiex_adapter *, u8, struct sk_buff *, 606 int (*host_to_card) (struct mwifiex_adapter *, u8, struct sk_buff *,
606 struct mwifiex_tx_param *); 607 struct mwifiex_tx_param *);
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c
index 5ee5ed02eccd..09185c963248 100644
--- a/drivers/net/wireless/mwifiex/sdio.c
+++ b/drivers/net/wireless/mwifiex/sdio.c
@@ -51,6 +51,7 @@ static struct mwifiex_if_ops sdio_ops;
51static struct semaphore add_remove_card_sem; 51static struct semaphore add_remove_card_sem;
52 52
53static int mwifiex_sdio_resume(struct device *dev); 53static int mwifiex_sdio_resume(struct device *dev);
54static void mwifiex_sdio_interrupt(struct sdio_func *func);
54 55
55/* 56/*
56 * SDIO probe. 57 * SDIO probe.
@@ -296,6 +297,15 @@ static struct sdio_driver mwifiex_sdio = {
296 } 297 }
297}; 298};
298 299
300/* Write data into SDIO card register. Caller claims SDIO device. */
301static int
302mwifiex_write_reg_locked(struct sdio_func *func, u32 reg, u8 data)
303{
304 int ret = -1;
305 sdio_writeb(func, data, reg, &ret);
306 return ret;
307}
308
299/* 309/*
300 * This function writes data into SDIO card register. 310 * This function writes data into SDIO card register.
301 */ 311 */
@@ -303,10 +313,10 @@ static int
303mwifiex_write_reg(struct mwifiex_adapter *adapter, u32 reg, u8 data) 313mwifiex_write_reg(struct mwifiex_adapter *adapter, u32 reg, u8 data)
304{ 314{
305 struct sdio_mmc_card *card = adapter->card; 315 struct sdio_mmc_card *card = adapter->card;
306 int ret = -1; 316 int ret;
307 317
308 sdio_claim_host(card->func); 318 sdio_claim_host(card->func);
309 sdio_writeb(card->func, data, reg, &ret); 319 ret = mwifiex_write_reg_locked(card->func, reg, data);
310 sdio_release_host(card->func); 320 sdio_release_host(card->func);
311 321
312 return ret; 322 return ret;
@@ -685,23 +695,15 @@ mwifiex_sdio_read_fw_status(struct mwifiex_adapter *adapter, u16 *dat)
685 * The host interrupt mask is read, the disable bit is reset and 695 * The host interrupt mask is read, the disable bit is reset and
686 * written back to the card host interrupt mask register. 696 * written back to the card host interrupt mask register.
687 */ 697 */
688static int mwifiex_sdio_disable_host_int(struct mwifiex_adapter *adapter) 698static void mwifiex_sdio_disable_host_int(struct mwifiex_adapter *adapter)
689{ 699{
690 u8 host_int_mask, host_int_disable = HOST_INT_DISABLE; 700 struct sdio_mmc_card *card = adapter->card;
691 701 struct sdio_func *func = card->func;
692 /* Read back the host_int_mask register */
693 if (mwifiex_read_reg(adapter, HOST_INT_MASK_REG, &host_int_mask))
694 return -1;
695
696 /* Update with the mask and write back to the register */
697 host_int_mask &= ~host_int_disable;
698
699 if (mwifiex_write_reg(adapter, HOST_INT_MASK_REG, host_int_mask)) {
700 dev_err(adapter->dev, "disable host interrupt failed\n");
701 return -1;
702 }
703 702
704 return 0; 703 sdio_claim_host(func);
704 mwifiex_write_reg_locked(func, HOST_INT_MASK_REG, 0);
705 sdio_release_irq(func);
706 sdio_release_host(func);
705} 707}
706 708
707/* 709/*
@@ -713,14 +715,29 @@ static int mwifiex_sdio_disable_host_int(struct mwifiex_adapter *adapter)
713static int mwifiex_sdio_enable_host_int(struct mwifiex_adapter *adapter) 715static int mwifiex_sdio_enable_host_int(struct mwifiex_adapter *adapter)
714{ 716{
715 struct sdio_mmc_card *card = adapter->card; 717 struct sdio_mmc_card *card = adapter->card;
718 struct sdio_func *func = card->func;
719 int ret;
720
721 sdio_claim_host(func);
722
723 /* Request the SDIO IRQ */
724 ret = sdio_claim_irq(func, mwifiex_sdio_interrupt);
725 if (ret) {
726 dev_err(adapter->dev, "claim irq failed: ret=%d\n", ret);
727 goto out;
728 }
716 729
717 /* Simply write the mask to the register */ 730 /* Simply write the mask to the register */
718 if (mwifiex_write_reg(adapter, HOST_INT_MASK_REG, 731 ret = mwifiex_write_reg_locked(func, HOST_INT_MASK_REG,
719 card->reg->host_int_enable)) { 732 card->reg->host_int_enable);
733 if (ret) {
720 dev_err(adapter->dev, "enable host interrupt failed\n"); 734 dev_err(adapter->dev, "enable host interrupt failed\n");
721 return -1; 735 sdio_release_irq(func);
722 } 736 }
723 return 0; 737
738out:
739 sdio_release_host(func);
740 return ret;
724} 741}
725 742
726/* 743/*
@@ -997,9 +1014,6 @@ mwifiex_sdio_interrupt(struct sdio_func *func)
997 } 1014 }
998 adapter = card->adapter; 1015 adapter = card->adapter;
999 1016
1000 if (adapter->surprise_removed)
1001 return;
1002
1003 if (!adapter->pps_uapsd_mode && adapter->ps_state == PS_STATE_SLEEP) 1017 if (!adapter->pps_uapsd_mode && adapter->ps_state == PS_STATE_SLEEP)
1004 adapter->ps_state = PS_STATE_AWAKE; 1018 adapter->ps_state = PS_STATE_AWAKE;
1005 1019
@@ -1625,8 +1639,8 @@ static int mwifiex_sdio_host_to_card(struct mwifiex_adapter *adapter,
1625 /* Allocate buffer and copy payload */ 1639 /* Allocate buffer and copy payload */
1626 blk_size = MWIFIEX_SDIO_BLOCK_SIZE; 1640 blk_size = MWIFIEX_SDIO_BLOCK_SIZE;
1627 buf_block_len = (pkt_len + blk_size - 1) / blk_size; 1641 buf_block_len = (pkt_len + blk_size - 1) / blk_size;
1628 *(u16 *) &payload[0] = (u16) pkt_len; 1642 *(__le16 *)&payload[0] = cpu_to_le16((u16)pkt_len);
1629 *(u16 *) &payload[2] = type; 1643 *(__le16 *)&payload[2] = cpu_to_le16(type);
1630 1644
1631 /* 1645 /*
1632 * This is SDIO specific header 1646 * This is SDIO specific header
@@ -1728,9 +1742,7 @@ mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
1728 struct sdio_mmc_card *card = adapter->card; 1742 struct sdio_mmc_card *card = adapter->card;
1729 1743
1730 if (adapter->card) { 1744 if (adapter->card) {
1731 /* Release the SDIO IRQ */
1732 sdio_claim_host(card->func); 1745 sdio_claim_host(card->func);
1733 sdio_release_irq(card->func);
1734 sdio_disable_func(card->func); 1746 sdio_disable_func(card->func);
1735 sdio_release_host(card->func); 1747 sdio_release_host(card->func);
1736 sdio_set_drvdata(card->func, NULL); 1748 sdio_set_drvdata(card->func, NULL);
@@ -1744,7 +1756,7 @@ mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
1744 */ 1756 */
1745static int mwifiex_register_dev(struct mwifiex_adapter *adapter) 1757static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
1746{ 1758{
1747 int ret = 0; 1759 int ret;
1748 struct sdio_mmc_card *card = adapter->card; 1760 struct sdio_mmc_card *card = adapter->card;
1749 struct sdio_func *func = card->func; 1761 struct sdio_func *func = card->func;
1750 1762
@@ -1753,22 +1765,14 @@ static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
1753 1765
1754 sdio_claim_host(func); 1766 sdio_claim_host(func);
1755 1767
1756 /* Request the SDIO IRQ */
1757 ret = sdio_claim_irq(func, mwifiex_sdio_interrupt);
1758 if (ret) {
1759 pr_err("claim irq failed: ret=%d\n", ret);
1760 goto disable_func;
1761 }
1762
1763 /* Set block size */ 1768 /* Set block size */
1764 ret = sdio_set_block_size(card->func, MWIFIEX_SDIO_BLOCK_SIZE); 1769 ret = sdio_set_block_size(card->func, MWIFIEX_SDIO_BLOCK_SIZE);
1770 sdio_release_host(func);
1765 if (ret) { 1771 if (ret) {
1766 pr_err("cannot set SDIO block size\n"); 1772 pr_err("cannot set SDIO block size\n");
1767 ret = -1; 1773 return ret;
1768 goto release_irq;
1769 } 1774 }
1770 1775
1771 sdio_release_host(func);
1772 sdio_set_drvdata(func, card); 1776 sdio_set_drvdata(func, card);
1773 1777
1774 adapter->dev = &func->dev; 1778 adapter->dev = &func->dev;
@@ -1776,15 +1780,6 @@ static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
1776 strcpy(adapter->fw_name, card->firmware); 1780 strcpy(adapter->fw_name, card->firmware);
1777 1781
1778 return 0; 1782 return 0;
1779
1780release_irq:
1781 sdio_release_irq(func);
1782disable_func:
1783 sdio_disable_func(func);
1784 sdio_release_host(func);
1785 adapter->card = NULL;
1786
1787 return -1;
1788} 1783}
1789 1784
1790/* 1785/*
@@ -1813,9 +1808,6 @@ static int mwifiex_init_sdio(struct mwifiex_adapter *adapter)
1813 */ 1808 */
1814 mwifiex_read_reg(adapter, HOST_INTSTATUS_REG, &sdio_ireg); 1809 mwifiex_read_reg(adapter, HOST_INTSTATUS_REG, &sdio_ireg);
1815 1810
1816 /* Disable host interrupt mask register for SDIO */
1817 mwifiex_sdio_disable_host_int(adapter);
1818
1819 /* Get SDIO ioport */ 1811 /* Get SDIO ioport */
1820 mwifiex_init_sdio_ioport(adapter); 1812 mwifiex_init_sdio_ioport(adapter);
1821 1813
@@ -1957,6 +1949,7 @@ static struct mwifiex_if_ops sdio_ops = {
1957 .register_dev = mwifiex_register_dev, 1949 .register_dev = mwifiex_register_dev,
1958 .unregister_dev = mwifiex_unregister_dev, 1950 .unregister_dev = mwifiex_unregister_dev,
1959 .enable_int = mwifiex_sdio_enable_host_int, 1951 .enable_int = mwifiex_sdio_enable_host_int,
1952 .disable_int = mwifiex_sdio_disable_host_int,
1960 .process_int_status = mwifiex_process_int_status, 1953 .process_int_status = mwifiex_process_int_status,
1961 .host_to_card = mwifiex_sdio_host_to_card, 1954 .host_to_card = mwifiex_sdio_host_to_card,
1962 .wakeup = mwifiex_pm_wakeup_card, 1955 .wakeup = mwifiex_pm_wakeup_card,
diff --git a/drivers/net/wireless/mwifiex/sdio.h b/drivers/net/wireless/mwifiex/sdio.h
index 6d51dfdd8251..532ae0ac4dfb 100644
--- a/drivers/net/wireless/mwifiex/sdio.h
+++ b/drivers/net/wireless/mwifiex/sdio.h
@@ -92,9 +92,6 @@
92/* Host Control Registers : Download host interrupt mask */ 92/* Host Control Registers : Download host interrupt mask */
93#define DN_LD_HOST_INT_MASK (0x2U) 93#define DN_LD_HOST_INT_MASK (0x2U)
94 94
95/* Disable Host interrupt mask */
96#define HOST_INT_DISABLE 0xff
97
98/* Host Control Registers : Host interrupt status */ 95/* Host Control Registers : Host interrupt status */
99#define HOST_INTSTATUS_REG 0x03 96#define HOST_INTSTATUS_REG 0x03
100/* Host Control Registers : Upload host interrupt status */ 97/* Host Control Registers : Upload host interrupt status */
diff --git a/drivers/net/wireless/mwifiex/sta_ioctl.c b/drivers/net/wireless/mwifiex/sta_ioctl.c
index 206c3e038072..8af97abf7108 100644
--- a/drivers/net/wireless/mwifiex/sta_ioctl.c
+++ b/drivers/net/wireless/mwifiex/sta_ioctl.c
@@ -257,10 +257,10 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
257 goto done; 257 goto done;
258 } 258 }
259 259
260 if (priv->bss_mode == NL80211_IFTYPE_STATION) { 260 if (priv->bss_mode == NL80211_IFTYPE_STATION ||
261 priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) {
261 u8 config_bands; 262 u8 config_bands;
262 263
263 /* Infra mode */
264 ret = mwifiex_deauthenticate(priv, NULL); 264 ret = mwifiex_deauthenticate(priv, NULL);
265 if (ret) 265 if (ret)
266 goto done; 266 goto done;
diff --git a/drivers/net/wireless/rt2x00/Kconfig b/drivers/net/wireless/rt2x00/Kconfig
index 9b915d3a44be..3e60a31582f8 100644
--- a/drivers/net/wireless/rt2x00/Kconfig
+++ b/drivers/net/wireless/rt2x00/Kconfig
@@ -1,6 +1,6 @@
1menuconfig RT2X00 1menuconfig RT2X00
2 tristate "Ralink driver support" 2 tristate "Ralink driver support"
3 depends on MAC80211 3 depends on MAC80211 && HAS_DMA
4 ---help--- 4 ---help---
5 This will enable the support for the Ralink drivers, 5 This will enable the support for the Ralink drivers,
6 developed in the rt2x00 project <http://rt2x00.serialmonkey.com>. 6 developed in the rt2x00 project <http://rt2x00.serialmonkey.com>.
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 6c0a91ff963c..aa95c6cf3545 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -936,13 +936,8 @@ void rt2x00queue_index_inc(struct queue_entry *entry, enum queue_index index)
936 spin_unlock_irqrestore(&queue->index_lock, irqflags); 936 spin_unlock_irqrestore(&queue->index_lock, irqflags);
937} 937}
938 938
939void rt2x00queue_pause_queue(struct data_queue *queue) 939void rt2x00queue_pause_queue_nocheck(struct data_queue *queue)
940{ 940{
941 if (!test_bit(DEVICE_STATE_PRESENT, &queue->rt2x00dev->flags) ||
942 !test_bit(QUEUE_STARTED, &queue->flags) ||
943 test_and_set_bit(QUEUE_PAUSED, &queue->flags))
944 return;
945
946 switch (queue->qid) { 941 switch (queue->qid) {
947 case QID_AC_VO: 942 case QID_AC_VO:
948 case QID_AC_VI: 943 case QID_AC_VI:
@@ -958,6 +953,15 @@ void rt2x00queue_pause_queue(struct data_queue *queue)
958 break; 953 break;
959 } 954 }
960} 955}
956void rt2x00queue_pause_queue(struct data_queue *queue)
957{
958 if (!test_bit(DEVICE_STATE_PRESENT, &queue->rt2x00dev->flags) ||
959 !test_bit(QUEUE_STARTED, &queue->flags) ||
960 test_and_set_bit(QUEUE_PAUSED, &queue->flags))
961 return;
962
963 rt2x00queue_pause_queue_nocheck(queue);
964}
961EXPORT_SYMBOL_GPL(rt2x00queue_pause_queue); 965EXPORT_SYMBOL_GPL(rt2x00queue_pause_queue);
962 966
963void rt2x00queue_unpause_queue(struct data_queue *queue) 967void rt2x00queue_unpause_queue(struct data_queue *queue)
@@ -1019,7 +1023,7 @@ void rt2x00queue_stop_queue(struct data_queue *queue)
1019 return; 1023 return;
1020 } 1024 }
1021 1025
1022 rt2x00queue_pause_queue(queue); 1026 rt2x00queue_pause_queue_nocheck(queue);
1023 1027
1024 queue->rt2x00dev->ops->lib->stop_queue(queue); 1028 queue->rt2x00dev->ops->lib->stop_queue(queue);
1025 1029
diff --git a/drivers/net/wireless/rtlwifi/Kconfig b/drivers/net/wireless/rtlwifi/Kconfig
index 7253de3d8c66..c2ffce7a907c 100644
--- a/drivers/net/wireless/rtlwifi/Kconfig
+++ b/drivers/net/wireless/rtlwifi/Kconfig
@@ -1,27 +1,20 @@
1config RTLWIFI 1menuconfig RTL_CARDS
2 tristate "Realtek wireless card support" 2 tristate "Realtek rtlwifi family of devices"
3 depends on MAC80211 3 depends on MAC80211 && (PCI || USB)
4 select FW_LOADER
5 ---help---
6 This is common code for RTL8192CE/RTL8192CU/RTL8192SE/RTL8723AE
7 drivers. This module does nothing by itself - the various front-end
8 drivers need to be enabled to support any desired devices.
9
10 If you choose to build as a module, it'll be called rtlwifi.
11
12config RTLWIFI_DEBUG
13 bool "Debugging output for rtlwifi driver family"
14 depends on RTLWIFI
15 default y 4 default y
16 ---help--- 5 ---help---
17 To use the module option that sets the dynamic-debugging level for, 6 This option will enable support for the Realtek mac80211-based
18 the front-end driver, this parameter must be "Y". For memory-limited 7 wireless drivers. Drivers rtl8192ce, rtl8192cu, rtl8192se, rtl8192de,
19 systems, choose "N". If in doubt, choose "Y". 8 rtl8723eu, and rtl8188eu share some common code.
9
10if RTL_CARDS
20 11
21config RTL8192CE 12config RTL8192CE
22 tristate "Realtek RTL8192CE/RTL8188CE Wireless Network Adapter" 13 tristate "Realtek RTL8192CE/RTL8188CE Wireless Network Adapter"
23 depends on RTLWIFI && PCI 14 depends on PCI
24 select RTL8192C_COMMON 15 select RTL8192C_COMMON
16 select RTLWIFI
17 select RTLWIFI_PCI
25 ---help--- 18 ---help---
26 This is the driver for Realtek RTL8192CE/RTL8188CE 802.11n PCIe 19 This is the driver for Realtek RTL8192CE/RTL8188CE 802.11n PCIe
27 wireless network adapters. 20 wireless network adapters.
@@ -30,7 +23,9 @@ config RTL8192CE
30 23
31config RTL8192SE 24config RTL8192SE
32 tristate "Realtek RTL8192SE/RTL8191SE PCIe Wireless Network Adapter" 25 tristate "Realtek RTL8192SE/RTL8191SE PCIe Wireless Network Adapter"
33 depends on RTLWIFI && PCI 26 depends on PCI
27 select RTLWIFI
28 select RTLWIFI_PCI
34 ---help--- 29 ---help---
35 This is the driver for Realtek RTL8192SE/RTL8191SE 802.11n PCIe 30 This is the driver for Realtek RTL8192SE/RTL8191SE 802.11n PCIe
36 wireless network adapters. 31 wireless network adapters.
@@ -39,7 +34,9 @@ config RTL8192SE
39 34
40config RTL8192DE 35config RTL8192DE
41 tristate "Realtek RTL8192DE/RTL8188DE PCIe Wireless Network Adapter" 36 tristate "Realtek RTL8192DE/RTL8188DE PCIe Wireless Network Adapter"
42 depends on RTLWIFI && PCI 37 depends on PCI
38 select RTLWIFI
39 select RTLWIFI_PCI
43 ---help--- 40 ---help---
44 This is the driver for Realtek RTL8192DE/RTL8188DE 802.11n PCIe 41 This is the driver for Realtek RTL8192DE/RTL8188DE 802.11n PCIe
45 wireless network adapters. 42 wireless network adapters.
@@ -48,7 +45,9 @@ config RTL8192DE
48 45
49config RTL8723AE 46config RTL8723AE
50 tristate "Realtek RTL8723AE PCIe Wireless Network Adapter" 47 tristate "Realtek RTL8723AE PCIe Wireless Network Adapter"
51 depends on RTLWIFI && PCI 48 depends on PCI
49 select RTLWIFI
50 select RTLWIFI_PCI
52 ---help--- 51 ---help---
53 This is the driver for Realtek RTL8723AE 802.11n PCIe 52 This is the driver for Realtek RTL8723AE 802.11n PCIe
54 wireless network adapters. 53 wireless network adapters.
@@ -57,7 +56,9 @@ config RTL8723AE
57 56
58config RTL8188EE 57config RTL8188EE
59 tristate "Realtek RTL8188EE Wireless Network Adapter" 58 tristate "Realtek RTL8188EE Wireless Network Adapter"
60 depends on RTLWIFI && PCI 59 depends on PCI
60 select RTLWIFI
61 select RTLWIFI_PCI
61 ---help--- 62 ---help---
62 This is the driver for Realtek RTL8188EE 802.11n PCIe 63 This is the driver for Realtek RTL8188EE 802.11n PCIe
63 wireless network adapters. 64 wireless network adapters.
@@ -66,7 +67,9 @@ config RTL8188EE
66 67
67config RTL8192CU 68config RTL8192CU
68 tristate "Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter" 69 tristate "Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter"
69 depends on RTLWIFI && USB 70 depends on USB
71 select RTLWIFI
72 select RTLWIFI_USB
70 select RTL8192C_COMMON 73 select RTL8192C_COMMON
71 ---help--- 74 ---help---
72 This is the driver for Realtek RTL8192CU/RTL8188CU 802.11n USB 75 This is the driver for Realtek RTL8192CU/RTL8188CU 802.11n USB
@@ -74,7 +77,28 @@ config RTL8192CU
74 77
75 If you choose to build it as a module, it will be called rtl8192cu 78 If you choose to build it as a module, it will be called rtl8192cu
76 79
80config RTLWIFI
81 tristate
82 select FW_LOADER
83
84config RTLWIFI_PCI
85 tristate
86
87config RTLWIFI_USB
88 tristate
89
90config RTLWIFI_DEBUG
91 bool "Debugging output for rtlwifi driver family"
92 depends on RTLWIFI
93 default y
94 ---help---
95 To use the module option that sets the dynamic-debugging level for,
96 the front-end driver, this parameter must be "Y". For memory-limited
97 systems, choose "N". If in doubt, choose "Y".
98
77config RTL8192C_COMMON 99config RTL8192C_COMMON
78 tristate 100 tristate
79 depends on RTL8192CE || RTL8192CU 101 depends on RTL8192CE || RTL8192CU
80 default m 102 default y
103
104endif
diff --git a/drivers/net/wireless/rtlwifi/Makefile b/drivers/net/wireless/rtlwifi/Makefile
index ff02b874f8d8..d56f023a4b90 100644
--- a/drivers/net/wireless/rtlwifi/Makefile
+++ b/drivers/net/wireless/rtlwifi/Makefile
@@ -12,13 +12,11 @@ rtlwifi-objs := \
12 12
13rtl8192c_common-objs += \ 13rtl8192c_common-objs += \
14 14
15ifneq ($(CONFIG_PCI),) 15obj-$(CONFIG_RTLWIFI_PCI) += rtl_pci.o
16rtlwifi-objs += pci.o 16rtl_pci-objs := pci.o
17endif
18 17
19ifneq ($(CONFIG_USB),) 18obj-$(CONFIG_RTLWIFI_USB) += rtl_usb.o
20rtlwifi-objs += usb.o 19rtl_usb-objs := usb.o
21endif
22 20
23obj-$(CONFIG_RTL8192C_COMMON) += rtl8192c/ 21obj-$(CONFIG_RTL8192C_COMMON) += rtl8192c/
24obj-$(CONFIG_RTL8192CE) += rtl8192ce/ 22obj-$(CONFIG_RTL8192CE) += rtl8192ce/
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
index 9d558ac77b0c..7651f5acc14b 100644
--- a/drivers/net/wireless/rtlwifi/base.c
+++ b/drivers/net/wireless/rtlwifi/base.c
@@ -172,6 +172,7 @@ u8 rtl_tid_to_ac(u8 tid)
172{ 172{
173 return tid_to_ac[tid]; 173 return tid_to_ac[tid];
174} 174}
175EXPORT_SYMBOL_GPL(rtl_tid_to_ac);
175 176
176static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw, 177static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw,
177 struct ieee80211_sta_ht_cap *ht_cap) 178 struct ieee80211_sta_ht_cap *ht_cap)
@@ -406,6 +407,7 @@ void rtl_deinit_deferred_work(struct ieee80211_hw *hw)
406 cancel_delayed_work(&rtlpriv->works.ps_rfon_wq); 407 cancel_delayed_work(&rtlpriv->works.ps_rfon_wq);
407 cancel_delayed_work(&rtlpriv->works.fwevt_wq); 408 cancel_delayed_work(&rtlpriv->works.fwevt_wq);
408} 409}
410EXPORT_SYMBOL_GPL(rtl_deinit_deferred_work);
409 411
410void rtl_init_rfkill(struct ieee80211_hw *hw) 412void rtl_init_rfkill(struct ieee80211_hw *hw)
411{ 413{
@@ -439,6 +441,7 @@ void rtl_deinit_rfkill(struct ieee80211_hw *hw)
439{ 441{
440 wiphy_rfkill_stop_polling(hw->wiphy); 442 wiphy_rfkill_stop_polling(hw->wiphy);
441} 443}
444EXPORT_SYMBOL_GPL(rtl_deinit_rfkill);
442 445
443int rtl_init_core(struct ieee80211_hw *hw) 446int rtl_init_core(struct ieee80211_hw *hw)
444{ 447{
@@ -489,10 +492,12 @@ int rtl_init_core(struct ieee80211_hw *hw)
489 492
490 return 0; 493 return 0;
491} 494}
495EXPORT_SYMBOL_GPL(rtl_init_core);
492 496
493void rtl_deinit_core(struct ieee80211_hw *hw) 497void rtl_deinit_core(struct ieee80211_hw *hw)
494{ 498{
495} 499}
500EXPORT_SYMBOL_GPL(rtl_deinit_core);
496 501
497void rtl_init_rx_config(struct ieee80211_hw *hw) 502void rtl_init_rx_config(struct ieee80211_hw *hw)
498{ 503{
@@ -501,6 +506,7 @@ void rtl_init_rx_config(struct ieee80211_hw *hw)
501 506
502 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *) (&mac->rx_conf)); 507 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *) (&mac->rx_conf));
503} 508}
509EXPORT_SYMBOL_GPL(rtl_init_rx_config);
504 510
505/********************************************************* 511/*********************************************************
506 * 512 *
@@ -879,6 +885,7 @@ bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb)
879 885
880 return true; 886 return true;
881} 887}
888EXPORT_SYMBOL_GPL(rtl_tx_mgmt_proc);
882 889
883void rtl_get_tcb_desc(struct ieee80211_hw *hw, 890void rtl_get_tcb_desc(struct ieee80211_hw *hw,
884 struct ieee80211_tx_info *info, 891 struct ieee80211_tx_info *info,
@@ -1052,6 +1059,7 @@ bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
1052 1059
1053 return true; 1060 return true;
1054} 1061}
1062EXPORT_SYMBOL_GPL(rtl_action_proc);
1055 1063
1056/*should call before software enc*/ 1064/*should call before software enc*/
1057u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) 1065u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
@@ -1125,6 +1133,7 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
1125 1133
1126 return false; 1134 return false;
1127} 1135}
1136EXPORT_SYMBOL_GPL(rtl_is_special_data);
1128 1137
1129/********************************************************* 1138/*********************************************************
1130 * 1139 *
@@ -1300,6 +1309,7 @@ void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb)
1300 1309
1301 rtlpriv->link_info.bcn_rx_inperiod++; 1310 rtlpriv->link_info.bcn_rx_inperiod++;
1302} 1311}
1312EXPORT_SYMBOL_GPL(rtl_beacon_statistic);
1303 1313
1304void rtl_watchdog_wq_callback(void *data) 1314void rtl_watchdog_wq_callback(void *data)
1305{ 1315{
@@ -1793,6 +1803,7 @@ void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len)
1793 1803
1794 mac->vendor = vendor; 1804 mac->vendor = vendor;
1795} 1805}
1806EXPORT_SYMBOL_GPL(rtl_recognize_peer);
1796 1807
1797/********************************************************* 1808/*********************************************************
1798 * 1809 *
@@ -1849,6 +1860,7 @@ struct attribute_group rtl_attribute_group = {
1849 .name = "rtlsysfs", 1860 .name = "rtlsysfs",
1850 .attrs = rtl_sysfs_entries, 1861 .attrs = rtl_sysfs_entries,
1851}; 1862};
1863EXPORT_SYMBOL_GPL(rtl_attribute_group);
1852 1864
1853MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>"); 1865MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>");
1854MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>"); 1866MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
@@ -1856,7 +1868,8 @@ MODULE_AUTHOR("Larry Finger <Larry.FInger@lwfinger.net>");
1856MODULE_LICENSE("GPL"); 1868MODULE_LICENSE("GPL");
1857MODULE_DESCRIPTION("Realtek 802.11n PCI wireless core"); 1869MODULE_DESCRIPTION("Realtek 802.11n PCI wireless core");
1858 1870
1859struct rtl_global_var global_var = {}; 1871struct rtl_global_var rtl_global_var = {};
1872EXPORT_SYMBOL_GPL(rtl_global_var);
1860 1873
1861static int __init rtl_core_module_init(void) 1874static int __init rtl_core_module_init(void)
1862{ 1875{
@@ -1864,8 +1877,8 @@ static int __init rtl_core_module_init(void)
1864 pr_err("Unable to register rtl_rc, use default RC !!\n"); 1877 pr_err("Unable to register rtl_rc, use default RC !!\n");
1865 1878
1866 /* init some global vars */ 1879 /* init some global vars */
1867 INIT_LIST_HEAD(&global_var.glb_priv_list); 1880 INIT_LIST_HEAD(&rtl_global_var.glb_priv_list);
1868 spin_lock_init(&global_var.glb_list_lock); 1881 spin_lock_init(&rtl_global_var.glb_list_lock);
1869 1882
1870 return 0; 1883 return 0;
1871} 1884}
diff --git a/drivers/net/wireless/rtlwifi/base.h b/drivers/net/wireless/rtlwifi/base.h
index 8576bc34b032..0e5fe0902daf 100644
--- a/drivers/net/wireless/rtlwifi/base.h
+++ b/drivers/net/wireless/rtlwifi/base.h
@@ -147,7 +147,7 @@ void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len);
147u8 rtl_tid_to_ac(u8 tid); 147u8 rtl_tid_to_ac(u8 tid);
148extern struct attribute_group rtl_attribute_group; 148extern struct attribute_group rtl_attribute_group;
149void rtl_easy_concurrent_retrytimer_callback(unsigned long data); 149void rtl_easy_concurrent_retrytimer_callback(unsigned long data);
150extern struct rtl_global_var global_var; 150extern struct rtl_global_var rtl_global_var;
151int rtlwifi_rate_mapping(struct ieee80211_hw *hw, 151int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
152 bool isht, u8 desc_rate, bool first_ampdu); 152 bool isht, u8 desc_rate, bool first_ampdu);
153bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb); 153bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb);
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
index ee84844be008..733b7ce7f0e2 100644
--- a/drivers/net/wireless/rtlwifi/core.c
+++ b/drivers/net/wireless/rtlwifi/core.c
@@ -1330,3 +1330,4 @@ const struct ieee80211_ops rtl_ops = {
1330 .rfkill_poll = rtl_op_rfkill_poll, 1330 .rfkill_poll = rtl_op_rfkill_poll,
1331 .flush = rtl_op_flush, 1331 .flush = rtl_op_flush,
1332}; 1332};
1333EXPORT_SYMBOL_GPL(rtl_ops);
diff --git a/drivers/net/wireless/rtlwifi/debug.c b/drivers/net/wireless/rtlwifi/debug.c
index 7d52d3d7769f..76e2086e137e 100644
--- a/drivers/net/wireless/rtlwifi/debug.c
+++ b/drivers/net/wireless/rtlwifi/debug.c
@@ -51,3 +51,4 @@ void rtl_dbgp_flag_init(struct ieee80211_hw *hw)
51 51
52 /*Init Debug flag enable condition */ 52 /*Init Debug flag enable condition */
53} 53}
54EXPORT_SYMBOL_GPL(rtl_dbgp_flag_init);
diff --git a/drivers/net/wireless/rtlwifi/efuse.c b/drivers/net/wireless/rtlwifi/efuse.c
index 9e3894178e77..838a1ed3f194 100644
--- a/drivers/net/wireless/rtlwifi/efuse.c
+++ b/drivers/net/wireless/rtlwifi/efuse.c
@@ -229,6 +229,7 @@ void read_efuse_byte(struct ieee80211_hw *hw, u16 _offset, u8 *pbuf)
229 229
230 *pbuf = (u8) (value32 & 0xff); 230 *pbuf = (u8) (value32 & 0xff);
231} 231}
232EXPORT_SYMBOL_GPL(read_efuse_byte);
232 233
233void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf) 234void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
234{ 235{
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
index c97e9d327331..703f839af6ca 100644
--- a/drivers/net/wireless/rtlwifi/pci.c
+++ b/drivers/net/wireless/rtlwifi/pci.c
@@ -35,6 +35,13 @@
35#include "efuse.h" 35#include "efuse.h"
36#include <linux/export.h> 36#include <linux/export.h>
37#include <linux/kmemleak.h> 37#include <linux/kmemleak.h>
38#include <linux/module.h>
39
40MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>");
41MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
42MODULE_AUTHOR("Larry Finger <Larry.FInger@lwfinger.net>");
43MODULE_LICENSE("GPL");
44MODULE_DESCRIPTION("PCI basic driver for rtlwifi");
38 45
39static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = { 46static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = {
40 PCI_VENDOR_ID_INTEL, 47 PCI_VENDOR_ID_INTEL,
@@ -1008,19 +1015,6 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
1008 return; 1015 return;
1009} 1016}
1010 1017
1011static void rtl_lps_change_work_callback(struct work_struct *work)
1012{
1013 struct rtl_works *rtlworks =
1014 container_of(work, struct rtl_works, lps_change_work);
1015 struct ieee80211_hw *hw = rtlworks->hw;
1016 struct rtl_priv *rtlpriv = rtl_priv(hw);
1017
1018 if (rtlpriv->enter_ps)
1019 rtl_lps_enter(hw);
1020 else
1021 rtl_lps_leave(hw);
1022}
1023
1024static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw) 1018static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
1025{ 1019{
1026 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1020 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
@@ -1899,7 +1893,7 @@ int rtl_pci_probe(struct pci_dev *pdev,
1899 rtlpriv->rtlhal.interface = INTF_PCI; 1893 rtlpriv->rtlhal.interface = INTF_PCI;
1900 rtlpriv->cfg = (struct rtl_hal_cfg *)(id->driver_data); 1894 rtlpriv->cfg = (struct rtl_hal_cfg *)(id->driver_data);
1901 rtlpriv->intf_ops = &rtl_pci_ops; 1895 rtlpriv->intf_ops = &rtl_pci_ops;
1902 rtlpriv->glb_var = &global_var; 1896 rtlpriv->glb_var = &rtl_global_var;
1903 1897
1904 /* 1898 /*
1905 *init dbgp flags before all 1899 *init dbgp flags before all
diff --git a/drivers/net/wireless/rtlwifi/ps.c b/drivers/net/wireless/rtlwifi/ps.c
index 884bceae38a9..298b615964e8 100644
--- a/drivers/net/wireless/rtlwifi/ps.c
+++ b/drivers/net/wireless/rtlwifi/ps.c
@@ -269,6 +269,7 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
269 269
270 spin_unlock_irqrestore(&rtlpriv->locks.ips_lock, flags); 270 spin_unlock_irqrestore(&rtlpriv->locks.ips_lock, flags);
271} 271}
272EXPORT_SYMBOL_GPL(rtl_ips_nic_on);
272 273
273/*for FW LPS*/ 274/*for FW LPS*/
274 275
@@ -518,6 +519,7 @@ void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len)
518 "u_bufferd: %x, m_buffered: %x\n", u_buffed, m_buffed); 519 "u_bufferd: %x, m_buffered: %x\n", u_buffed, m_buffed);
519 } 520 }
520} 521}
522EXPORT_SYMBOL_GPL(rtl_swlps_beacon);
521 523
522void rtl_swlps_rf_awake(struct ieee80211_hw *hw) 524void rtl_swlps_rf_awake(struct ieee80211_hw *hw)
523{ 525{
@@ -611,6 +613,19 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
611 MSECS(sleep_intv * mac->vif->bss_conf.beacon_int - 40)); 613 MSECS(sleep_intv * mac->vif->bss_conf.beacon_int - 40));
612} 614}
613 615
616void rtl_lps_change_work_callback(struct work_struct *work)
617{
618 struct rtl_works *rtlworks =
619 container_of(work, struct rtl_works, lps_change_work);
620 struct ieee80211_hw *hw = rtlworks->hw;
621 struct rtl_priv *rtlpriv = rtl_priv(hw);
622
623 if (rtlpriv->enter_ps)
624 rtl_lps_enter(hw);
625 else
626 rtl_lps_leave(hw);
627}
628EXPORT_SYMBOL_GPL(rtl_lps_change_work_callback);
614 629
615void rtl_swlps_wq_callback(void *data) 630void rtl_swlps_wq_callback(void *data)
616{ 631{
@@ -922,3 +937,4 @@ void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len)
922 else 937 else
923 rtl_p2p_noa_ie(hw, data, len - FCS_LEN); 938 rtl_p2p_noa_ie(hw, data, len - FCS_LEN);
924} 939}
940EXPORT_SYMBOL_GPL(rtl_p2p_info);
diff --git a/drivers/net/wireless/rtlwifi/ps.h b/drivers/net/wireless/rtlwifi/ps.h
index 4d682b753f50..88bd76ea88f7 100644
--- a/drivers/net/wireless/rtlwifi/ps.h
+++ b/drivers/net/wireless/rtlwifi/ps.h
@@ -49,5 +49,6 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw);
49void rtl_swlps_rf_sleep(struct ieee80211_hw *hw); 49void rtl_swlps_rf_sleep(struct ieee80211_hw *hw);
50void rtl_p2p_ps_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state); 50void rtl_p2p_ps_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
51void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len); 51void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len);
52void rtl_lps_change_work_callback(struct work_struct *work);
52 53
53#endif 54#endif
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
index a3532e077871..e56778cac9bf 100644
--- a/drivers/net/wireless/rtlwifi/usb.c
+++ b/drivers/net/wireless/rtlwifi/usb.c
@@ -32,6 +32,13 @@
32#include "ps.h" 32#include "ps.h"
33#include "rtl8192c/fw_common.h" 33#include "rtl8192c/fw_common.h"
34#include <linux/export.h> 34#include <linux/export.h>
35#include <linux/module.h>
36
37MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>");
38MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
39MODULE_AUTHOR("Larry Finger <Larry.FInger@lwfinger.net>");
40MODULE_LICENSE("GPL");
41MODULE_DESCRIPTION("USB basic driver for rtlwifi");
35 42
36#define REALTEK_USB_VENQT_READ 0xC0 43#define REALTEK_USB_VENQT_READ 0xC0
37#define REALTEK_USB_VENQT_WRITE 0x40 44#define REALTEK_USB_VENQT_WRITE 0x40
@@ -1070,6 +1077,8 @@ int rtl_usb_probe(struct usb_interface *intf,
1070 spin_lock_init(&rtlpriv->locks.usb_lock); 1077 spin_lock_init(&rtlpriv->locks.usb_lock);
1071 INIT_WORK(&rtlpriv->works.fill_h2c_cmd, 1078 INIT_WORK(&rtlpriv->works.fill_h2c_cmd,
1072 rtl_fill_h2c_cmd_work_callback); 1079 rtl_fill_h2c_cmd_work_callback);
1080 INIT_WORK(&rtlpriv->works.lps_change_work,
1081 rtl_lps_change_work_callback);
1073 1082
1074 rtlpriv->usb_data_index = 0; 1083 rtlpriv->usb_data_index = 0;
1075 init_completion(&rtlpriv->firmware_loading_complete); 1084 init_completion(&rtlpriv->firmware_loading_complete);
diff --git a/drivers/net/wireless/zd1201.c b/drivers/net/wireless/zd1201.c
index 4941f201d6c8..b8ba1f925e75 100644
--- a/drivers/net/wireless/zd1201.c
+++ b/drivers/net/wireless/zd1201.c
@@ -98,10 +98,12 @@ static int zd1201_fw_upload(struct usb_device *dev, int apfw)
98 goto exit; 98 goto exit;
99 99
100 err = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0x4, 100 err = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 0x4,
101 USB_DIR_IN | 0x40, 0,0, &ret, sizeof(ret), ZD1201_FW_TIMEOUT); 101 USB_DIR_IN | 0x40, 0, 0, buf, sizeof(ret), ZD1201_FW_TIMEOUT);
102 if (err < 0) 102 if (err < 0)
103 goto exit; 103 goto exit;
104 104
105 memcpy(&ret, buf, sizeof(ret));
106
105 if (ret & 0x80) { 107 if (ret & 0x80) {
106 err = -EIO; 108 err = -EIO;
107 goto exit; 109 goto exit;
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 6bb7cf2de556..b10ba00cc3e6 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -392,6 +392,8 @@ static void __unflatten_device_tree(struct boot_param_header *blob,
392 mem = (unsigned long) 392 mem = (unsigned long)
393 dt_alloc(size + 4, __alignof__(struct device_node)); 393 dt_alloc(size + 4, __alignof__(struct device_node));
394 394
395 memset((void *)mem, 0, size);
396
395 ((__be32 *)mem)[size / 4] = cpu_to_be32(0xdeadbeef); 397 ((__be32 *)mem)[size / 4] = cpu_to_be32(0xdeadbeef);
396 398
397 pr_debug(" unflattening %lx...\n", mem); 399 pr_debug(" unflattening %lx...\n", mem);
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c
index e79e006eb9ab..9ee04b4b68bf 100644
--- a/drivers/parisc/iosapic.c
+++ b/drivers/parisc/iosapic.c
@@ -811,18 +811,28 @@ int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev)
811 return pcidev->irq; 811 return pcidev->irq;
812} 812}
813 813
814static struct iosapic_info *first_isi = NULL; 814static struct iosapic_info *iosapic_list;
815 815
816#ifdef CONFIG_64BIT 816#ifdef CONFIG_64BIT
817int iosapic_serial_irq(int num) 817int iosapic_serial_irq(struct parisc_device *dev)
818{ 818{
819 struct iosapic_info *isi = first_isi; 819 struct iosapic_info *isi;
820 struct irt_entry *irte = NULL; /* only used if PAT PDC */ 820 struct irt_entry *irte;
821 struct vector_info *vi; 821 struct vector_info *vi;
822 int isi_line; /* line used by device */ 822 int cnt;
823 int intin;
824
825 intin = (dev->mod_info >> 24) & 15;
823 826
824 /* lookup IRT entry for isi/slot/pin set */ 827 /* lookup IRT entry for isi/slot/pin set */
825 irte = &irt_cell[num]; 828 for (cnt = 0; cnt < irt_num_entry; cnt++) {
829 irte = &irt_cell[cnt];
830 if (COMPARE_IRTE_ADDR(irte, dev->mod0) &&
831 irte->dest_iosapic_intin == intin)
832 break;
833 }
834 if (cnt >= irt_num_entry)
835 return 0; /* no irq found, force polling */
826 836
827 DBG_IRT("iosapic_serial_irq(): irte %p %x %x %x %x %x %x %x %x\n", 837 DBG_IRT("iosapic_serial_irq(): irte %p %x %x %x %x %x %x %x %x\n",
828 irte, 838 irte,
@@ -834,11 +844,17 @@ int iosapic_serial_irq(int num)
834 irte->src_seg_id, 844 irte->src_seg_id,
835 irte->dest_iosapic_intin, 845 irte->dest_iosapic_intin,
836 (u32) irte->dest_iosapic_addr); 846 (u32) irte->dest_iosapic_addr);
837 isi_line = irte->dest_iosapic_intin; 847
848 /* search for iosapic */
849 for (isi = iosapic_list; isi; isi = isi->isi_next)
850 if (isi->isi_hpa == dev->mod0)
851 break;
852 if (!isi)
853 return 0; /* no iosapic found, force polling */
838 854
839 /* get vector info for this input line */ 855 /* get vector info for this input line */
840 vi = isi->isi_vector + isi_line; 856 vi = isi->isi_vector + intin;
841 DBG_IRT("iosapic_serial_irq: line %d vi 0x%p\n", isi_line, vi); 857 DBG_IRT("iosapic_serial_irq: line %d vi 0x%p\n", iosapic_intin, vi);
842 858
843 /* If this IRQ line has already been setup, skip it */ 859 /* If this IRQ line has already been setup, skip it */
844 if (vi->irte) 860 if (vi->irte)
@@ -941,8 +957,8 @@ void *iosapic_register(unsigned long hpa)
941 vip->irqline = (unsigned char) cnt; 957 vip->irqline = (unsigned char) cnt;
942 vip->iosapic = isi; 958 vip->iosapic = isi;
943 } 959 }
944 if (!first_isi) 960 isi->isi_next = iosapic_list;
945 first_isi = isi; 961 iosapic_list = isi;
946 return isi; 962 return isi;
947} 963}
948 964
diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c
index 13a633b1612e..7bf3926aecc0 100644
--- a/drivers/pci/host/pci-mvebu.c
+++ b/drivers/pci/host/pci-mvebu.c
@@ -86,10 +86,6 @@ struct mvebu_sw_pci_bridge {
86 u16 secondary_status; 86 u16 secondary_status;
87 u16 membase; 87 u16 membase;
88 u16 memlimit; 88 u16 memlimit;
89 u16 prefmembase;
90 u16 prefmemlimit;
91 u32 prefbaseupper;
92 u32 preflimitupper;
93 u16 iobaseupper; 89 u16 iobaseupper;
94 u16 iolimitupper; 90 u16 iolimitupper;
95 u8 cappointer; 91 u8 cappointer;
@@ -419,15 +415,7 @@ static int mvebu_sw_pci_bridge_read(struct mvebu_pcie_port *port,
419 break; 415 break;
420 416
421 case PCI_PREF_MEMORY_BASE: 417 case PCI_PREF_MEMORY_BASE:
422 *value = (bridge->prefmemlimit << 16 | bridge->prefmembase); 418 *value = 0;
423 break;
424
425 case PCI_PREF_BASE_UPPER32:
426 *value = bridge->prefbaseupper;
427 break;
428
429 case PCI_PREF_LIMIT_UPPER32:
430 *value = bridge->preflimitupper;
431 break; 419 break;
432 420
433 case PCI_IO_BASE_UPPER16: 421 case PCI_IO_BASE_UPPER16:
@@ -501,19 +489,6 @@ static int mvebu_sw_pci_bridge_write(struct mvebu_pcie_port *port,
501 mvebu_pcie_handle_membase_change(port); 489 mvebu_pcie_handle_membase_change(port);
502 break; 490 break;
503 491
504 case PCI_PREF_MEMORY_BASE:
505 bridge->prefmembase = value & 0xffff;
506 bridge->prefmemlimit = value >> 16;
507 break;
508
509 case PCI_PREF_BASE_UPPER32:
510 bridge->prefbaseupper = value;
511 break;
512
513 case PCI_PREF_LIMIT_UPPER32:
514 bridge->preflimitupper = value;
515 break;
516
517 case PCI_IO_BASE_UPPER16: 492 case PCI_IO_BASE_UPPER16:
518 bridge->iobaseupper = value & 0xffff; 493 bridge->iobaseupper = value & 0xffff;
519 bridge->iolimitupper = value >> 16; 494 bridge->iolimitupper = value >> 16;
diff --git a/drivers/pci/hotplug/Kconfig b/drivers/pci/hotplug/Kconfig
index bb7ebb22db01..d85009de713d 100644
--- a/drivers/pci/hotplug/Kconfig
+++ b/drivers/pci/hotplug/Kconfig
@@ -3,16 +3,13 @@
3# 3#
4 4
5menuconfig HOTPLUG_PCI 5menuconfig HOTPLUG_PCI
6 tristate "Support for PCI Hotplug" 6 bool "Support for PCI Hotplug"
7 depends on PCI && SYSFS 7 depends on PCI && SYSFS
8 ---help--- 8 ---help---
9 Say Y here if you have a motherboard with a PCI Hotplug controller. 9 Say Y here if you have a motherboard with a PCI Hotplug controller.
10 This allows you to add and remove PCI cards while the machine is 10 This allows you to add and remove PCI cards while the machine is
11 powered up and running. 11 powered up and running.
12 12
13 To compile this driver as a module, choose M here: the
14 module will be called pci_hotplug.
15
16 When in doubt, say N. 13 When in doubt, say N.
17 14
18if HOTPLUG_PCI 15if HOTPLUG_PCI
diff --git a/drivers/pci/hotplug/pciehp_pci.c b/drivers/pci/hotplug/pciehp_pci.c
index aac7a40e4a4a..0e0d0f7f63fd 100644
--- a/drivers/pci/hotplug/pciehp_pci.c
+++ b/drivers/pci/hotplug/pciehp_pci.c
@@ -92,7 +92,14 @@ int pciehp_unconfigure_device(struct slot *p_slot)
92 if (ret) 92 if (ret)
93 presence = 0; 93 presence = 0;
94 94
95 list_for_each_entry_safe(dev, temp, &parent->devices, bus_list) { 95 /*
96 * Stopping an SR-IOV PF device removes all the associated VFs,
97 * which will update the bus->devices list and confuse the
98 * iterator. Therefore, iterate in reverse so we remove the VFs
99 * first, then the PF. We do the same in pci_stop_bus_device().
100 */
101 list_for_each_entry_safe_reverse(dev, temp, &parent->devices,
102 bus_list) {
96 pci_dev_get(dev); 103 pci_dev_get(dev);
97 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE && presence) { 104 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE && presence) {
98 pci_read_config_byte(dev, PCI_BRIDGE_CONTROL, &bctl); 105 pci_read_config_byte(dev, PCI_BRIDGE_CONTROL, &bctl);
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c
index dbdc5f7e2b29..01e264fb50e0 100644
--- a/drivers/pci/pci-acpi.c
+++ b/drivers/pci/pci-acpi.c
@@ -317,13 +317,20 @@ void acpi_pci_remove_bus(struct pci_bus *bus)
317/* ACPI bus type */ 317/* ACPI bus type */
318static int acpi_pci_find_device(struct device *dev, acpi_handle *handle) 318static int acpi_pci_find_device(struct device *dev, acpi_handle *handle)
319{ 319{
320 struct pci_dev * pci_dev; 320 struct pci_dev *pci_dev = to_pci_dev(dev);
321 u64 addr; 321 bool is_bridge;
322 u64 addr;
322 323
323 pci_dev = to_pci_dev(dev); 324 /*
325 * pci_is_bridge() is not suitable here, because pci_dev->subordinate
326 * is set only after acpi_pci_find_device() has been called for the
327 * given device.
328 */
329 is_bridge = pci_dev->hdr_type == PCI_HEADER_TYPE_BRIDGE
330 || pci_dev->hdr_type == PCI_HEADER_TYPE_CARDBUS;
324 /* Please ref to ACPI spec for the syntax of _ADR */ 331 /* Please ref to ACPI spec for the syntax of _ADR */
325 addr = (PCI_SLOT(pci_dev->devfn) << 16) | PCI_FUNC(pci_dev->devfn); 332 addr = (PCI_SLOT(pci_dev->devfn) << 16) | PCI_FUNC(pci_dev->devfn);
326 *handle = acpi_get_child(DEVICE_ACPI_HANDLE(dev->parent), addr); 333 *handle = acpi_find_child(ACPI_HANDLE(dev->parent), addr, is_bridge);
327 if (!*handle) 334 if (!*handle)
328 return -ENODEV; 335 return -ENODEV;
329 return 0; 336 return 0;
diff --git a/drivers/pci/pcie/Kconfig b/drivers/pci/pcie/Kconfig
index 569f82fc9e22..3b94cfcfa03b 100644
--- a/drivers/pci/pcie/Kconfig
+++ b/drivers/pci/pcie/Kconfig
@@ -14,15 +14,12 @@ config PCIEPORTBUS
14# Include service Kconfig here 14# Include service Kconfig here
15# 15#
16config HOTPLUG_PCI_PCIE 16config HOTPLUG_PCI_PCIE
17 tristate "PCI Express Hotplug driver" 17 bool "PCI Express Hotplug driver"
18 depends on HOTPLUG_PCI && PCIEPORTBUS 18 depends on HOTPLUG_PCI && PCIEPORTBUS
19 help 19 help
20 Say Y here if you have a motherboard that supports PCI Express Native 20 Say Y here if you have a motherboard that supports PCI Express Native
21 Hotplug 21 Hotplug
22 22
23 To compile this driver as a module, choose M here: the
24 module will be called pciehp.
25
26 When in doubt, say N. 23 When in doubt, say N.
27 24
28source "drivers/pci/pcie/aer/Kconfig" 25source "drivers/pci/pcie/aer/Kconfig"
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index d254e2379533..64a7de22d9af 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -300,6 +300,47 @@ static void assign_requested_resources_sorted(struct list_head *head,
300 } 300 }
301} 301}
302 302
303static unsigned long pci_fail_res_type_mask(struct list_head *fail_head)
304{
305 struct pci_dev_resource *fail_res;
306 unsigned long mask = 0;
307
308 /* check failed type */
309 list_for_each_entry(fail_res, fail_head, list)
310 mask |= fail_res->flags;
311
312 /*
313 * one pref failed resource will set IORESOURCE_MEM,
314 * as we can allocate pref in non-pref range.
315 * Will release all assigned non-pref sibling resources
316 * according to that bit.
317 */
318 return mask & (IORESOURCE_IO | IORESOURCE_MEM | IORESOURCE_PREFETCH);
319}
320
321static bool pci_need_to_release(unsigned long mask, struct resource *res)
322{
323 if (res->flags & IORESOURCE_IO)
324 return !!(mask & IORESOURCE_IO);
325
326 /* check pref at first */
327 if (res->flags & IORESOURCE_PREFETCH) {
328 if (mask & IORESOURCE_PREFETCH)
329 return true;
330 /* count pref if its parent is non-pref */
331 else if ((mask & IORESOURCE_MEM) &&
332 !(res->parent->flags & IORESOURCE_PREFETCH))
333 return true;
334 else
335 return false;
336 }
337
338 if (res->flags & IORESOURCE_MEM)
339 return !!(mask & IORESOURCE_MEM);
340
341 return false; /* should not get here */
342}
343
303static void __assign_resources_sorted(struct list_head *head, 344static void __assign_resources_sorted(struct list_head *head,
304 struct list_head *realloc_head, 345 struct list_head *realloc_head,
305 struct list_head *fail_head) 346 struct list_head *fail_head)
@@ -312,11 +353,24 @@ static void __assign_resources_sorted(struct list_head *head,
312 * if could do that, could get out early. 353 * if could do that, could get out early.
313 * if could not do that, we still try to assign requested at first, 354 * if could not do that, we still try to assign requested at first,
314 * then try to reassign add_size for some resources. 355 * then try to reassign add_size for some resources.
356 *
357 * Separate three resource type checking if we need to release
358 * assigned resource after requested + add_size try.
359 * 1. if there is io port assign fail, will release assigned
360 * io port.
361 * 2. if there is pref mmio assign fail, release assigned
362 * pref mmio.
363 * if assigned pref mmio's parent is non-pref mmio and there
364 * is non-pref mmio assign fail, will release that assigned
365 * pref mmio.
366 * 3. if there is non-pref mmio assign fail or pref mmio
367 * assigned fail, will release assigned non-pref mmio.
315 */ 368 */
316 LIST_HEAD(save_head); 369 LIST_HEAD(save_head);
317 LIST_HEAD(local_fail_head); 370 LIST_HEAD(local_fail_head);
318 struct pci_dev_resource *save_res; 371 struct pci_dev_resource *save_res;
319 struct pci_dev_resource *dev_res; 372 struct pci_dev_resource *dev_res, *tmp_res;
373 unsigned long fail_type;
320 374
321 /* Check if optional add_size is there */ 375 /* Check if optional add_size is there */
322 if (!realloc_head || list_empty(realloc_head)) 376 if (!realloc_head || list_empty(realloc_head))
@@ -348,6 +402,19 @@ static void __assign_resources_sorted(struct list_head *head,
348 return; 402 return;
349 } 403 }
350 404
405 /* check failed type */
406 fail_type = pci_fail_res_type_mask(&local_fail_head);
407 /* remove not need to be released assigned res from head list etc */
408 list_for_each_entry_safe(dev_res, tmp_res, head, list)
409 if (dev_res->res->parent &&
410 !pci_need_to_release(fail_type, dev_res->res)) {
411 /* remove it from realloc_head list */
412 remove_from_list(realloc_head, dev_res->res);
413 remove_from_list(&save_head, dev_res->res);
414 list_del(&dev_res->list);
415 kfree(dev_res);
416 }
417
351 free_list(&local_fail_head); 418 free_list(&local_fail_head);
352 /* Release assigned resource */ 419 /* Release assigned resource */
353 list_for_each_entry(dev_res, head, list) 420 list_for_each_entry(dev_res, head, list)
diff --git a/drivers/pinctrl/pinctrl-sunxi.c b/drivers/pinctrl/pinctrl-sunxi.c
index c47fd1e5450b..94716c779800 100644
--- a/drivers/pinctrl/pinctrl-sunxi.c
+++ b/drivers/pinctrl/pinctrl-sunxi.c
@@ -278,6 +278,7 @@ static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev,
278{ 278{
279 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 279 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
280 struct sunxi_pinctrl_group *g = &pctl->groups[group]; 280 struct sunxi_pinctrl_group *g = &pctl->groups[group];
281 unsigned long flags;
281 u32 val, mask; 282 u32 val, mask;
282 u16 strength; 283 u16 strength;
283 u8 dlevel; 284 u8 dlevel;
@@ -295,22 +296,35 @@ static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev,
295 * 3: 40mA 296 * 3: 40mA
296 */ 297 */
297 dlevel = strength / 10 - 1; 298 dlevel = strength / 10 - 1;
299
300 spin_lock_irqsave(&pctl->lock, flags);
301
298 val = readl(pctl->membase + sunxi_dlevel_reg(g->pin)); 302 val = readl(pctl->membase + sunxi_dlevel_reg(g->pin));
299 mask = DLEVEL_PINS_MASK << sunxi_dlevel_offset(g->pin); 303 mask = DLEVEL_PINS_MASK << sunxi_dlevel_offset(g->pin);
300 writel((val & ~mask) | dlevel << sunxi_dlevel_offset(g->pin), 304 writel((val & ~mask) | dlevel << sunxi_dlevel_offset(g->pin),
301 pctl->membase + sunxi_dlevel_reg(g->pin)); 305 pctl->membase + sunxi_dlevel_reg(g->pin));
306
307 spin_unlock_irqrestore(&pctl->lock, flags);
302 break; 308 break;
303 case PIN_CONFIG_BIAS_PULL_UP: 309 case PIN_CONFIG_BIAS_PULL_UP:
310 spin_lock_irqsave(&pctl->lock, flags);
311
304 val = readl(pctl->membase + sunxi_pull_reg(g->pin)); 312 val = readl(pctl->membase + sunxi_pull_reg(g->pin));
305 mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin); 313 mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin);
306 writel((val & ~mask) | 1 << sunxi_pull_offset(g->pin), 314 writel((val & ~mask) | 1 << sunxi_pull_offset(g->pin),
307 pctl->membase + sunxi_pull_reg(g->pin)); 315 pctl->membase + sunxi_pull_reg(g->pin));
316
317 spin_unlock_irqrestore(&pctl->lock, flags);
308 break; 318 break;
309 case PIN_CONFIG_BIAS_PULL_DOWN: 319 case PIN_CONFIG_BIAS_PULL_DOWN:
320 spin_lock_irqsave(&pctl->lock, flags);
321
310 val = readl(pctl->membase + sunxi_pull_reg(g->pin)); 322 val = readl(pctl->membase + sunxi_pull_reg(g->pin));
311 mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin); 323 mask = PULL_PINS_MASK << sunxi_pull_offset(g->pin);
312 writel((val & ~mask) | 2 << sunxi_pull_offset(g->pin), 324 writel((val & ~mask) | 2 << sunxi_pull_offset(g->pin),
313 pctl->membase + sunxi_pull_reg(g->pin)); 325 pctl->membase + sunxi_pull_reg(g->pin));
326
327 spin_unlock_irqrestore(&pctl->lock, flags);
314 break; 328 break;
315 default: 329 default:
316 break; 330 break;
@@ -360,11 +374,17 @@ static void sunxi_pmx_set(struct pinctrl_dev *pctldev,
360 u8 config) 374 u8 config)
361{ 375{
362 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 376 struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
377 unsigned long flags;
378 u32 val, mask;
379
380 spin_lock_irqsave(&pctl->lock, flags);
363 381
364 u32 val = readl(pctl->membase + sunxi_mux_reg(pin)); 382 val = readl(pctl->membase + sunxi_mux_reg(pin));
365 u32 mask = MUX_PINS_MASK << sunxi_mux_offset(pin); 383 mask = MUX_PINS_MASK << sunxi_mux_offset(pin);
366 writel((val & ~mask) | config << sunxi_mux_offset(pin), 384 writel((val & ~mask) | config << sunxi_mux_offset(pin),
367 pctl->membase + sunxi_mux_reg(pin)); 385 pctl->membase + sunxi_mux_reg(pin));
386
387 spin_unlock_irqrestore(&pctl->lock, flags);
368} 388}
369 389
370static int sunxi_pmx_enable(struct pinctrl_dev *pctldev, 390static int sunxi_pmx_enable(struct pinctrl_dev *pctldev,
@@ -464,8 +484,21 @@ static void sunxi_pinctrl_gpio_set(struct gpio_chip *chip,
464 struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev); 484 struct sunxi_pinctrl *pctl = dev_get_drvdata(chip->dev);
465 u32 reg = sunxi_data_reg(offset); 485 u32 reg = sunxi_data_reg(offset);
466 u8 index = sunxi_data_offset(offset); 486 u8 index = sunxi_data_offset(offset);
487 unsigned long flags;
488 u32 regval;
489
490 spin_lock_irqsave(&pctl->lock, flags);
491
492 regval = readl(pctl->membase + reg);
467 493
468 writel((value & DATA_PINS_MASK) << index, pctl->membase + reg); 494 if (value)
495 regval |= BIT(index);
496 else
497 regval &= ~(BIT(index));
498
499 writel(regval, pctl->membase + reg);
500
501 spin_unlock_irqrestore(&pctl->lock, flags);
469} 502}
470 503
471static int sunxi_pinctrl_gpio_of_xlate(struct gpio_chip *gc, 504static int sunxi_pinctrl_gpio_of_xlate(struct gpio_chip *gc,
@@ -526,6 +559,8 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d,
526 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); 559 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
527 u32 reg = sunxi_irq_cfg_reg(d->hwirq); 560 u32 reg = sunxi_irq_cfg_reg(d->hwirq);
528 u8 index = sunxi_irq_cfg_offset(d->hwirq); 561 u8 index = sunxi_irq_cfg_offset(d->hwirq);
562 unsigned long flags;
563 u32 regval;
529 u8 mode; 564 u8 mode;
530 565
531 switch (type) { 566 switch (type) {
@@ -548,7 +583,13 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d,
548 return -EINVAL; 583 return -EINVAL;
549 } 584 }
550 585
551 writel((mode & IRQ_CFG_IRQ_MASK) << index, pctl->membase + reg); 586 spin_lock_irqsave(&pctl->lock, flags);
587
588 regval = readl(pctl->membase + reg);
589 regval &= ~IRQ_CFG_IRQ_MASK;
590 writel(regval | (mode << index), pctl->membase + reg);
591
592 spin_unlock_irqrestore(&pctl->lock, flags);
552 593
553 return 0; 594 return 0;
554} 595}
@@ -560,14 +601,19 @@ static void sunxi_pinctrl_irq_mask_ack(struct irq_data *d)
560 u8 ctrl_idx = sunxi_irq_ctrl_offset(d->hwirq); 601 u8 ctrl_idx = sunxi_irq_ctrl_offset(d->hwirq);
561 u32 status_reg = sunxi_irq_status_reg(d->hwirq); 602 u32 status_reg = sunxi_irq_status_reg(d->hwirq);
562 u8 status_idx = sunxi_irq_status_offset(d->hwirq); 603 u8 status_idx = sunxi_irq_status_offset(d->hwirq);
604 unsigned long flags;
563 u32 val; 605 u32 val;
564 606
607 spin_lock_irqsave(&pctl->lock, flags);
608
565 /* Mask the IRQ */ 609 /* Mask the IRQ */
566 val = readl(pctl->membase + ctrl_reg); 610 val = readl(pctl->membase + ctrl_reg);
567 writel(val & ~(1 << ctrl_idx), pctl->membase + ctrl_reg); 611 writel(val & ~(1 << ctrl_idx), pctl->membase + ctrl_reg);
568 612
569 /* Clear the IRQ */ 613 /* Clear the IRQ */
570 writel(1 << status_idx, pctl->membase + status_reg); 614 writel(1 << status_idx, pctl->membase + status_reg);
615
616 spin_unlock_irqrestore(&pctl->lock, flags);
571} 617}
572 618
573static void sunxi_pinctrl_irq_mask(struct irq_data *d) 619static void sunxi_pinctrl_irq_mask(struct irq_data *d)
@@ -575,11 +621,16 @@ static void sunxi_pinctrl_irq_mask(struct irq_data *d)
575 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); 621 struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
576 u32 reg = sunxi_irq_ctrl_reg(d->hwirq); 622 u32 reg = sunxi_irq_ctrl_reg(d->hwirq);
577 u8 idx = sunxi_irq_ctrl_offset(d->hwirq); 623 u8 idx = sunxi_irq_ctrl_offset(d->hwirq);
624 unsigned long flags;
578 u32 val; 625 u32 val;
579 626
627 spin_lock_irqsave(&pctl->lock, flags);
628
580 /* Mask the IRQ */ 629 /* Mask the IRQ */
581 val = readl(pctl->membase + reg); 630 val = readl(pctl->membase + reg);
582 writel(val & ~(1 << idx), pctl->membase + reg); 631 writel(val & ~(1 << idx), pctl->membase + reg);
632
633 spin_unlock_irqrestore(&pctl->lock, flags);
583} 634}
584 635
585static void sunxi_pinctrl_irq_unmask(struct irq_data *d) 636static void sunxi_pinctrl_irq_unmask(struct irq_data *d)
@@ -588,6 +639,7 @@ static void sunxi_pinctrl_irq_unmask(struct irq_data *d)
588 struct sunxi_desc_function *func; 639 struct sunxi_desc_function *func;
589 u32 reg = sunxi_irq_ctrl_reg(d->hwirq); 640 u32 reg = sunxi_irq_ctrl_reg(d->hwirq);
590 u8 idx = sunxi_irq_ctrl_offset(d->hwirq); 641 u8 idx = sunxi_irq_ctrl_offset(d->hwirq);
642 unsigned long flags;
591 u32 val; 643 u32 val;
592 644
593 func = sunxi_pinctrl_desc_find_function_by_pin(pctl, 645 func = sunxi_pinctrl_desc_find_function_by_pin(pctl,
@@ -597,9 +649,13 @@ static void sunxi_pinctrl_irq_unmask(struct irq_data *d)
597 /* Change muxing to INT mode */ 649 /* Change muxing to INT mode */
598 sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval); 650 sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval);
599 651
652 spin_lock_irqsave(&pctl->lock, flags);
653
600 /* Unmask the IRQ */ 654 /* Unmask the IRQ */
601 val = readl(pctl->membase + reg); 655 val = readl(pctl->membase + reg);
602 writel(val | (1 << idx), pctl->membase + reg); 656 writel(val | (1 << idx), pctl->membase + reg);
657
658 spin_unlock_irqrestore(&pctl->lock, flags);
603} 659}
604 660
605static struct irq_chip sunxi_pinctrl_irq_chip = { 661static struct irq_chip sunxi_pinctrl_irq_chip = {
@@ -752,6 +808,8 @@ static int sunxi_pinctrl_probe(struct platform_device *pdev)
752 return -ENOMEM; 808 return -ENOMEM;
753 platform_set_drvdata(pdev, pctl); 809 platform_set_drvdata(pdev, pctl);
754 810
811 spin_lock_init(&pctl->lock);
812
755 pctl->membase = of_iomap(node, 0); 813 pctl->membase = of_iomap(node, 0);
756 if (!pctl->membase) 814 if (!pctl->membase)
757 return -ENOMEM; 815 return -ENOMEM;
diff --git a/drivers/pinctrl/pinctrl-sunxi.h b/drivers/pinctrl/pinctrl-sunxi.h
index d68047d8f699..01c494f8a14f 100644
--- a/drivers/pinctrl/pinctrl-sunxi.h
+++ b/drivers/pinctrl/pinctrl-sunxi.h
@@ -14,6 +14,7 @@
14#define __PINCTRL_SUNXI_H 14#define __PINCTRL_SUNXI_H
15 15
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/spinlock.h>
17 18
18#define PA_BASE 0 19#define PA_BASE 0
19#define PB_BASE 32 20#define PB_BASE 32
@@ -407,6 +408,7 @@ struct sunxi_pinctrl {
407 unsigned ngroups; 408 unsigned ngroups;
408 int irq; 409 int irq;
409 int irq_array[SUNXI_IRQ_NUMBER]; 410 int irq_array[SUNXI_IRQ_NUMBER];
411 spinlock_t lock;
410 struct pinctrl_dev *pctl_dev; 412 struct pinctrl_dev *pctl_dev;
411}; 413};
412 414
diff --git a/drivers/platform/olpc/olpc-ec.c b/drivers/platform/olpc/olpc-ec.c
index 0f9f8596b300..f9119525f557 100644
--- a/drivers/platform/olpc/olpc-ec.c
+++ b/drivers/platform/olpc/olpc-ec.c
@@ -330,7 +330,7 @@ static int __init olpc_ec_init_module(void)
330 return platform_driver_register(&olpc_ec_plat_driver); 330 return platform_driver_register(&olpc_ec_plat_driver);
331} 331}
332 332
333module_init(olpc_ec_init_module); 333arch_initcall(olpc_ec_init_module);
334 334
335MODULE_AUTHOR("Andres Salomon <dilinger@queued.net>"); 335MODULE_AUTHOR("Andres Salomon <dilinger@queued.net>");
336MODULE_LICENSE("GPL"); 336MODULE_LICENSE("GPL");
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c
index 97bb05edcb5a..d6970f47ae72 100644
--- a/drivers/platform/x86/hp-wmi.c
+++ b/drivers/platform/x86/hp-wmi.c
@@ -53,7 +53,6 @@ MODULE_ALIAS("wmi:5FB7F034-2C63-45e9-BE91-3D44E2C707E4");
53#define HPWMI_ALS_QUERY 0x3 53#define HPWMI_ALS_QUERY 0x3
54#define HPWMI_HARDWARE_QUERY 0x4 54#define HPWMI_HARDWARE_QUERY 0x4
55#define HPWMI_WIRELESS_QUERY 0x5 55#define HPWMI_WIRELESS_QUERY 0x5
56#define HPWMI_BIOS_QUERY 0x9
57#define HPWMI_HOTKEY_QUERY 0xc 56#define HPWMI_HOTKEY_QUERY 0xc
58#define HPWMI_WIRELESS2_QUERY 0x1b 57#define HPWMI_WIRELESS2_QUERY 0x1b
59#define HPWMI_POSTCODEERROR_QUERY 0x2a 58#define HPWMI_POSTCODEERROR_QUERY 0x2a
@@ -293,19 +292,6 @@ static int hp_wmi_tablet_state(void)
293 return (state & 0x4) ? 1 : 0; 292 return (state & 0x4) ? 1 : 0;
294} 293}
295 294
296static int hp_wmi_enable_hotkeys(void)
297{
298 int ret;
299 int query = 0x6e;
300
301 ret = hp_wmi_perform_query(HPWMI_BIOS_QUERY, 1, &query, sizeof(query),
302 0);
303
304 if (ret)
305 return -EINVAL;
306 return 0;
307}
308
309static int hp_wmi_set_block(void *data, bool blocked) 295static int hp_wmi_set_block(void *data, bool blocked)
310{ 296{
311 enum hp_wmi_radio r = (enum hp_wmi_radio) data; 297 enum hp_wmi_radio r = (enum hp_wmi_radio) data;
@@ -1009,8 +995,6 @@ static int __init hp_wmi_init(void)
1009 err = hp_wmi_input_setup(); 995 err = hp_wmi_input_setup();
1010 if (err) 996 if (err)
1011 return err; 997 return err;
1012
1013 hp_wmi_enable_hotkeys();
1014 } 998 }
1015 999
1016 if (bios_capable) { 1000 if (bios_capable) {
diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c
index 2ac045f27f10..3a1b6bf326a8 100644
--- a/drivers/platform/x86/sony-laptop.c
+++ b/drivers/platform/x86/sony-laptop.c
@@ -2440,7 +2440,10 @@ static ssize_t sony_nc_gfx_switch_status_show(struct device *dev,
2440 if (pos < 0) 2440 if (pos < 0)
2441 return pos; 2441 return pos;
2442 2442
2443 return snprintf(buffer, PAGE_SIZE, "%s\n", pos ? "speed" : "stamina"); 2443 return snprintf(buffer, PAGE_SIZE, "%s\n",
2444 pos == SPEED ? "speed" :
2445 pos == STAMINA ? "stamina" :
2446 pos == AUTO ? "auto" : "unknown");
2444} 2447}
2445 2448
2446static int sony_nc_gfx_switch_setup(struct platform_device *pd, 2449static int sony_nc_gfx_switch_setup(struct platform_device *pd,
@@ -4320,7 +4323,8 @@ static int sony_pic_add(struct acpi_device *device)
4320 goto err_free_resources; 4323 goto err_free_resources;
4321 } 4324 }
4322 4325
4323 if (sonypi_compat_init()) 4326 result = sonypi_compat_init();
4327 if (result)
4324 goto err_remove_input; 4328 goto err_remove_input;
4325 4329
4326 /* request io port */ 4330 /* request io port */
diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c
index f4f30af2df68..2e8a20cac588 100644
--- a/drivers/rapidio/rio.c
+++ b/drivers/rapidio/rio.c
@@ -1715,11 +1715,13 @@ int rio_unregister_scan(int mport_id, struct rio_scan *scan_ops)
1715 (mport_id == RIO_MPORT_ANY && port->nscan == scan_ops)) 1715 (mport_id == RIO_MPORT_ANY && port->nscan == scan_ops))
1716 port->nscan = NULL; 1716 port->nscan = NULL;
1717 1717
1718 list_for_each_entry(scan, &rio_scans, node) 1718 list_for_each_entry(scan, &rio_scans, node) {
1719 if (scan->mport_id == mport_id) { 1719 if (scan->mport_id == mport_id) {
1720 list_del(&scan->node); 1720 list_del(&scan->node);
1721 kfree(scan); 1721 kfree(scan);
1722 break;
1722 } 1723 }
1724 }
1723 1725
1724 mutex_unlock(&rio_mport_list_lock); 1726 mutex_unlock(&rio_mport_list_lock);
1725 1727
diff --git a/drivers/rtc/rtc-stmp3xxx.c b/drivers/rtc/rtc-stmp3xxx.c
index 767fee2ab340..26019531db15 100644
--- a/drivers/rtc/rtc-stmp3xxx.c
+++ b/drivers/rtc/rtc-stmp3xxx.c
@@ -23,6 +23,7 @@
23#include <linux/init.h> 23#include <linux/init.h>
24#include <linux/platform_device.h> 24#include <linux/platform_device.h>
25#include <linux/interrupt.h> 25#include <linux/interrupt.h>
26#include <linux/delay.h>
26#include <linux/rtc.h> 27#include <linux/rtc.h>
27#include <linux/slab.h> 28#include <linux/slab.h>
28#include <linux/of_device.h> 29#include <linux/of_device.h>
@@ -119,24 +120,39 @@ static void stmp3xxx_wdt_register(struct platform_device *rtc_pdev)
119} 120}
120#endif /* CONFIG_STMP3XXX_RTC_WATCHDOG */ 121#endif /* CONFIG_STMP3XXX_RTC_WATCHDOG */
121 122
122static void stmp3xxx_wait_time(struct stmp3xxx_rtc_data *rtc_data) 123static int stmp3xxx_wait_time(struct stmp3xxx_rtc_data *rtc_data)
123{ 124{
125 int timeout = 5000; /* 3ms according to i.MX28 Ref Manual */
124 /* 126 /*
125 * The datasheet doesn't say which way round the 127 * The i.MX28 Applications Processor Reference Manual, Rev. 1, 2010
126 * NEW_REGS/STALE_REGS bitfields go. In fact it's 0x1=P0, 128 * states:
127 * 0x2=P1, .., 0x20=P5, 0x40=ALARM, 0x80=SECONDS 129 * | The order in which registers are updated is
130 * | Persistent 0, 1, 2, 3, 4, 5, Alarm, Seconds.
131 * | (This list is in bitfield order, from LSB to MSB, as they would
132 * | appear in the STALE_REGS and NEW_REGS bitfields of the HW_RTC_STAT
133 * | register. For example, the Seconds register corresponds to
134 * | STALE_REGS or NEW_REGS containing 0x80.)
128 */ 135 */
129 while (readl(rtc_data->io + STMP3XXX_RTC_STAT) & 136 do {
130 (0x80 << STMP3XXX_RTC_STAT_STALE_SHIFT)) 137 if (!(readl(rtc_data->io + STMP3XXX_RTC_STAT) &
131 cpu_relax(); 138 (0x80 << STMP3XXX_RTC_STAT_STALE_SHIFT)))
139 return 0;
140 udelay(1);
141 } while (--timeout > 0);
142 return (readl(rtc_data->io + STMP3XXX_RTC_STAT) &
143 (0x80 << STMP3XXX_RTC_STAT_STALE_SHIFT)) ? -ETIME : 0;
132} 144}
133 145
134/* Time read/write */ 146/* Time read/write */
135static int stmp3xxx_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) 147static int stmp3xxx_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
136{ 148{
149 int ret;
137 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev); 150 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev);
138 151
139 stmp3xxx_wait_time(rtc_data); 152 ret = stmp3xxx_wait_time(rtc_data);
153 if (ret)
154 return ret;
155
140 rtc_time_to_tm(readl(rtc_data->io + STMP3XXX_RTC_SECONDS), rtc_tm); 156 rtc_time_to_tm(readl(rtc_data->io + STMP3XXX_RTC_SECONDS), rtc_tm);
141 return 0; 157 return 0;
142} 158}
@@ -146,8 +162,7 @@ static int stmp3xxx_rtc_set_mmss(struct device *dev, unsigned long t)
146 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev); 162 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev);
147 163
148 writel(t, rtc_data->io + STMP3XXX_RTC_SECONDS); 164 writel(t, rtc_data->io + STMP3XXX_RTC_SECONDS);
149 stmp3xxx_wait_time(rtc_data); 165 return stmp3xxx_wait_time(rtc_data);
150 return 0;
151} 166}
152 167
153/* interrupt(s) handler */ 168/* interrupt(s) handler */
diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c
index 02faf3c4e0d5..c2e80d7ca5e2 100644
--- a/drivers/rtc/rtc-twl.c
+++ b/drivers/rtc/rtc-twl.c
@@ -524,6 +524,8 @@ static int twl_rtc_probe(struct platform_device *pdev)
524 if (ret < 0) 524 if (ret < 0)
525 goto out1; 525 goto out1;
526 526
527 device_init_wakeup(&pdev->dev, 1);
528
527 rtc = rtc_device_register(pdev->name, 529 rtc = rtc_device_register(pdev->name,
528 &pdev->dev, &twl_rtc_ops, THIS_MODULE); 530 &pdev->dev, &twl_rtc_ops, THIS_MODULE);
529 if (IS_ERR(rtc)) { 531 if (IS_ERR(rtc)) {
@@ -542,7 +544,6 @@ static int twl_rtc_probe(struct platform_device *pdev)
542 } 544 }
543 545
544 platform_set_drvdata(pdev, rtc); 546 platform_set_drvdata(pdev, rtc);
545 device_init_wakeup(&pdev->dev, 1);
546 return 0; 547 return 0;
547 548
548out2: 549out2:
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index 17150a778984..451bf99582ff 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -2392,6 +2392,12 @@ int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr)
2392 rc = cqr->intrc; 2392 rc = cqr->intrc;
2393 else 2393 else
2394 rc = -EIO; 2394 rc = -EIO;
2395
2396 /* kick tasklets */
2397 dasd_schedule_device_bh(device);
2398 if (device->block)
2399 dasd_schedule_block_bh(device->block);
2400
2395 return rc; 2401 return rc;
2396} 2402}
2397 2403
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c
index 1d4c8fe72752..c82fe65c4128 100644
--- a/drivers/s390/scsi/zfcp_erp.c
+++ b/drivers/s390/scsi/zfcp_erp.c
@@ -102,10 +102,13 @@ static void zfcp_erp_action_dismiss_port(struct zfcp_port *port)
102 102
103 if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_INUSE) 103 if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_INUSE)
104 zfcp_erp_action_dismiss(&port->erp_action); 104 zfcp_erp_action_dismiss(&port->erp_action);
105 else 105 else {
106 shost_for_each_device(sdev, port->adapter->scsi_host) 106 spin_lock(port->adapter->scsi_host->host_lock);
107 __shost_for_each_device(sdev, port->adapter->scsi_host)
107 if (sdev_to_zfcp(sdev)->port == port) 108 if (sdev_to_zfcp(sdev)->port == port)
108 zfcp_erp_action_dismiss_lun(sdev); 109 zfcp_erp_action_dismiss_lun(sdev);
110 spin_unlock(port->adapter->scsi_host->host_lock);
111 }
109} 112}
110 113
111static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) 114static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter)
@@ -592,9 +595,11 @@ static void _zfcp_erp_lun_reopen_all(struct zfcp_port *port, int clear,
592{ 595{
593 struct scsi_device *sdev; 596 struct scsi_device *sdev;
594 597
595 shost_for_each_device(sdev, port->adapter->scsi_host) 598 spin_lock(port->adapter->scsi_host->host_lock);
599 __shost_for_each_device(sdev, port->adapter->scsi_host)
596 if (sdev_to_zfcp(sdev)->port == port) 600 if (sdev_to_zfcp(sdev)->port == port)
597 _zfcp_erp_lun_reopen(sdev, clear, id, 0); 601 _zfcp_erp_lun_reopen(sdev, clear, id, 0);
602 spin_unlock(port->adapter->scsi_host->host_lock);
598} 603}
599 604
600static void zfcp_erp_strategy_followup_failed(struct zfcp_erp_action *act) 605static void zfcp_erp_strategy_followup_failed(struct zfcp_erp_action *act)
@@ -1434,8 +1439,10 @@ void zfcp_erp_set_adapter_status(struct zfcp_adapter *adapter, u32 mask)
1434 atomic_set_mask(common_mask, &port->status); 1439 atomic_set_mask(common_mask, &port->status);
1435 read_unlock_irqrestore(&adapter->port_list_lock, flags); 1440 read_unlock_irqrestore(&adapter->port_list_lock, flags);
1436 1441
1437 shost_for_each_device(sdev, adapter->scsi_host) 1442 spin_lock_irqsave(adapter->scsi_host->host_lock, flags);
1443 __shost_for_each_device(sdev, adapter->scsi_host)
1438 atomic_set_mask(common_mask, &sdev_to_zfcp(sdev)->status); 1444 atomic_set_mask(common_mask, &sdev_to_zfcp(sdev)->status);
1445 spin_unlock_irqrestore(adapter->scsi_host->host_lock, flags);
1439} 1446}
1440 1447
1441/** 1448/**
@@ -1469,11 +1476,13 @@ void zfcp_erp_clear_adapter_status(struct zfcp_adapter *adapter, u32 mask)
1469 } 1476 }
1470 read_unlock_irqrestore(&adapter->port_list_lock, flags); 1477 read_unlock_irqrestore(&adapter->port_list_lock, flags);
1471 1478
1472 shost_for_each_device(sdev, adapter->scsi_host) { 1479 spin_lock_irqsave(adapter->scsi_host->host_lock, flags);
1480 __shost_for_each_device(sdev, adapter->scsi_host) {
1473 atomic_clear_mask(common_mask, &sdev_to_zfcp(sdev)->status); 1481 atomic_clear_mask(common_mask, &sdev_to_zfcp(sdev)->status);
1474 if (clear_counter) 1482 if (clear_counter)
1475 atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0); 1483 atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0);
1476 } 1484 }
1485 spin_unlock_irqrestore(adapter->scsi_host->host_lock, flags);
1477} 1486}
1478 1487
1479/** 1488/**
@@ -1487,16 +1496,19 @@ void zfcp_erp_set_port_status(struct zfcp_port *port, u32 mask)
1487{ 1496{
1488 struct scsi_device *sdev; 1497 struct scsi_device *sdev;
1489 u32 common_mask = mask & ZFCP_COMMON_FLAGS; 1498 u32 common_mask = mask & ZFCP_COMMON_FLAGS;
1499 unsigned long flags;
1490 1500
1491 atomic_set_mask(mask, &port->status); 1501 atomic_set_mask(mask, &port->status);
1492 1502
1493 if (!common_mask) 1503 if (!common_mask)
1494 return; 1504 return;
1495 1505
1496 shost_for_each_device(sdev, port->adapter->scsi_host) 1506 spin_lock_irqsave(port->adapter->scsi_host->host_lock, flags);
1507 __shost_for_each_device(sdev, port->adapter->scsi_host)
1497 if (sdev_to_zfcp(sdev)->port == port) 1508 if (sdev_to_zfcp(sdev)->port == port)
1498 atomic_set_mask(common_mask, 1509 atomic_set_mask(common_mask,
1499 &sdev_to_zfcp(sdev)->status); 1510 &sdev_to_zfcp(sdev)->status);
1511 spin_unlock_irqrestore(port->adapter->scsi_host->host_lock, flags);
1500} 1512}
1501 1513
1502/** 1514/**
@@ -1511,6 +1523,7 @@ void zfcp_erp_clear_port_status(struct zfcp_port *port, u32 mask)
1511 struct scsi_device *sdev; 1523 struct scsi_device *sdev;
1512 u32 common_mask = mask & ZFCP_COMMON_FLAGS; 1524 u32 common_mask = mask & ZFCP_COMMON_FLAGS;
1513 u32 clear_counter = mask & ZFCP_STATUS_COMMON_ERP_FAILED; 1525 u32 clear_counter = mask & ZFCP_STATUS_COMMON_ERP_FAILED;
1526 unsigned long flags;
1514 1527
1515 atomic_clear_mask(mask, &port->status); 1528 atomic_clear_mask(mask, &port->status);
1516 1529
@@ -1520,13 +1533,15 @@ void zfcp_erp_clear_port_status(struct zfcp_port *port, u32 mask)
1520 if (clear_counter) 1533 if (clear_counter)
1521 atomic_set(&port->erp_counter, 0); 1534 atomic_set(&port->erp_counter, 0);
1522 1535
1523 shost_for_each_device(sdev, port->adapter->scsi_host) 1536 spin_lock_irqsave(port->adapter->scsi_host->host_lock, flags);
1537 __shost_for_each_device(sdev, port->adapter->scsi_host)
1524 if (sdev_to_zfcp(sdev)->port == port) { 1538 if (sdev_to_zfcp(sdev)->port == port) {
1525 atomic_clear_mask(common_mask, 1539 atomic_clear_mask(common_mask,
1526 &sdev_to_zfcp(sdev)->status); 1540 &sdev_to_zfcp(sdev)->status);
1527 if (clear_counter) 1541 if (clear_counter)
1528 atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0); 1542 atomic_set(&sdev_to_zfcp(sdev)->erp_counter, 0);
1529 } 1543 }
1544 spin_unlock_irqrestore(port->adapter->scsi_host->host_lock, flags);
1530} 1545}
1531 1546
1532/** 1547/**
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c
index 665e3cfaaf85..de0598eaacd2 100644
--- a/drivers/s390/scsi/zfcp_qdio.c
+++ b/drivers/s390/scsi/zfcp_qdio.c
@@ -224,11 +224,9 @@ int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
224 224
225static int zfcp_qdio_sbal_check(struct zfcp_qdio *qdio) 225static int zfcp_qdio_sbal_check(struct zfcp_qdio *qdio)
226{ 226{
227 spin_lock_irq(&qdio->req_q_lock);
228 if (atomic_read(&qdio->req_q_free) || 227 if (atomic_read(&qdio->req_q_free) ||
229 !(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) 228 !(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP))
230 return 1; 229 return 1;
231 spin_unlock_irq(&qdio->req_q_lock);
232 return 0; 230 return 0;
233} 231}
234 232
@@ -246,9 +244,8 @@ int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio)
246{ 244{
247 long ret; 245 long ret;
248 246
249 spin_unlock_irq(&qdio->req_q_lock); 247 ret = wait_event_interruptible_lock_irq_timeout(qdio->req_q_wq,
250 ret = wait_event_interruptible_timeout(qdio->req_q_wq, 248 zfcp_qdio_sbal_check(qdio), qdio->req_q_lock, 5 * HZ);
251 zfcp_qdio_sbal_check(qdio), 5 * HZ);
252 249
253 if (!(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) 250 if (!(atomic_read(&qdio->adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP))
254 return -EIO; 251 return -EIO;
@@ -262,7 +259,6 @@ int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio)
262 zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1"); 259 zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1");
263 } 260 }
264 261
265 spin_lock_irq(&qdio->req_q_lock);
266 return -EIO; 262 return -EIO;
267} 263}
268 264
diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c
index 3f01bbf0609f..890639274bcf 100644
--- a/drivers/s390/scsi/zfcp_sysfs.c
+++ b/drivers/s390/scsi/zfcp_sysfs.c
@@ -27,6 +27,16 @@ static ssize_t zfcp_sysfs_##_feat##_##_name##_show(struct device *dev, \
27static ZFCP_DEV_ATTR(_feat, _name, S_IRUGO, \ 27static ZFCP_DEV_ATTR(_feat, _name, S_IRUGO, \
28 zfcp_sysfs_##_feat##_##_name##_show, NULL); 28 zfcp_sysfs_##_feat##_##_name##_show, NULL);
29 29
30#define ZFCP_DEFINE_ATTR_CONST(_feat, _name, _format, _value) \
31static ssize_t zfcp_sysfs_##_feat##_##_name##_show(struct device *dev, \
32 struct device_attribute *at,\
33 char *buf) \
34{ \
35 return sprintf(buf, _format, _value); \
36} \
37static ZFCP_DEV_ATTR(_feat, _name, S_IRUGO, \
38 zfcp_sysfs_##_feat##_##_name##_show, NULL);
39
30#define ZFCP_DEFINE_A_ATTR(_name, _format, _value) \ 40#define ZFCP_DEFINE_A_ATTR(_name, _format, _value) \
31static ssize_t zfcp_sysfs_adapter_##_name##_show(struct device *dev, \ 41static ssize_t zfcp_sysfs_adapter_##_name##_show(struct device *dev, \
32 struct device_attribute *at,\ 42 struct device_attribute *at,\
@@ -75,6 +85,8 @@ ZFCP_DEFINE_ATTR(zfcp_unit, unit, in_recovery, "%d\n",
75ZFCP_DEFINE_ATTR(zfcp_unit, unit, access_denied, "%d\n", 85ZFCP_DEFINE_ATTR(zfcp_unit, unit, access_denied, "%d\n",
76 (zfcp_unit_sdev_status(unit) & 86 (zfcp_unit_sdev_status(unit) &
77 ZFCP_STATUS_COMMON_ACCESS_DENIED) != 0); 87 ZFCP_STATUS_COMMON_ACCESS_DENIED) != 0);
88ZFCP_DEFINE_ATTR_CONST(unit, access_shared, "%d\n", 0);
89ZFCP_DEFINE_ATTR_CONST(unit, access_readonly, "%d\n", 0);
78 90
79static ssize_t zfcp_sysfs_port_failed_show(struct device *dev, 91static ssize_t zfcp_sysfs_port_failed_show(struct device *dev,
80 struct device_attribute *attr, 92 struct device_attribute *attr,
@@ -347,6 +359,8 @@ static struct attribute *zfcp_unit_attrs[] = {
347 &dev_attr_unit_in_recovery.attr, 359 &dev_attr_unit_in_recovery.attr,
348 &dev_attr_unit_status.attr, 360 &dev_attr_unit_status.attr,
349 &dev_attr_unit_access_denied.attr, 361 &dev_attr_unit_access_denied.attr,
362 &dev_attr_unit_access_shared.attr,
363 &dev_attr_unit_access_readonly.attr,
350 NULL 364 NULL
351}; 365};
352static struct attribute_group zfcp_unit_attr_group = { 366static struct attribute_group zfcp_unit_attr_group = {
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
index 48b2918e0d65..92ff027746f2 100644
--- a/drivers/scsi/Kconfig
+++ b/drivers/scsi/Kconfig
@@ -1353,7 +1353,6 @@ config SCSI_LPFC
1353 tristate "Emulex LightPulse Fibre Channel Support" 1353 tristate "Emulex LightPulse Fibre Channel Support"
1354 depends on PCI && SCSI 1354 depends on PCI && SCSI
1355 select SCSI_FC_ATTRS 1355 select SCSI_FC_ATTRS
1356 select GENERIC_CSUM
1357 select CRC_T10DIF 1356 select CRC_T10DIF
1358 help 1357 help
1359 This lpfc driver supports the Emulex LightPulse 1358 This lpfc driver supports the Emulex LightPulse
diff --git a/drivers/scsi/fnic/fnic.h b/drivers/scsi/fnic/fnic.h
index b6d1f92ed33c..c18c68150e9f 100644
--- a/drivers/scsi/fnic/fnic.h
+++ b/drivers/scsi/fnic/fnic.h
@@ -38,7 +38,7 @@
38 38
39#define DRV_NAME "fnic" 39#define DRV_NAME "fnic"
40#define DRV_DESCRIPTION "Cisco FCoE HBA Driver" 40#define DRV_DESCRIPTION "Cisco FCoE HBA Driver"
41#define DRV_VERSION "1.5.0.22" 41#define DRV_VERSION "1.5.0.23"
42#define PFX DRV_NAME ": " 42#define PFX DRV_NAME ": "
43#define DFX DRV_NAME "%d: " 43#define DFX DRV_NAME "%d: "
44 44
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c
index 5f09d1814d26..42e15ee6e1bb 100644
--- a/drivers/scsi/fnic/fnic_main.c
+++ b/drivers/scsi/fnic/fnic_main.c
@@ -642,19 +642,6 @@ static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
642 INIT_WORK(&fnic->fip_frame_work, fnic_handle_fip_frame); 642 INIT_WORK(&fnic->fip_frame_work, fnic_handle_fip_frame);
643 INIT_WORK(&fnic->event_work, fnic_handle_event); 643 INIT_WORK(&fnic->event_work, fnic_handle_event);
644 skb_queue_head_init(&fnic->fip_frame_queue); 644 skb_queue_head_init(&fnic->fip_frame_queue);
645 spin_lock_irqsave(&fnic_list_lock, flags);
646 if (!fnic_fip_queue) {
647 fnic_fip_queue =
648 create_singlethread_workqueue("fnic_fip_q");
649 if (!fnic_fip_queue) {
650 spin_unlock_irqrestore(&fnic_list_lock, flags);
651 printk(KERN_ERR PFX "fnic FIP work queue "
652 "create failed\n");
653 err = -ENOMEM;
654 goto err_out_free_max_pool;
655 }
656 }
657 spin_unlock_irqrestore(&fnic_list_lock, flags);
658 INIT_LIST_HEAD(&fnic->evlist); 645 INIT_LIST_HEAD(&fnic->evlist);
659 INIT_LIST_HEAD(&fnic->vlans); 646 INIT_LIST_HEAD(&fnic->vlans);
660 } else { 647 } else {
@@ -960,6 +947,13 @@ static int __init fnic_init_module(void)
960 spin_lock_init(&fnic_list_lock); 947 spin_lock_init(&fnic_list_lock);
961 INIT_LIST_HEAD(&fnic_list); 948 INIT_LIST_HEAD(&fnic_list);
962 949
950 fnic_fip_queue = create_singlethread_workqueue("fnic_fip_q");
951 if (!fnic_fip_queue) {
952 printk(KERN_ERR PFX "fnic FIP work queue create failed\n");
953 err = -ENOMEM;
954 goto err_create_fip_workq;
955 }
956
963 fnic_fc_transport = fc_attach_transport(&fnic_fc_functions); 957 fnic_fc_transport = fc_attach_transport(&fnic_fc_functions);
964 if (!fnic_fc_transport) { 958 if (!fnic_fc_transport) {
965 printk(KERN_ERR PFX "fc_attach_transport error\n"); 959 printk(KERN_ERR PFX "fc_attach_transport error\n");
@@ -978,6 +972,8 @@ static int __init fnic_init_module(void)
978err_pci_register: 972err_pci_register:
979 fc_release_transport(fnic_fc_transport); 973 fc_release_transport(fnic_fc_transport);
980err_fc_transport: 974err_fc_transport:
975 destroy_workqueue(fnic_fip_queue);
976err_create_fip_workq:
981 destroy_workqueue(fnic_event_queue); 977 destroy_workqueue(fnic_event_queue);
982err_create_fnic_workq: 978err_create_fnic_workq:
983 kmem_cache_destroy(fnic_io_req_cache); 979 kmem_cache_destroy(fnic_io_req_cache);
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index 0177295599e0..1f0ca68409d4 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -3547,11 +3547,21 @@ static int megasas_init_fw(struct megasas_instance *instance)
3547 break; 3547 break;
3548 } 3548 }
3549 3549
3550 /* 3550 if (megasas_transition_to_ready(instance, 0)) {
3551 * We expect the FW state to be READY 3551 atomic_set(&instance->fw_reset_no_pci_access, 1);
3552 */ 3552 instance->instancet->adp_reset
3553 if (megasas_transition_to_ready(instance, 0)) 3553 (instance, instance->reg_set);
3554 goto fail_ready_state; 3554 atomic_set(&instance->fw_reset_no_pci_access, 0);
3555 dev_info(&instance->pdev->dev,
3556 "megasas: FW restarted successfully from %s!\n",
3557 __func__);
3558
3559 /*waitting for about 30 second before retry*/
3560 ssleep(30);
3561
3562 if (megasas_transition_to_ready(instance, 0))
3563 goto fail_ready_state;
3564 }
3555 3565
3556 /* 3566 /*
3557 * MSI-X host index 0 is common for all adapter. 3567 * MSI-X host index 0 is common for all adapter.
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 3b1ea34e1f5a..eaa808e6ba91 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -1031,6 +1031,9 @@ int scsi_get_vpd_page(struct scsi_device *sdev, u8 page, unsigned char *buf,
1031{ 1031{
1032 int i, result; 1032 int i, result;
1033 1033
1034 if (sdev->skip_vpd_pages)
1035 goto fail;
1036
1034 /* Ask for all the pages supported by this device */ 1037 /* Ask for all the pages supported by this device */
1035 result = scsi_vpd_inquiry(sdev, buf, 0, buf_len); 1038 result = scsi_vpd_inquiry(sdev, buf, 0, buf_len);
1036 if (result) 1039 if (result)
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 2168258fb2c3..74b88efde6ad 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -751,7 +751,7 @@ static void __virtscsi_set_affinity(struct virtio_scsi *vscsi, bool affinity)
751 751
752 vscsi->affinity_hint_set = true; 752 vscsi->affinity_hint_set = true;
753 } else { 753 } else {
754 for (i = 0; i < vscsi->num_queues - VIRTIO_SCSI_VQ_BASE; i++) 754 for (i = 0; i < vscsi->num_queues; i++)
755 virtqueue_set_affinity(vscsi->req_vqs[i].vq, -1); 755 virtqueue_set_affinity(vscsi->req_vqs[i].vq, -1);
756 756
757 vscsi->affinity_hint_set = false; 757 vscsi->affinity_hint_set = false;
diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c
index 222d3e37fc28..707966bd5610 100644
--- a/drivers/spi/spi-davinci.c
+++ b/drivers/spi/spi-davinci.c
@@ -609,7 +609,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
609 else 609 else
610 buf = (void *)t->tx_buf; 610 buf = (void *)t->tx_buf;
611 t->tx_dma = dma_map_single(&spi->dev, buf, 611 t->tx_dma = dma_map_single(&spi->dev, buf,
612 t->len, DMA_FROM_DEVICE); 612 t->len, DMA_TO_DEVICE);
613 if (!t->tx_dma) { 613 if (!t->tx_dma) {
614 ret = -EFAULT; 614 ret = -EFAULT;
615 goto err_tx_map; 615 goto err_tx_map;
diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c
index e25eba5713c1..b3b5125faa72 100644
--- a/drivers/staging/comedi/drivers.c
+++ b/drivers/staging/comedi/drivers.c
@@ -482,7 +482,7 @@ int comedi_device_attach(struct comedi_device *dev, struct comedi_devconfig *it)
482 ret = comedi_device_postconfig(dev); 482 ret = comedi_device_postconfig(dev);
483 if (ret < 0) { 483 if (ret < 0) {
484 comedi_device_detach(dev); 484 comedi_device_detach(dev);
485 module_put(dev->driver->module); 485 module_put(driv->module);
486 } 486 }
487 /* On success, the driver module count has been incremented. */ 487 /* On success, the driver module count has been incremented. */
488 return ret; 488 return ret;
diff --git a/drivers/staging/zcache/zcache-main.c b/drivers/staging/zcache/zcache-main.c
index dcceed29d31a..81972fa47beb 100644
--- a/drivers/staging/zcache/zcache-main.c
+++ b/drivers/staging/zcache/zcache-main.c
@@ -1811,10 +1811,12 @@ static int zcache_comp_init(void)
1811#else 1811#else
1812 if (*zcache_comp_name != '\0') { 1812 if (*zcache_comp_name != '\0') {
1813 ret = crypto_has_comp(zcache_comp_name, 0, 0); 1813 ret = crypto_has_comp(zcache_comp_name, 0, 0);
1814 if (!ret) 1814 if (!ret) {
1815 pr_info("zcache: %s not supported\n", 1815 pr_info("zcache: %s not supported\n",
1816 zcache_comp_name); 1816 zcache_comp_name);
1817 goto out; 1817 ret = 1;
1818 goto out;
1819 }
1818 } 1820 }
1819 if (!ret) 1821 if (!ret)
1820 strcpy(zcache_comp_name, "lzo"); 1822 strcpy(zcache_comp_name, "lzo");
diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c
index bb91b4713ebd..2e3ea1a70d7b 100644
--- a/drivers/tty/serial/8250/8250_gsc.c
+++ b/drivers/tty/serial/8250/8250_gsc.c
@@ -31,9 +31,8 @@ static int __init serial_init_chip(struct parisc_device *dev)
31 int err; 31 int err;
32 32
33#ifdef CONFIG_64BIT 33#ifdef CONFIG_64BIT
34 extern int iosapic_serial_irq(int cellnum);
35 if (!dev->irq && (dev->id.sversion == 0xad)) 34 if (!dev->irq && (dev->id.sversion == 0xad))
36 dev->irq = iosapic_serial_irq(dev->mod_index-1); 35 dev->irq = iosapic_serial_irq(dev);
37#endif 36#endif
38 37
39 if (!dev->irq) { 38 if (!dev->irq) {
diff --git a/drivers/tty/serial/arc_uart.c b/drivers/tty/serial/arc_uart.c
index cbf1d155b7b2..22f280aa4f2c 100644
--- a/drivers/tty/serial/arc_uart.c
+++ b/drivers/tty/serial/arc_uart.c
@@ -773,6 +773,6 @@ module_init(arc_serial_init);
773module_exit(arc_serial_exit); 773module_exit(arc_serial_exit);
774 774
775MODULE_LICENSE("GPL"); 775MODULE_LICENSE("GPL");
776MODULE_ALIAS("plat-arcfpga/uart"); 776MODULE_ALIAS("platform:" DRIVER_NAME);
777MODULE_AUTHOR("Vineet Gupta"); 777MODULE_AUTHOR("Vineet Gupta");
778MODULE_DESCRIPTION("ARC(Synopsys) On-Chip(fpga) serial driver"); 778MODULE_DESCRIPTION("ARC(Synopsys) On-Chip(fpga) serial driver");
diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
index 4f5f161896a1..f85b8e6d0346 100644
--- a/drivers/tty/serial/mxs-auart.c
+++ b/drivers/tty/serial/mxs-auart.c
@@ -678,11 +678,18 @@ static void mxs_auart_settermios(struct uart_port *u,
678 678
679static irqreturn_t mxs_auart_irq_handle(int irq, void *context) 679static irqreturn_t mxs_auart_irq_handle(int irq, void *context)
680{ 680{
681 u32 istatus, istat; 681 u32 istat;
682 struct mxs_auart_port *s = context; 682 struct mxs_auart_port *s = context;
683 u32 stat = readl(s->port.membase + AUART_STAT); 683 u32 stat = readl(s->port.membase + AUART_STAT);
684 684
685 istatus = istat = readl(s->port.membase + AUART_INTR); 685 istat = readl(s->port.membase + AUART_INTR);
686
687 /* ack irq */
688 writel(istat & (AUART_INTR_RTIS
689 | AUART_INTR_TXIS
690 | AUART_INTR_RXIS
691 | AUART_INTR_CTSMIS),
692 s->port.membase + AUART_INTR_CLR);
686 693
687 if (istat & AUART_INTR_CTSMIS) { 694 if (istat & AUART_INTR_CTSMIS) {
688 uart_handle_cts_change(&s->port, stat & AUART_STAT_CTS); 695 uart_handle_cts_change(&s->port, stat & AUART_STAT_CTS);
@@ -702,12 +709,6 @@ static irqreturn_t mxs_auart_irq_handle(int irq, void *context)
702 istat &= ~AUART_INTR_TXIS; 709 istat &= ~AUART_INTR_TXIS;
703 } 710 }
704 711
705 writel(istatus & (AUART_INTR_RTIS
706 | AUART_INTR_TXIS
707 | AUART_INTR_RXIS
708 | AUART_INTR_CTSMIS),
709 s->port.membase + AUART_INTR_CLR);
710
711 return IRQ_HANDLED; 712 return IRQ_HANDLED;
712} 713}
713 714
@@ -850,7 +851,7 @@ auart_console_write(struct console *co, const char *str, unsigned int count)
850 struct mxs_auart_port *s; 851 struct mxs_auart_port *s;
851 struct uart_port *port; 852 struct uart_port *port;
852 unsigned int old_ctrl0, old_ctrl2; 853 unsigned int old_ctrl0, old_ctrl2;
853 unsigned int to = 1000; 854 unsigned int to = 20000;
854 855
855 if (co->index >= MXS_AUART_PORTS || co->index < 0) 856 if (co->index >= MXS_AUART_PORTS || co->index < 0)
856 return; 857 return;
@@ -871,18 +872,23 @@ auart_console_write(struct console *co, const char *str, unsigned int count)
871 872
872 uart_console_write(port, str, count, mxs_auart_console_putchar); 873 uart_console_write(port, str, count, mxs_auart_console_putchar);
873 874
874 /* 875 /* Finally, wait for transmitter to become empty ... */
875 * Finally, wait for transmitter to become empty
876 * and restore the TCR
877 */
878 while (readl(port->membase + AUART_STAT) & AUART_STAT_BUSY) { 876 while (readl(port->membase + AUART_STAT) & AUART_STAT_BUSY) {
877 udelay(1);
879 if (!to--) 878 if (!to--)
880 break; 879 break;
881 udelay(1);
882 } 880 }
883 881
884 writel(old_ctrl0, port->membase + AUART_CTRL0); 882 /*
885 writel(old_ctrl2, port->membase + AUART_CTRL2); 883 * ... and restore the TCR if we waited long enough for the transmitter
884 * to be idle. This might keep the transmitter enabled although it is
885 * unused, but that is better than to disable it while it is still
886 * transmitting.
887 */
888 if (!(readl(port->membase + AUART_STAT) & AUART_STAT_BUSY)) {
889 writel(old_ctrl0, port->membase + AUART_CTRL0);
890 writel(old_ctrl2, port->membase + AUART_CTRL2);
891 }
886 892
887 clk_disable(s->clk); 893 clk_disable(s->clk);
888} 894}
diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c
index 121aeb9393e1..f597e88a705d 100644
--- a/drivers/tty/tty_port.c
+++ b/drivers/tty/tty_port.c
@@ -256,10 +256,9 @@ void tty_port_tty_hangup(struct tty_port *port, bool check_clocal)
256{ 256{
257 struct tty_struct *tty = tty_port_tty_get(port); 257 struct tty_struct *tty = tty_port_tty_get(port);
258 258
259 if (tty && (!check_clocal || !C_CLOCAL(tty))) { 259 if (tty && (!check_clocal || !C_CLOCAL(tty)))
260 tty_hangup(tty); 260 tty_hangup(tty);
261 tty_kref_put(tty); 261 tty_kref_put(tty);
262 }
263} 262}
264EXPORT_SYMBOL_GPL(tty_port_tty_hangup); 263EXPORT_SYMBOL_GPL(tty_port_tty_hangup);
265 264
diff --git a/drivers/usb/chipidea/Kconfig b/drivers/usb/chipidea/Kconfig
index eb2aa2e5a842..d1bd8ef1f9c1 100644
--- a/drivers/usb/chipidea/Kconfig
+++ b/drivers/usb/chipidea/Kconfig
@@ -12,7 +12,7 @@ if USB_CHIPIDEA
12 12
13config USB_CHIPIDEA_UDC 13config USB_CHIPIDEA_UDC
14 bool "ChipIdea device controller" 14 bool "ChipIdea device controller"
15 depends on USB_GADGET=y || USB_CHIPIDEA=m 15 depends on USB_GADGET=y || (USB_CHIPIDEA=m && USB_GADGET=m)
16 help 16 help
17 Say Y here to enable device controller functionality of the 17 Say Y here to enable device controller functionality of the
18 ChipIdea driver. 18 ChipIdea driver.
@@ -20,7 +20,7 @@ config USB_CHIPIDEA_UDC
20config USB_CHIPIDEA_HOST 20config USB_CHIPIDEA_HOST
21 bool "ChipIdea host controller" 21 bool "ChipIdea host controller"
22 depends on USB=y 22 depends on USB=y
23 depends on USB_EHCI_HCD=y || USB_CHIPIDEA=m 23 depends on USB_EHCI_HCD=y || (USB_CHIPIDEA=m && USB_EHCI_HCD=m)
24 select USB_EHCI_ROOT_HUB_TT 24 select USB_EHCI_ROOT_HUB_TT
25 help 25 help
26 Say Y here to enable host controller functionality of the 26 Say Y here to enable host controller functionality of the
diff --git a/drivers/usb/chipidea/bits.h b/drivers/usb/chipidea/bits.h
index aefa0261220c..1b23e354f9fb 100644
--- a/drivers/usb/chipidea/bits.h
+++ b/drivers/usb/chipidea/bits.h
@@ -50,7 +50,7 @@
50#define PORTSC_PTC (0x0FUL << 16) 50#define PORTSC_PTC (0x0FUL << 16)
51/* PTS and PTW for non lpm version only */ 51/* PTS and PTW for non lpm version only */
52#define PORTSC_PTS(d) \ 52#define PORTSC_PTS(d) \
53 ((((d) & 0x3) << 30) | (((d) & 0x4) ? BIT(25) : 0)) 53 (u32)((((d) & 0x3) << 30) | (((d) & 0x4) ? BIT(25) : 0))
54#define PORTSC_PTW BIT(28) 54#define PORTSC_PTW BIT(28)
55#define PORTSC_STS BIT(29) 55#define PORTSC_STS BIT(29)
56 56
@@ -59,7 +59,7 @@
59#define DEVLC_PSPD_HS (0x02UL << 25) 59#define DEVLC_PSPD_HS (0x02UL << 25)
60#define DEVLC_PTW BIT(27) 60#define DEVLC_PTW BIT(27)
61#define DEVLC_STS BIT(28) 61#define DEVLC_STS BIT(28)
62#define DEVLC_PTS(d) (((d) & 0x7) << 29) 62#define DEVLC_PTS(d) (u32)(((d) & 0x7) << 29)
63 63
64/* Encoding for DEVLC_PTS and PORTSC_PTS */ 64/* Encoding for DEVLC_PTS and PORTSC_PTS */
65#define PTS_UTMI 0 65#define PTS_UTMI 0
diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c
index 609dbc2f7151..83b4ef4dfcf8 100644
--- a/drivers/usb/class/usbtmc.c
+++ b/drivers/usb/class/usbtmc.c
@@ -1119,11 +1119,11 @@ static int usbtmc_probe(struct usb_interface *intf,
1119 /* Determine if it is a Rigol or not */ 1119 /* Determine if it is a Rigol or not */
1120 data->rigol_quirk = 0; 1120 data->rigol_quirk = 0;
1121 dev_dbg(&intf->dev, "Trying to find if device Vendor 0x%04X Product 0x%04X has the RIGOL quirk\n", 1121 dev_dbg(&intf->dev, "Trying to find if device Vendor 0x%04X Product 0x%04X has the RIGOL quirk\n",
1122 data->usb_dev->descriptor.idVendor, 1122 le16_to_cpu(data->usb_dev->descriptor.idVendor),
1123 data->usb_dev->descriptor.idProduct); 1123 le16_to_cpu(data->usb_dev->descriptor.idProduct));
1124 for(n = 0; usbtmc_id_quirk[n].idVendor > 0; n++) { 1124 for(n = 0; usbtmc_id_quirk[n].idVendor > 0; n++) {
1125 if ((usbtmc_id_quirk[n].idVendor == data->usb_dev->descriptor.idVendor) && 1125 if ((usbtmc_id_quirk[n].idVendor == le16_to_cpu(data->usb_dev->descriptor.idVendor)) &&
1126 (usbtmc_id_quirk[n].idProduct == data->usb_dev->descriptor.idProduct)) { 1126 (usbtmc_id_quirk[n].idProduct == le16_to_cpu(data->usb_dev->descriptor.idProduct))) {
1127 dev_dbg(&intf->dev, "Setting this device as having the RIGOL quirk\n"); 1127 dev_dbg(&intf->dev, "Setting this device as having the RIGOL quirk\n");
1128 data->rigol_quirk = 1; 1128 data->rigol_quirk = 1;
1129 break; 1129 break;
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 4a8a1d68002c..558313de4911 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -4798,7 +4798,8 @@ static void hub_events(void)
4798 hub->ports[i - 1]->child; 4798 hub->ports[i - 1]->child;
4799 4799
4800 dev_dbg(hub_dev, "warm reset port %d\n", i); 4800 dev_dbg(hub_dev, "warm reset port %d\n", i);
4801 if (!udev) { 4801 if (!udev || !(portstatus &
4802 USB_PORT_STAT_CONNECTION)) {
4802 status = hub_port_reset(hub, i, 4803 status = hub_port_reset(hub, i,
4803 NULL, HUB_BH_RESET_TIME, 4804 NULL, HUB_BH_RESET_TIME,
4804 true); 4805 true);
@@ -4808,8 +4809,8 @@ static void hub_events(void)
4808 usb_lock_device(udev); 4809 usb_lock_device(udev);
4809 status = usb_reset_device(udev); 4810 status = usb_reset_device(udev);
4810 usb_unlock_device(udev); 4811 usb_unlock_device(udev);
4812 connect_change = 0;
4811 } 4813 }
4812 connect_change = 0;
4813 } 4814 }
4814 4815
4815 if (connect_change) 4816 if (connect_change)
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
index a63598895077..5b44cd47da5b 100644
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -78,6 +78,12 @@ static const struct usb_device_id usb_quirk_list[] = {
78 { USB_DEVICE(0x04d8, 0x000c), .driver_info = 78 { USB_DEVICE(0x04d8, 0x000c), .driver_info =
79 USB_QUIRK_CONFIG_INTF_STRINGS }, 79 USB_QUIRK_CONFIG_INTF_STRINGS },
80 80
81 /* CarrolTouch 4000U */
82 { USB_DEVICE(0x04e7, 0x0009), .driver_info = USB_QUIRK_RESET_RESUME },
83
84 /* CarrolTouch 4500U */
85 { USB_DEVICE(0x04e7, 0x0030), .driver_info = USB_QUIRK_RESET_RESUME },
86
81 /* Samsung Android phone modem - ID conflict with SPH-I500 */ 87 /* Samsung Android phone modem - ID conflict with SPH-I500 */
82 { USB_DEVICE(0x04e8, 0x6601), .driver_info = 88 { USB_DEVICE(0x04e8, 0x6601), .driver_info =
83 USB_QUIRK_CONFIG_INTF_STRINGS }, 89 USB_QUIRK_CONFIG_INTF_STRINGS },
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index f48712ffe261..c1c113ef950c 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -449,14 +449,20 @@ fail:
449 449
450static int __exit eth_unbind(struct usb_composite_dev *cdev) 450static int __exit eth_unbind(struct usb_composite_dev *cdev)
451{ 451{
452 if (has_rndis()) 452 if (has_rndis()) {
453 usb_put_function(f_rndis);
453 usb_put_function_instance(fi_rndis); 454 usb_put_function_instance(fi_rndis);
454 if (use_eem) 455 }
456 if (use_eem) {
457 usb_put_function(f_eem);
455 usb_put_function_instance(fi_eem); 458 usb_put_function_instance(fi_eem);
456 else if (can_support_ecm(cdev->gadget)) 459 } else if (can_support_ecm(cdev->gadget)) {
460 usb_put_function(f_ecm);
457 usb_put_function_instance(fi_ecm); 461 usb_put_function_instance(fi_ecm);
458 else 462 } else {
463 usb_put_function(f_geth);
459 usb_put_function_instance(fi_geth); 464 usb_put_function_instance(fi_geth);
465 }
460 return 0; 466 return 0;
461} 467}
462 468
diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c
index 1bf26e9f38cd..eb3aa817a662 100644
--- a/drivers/usb/gadget/f_phonet.c
+++ b/drivers/usb/gadget/f_phonet.c
@@ -488,7 +488,6 @@ static int pn_bind(struct usb_configuration *c, struct usb_function *f)
488 struct usb_ep *ep; 488 struct usb_ep *ep;
489 int status, i; 489 int status, i;
490 490
491#ifndef USBF_PHONET_INCLUDED
492 struct f_phonet_opts *phonet_opts; 491 struct f_phonet_opts *phonet_opts;
493 492
494 phonet_opts = container_of(f->fi, struct f_phonet_opts, func_inst); 493 phonet_opts = container_of(f->fi, struct f_phonet_opts, func_inst);
@@ -507,7 +506,6 @@ static int pn_bind(struct usb_configuration *c, struct usb_function *f)
507 return status; 506 return status;
508 phonet_opts->bound = true; 507 phonet_opts->bound = true;
509 } 508 }
510#endif
511 509
512 /* Reserve interface IDs */ 510 /* Reserve interface IDs */
513 status = usb_interface_id(c, f); 511 status = usb_interface_id(c, f);
diff --git a/drivers/usb/gadget/multi.c b/drivers/usb/gadget/multi.c
index 032b96a51ce4..2a1ebefd8f9e 100644
--- a/drivers/usb/gadget/multi.c
+++ b/drivers/usb/gadget/multi.c
@@ -160,10 +160,8 @@ static __init int rndis_do_config(struct usb_configuration *c)
160 return ret; 160 return ret;
161 161
162 f_acm_rndis = usb_get_function(fi_acm); 162 f_acm_rndis = usb_get_function(fi_acm);
163 if (IS_ERR(f_acm_rndis)) { 163 if (IS_ERR(f_acm_rndis))
164 ret = PTR_ERR(f_acm_rndis); 164 return PTR_ERR(f_acm_rndis);
165 goto err_func_acm;
166 }
167 165
168 ret = usb_add_function(c, f_acm_rndis); 166 ret = usb_add_function(c, f_acm_rndis);
169 if (ret) 167 if (ret)
@@ -178,7 +176,6 @@ err_fsg:
178 usb_remove_function(c, f_acm_rndis); 176 usb_remove_function(c, f_acm_rndis);
179err_conf: 177err_conf:
180 usb_put_function(f_acm_rndis); 178 usb_put_function(f_acm_rndis);
181err_func_acm:
182 return ret; 179 return ret;
183} 180}
184 181
@@ -226,7 +223,7 @@ static __init int cdc_do_config(struct usb_configuration *c)
226 /* implicit port_num is zero */ 223 /* implicit port_num is zero */
227 f_acm_multi = usb_get_function(fi_acm); 224 f_acm_multi = usb_get_function(fi_acm);
228 if (IS_ERR(f_acm_multi)) 225 if (IS_ERR(f_acm_multi))
229 goto err_func_acm; 226 return PTR_ERR(f_acm_multi);
230 227
231 ret = usb_add_function(c, f_acm_multi); 228 ret = usb_add_function(c, f_acm_multi);
232 if (ret) 229 if (ret)
@@ -241,7 +238,6 @@ err_fsg:
241 usb_remove_function(c, f_acm_multi); 238 usb_remove_function(c, f_acm_multi);
242err_conf: 239err_conf:
243 usb_put_function(f_acm_multi); 240 usb_put_function(f_acm_multi);
244err_func_acm:
245 return ret; 241 return ret;
246} 242}
247 243
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c
index c28ac9872030..13e25f80fc20 100644
--- a/drivers/usb/gadget/udc-core.c
+++ b/drivers/usb/gadget/udc-core.c
@@ -109,7 +109,7 @@ void usb_gadget_set_state(struct usb_gadget *gadget,
109 enum usb_device_state state) 109 enum usb_device_state state)
110{ 110{
111 gadget->state = state; 111 gadget->state = state;
112 sysfs_notify(&gadget->dev.kobj, NULL, "status"); 112 sysfs_notify(&gadget->dev.kobj, NULL, "state");
113} 113}
114EXPORT_SYMBOL_GPL(usb_gadget_set_state); 114EXPORT_SYMBOL_GPL(usb_gadget_set_state);
115 115
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
index f80d0330d548..8e3c878f38cf 100644
--- a/drivers/usb/host/ehci-sched.c
+++ b/drivers/usb/host/ehci-sched.c
@@ -1391,21 +1391,20 @@ iso_stream_schedule (
1391 1391
1392 /* Behind the scheduling threshold? */ 1392 /* Behind the scheduling threshold? */
1393 if (unlikely(start < next)) { 1393 if (unlikely(start < next)) {
1394 unsigned now2 = (now - base) & (mod - 1);
1394 1395
1395 /* USB_ISO_ASAP: Round up to the first available slot */ 1396 /* USB_ISO_ASAP: Round up to the first available slot */
1396 if (urb->transfer_flags & URB_ISO_ASAP) 1397 if (urb->transfer_flags & URB_ISO_ASAP)
1397 start += (next - start + period - 1) & -period; 1398 start += (next - start + period - 1) & -period;
1398 1399
1399 /* 1400 /*
1400 * Not ASAP: Use the next slot in the stream. If 1401 * Not ASAP: Use the next slot in the stream,
1401 * the entire URB falls before the threshold, fail. 1402 * no matter what.
1402 */ 1403 */
1403 else if (start + span - period < next) { 1404 else if (start + span - period < now2) {
1404 ehci_dbg(ehci, "iso urb late %p (%u+%u < %u)\n", 1405 ehci_dbg(ehci, "iso underrun %p (%u+%u < %u)\n",
1405 urb, start + base, 1406 urb, start + base,
1406 span - period, next + base); 1407 span - period, now2 + base);
1407 status = -EXDEV;
1408 goto fail;
1409 } 1408 }
1410 } 1409 }
1411 1410
diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c
index 08613e241894..0f1d193fef02 100644
--- a/drivers/usb/host/ohci-pci.c
+++ b/drivers/usb/host/ohci-pci.c
@@ -304,6 +304,11 @@ static int __init ohci_pci_init(void)
304 pr_info("%s: " DRIVER_DESC "\n", hcd_name); 304 pr_info("%s: " DRIVER_DESC "\n", hcd_name);
305 305
306 ohci_init_driver(&ohci_pci_hc_driver, &pci_overrides); 306 ohci_init_driver(&ohci_pci_hc_driver, &pci_overrides);
307
308 /* Entries for the PCI suspend/resume callbacks are special */
309 ohci_pci_hc_driver.pci_suspend = ohci_suspend;
310 ohci_pci_hc_driver.pci_resume = ohci_resume;
311
307 return pci_register_driver(&ohci_pci_driver); 312 return pci_register_driver(&ohci_pci_driver);
308} 313}
309module_init(ohci_pci_init); 314module_init(ohci_pci_init);
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index df6978abd7e6..6f8c2fd47675 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -24,6 +24,7 @@
24#include <linux/pci.h> 24#include <linux/pci.h>
25#include <linux/slab.h> 25#include <linux/slab.h>
26#include <linux/dmapool.h> 26#include <linux/dmapool.h>
27#include <linux/dma-mapping.h>
27 28
28#include "xhci.h" 29#include "xhci.h"
29 30
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index 41eb4fc33453..9478caa2f71f 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -27,6 +27,7 @@
27#include <linux/moduleparam.h> 27#include <linux/moduleparam.h>
28#include <linux/slab.h> 28#include <linux/slab.h>
29#include <linux/dmi.h> 29#include <linux/dmi.h>
30#include <linux/dma-mapping.h>
30 31
31#include "xhci.h" 32#include "xhci.h"
32 33
diff --git a/drivers/usb/misc/adutux.c b/drivers/usb/misc/adutux.c
index eb3c8c142fa9..eeb27208c0d1 100644
--- a/drivers/usb/misc/adutux.c
+++ b/drivers/usb/misc/adutux.c
@@ -830,7 +830,7 @@ static int adu_probe(struct usb_interface *interface,
830 830
831 /* let the user know what node this device is now attached to */ 831 /* let the user know what node this device is now attached to */
832 dev_info(&interface->dev, "ADU%d %s now attached to /dev/usb/adutux%d\n", 832 dev_info(&interface->dev, "ADU%d %s now attached to /dev/usb/adutux%d\n",
833 udev->descriptor.idProduct, dev->serial_number, 833 le16_to_cpu(udev->descriptor.idProduct), dev->serial_number,
834 (dev->minor - ADU_MINOR_BASE)); 834 (dev->minor - ADU_MINOR_BASE));
835exit: 835exit:
836 dbg(2, " %s : leave, return value %p (dev)", __func__, dev); 836 dbg(2, " %s : leave, return value %p (dev)", __func__, dev);
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
index 6708a3b78ad8..f44e8b5e00c9 100644
--- a/drivers/usb/musb/omap2430.c
+++ b/drivers/usb/musb/omap2430.c
@@ -481,7 +481,7 @@ static u64 omap2430_dmamask = DMA_BIT_MASK(32);
481 481
482static int omap2430_probe(struct platform_device *pdev) 482static int omap2430_probe(struct platform_device *pdev)
483{ 483{
484 struct resource musb_resources[2]; 484 struct resource musb_resources[3];
485 struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; 485 struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
486 struct omap_musb_board_data *data; 486 struct omap_musb_board_data *data;
487 struct platform_device *musb; 487 struct platform_device *musb;
@@ -581,6 +581,11 @@ static int omap2430_probe(struct platform_device *pdev)
581 musb_resources[1].end = pdev->resource[1].end; 581 musb_resources[1].end = pdev->resource[1].end;
582 musb_resources[1].flags = pdev->resource[1].flags; 582 musb_resources[1].flags = pdev->resource[1].flags;
583 583
584 musb_resources[2].name = pdev->resource[2].name;
585 musb_resources[2].start = pdev->resource[2].start;
586 musb_resources[2].end = pdev->resource[2].end;
587 musb_resources[2].flags = pdev->resource[2].flags;
588
584 ret = platform_device_add_resources(musb, musb_resources, 589 ret = platform_device_add_resources(musb, musb_resources,
585 ARRAY_SIZE(musb_resources)); 590 ARRAY_SIZE(musb_resources));
586 if (ret) { 591 if (ret) {
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c
index 2c06a8969a9f..6f8a9ca96ae7 100644
--- a/drivers/usb/musb/tusb6010.c
+++ b/drivers/usb/musb/tusb6010.c
@@ -1156,7 +1156,7 @@ static u64 tusb_dmamask = DMA_BIT_MASK(32);
1156 1156
1157static int tusb_probe(struct platform_device *pdev) 1157static int tusb_probe(struct platform_device *pdev)
1158{ 1158{
1159 struct resource musb_resources[2]; 1159 struct resource musb_resources[3];
1160 struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data; 1160 struct musb_hdrc_platform_data *pdata = pdev->dev.platform_data;
1161 struct platform_device *musb; 1161 struct platform_device *musb;
1162 struct tusb6010_glue *glue; 1162 struct tusb6010_glue *glue;
@@ -1199,6 +1199,11 @@ static int tusb_probe(struct platform_device *pdev)
1199 musb_resources[1].end = pdev->resource[1].end; 1199 musb_resources[1].end = pdev->resource[1].end;
1200 musb_resources[1].flags = pdev->resource[1].flags; 1200 musb_resources[1].flags = pdev->resource[1].flags;
1201 1201
1202 musb_resources[2].name = pdev->resource[2].name;
1203 musb_resources[2].start = pdev->resource[2].start;
1204 musb_resources[2].end = pdev->resource[2].end;
1205 musb_resources[2].flags = pdev->resource[2].flags;
1206
1202 ret = platform_device_add_resources(musb, musb_resources, 1207 ret = platform_device_add_resources(musb, musb_resources,
1203 ARRAY_SIZE(musb_resources)); 1208 ARRAY_SIZE(musb_resources));
1204 if (ret) { 1209 if (ret) {
diff --git a/drivers/usb/phy/phy-fsl-usb.h b/drivers/usb/phy/phy-fsl-usb.h
index ca266280895d..e1859b8ef567 100644
--- a/drivers/usb/phy/phy-fsl-usb.h
+++ b/drivers/usb/phy/phy-fsl-usb.h
@@ -15,7 +15,7 @@
15 * 675 Mass Ave, Cambridge, MA 02139, USA. 15 * 675 Mass Ave, Cambridge, MA 02139, USA.
16 */ 16 */
17 17
18#include "otg_fsm.h" 18#include "phy-fsm-usb.h"
19#include <linux/usb/otg.h> 19#include <linux/usb/otg.h>
20#include <linux/ioctl.h> 20#include <linux/ioctl.h>
21 21
diff --git a/drivers/usb/phy/phy-fsm-usb.c b/drivers/usb/phy/phy-fsm-usb.c
index c520b3548e7c..7f4596606e18 100644
--- a/drivers/usb/phy/phy-fsm-usb.c
+++ b/drivers/usb/phy/phy-fsm-usb.c
@@ -29,7 +29,7 @@
29#include <linux/usb/gadget.h> 29#include <linux/usb/gadget.h>
30#include <linux/usb/otg.h> 30#include <linux/usb/otg.h>
31 31
32#include "phy-otg-fsm.h" 32#include "phy-fsm-usb.h"
33 33
34/* Change USB protocol when there is a protocol change */ 34/* Change USB protocol when there is a protocol change */
35static int otg_set_protocol(struct otg_fsm *fsm, int protocol) 35static int otg_set_protocol(struct otg_fsm *fsm, int protocol)
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig
index 8c3a42ea910c..7eef9b33fde6 100644
--- a/drivers/usb/serial/Kconfig
+++ b/drivers/usb/serial/Kconfig
@@ -719,6 +719,13 @@ config USB_SERIAL_FLASHLOADER
719 To compile this driver as a module, choose M here: the 719 To compile this driver as a module, choose M here: the
720 module will be called flashloader. 720 module will be called flashloader.
721 721
722config USB_SERIAL_SUUNTO
723 tristate "USB Suunto ANT+ driver"
724 help
725 Say Y here if you want to use the Suunto ANT+ USB device.
726
727 To compile this driver as a module, choose M here: the
728 module will be called suunto.
722 729
723config USB_SERIAL_DEBUG 730config USB_SERIAL_DEBUG
724 tristate "USB Debugging Device" 731 tristate "USB Debugging Device"
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile
index f7130114488f..a14a870d993f 100644
--- a/drivers/usb/serial/Makefile
+++ b/drivers/usb/serial/Makefile
@@ -54,6 +54,7 @@ obj-$(CONFIG_USB_SERIAL_SIEMENS_MPI) += siemens_mpi.o
54obj-$(CONFIG_USB_SERIAL_SIERRAWIRELESS) += sierra.o 54obj-$(CONFIG_USB_SERIAL_SIERRAWIRELESS) += sierra.o
55obj-$(CONFIG_USB_SERIAL_SPCP8X5) += spcp8x5.o 55obj-$(CONFIG_USB_SERIAL_SPCP8X5) += spcp8x5.o
56obj-$(CONFIG_USB_SERIAL_SSU100) += ssu100.o 56obj-$(CONFIG_USB_SERIAL_SSU100) += ssu100.o
57obj-$(CONFIG_USB_SERIAL_SUUNTO) += suunto.o
57obj-$(CONFIG_USB_SERIAL_SYMBOL) += symbolserial.o 58obj-$(CONFIG_USB_SERIAL_SYMBOL) += symbolserial.o
58obj-$(CONFIG_USB_SERIAL_WWAN) += usb_wwan.o 59obj-$(CONFIG_USB_SERIAL_WWAN) += usb_wwan.o
59obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o 60obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index 7260ec660347..b65e657c641d 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -735,9 +735,34 @@ static struct usb_device_id id_table_combined [] = {
735 { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID), 735 { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
736 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, 736 .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
737 { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, 737 { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
738 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) }, 738 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) },
739 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_CT29B_PID) }, 739 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) },
740 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_RTS01_PID) }, 740 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) },
741 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57B_PID) },
742 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29A_PID) },
743 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29B_PID) },
744 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29F_PID) },
745 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62B_PID) },
746 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S01_PID) },
747 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63_PID) },
748 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29C_PID) },
749 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_81B_PID) },
750 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_82B_PID) },
751 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5D_PID) },
752 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K4Y_PID) },
753 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5G_PID) },
754 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S05_PID) },
755 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_60_PID) },
756 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_61_PID) },
757 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62_PID) },
758 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63B_PID) },
759 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_64_PID) },
760 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_65_PID) },
761 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92_PID) },
762 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92D_PID) },
763 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_W5R_PID) },
764 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_A5R_PID) },
765 { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_PW1_PID) },
741 { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, 766 { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
742 { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) }, 767 { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
743 { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, 768 { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
index 6dd79253205d..1b8af461b522 100644
--- a/drivers/usb/serial/ftdi_sio_ids.h
+++ b/drivers/usb/serial/ftdi_sio_ids.h
@@ -815,11 +815,35 @@
815/* 815/*
816 * RT Systems programming cables for various ham radios 816 * RT Systems programming cables for various ham radios
817 */ 817 */
818#define RTSYSTEMS_VID 0x2100 /* Vendor ID */ 818#define RTSYSTEMS_VID 0x2100 /* Vendor ID */
819#define RTSYSTEMS_SERIAL_VX7_PID 0x9e52 /* Serial converter for VX-7 Radios using FT232RL */ 819#define RTSYSTEMS_USB_S03_PID 0x9001 /* RTS-03 USB to Serial Adapter */
820#define RTSYSTEMS_CT29B_PID 0x9e54 /* CT29B Radio Cable */ 820#define RTSYSTEMS_USB_59_PID 0x9e50 /* USB-59 USB to 8 pin plug */
821#define RTSYSTEMS_RTS01_PID 0x9e57 /* USB-RTS01 Radio Cable */ 821#define RTSYSTEMS_USB_57A_PID 0x9e51 /* USB-57A USB to 4pin 3.5mm plug */
822 822#define RTSYSTEMS_USB_57B_PID 0x9e52 /* USB-57B USB to extended 4pin 3.5mm plug */
823#define RTSYSTEMS_USB_29A_PID 0x9e53 /* USB-29A USB to 3.5mm stereo plug */
824#define RTSYSTEMS_USB_29B_PID 0x9e54 /* USB-29B USB to 6 pin mini din */
825#define RTSYSTEMS_USB_29F_PID 0x9e55 /* USB-29F USB to 6 pin modular plug */
826#define RTSYSTEMS_USB_62B_PID 0x9e56 /* USB-62B USB to 8 pin mini din plug*/
827#define RTSYSTEMS_USB_S01_PID 0x9e57 /* USB-RTS01 USB to 3.5 mm stereo plug*/
828#define RTSYSTEMS_USB_63_PID 0x9e58 /* USB-63 USB to 9 pin female*/
829#define RTSYSTEMS_USB_29C_PID 0x9e59 /* USB-29C USB to 4 pin modular plug*/
830#define RTSYSTEMS_USB_81B_PID 0x9e5A /* USB-81 USB to 8 pin mini din plug*/
831#define RTSYSTEMS_USB_82B_PID 0x9e5B /* USB-82 USB to 2.5 mm stereo plug*/
832#define RTSYSTEMS_USB_K5D_PID 0x9e5C /* USB-K5D USB to 8 pin modular plug*/
833#define RTSYSTEMS_USB_K4Y_PID 0x9e5D /* USB-K4Y USB to 2.5/3.5 mm plugs*/
834#define RTSYSTEMS_USB_K5G_PID 0x9e5E /* USB-K5G USB to 8 pin modular plug*/
835#define RTSYSTEMS_USB_S05_PID 0x9e5F /* USB-RTS05 USB to 2.5 mm stereo plug*/
836#define RTSYSTEMS_USB_60_PID 0x9e60 /* USB-60 USB to 6 pin din*/
837#define RTSYSTEMS_USB_61_PID 0x9e61 /* USB-61 USB to 6 pin mini din*/
838#define RTSYSTEMS_USB_62_PID 0x9e62 /* USB-62 USB to 8 pin mini din*/
839#define RTSYSTEMS_USB_63B_PID 0x9e63 /* USB-63 USB to 9 pin female*/
840#define RTSYSTEMS_USB_64_PID 0x9e64 /* USB-64 USB to 9 pin male*/
841#define RTSYSTEMS_USB_65_PID 0x9e65 /* USB-65 USB to 9 pin female null modem*/
842#define RTSYSTEMS_USB_92_PID 0x9e66 /* USB-92 USB to 12 pin plug*/
843#define RTSYSTEMS_USB_92D_PID 0x9e67 /* USB-92D USB to 12 pin plug data*/
844#define RTSYSTEMS_USB_W5R_PID 0x9e68 /* USB-W5R USB to 8 pin modular plug*/
845#define RTSYSTEMS_USB_A5R_PID 0x9e69 /* USB-A5R USB to 8 pin modular plug*/
846#define RTSYSTEMS_USB_PW1_PID 0x9e6A /* USB-PW1 USB to 8 pin modular plug*/
823 847
824/* 848/*
825 * Physik Instrumente 849 * Physik Instrumente
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
index 5a979729f8ec..58c17fdc85eb 100644
--- a/drivers/usb/serial/keyspan.c
+++ b/drivers/usb/serial/keyspan.c
@@ -2303,7 +2303,7 @@ static int keyspan_startup(struct usb_serial *serial)
2303 if (d_details == NULL) { 2303 if (d_details == NULL) {
2304 dev_err(&serial->dev->dev, "%s - unknown product id %x\n", 2304 dev_err(&serial->dev->dev, "%s - unknown product id %x\n",
2305 __func__, le16_to_cpu(serial->dev->descriptor.idProduct)); 2305 __func__, le16_to_cpu(serial->dev->descriptor.idProduct));
2306 return 1; 2306 return -ENODEV;
2307 } 2307 }
2308 2308
2309 /* Setup private data for serial driver */ 2309 /* Setup private data for serial driver */
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c
index 51da424327b0..b01300164fc0 100644
--- a/drivers/usb/serial/mos7720.c
+++ b/drivers/usb/serial/mos7720.c
@@ -90,6 +90,7 @@ struct urbtracker {
90 struct list_head urblist_entry; 90 struct list_head urblist_entry;
91 struct kref ref_count; 91 struct kref ref_count;
92 struct urb *urb; 92 struct urb *urb;
93 struct usb_ctrlrequest *setup;
93}; 94};
94 95
95enum mos7715_pp_modes { 96enum mos7715_pp_modes {
@@ -271,6 +272,7 @@ static void destroy_urbtracker(struct kref *kref)
271 struct mos7715_parport *mos_parport = urbtrack->mos_parport; 272 struct mos7715_parport *mos_parport = urbtrack->mos_parport;
272 273
273 usb_free_urb(urbtrack->urb); 274 usb_free_urb(urbtrack->urb);
275 kfree(urbtrack->setup);
274 kfree(urbtrack); 276 kfree(urbtrack);
275 kref_put(&mos_parport->ref_count, destroy_mos_parport); 277 kref_put(&mos_parport->ref_count, destroy_mos_parport);
276} 278}
@@ -355,7 +357,6 @@ static int write_parport_reg_nonblock(struct mos7715_parport *mos_parport,
355 struct urbtracker *urbtrack; 357 struct urbtracker *urbtrack;
356 int ret_val; 358 int ret_val;
357 unsigned long flags; 359 unsigned long flags;
358 struct usb_ctrlrequest setup;
359 struct usb_serial *serial = mos_parport->serial; 360 struct usb_serial *serial = mos_parport->serial;
360 struct usb_device *usbdev = serial->dev; 361 struct usb_device *usbdev = serial->dev;
361 362
@@ -373,14 +374,20 @@ static int write_parport_reg_nonblock(struct mos7715_parport *mos_parport,
373 kfree(urbtrack); 374 kfree(urbtrack);
374 return -ENOMEM; 375 return -ENOMEM;
375 } 376 }
376 setup.bRequestType = (__u8)0x40; 377 urbtrack->setup = kmalloc(sizeof(*urbtrack->setup), GFP_KERNEL);
377 setup.bRequest = (__u8)0x0e; 378 if (!urbtrack->setup) {
378 setup.wValue = get_reg_value(reg, dummy); 379 usb_free_urb(urbtrack->urb);
379 setup.wIndex = get_reg_index(reg); 380 kfree(urbtrack);
380 setup.wLength = 0; 381 return -ENOMEM;
382 }
383 urbtrack->setup->bRequestType = (__u8)0x40;
384 urbtrack->setup->bRequest = (__u8)0x0e;
385 urbtrack->setup->wValue = get_reg_value(reg, dummy);
386 urbtrack->setup->wIndex = get_reg_index(reg);
387 urbtrack->setup->wLength = 0;
381 usb_fill_control_urb(urbtrack->urb, usbdev, 388 usb_fill_control_urb(urbtrack->urb, usbdev,
382 usb_sndctrlpipe(usbdev, 0), 389 usb_sndctrlpipe(usbdev, 0),
383 (unsigned char *)&setup, 390 (unsigned char *)urbtrack->setup,
384 NULL, 0, async_complete, urbtrack); 391 NULL, 0, async_complete, urbtrack);
385 kref_init(&urbtrack->ref_count); 392 kref_init(&urbtrack->ref_count);
386 INIT_LIST_HEAD(&urbtrack->urblist_entry); 393 INIT_LIST_HEAD(&urbtrack->urblist_entry);
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
index 603fb70dde80..3bac4693c038 100644
--- a/drivers/usb/serial/mos7840.c
+++ b/drivers/usb/serial/mos7840.c
@@ -183,7 +183,10 @@
183#define LED_ON_MS 500 183#define LED_ON_MS 500
184#define LED_OFF_MS 500 184#define LED_OFF_MS 500
185 185
186static int device_type; 186enum mos7840_flag {
187 MOS7840_FLAG_CTRL_BUSY,
188 MOS7840_FLAG_LED_BUSY,
189};
187 190
188static const struct usb_device_id id_table[] = { 191static const struct usb_device_id id_table[] = {
189 {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)}, 192 {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)},
@@ -238,9 +241,12 @@ struct moschip_port {
238 241
239 /* For device(s) with LED indicator */ 242 /* For device(s) with LED indicator */
240 bool has_led; 243 bool has_led;
241 bool led_flag;
242 struct timer_list led_timer1; /* Timer for LED on */ 244 struct timer_list led_timer1; /* Timer for LED on */
243 struct timer_list led_timer2; /* Timer for LED off */ 245 struct timer_list led_timer2; /* Timer for LED off */
246 struct urb *led_urb;
247 struct usb_ctrlrequest *led_dr;
248
249 unsigned long flags;
244}; 250};
245 251
246/* 252/*
@@ -460,10 +466,10 @@ static void mos7840_control_callback(struct urb *urb)
460 case -ESHUTDOWN: 466 case -ESHUTDOWN:
461 /* this urb is terminated, clean up */ 467 /* this urb is terminated, clean up */
462 dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status); 468 dev_dbg(dev, "%s - urb shutting down with status: %d\n", __func__, status);
463 return; 469 goto out;
464 default: 470 default:
465 dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status); 471 dev_dbg(dev, "%s - nonzero urb status received: %d\n", __func__, status);
466 return; 472 goto out;
467 } 473 }
468 474
469 dev_dbg(dev, "%s urb buffer size is %d\n", __func__, urb->actual_length); 475 dev_dbg(dev, "%s urb buffer size is %d\n", __func__, urb->actual_length);
@@ -476,6 +482,8 @@ static void mos7840_control_callback(struct urb *urb)
476 mos7840_handle_new_msr(mos7840_port, regval); 482 mos7840_handle_new_msr(mos7840_port, regval);
477 else if (mos7840_port->MsrLsr == 1) 483 else if (mos7840_port->MsrLsr == 1)
478 mos7840_handle_new_lsr(mos7840_port, regval); 484 mos7840_handle_new_lsr(mos7840_port, regval);
485out:
486 clear_bit_unlock(MOS7840_FLAG_CTRL_BUSY, &mos7840_port->flags);
479} 487}
480 488
481static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg, 489static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg,
@@ -486,6 +494,9 @@ static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg,
486 unsigned char *buffer = mcs->ctrl_buf; 494 unsigned char *buffer = mcs->ctrl_buf;
487 int ret; 495 int ret;
488 496
497 if (test_and_set_bit_lock(MOS7840_FLAG_CTRL_BUSY, &mcs->flags))
498 return -EBUSY;
499
489 dr->bRequestType = MCS_RD_RTYPE; 500 dr->bRequestType = MCS_RD_RTYPE;
490 dr->bRequest = MCS_RDREQ; 501 dr->bRequest = MCS_RDREQ;
491 dr->wValue = cpu_to_le16(Wval); /* 0 */ 502 dr->wValue = cpu_to_le16(Wval); /* 0 */
@@ -497,6 +508,9 @@ static int mos7840_get_reg(struct moschip_port *mcs, __u16 Wval, __u16 reg,
497 mos7840_control_callback, mcs); 508 mos7840_control_callback, mcs);
498 mcs->control_urb->transfer_buffer_length = 2; 509 mcs->control_urb->transfer_buffer_length = 2;
499 ret = usb_submit_urb(mcs->control_urb, GFP_ATOMIC); 510 ret = usb_submit_urb(mcs->control_urb, GFP_ATOMIC);
511 if (ret)
512 clear_bit_unlock(MOS7840_FLAG_CTRL_BUSY, &mcs->flags);
513
500 return ret; 514 return ret;
501} 515}
502 516
@@ -523,7 +537,7 @@ static void mos7840_set_led_async(struct moschip_port *mcs, __u16 wval,
523 __u16 reg) 537 __u16 reg)
524{ 538{
525 struct usb_device *dev = mcs->port->serial->dev; 539 struct usb_device *dev = mcs->port->serial->dev;
526 struct usb_ctrlrequest *dr = mcs->dr; 540 struct usb_ctrlrequest *dr = mcs->led_dr;
527 541
528 dr->bRequestType = MCS_WR_RTYPE; 542 dr->bRequestType = MCS_WR_RTYPE;
529 dr->bRequest = MCS_WRREQ; 543 dr->bRequest = MCS_WRREQ;
@@ -531,10 +545,10 @@ static void mos7840_set_led_async(struct moschip_port *mcs, __u16 wval,
531 dr->wIndex = cpu_to_le16(reg); 545 dr->wIndex = cpu_to_le16(reg);
532 dr->wLength = cpu_to_le16(0); 546 dr->wLength = cpu_to_le16(0);
533 547
534 usb_fill_control_urb(mcs->control_urb, dev, usb_sndctrlpipe(dev, 0), 548 usb_fill_control_urb(mcs->led_urb, dev, usb_sndctrlpipe(dev, 0),
535 (unsigned char *)dr, NULL, 0, mos7840_set_led_callback, NULL); 549 (unsigned char *)dr, NULL, 0, mos7840_set_led_callback, NULL);
536 550
537 usb_submit_urb(mcs->control_urb, GFP_ATOMIC); 551 usb_submit_urb(mcs->led_urb, GFP_ATOMIC);
538} 552}
539 553
540static void mos7840_set_led_sync(struct usb_serial_port *port, __u16 reg, 554static void mos7840_set_led_sync(struct usb_serial_port *port, __u16 reg,
@@ -560,7 +574,19 @@ static void mos7840_led_flag_off(unsigned long arg)
560{ 574{
561 struct moschip_port *mcs = (struct moschip_port *) arg; 575 struct moschip_port *mcs = (struct moschip_port *) arg;
562 576
563 mcs->led_flag = false; 577 clear_bit_unlock(MOS7840_FLAG_LED_BUSY, &mcs->flags);
578}
579
580static void mos7840_led_activity(struct usb_serial_port *port)
581{
582 struct moschip_port *mos7840_port = usb_get_serial_port_data(port);
583
584 if (test_and_set_bit_lock(MOS7840_FLAG_LED_BUSY, &mos7840_port->flags))
585 return;
586
587 mos7840_set_led_async(mos7840_port, 0x0301, MODEM_CONTROL_REGISTER);
588 mod_timer(&mos7840_port->led_timer1,
589 jiffies + msecs_to_jiffies(LED_ON_MS));
564} 590}
565 591
566/***************************************************************************** 592/*****************************************************************************
@@ -758,14 +784,8 @@ static void mos7840_bulk_in_callback(struct urb *urb)
758 return; 784 return;
759 } 785 }
760 786
761 /* Turn on LED */ 787 if (mos7840_port->has_led)
762 if (mos7840_port->has_led && !mos7840_port->led_flag) { 788 mos7840_led_activity(port);
763 mos7840_port->led_flag = true;
764 mos7840_set_led_async(mos7840_port, 0x0301,
765 MODEM_CONTROL_REGISTER);
766 mod_timer(&mos7840_port->led_timer1,
767 jiffies + msecs_to_jiffies(LED_ON_MS));
768 }
769 789
770 mos7840_port->read_urb_busy = true; 790 mos7840_port->read_urb_busy = true;
771 retval = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC); 791 retval = usb_submit_urb(mos7840_port->read_urb, GFP_ATOMIC);
@@ -816,18 +836,6 @@ static void mos7840_bulk_out_data_callback(struct urb *urb)
816/************************************************************************/ 836/************************************************************************/
817/* D R I V E R T T Y I N T E R F A C E F U N C T I O N S */ 837/* D R I V E R T T Y I N T E R F A C E F U N C T I O N S */
818/************************************************************************/ 838/************************************************************************/
819#ifdef MCSSerialProbe
820static int mos7840_serial_probe(struct usb_serial *serial,
821 const struct usb_device_id *id)
822{
823
824 /*need to implement the mode_reg reading and updating\
825 structures usb_serial_ device_type\
826 (i.e num_ports, num_bulkin,bulkout etc) */
827 /* Also we can update the changes attach */
828 return 1;
829}
830#endif
831 839
832/***************************************************************************** 840/*****************************************************************************
833 * mos7840_open 841 * mos7840_open
@@ -1454,13 +1462,8 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port,
1454 data1 = urb->transfer_buffer; 1462 data1 = urb->transfer_buffer;
1455 dev_dbg(&port->dev, "bulkout endpoint is %d\n", port->bulk_out_endpointAddress); 1463 dev_dbg(&port->dev, "bulkout endpoint is %d\n", port->bulk_out_endpointAddress);
1456 1464
1457 /* Turn on LED */ 1465 if (mos7840_port->has_led)
1458 if (mos7840_port->has_led && !mos7840_port->led_flag) { 1466 mos7840_led_activity(port);
1459 mos7840_port->led_flag = true;
1460 mos7840_set_led_sync(port, MODEM_CONTROL_REGISTER, 0x0301);
1461 mod_timer(&mos7840_port->led_timer1,
1462 jiffies + msecs_to_jiffies(LED_ON_MS));
1463 }
1464 1467
1465 /* send it down the pipe */ 1468 /* send it down the pipe */
1466 status = usb_submit_urb(urb, GFP_ATOMIC); 1469 status = usb_submit_urb(urb, GFP_ATOMIC);
@@ -2187,38 +2190,48 @@ static int mos7810_check(struct usb_serial *serial)
2187 return 0; 2190 return 0;
2188} 2191}
2189 2192
2190static int mos7840_calc_num_ports(struct usb_serial *serial) 2193static int mos7840_probe(struct usb_serial *serial,
2194 const struct usb_device_id *id)
2191{ 2195{
2192 __u16 data = 0x00; 2196 u16 product = le16_to_cpu(serial->dev->descriptor.idProduct);
2193 u8 *buf; 2197 u8 *buf;
2194 int mos7840_num_ports; 2198 int device_type;
2199
2200 if (product == MOSCHIP_DEVICE_ID_7810 ||
2201 product == MOSCHIP_DEVICE_ID_7820) {
2202 device_type = product;
2203 goto out;
2204 }
2195 2205
2196 buf = kzalloc(VENDOR_READ_LENGTH, GFP_KERNEL); 2206 buf = kzalloc(VENDOR_READ_LENGTH, GFP_KERNEL);
2197 if (buf) { 2207 if (!buf)
2198 usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), 2208 return -ENOMEM;
2209
2210 usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),
2199 MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, buf, 2211 MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, buf,
2200 VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); 2212 VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT);
2201 data = *buf;
2202 kfree(buf);
2203 }
2204 2213
2205 if (serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7810 || 2214 /* For a MCS7840 device GPIO0 must be set to 1 */
2206 serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7820) { 2215 if (buf[0] & 0x01)
2207 device_type = serial->dev->descriptor.idProduct; 2216 device_type = MOSCHIP_DEVICE_ID_7840;
2208 } else { 2217 else if (mos7810_check(serial))
2209 /* For a MCS7840 device GPIO0 must be set to 1 */ 2218 device_type = MOSCHIP_DEVICE_ID_7810;
2210 if ((data & 0x01) == 1) 2219 else
2211 device_type = MOSCHIP_DEVICE_ID_7840; 2220 device_type = MOSCHIP_DEVICE_ID_7820;
2212 else if (mos7810_check(serial)) 2221
2213 device_type = MOSCHIP_DEVICE_ID_7810; 2222 kfree(buf);
2214 else 2223out:
2215 device_type = MOSCHIP_DEVICE_ID_7820; 2224 usb_set_serial_data(serial, (void *)(unsigned long)device_type);
2216 } 2225
2226 return 0;
2227}
2228
2229static int mos7840_calc_num_ports(struct usb_serial *serial)
2230{
2231 int device_type = (unsigned long)usb_get_serial_data(serial);
2232 int mos7840_num_ports;
2217 2233
2218 mos7840_num_ports = (device_type >> 4) & 0x000F; 2234 mos7840_num_ports = (device_type >> 4) & 0x000F;
2219 serial->num_bulk_in = mos7840_num_ports;
2220 serial->num_bulk_out = mos7840_num_ports;
2221 serial->num_ports = mos7840_num_ports;
2222 2235
2223 return mos7840_num_ports; 2236 return mos7840_num_ports;
2224} 2237}
@@ -2226,6 +2239,7 @@ static int mos7840_calc_num_ports(struct usb_serial *serial)
2226static int mos7840_port_probe(struct usb_serial_port *port) 2239static int mos7840_port_probe(struct usb_serial_port *port)
2227{ 2240{
2228 struct usb_serial *serial = port->serial; 2241 struct usb_serial *serial = port->serial;
2242 int device_type = (unsigned long)usb_get_serial_data(serial);
2229 struct moschip_port *mos7840_port; 2243 struct moschip_port *mos7840_port;
2230 int status; 2244 int status;
2231 int pnum; 2245 int pnum;
@@ -2401,6 +2415,14 @@ static int mos7840_port_probe(struct usb_serial_port *port)
2401 if (device_type == MOSCHIP_DEVICE_ID_7810) { 2415 if (device_type == MOSCHIP_DEVICE_ID_7810) {
2402 mos7840_port->has_led = true; 2416 mos7840_port->has_led = true;
2403 2417
2418 mos7840_port->led_urb = usb_alloc_urb(0, GFP_KERNEL);
2419 mos7840_port->led_dr = kmalloc(sizeof(*mos7840_port->led_dr),
2420 GFP_KERNEL);
2421 if (!mos7840_port->led_urb || !mos7840_port->led_dr) {
2422 status = -ENOMEM;
2423 goto error;
2424 }
2425
2404 init_timer(&mos7840_port->led_timer1); 2426 init_timer(&mos7840_port->led_timer1);
2405 mos7840_port->led_timer1.function = mos7840_led_off; 2427 mos7840_port->led_timer1.function = mos7840_led_off;
2406 mos7840_port->led_timer1.expires = 2428 mos7840_port->led_timer1.expires =
@@ -2413,8 +2435,6 @@ static int mos7840_port_probe(struct usb_serial_port *port)
2413 jiffies + msecs_to_jiffies(LED_OFF_MS); 2435 jiffies + msecs_to_jiffies(LED_OFF_MS);
2414 mos7840_port->led_timer2.data = (unsigned long)mos7840_port; 2436 mos7840_port->led_timer2.data = (unsigned long)mos7840_port;
2415 2437
2416 mos7840_port->led_flag = false;
2417
2418 /* Turn off LED */ 2438 /* Turn off LED */
2419 mos7840_set_led_sync(port, MODEM_CONTROL_REGISTER, 0x0300); 2439 mos7840_set_led_sync(port, MODEM_CONTROL_REGISTER, 0x0300);
2420 } 2440 }
@@ -2436,6 +2456,8 @@ out:
2436 } 2456 }
2437 return 0; 2457 return 0;
2438error: 2458error:
2459 kfree(mos7840_port->led_dr);
2460 usb_free_urb(mos7840_port->led_urb);
2439 kfree(mos7840_port->dr); 2461 kfree(mos7840_port->dr);
2440 kfree(mos7840_port->ctrl_buf); 2462 kfree(mos7840_port->ctrl_buf);
2441 usb_free_urb(mos7840_port->control_urb); 2463 usb_free_urb(mos7840_port->control_urb);
@@ -2456,6 +2478,10 @@ static int mos7840_port_remove(struct usb_serial_port *port)
2456 2478
2457 del_timer_sync(&mos7840_port->led_timer1); 2479 del_timer_sync(&mos7840_port->led_timer1);
2458 del_timer_sync(&mos7840_port->led_timer2); 2480 del_timer_sync(&mos7840_port->led_timer2);
2481
2482 usb_kill_urb(mos7840_port->led_urb);
2483 usb_free_urb(mos7840_port->led_urb);
2484 kfree(mos7840_port->led_dr);
2459 } 2485 }
2460 usb_kill_urb(mos7840_port->control_urb); 2486 usb_kill_urb(mos7840_port->control_urb);
2461 usb_free_urb(mos7840_port->control_urb); 2487 usb_free_urb(mos7840_port->control_urb);
@@ -2482,9 +2508,7 @@ static struct usb_serial_driver moschip7840_4port_device = {
2482 .throttle = mos7840_throttle, 2508 .throttle = mos7840_throttle,
2483 .unthrottle = mos7840_unthrottle, 2509 .unthrottle = mos7840_unthrottle,
2484 .calc_num_ports = mos7840_calc_num_ports, 2510 .calc_num_ports = mos7840_calc_num_ports,
2485#ifdef MCSSerialProbe 2511 .probe = mos7840_probe,
2486 .probe = mos7840_serial_probe,
2487#endif
2488 .ioctl = mos7840_ioctl, 2512 .ioctl = mos7840_ioctl,
2489 .set_termios = mos7840_set_termios, 2513 .set_termios = mos7840_set_termios,
2490 .break_ctl = mos7840_break, 2514 .break_ctl = mos7840_break,
diff --git a/drivers/usb/serial/suunto.c b/drivers/usb/serial/suunto.c
new file mode 100644
index 000000000000..2248e7a7d5ad
--- /dev/null
+++ b/drivers/usb/serial/suunto.c
@@ -0,0 +1,41 @@
1/*
2 * Suunto ANT+ USB Driver
3 *
4 * Copyright (C) 2013 Greg Kroah-Hartman <gregkh@linuxfoundation.org>
5 * Copyright (C) 2013 Linux Foundation
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License version 2 as published by
9 * the Free Software Foundation only.
10 */
11
12#include <linux/kernel.h>
13#include <linux/init.h>
14#include <linux/tty.h>
15#include <linux/module.h>
16#include <linux/usb.h>
17#include <linux/usb/serial.h>
18#include <linux/uaccess.h>
19
20static const struct usb_device_id id_table[] = {
21 { USB_DEVICE(0x0fcf, 0x1008) },
22 { },
23};
24MODULE_DEVICE_TABLE(usb, id_table);
25
26static struct usb_serial_driver suunto_device = {
27 .driver = {
28 .owner = THIS_MODULE,
29 .name = KBUILD_MODNAME,
30 },
31 .id_table = id_table,
32 .num_ports = 1,
33};
34
35static struct usb_serial_driver * const serial_drivers[] = {
36 &suunto_device,
37 NULL,
38};
39
40module_usb_serial_driver(serial_drivers, id_table);
41MODULE_LICENSE("GPL");
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
index 375b5a400b6f..5c9f9b1d7736 100644
--- a/drivers/usb/serial/ti_usb_3410_5052.c
+++ b/drivers/usb/serial/ti_usb_3410_5052.c
@@ -1536,14 +1536,15 @@ static int ti_download_firmware(struct ti_device *tdev)
1536 char buf[32]; 1536 char buf[32];
1537 1537
1538 /* try ID specific firmware first, then try generic firmware */ 1538 /* try ID specific firmware first, then try generic firmware */
1539 sprintf(buf, "ti_usb-v%04x-p%04x.fw", dev->descriptor.idVendor, 1539 sprintf(buf, "ti_usb-v%04x-p%04x.fw",
1540 dev->descriptor.idProduct); 1540 le16_to_cpu(dev->descriptor.idVendor),
1541 le16_to_cpu(dev->descriptor.idProduct));
1541 status = request_firmware(&fw_p, buf, &dev->dev); 1542 status = request_firmware(&fw_p, buf, &dev->dev);
1542 1543
1543 if (status != 0) { 1544 if (status != 0) {
1544 buf[0] = '\0'; 1545 buf[0] = '\0';
1545 if (dev->descriptor.idVendor == MTS_VENDOR_ID) { 1546 if (le16_to_cpu(dev->descriptor.idVendor) == MTS_VENDOR_ID) {
1546 switch (dev->descriptor.idProduct) { 1547 switch (le16_to_cpu(dev->descriptor.idProduct)) {
1547 case MTS_CDMA_PRODUCT_ID: 1548 case MTS_CDMA_PRODUCT_ID:
1548 strcpy(buf, "mts_cdma.fw"); 1549 strcpy(buf, "mts_cdma.fw");
1549 break; 1550 break;
diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c
index 8257d30c4072..85365784040b 100644
--- a/drivers/usb/serial/usb_wwan.c
+++ b/drivers/usb/serial/usb_wwan.c
@@ -291,18 +291,18 @@ static void usb_wwan_indat_callback(struct urb *urb)
291 tty_flip_buffer_push(&port->port); 291 tty_flip_buffer_push(&port->port);
292 } else 292 } else
293 dev_dbg(dev, "%s: empty read urb received\n", __func__); 293 dev_dbg(dev, "%s: empty read urb received\n", __func__);
294 294 }
295 /* Resubmit urb so we continue receiving */ 295 /* Resubmit urb so we continue receiving */
296 err = usb_submit_urb(urb, GFP_ATOMIC); 296 err = usb_submit_urb(urb, GFP_ATOMIC);
297 if (err) { 297 if (err) {
298 if (err != -EPERM) { 298 if (err != -EPERM) {
299 dev_err(dev, "%s: resubmit read urb failed. (%d)\n", __func__, err); 299 dev_err(dev, "%s: resubmit read urb failed. (%d)\n",
300 /* busy also in error unless we are killed */ 300 __func__, err);
301 usb_mark_last_busy(port->serial->dev); 301 /* busy also in error unless we are killed */
302 }
303 } else {
304 usb_mark_last_busy(port->serial->dev); 302 usb_mark_last_busy(port->serial->dev);
305 } 303 }
304 } else {
305 usb_mark_last_busy(port->serial->dev);
306 } 306 }
307} 307}
308 308
diff --git a/drivers/usb/wusbcore/wa-xfer.c b/drivers/usb/wusbcore/wa-xfer.c
index 16968c899493..d3493ca0525d 100644
--- a/drivers/usb/wusbcore/wa-xfer.c
+++ b/drivers/usb/wusbcore/wa-xfer.c
@@ -1226,6 +1226,12 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb)
1226 } 1226 }
1227 spin_lock_irqsave(&xfer->lock, flags); 1227 spin_lock_irqsave(&xfer->lock, flags);
1228 rpipe = xfer->ep->hcpriv; 1228 rpipe = xfer->ep->hcpriv;
1229 if (rpipe == NULL) {
1230 pr_debug("%s: xfer id 0x%08X has no RPIPE. %s",
1231 __func__, wa_xfer_id(xfer),
1232 "Probably already aborted.\n" );
1233 goto out_unlock;
1234 }
1229 /* Check the delayed list -> if there, release and complete */ 1235 /* Check the delayed list -> if there, release and complete */
1230 spin_lock_irqsave(&wa->xfer_list_lock, flags2); 1236 spin_lock_irqsave(&wa->xfer_list_lock, flags2);
1231 if (!list_empty(&xfer->list_node) && xfer->seg == NULL) 1237 if (!list_empty(&xfer->list_node) && xfer->seg == NULL)
@@ -1644,8 +1650,7 @@ static void wa_xfer_result_cb(struct urb *urb)
1644 break; 1650 break;
1645 } 1651 }
1646 usb_status = xfer_result->bTransferStatus & 0x3f; 1652 usb_status = xfer_result->bTransferStatus & 0x3f;
1647 if (usb_status == WA_XFER_STATUS_ABORTED 1653 if (usb_status == WA_XFER_STATUS_NOT_FOUND)
1648 || usb_status == WA_XFER_STATUS_NOT_FOUND)
1649 /* taken care of already */ 1654 /* taken care of already */
1650 break; 1655 break;
1651 xfer_id = xfer_result->dwTransferID; 1656 xfer_id = xfer_result->dwTransferID;
diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
index c5179e269df6..cef6002acbd4 100644
--- a/drivers/vfio/pci/vfio_pci.c
+++ b/drivers/vfio/pci/vfio_pci.c
@@ -137,8 +137,27 @@ static void vfio_pci_disable(struct vfio_pci_device *vdev)
137 */ 137 */
138 pci_write_config_word(pdev, PCI_COMMAND, PCI_COMMAND_INTX_DISABLE); 138 pci_write_config_word(pdev, PCI_COMMAND, PCI_COMMAND_INTX_DISABLE);
139 139
140 if (vdev->reset_works) 140 /*
141 __pci_reset_function(pdev); 141 * Careful, device_lock may already be held. This is the case if
142 * a driver unbind is blocked. Try to get the locks ourselves to
143 * prevent a deadlock.
144 */
145 if (vdev->reset_works) {
146 bool reset_done = false;
147
148 if (pci_cfg_access_trylock(pdev)) {
149 if (device_trylock(&pdev->dev)) {
150 __pci_reset_function_locked(pdev);
151 reset_done = true;
152 device_unlock(&pdev->dev);
153 }
154 pci_cfg_access_unlock(pdev);
155 }
156
157 if (!reset_done)
158 pr_warn("%s: Unable to acquire locks for reset of %s\n",
159 __func__, dev_name(&pdev->dev));
160 }
142 161
143 pci_restore_state(pdev); 162 pci_restore_state(pdev);
144} 163}
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
index c488da5db7c7..842f4507883e 100644
--- a/drivers/vfio/vfio.c
+++ b/drivers/vfio/vfio.c
@@ -494,27 +494,6 @@ static int vfio_group_nb_add_dev(struct vfio_group *group, struct device *dev)
494 return 0; 494 return 0;
495} 495}
496 496
497static int vfio_group_nb_del_dev(struct vfio_group *group, struct device *dev)
498{
499 struct vfio_device *device;
500
501 /*
502 * Expect to fall out here. If a device was in use, it would
503 * have been bound to a vfio sub-driver, which would have blocked
504 * in .remove at vfio_del_group_dev. Sanity check that we no
505 * longer track the device, so it's safe to remove.
506 */
507 device = vfio_group_get_device(group, dev);
508 if (likely(!device))
509 return 0;
510
511 WARN("Device %s removed from live group %d!\n", dev_name(dev),
512 iommu_group_id(group->iommu_group));
513
514 vfio_device_put(device);
515 return 0;
516}
517
518static int vfio_group_nb_verify(struct vfio_group *group, struct device *dev) 497static int vfio_group_nb_verify(struct vfio_group *group, struct device *dev)
519{ 498{
520 /* We don't care what happens when the group isn't in use */ 499 /* We don't care what happens when the group isn't in use */
@@ -531,13 +510,11 @@ static int vfio_iommu_group_notifier(struct notifier_block *nb,
531 struct device *dev = data; 510 struct device *dev = data;
532 511
533 /* 512 /*
534 * Need to go through a group_lock lookup to get a reference or 513 * Need to go through a group_lock lookup to get a reference or we
535 * we risk racing a group being removed. Leave a WARN_ON for 514 * risk racing a group being removed. Ignore spurious notifies.
536 * debuging, but if the group no longer exists, a spurious notify
537 * is harmless.
538 */ 515 */
539 group = vfio_group_try_get(group); 516 group = vfio_group_try_get(group);
540 if (WARN_ON(!group)) 517 if (!group)
541 return NOTIFY_OK; 518 return NOTIFY_OK;
542 519
543 switch (action) { 520 switch (action) {
@@ -545,7 +522,13 @@ static int vfio_iommu_group_notifier(struct notifier_block *nb,
545 vfio_group_nb_add_dev(group, dev); 522 vfio_group_nb_add_dev(group, dev);
546 break; 523 break;
547 case IOMMU_GROUP_NOTIFY_DEL_DEVICE: 524 case IOMMU_GROUP_NOTIFY_DEL_DEVICE:
548 vfio_group_nb_del_dev(group, dev); 525 /*
526 * Nothing to do here. If the device is in use, then the
527 * vfio sub-driver should block the remove callback until
528 * it is unused. If the device is unused or attached to a
529 * stub driver, then it should be released and we don't
530 * care that it will be going away.
531 */
549 break; 532 break;
550 case IOMMU_GROUP_NOTIFY_BIND_DRIVER: 533 case IOMMU_GROUP_NOTIFY_BIND_DRIVER:
551 pr_debug("%s: Device %s, group %d binding to driver\n", 534 pr_debug("%s: Device %s, group %d binding to driver\n",
diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
index a89c15de9f45..9b0f12c5c284 100644
--- a/drivers/video/aty/atyfb_base.c
+++ b/drivers/video/aty/atyfb_base.c
@@ -435,8 +435,8 @@ static int correct_chipset(struct atyfb_par *par)
435 const char *name; 435 const char *name;
436 int i; 436 int i;
437 437
438 for (i = ARRAY_SIZE(aty_chips); i > 0; i--) 438 for (i = (int)ARRAY_SIZE(aty_chips) - 1; i >= 0; i--)
439 if (par->pci_id == aty_chips[i - 1].pci_id) 439 if (par->pci_id == aty_chips[i].pci_id)
440 break; 440 break;
441 441
442 if (i < 0) 442 if (i < 0)
diff --git a/drivers/video/mxsfb.c b/drivers/video/mxsfb.c
index 3ba37713b1f9..dc09ebe4aba5 100644
--- a/drivers/video/mxsfb.c
+++ b/drivers/video/mxsfb.c
@@ -239,24 +239,6 @@ static const struct fb_bitfield def_rgb565[] = {
239 } 239 }
240}; 240};
241 241
242static const struct fb_bitfield def_rgb666[] = {
243 [RED] = {
244 .offset = 16,
245 .length = 6,
246 },
247 [GREEN] = {
248 .offset = 8,
249 .length = 6,
250 },
251 [BLUE] = {
252 .offset = 0,
253 .length = 6,
254 },
255 [TRANSP] = { /* no support for transparency */
256 .length = 0,
257 }
258};
259
260static const struct fb_bitfield def_rgb888[] = { 242static const struct fb_bitfield def_rgb888[] = {
261 [RED] = { 243 [RED] = {
262 .offset = 16, 244 .offset = 16,
@@ -309,9 +291,6 @@ static int mxsfb_check_var(struct fb_var_screeninfo *var,
309 break; 291 break;
310 case STMLCDIF_16BIT: 292 case STMLCDIF_16BIT:
311 case STMLCDIF_18BIT: 293 case STMLCDIF_18BIT:
312 /* 24 bit to 18 bit mapping */
313 rgb = def_rgb666;
314 break;
315 case STMLCDIF_24BIT: 294 case STMLCDIF_24BIT:
316 /* real 24 bit */ 295 /* real 24 bit */
317 rgb = def_rgb888; 296 rgb = def_rgb888;
@@ -453,11 +432,6 @@ static int mxsfb_set_par(struct fb_info *fb_info)
453 return -EINVAL; 432 return -EINVAL;
454 case STMLCDIF_16BIT: 433 case STMLCDIF_16BIT:
455 case STMLCDIF_18BIT: 434 case STMLCDIF_18BIT:
456 /* 24 bit to 18 bit mapping */
457 ctrl |= CTRL_DF24; /* ignore the upper 2 bits in
458 * each colour component
459 */
460 break;
461 case STMLCDIF_24BIT: 435 case STMLCDIF_24BIT:
462 /* real 24 bit */ 436 /* real 24 bit */
463 break; 437 break;
diff --git a/drivers/video/nuc900fb.c b/drivers/video/nuc900fb.c
index 8c527e5b293c..796e5112ceee 100644
--- a/drivers/video/nuc900fb.c
+++ b/drivers/video/nuc900fb.c
@@ -587,8 +587,7 @@ static int nuc900fb_probe(struct platform_device *pdev)
587 fbinfo->flags = FBINFO_FLAG_DEFAULT; 587 fbinfo->flags = FBINFO_FLAG_DEFAULT;
588 fbinfo->pseudo_palette = &fbi->pseudo_pal; 588 fbinfo->pseudo_palette = &fbi->pseudo_pal;
589 589
590 ret = request_irq(irq, nuc900fb_irqhandler, 0, 590 ret = request_irq(irq, nuc900fb_irqhandler, 0, pdev->name, fbi);
591 pdev->name, fbinfo);
592 if (ret) { 591 if (ret) {
593 dev_err(&pdev->dev, "cannot register irq handler %d -err %d\n", 592 dev_err(&pdev->dev, "cannot register irq handler %d -err %d\n",
594 irq, ret); 593 irq, ret);
diff --git a/drivers/video/omap2/displays-new/connector-analog-tv.c b/drivers/video/omap2/displays-new/connector-analog-tv.c
index 5338f362293b..1b60698f141e 100644
--- a/drivers/video/omap2/displays-new/connector-analog-tv.c
+++ b/drivers/video/omap2/displays-new/connector-analog-tv.c
@@ -28,6 +28,20 @@ struct panel_drv_data {
28 bool invert_polarity; 28 bool invert_polarity;
29}; 29};
30 30
31static const struct omap_video_timings tvc_pal_timings = {
32 .x_res = 720,
33 .y_res = 574,
34 .pixel_clock = 13500,
35 .hsw = 64,
36 .hfp = 12,
37 .hbp = 68,
38 .vsw = 5,
39 .vfp = 5,
40 .vbp = 41,
41
42 .interlace = true,
43};
44
31#define to_panel_data(x) container_of(x, struct panel_drv_data, dssdev) 45#define to_panel_data(x) container_of(x, struct panel_drv_data, dssdev)
32 46
33static int tvc_connect(struct omap_dss_device *dssdev) 47static int tvc_connect(struct omap_dss_device *dssdev)
@@ -212,14 +226,14 @@ static int tvc_probe(struct platform_device *pdev)
212 return -ENODEV; 226 return -ENODEV;
213 } 227 }
214 228
215 ddata->timings = omap_dss_pal_timings; 229 ddata->timings = tvc_pal_timings;
216 230
217 dssdev = &ddata->dssdev; 231 dssdev = &ddata->dssdev;
218 dssdev->driver = &tvc_driver; 232 dssdev->driver = &tvc_driver;
219 dssdev->dev = &pdev->dev; 233 dssdev->dev = &pdev->dev;
220 dssdev->type = OMAP_DISPLAY_TYPE_VENC; 234 dssdev->type = OMAP_DISPLAY_TYPE_VENC;
221 dssdev->owner = THIS_MODULE; 235 dssdev->owner = THIS_MODULE;
222 dssdev->panel.timings = omap_dss_pal_timings; 236 dssdev->panel.timings = tvc_pal_timings;
223 237
224 r = omapdss_register_display(dssdev); 238 r = omapdss_register_display(dssdev);
225 if (r) { 239 if (r) {
diff --git a/drivers/video/sgivwfb.c b/drivers/video/sgivwfb.c
index b2a8912f6435..a9ac3ce2d0e9 100644
--- a/drivers/video/sgivwfb.c
+++ b/drivers/video/sgivwfb.c
@@ -713,7 +713,7 @@ static int sgivwfb_mmap(struct fb_info *info,
713 r = vm_iomap_memory(vma, sgivwfb_mem_phys, sgivwfb_mem_size); 713 r = vm_iomap_memory(vma, sgivwfb_mem_phys, sgivwfb_mem_size);
714 714
715 printk(KERN_DEBUG "sgivwfb: mmap framebuffer P(%lx)->V(%lx)\n", 715 printk(KERN_DEBUG "sgivwfb: mmap framebuffer P(%lx)->V(%lx)\n",
716 offset, vma->vm_start); 716 sgivwfb_mem_phys + (vma->vm_pgoff << PAGE_SHIFT), vma->vm_start);
717 717
718 return r; 718 return r;
719} 719}
diff --git a/drivers/video/sh7760fb.c b/drivers/video/sh7760fb.c
index a8c6c43a4658..1265b25f9f99 100644
--- a/drivers/video/sh7760fb.c
+++ b/drivers/video/sh7760fb.c
@@ -567,7 +567,7 @@ static int sh7760fb_remove(struct platform_device *dev)
567 fb_dealloc_cmap(&info->cmap); 567 fb_dealloc_cmap(&info->cmap);
568 sh7760fb_free_mem(info); 568 sh7760fb_free_mem(info);
569 if (par->irq >= 0) 569 if (par->irq >= 0)
570 free_irq(par->irq, par); 570 free_irq(par->irq, &par->vsync);
571 iounmap(par->base); 571 iounmap(par->base);
572 release_mem_region(par->ioarea->start, resource_size(par->ioarea)); 572 release_mem_region(par->ioarea->start, resource_size(par->ioarea));
573 framebuffer_release(info); 573 framebuffer_release(info);
diff --git a/drivers/video/vga16fb.c b/drivers/video/vga16fb.c
index 830ded45fd47..2827333703d9 100644
--- a/drivers/video/vga16fb.c
+++ b/drivers/video/vga16fb.c
@@ -1265,7 +1265,6 @@ static void vga16fb_imageblit(struct fb_info *info, const struct fb_image *image
1265 1265
1266static void vga16fb_destroy(struct fb_info *info) 1266static void vga16fb_destroy(struct fb_info *info)
1267{ 1267{
1268 struct platform_device *dev = container_of(info->device, struct platform_device, dev);
1269 iounmap(info->screen_base); 1268 iounmap(info->screen_base);
1270 fb_dealloc_cmap(&info->cmap); 1269 fb_dealloc_cmap(&info->cmap);
1271 /* XXX unshare VGA regions */ 1270 /* XXX unshare VGA regions */
diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c
index f3d4a69e1e4e..6629b29a8202 100644
--- a/drivers/video/xilinxfb.c
+++ b/drivers/video/xilinxfb.c
@@ -341,8 +341,8 @@ static int xilinxfb_assign(struct platform_device *pdev,
341 341
342 if (drvdata->flags & BUS_ACCESS_FLAG) { 342 if (drvdata->flags & BUS_ACCESS_FLAG) {
343 /* Put a banner in the log (for DEBUG) */ 343 /* Put a banner in the log (for DEBUG) */
344 dev_dbg(dev, "regs: phys=%x, virt=%p\n", drvdata->regs_phys, 344 dev_dbg(dev, "regs: phys=%pa, virt=%p\n",
345 drvdata->regs); 345 &drvdata->regs_phys, drvdata->regs);
346 } 346 }
347 /* Put a banner in the log (for DEBUG) */ 347 /* Put a banner in the log (for DEBUG) */
348 dev_dbg(dev, "fb: phys=%llx, virt=%p, size=%x\n", 348 dev_dbg(dev, "fb: phys=%llx, virt=%p, size=%x\n",
diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig
index 9e02d60a364b..23eae5cb69c2 100644
--- a/drivers/xen/Kconfig
+++ b/drivers/xen/Kconfig
@@ -145,7 +145,7 @@ config SWIOTLB_XEN
145 145
146config XEN_TMEM 146config XEN_TMEM
147 tristate 147 tristate
148 depends on !ARM 148 depends on !ARM && !ARM64
149 default m if (CLEANCACHE || FRONTSWAP) 149 default m if (CLEANCACHE || FRONTSWAP)
150 help 150 help
151 Shim to interface in-kernel Transcendent Memory hooks 151 Shim to interface in-kernel Transcendent Memory hooks
diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile
index eabd0ee1c2bc..14fe79d8634a 100644
--- a/drivers/xen/Makefile
+++ b/drivers/xen/Makefile
@@ -1,9 +1,8 @@
1ifneq ($(CONFIG_ARM),y) 1ifeq ($(filter y, $(CONFIG_ARM) $(CONFIG_ARM64)),)
2obj-y += manage.o
3obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o 2obj-$(CONFIG_HOTPLUG_CPU) += cpu_hotplug.o
4endif 3endif
5obj-$(CONFIG_X86) += fallback.o 4obj-$(CONFIG_X86) += fallback.o
6obj-y += grant-table.o features.o events.o balloon.o 5obj-y += grant-table.o features.o events.o balloon.o manage.o
7obj-y += xenbus/ 6obj-y += xenbus/
8 7
9nostackp := $(call cc-option, -fno-stack-protector) 8nostackp := $(call cc-option, -fno-stack-protector)
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index a58ac435a9a4..5e8be462aed5 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -348,7 +348,7 @@ static void init_evtchn_cpu_bindings(void)
348 348
349 for_each_possible_cpu(i) 349 for_each_possible_cpu(i)
350 memset(per_cpu(cpu_evtchn_mask, i), 350 memset(per_cpu(cpu_evtchn_mask, i),
351 (i == 0) ? ~0 : 0, sizeof(*per_cpu(cpu_evtchn_mask, i))); 351 (i == 0) ? ~0 : 0, NR_EVENT_CHANNELS/8);
352} 352}
353 353
354static inline void clear_evtchn(int port) 354static inline void clear_evtchn(int port)
@@ -1493,8 +1493,10 @@ void rebind_evtchn_irq(int evtchn, int irq)
1493/* Rebind an evtchn so that it gets delivered to a specific cpu */ 1493/* Rebind an evtchn so that it gets delivered to a specific cpu */
1494static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu) 1494static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu)
1495{ 1495{
1496 struct shared_info *s = HYPERVISOR_shared_info;
1496 struct evtchn_bind_vcpu bind_vcpu; 1497 struct evtchn_bind_vcpu bind_vcpu;
1497 int evtchn = evtchn_from_irq(irq); 1498 int evtchn = evtchn_from_irq(irq);
1499 int masked;
1498 1500
1499 if (!VALID_EVTCHN(evtchn)) 1501 if (!VALID_EVTCHN(evtchn))
1500 return -1; 1502 return -1;
@@ -1511,6 +1513,12 @@ static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu)
1511 bind_vcpu.vcpu = tcpu; 1513 bind_vcpu.vcpu = tcpu;
1512 1514
1513 /* 1515 /*
1516 * Mask the event while changing the VCPU binding to prevent
1517 * it being delivered on an unexpected VCPU.
1518 */
1519 masked = sync_test_and_set_bit(evtchn, BM(s->evtchn_mask));
1520
1521 /*
1514 * If this fails, it usually just indicates that we're dealing with a 1522 * If this fails, it usually just indicates that we're dealing with a
1515 * virq or IPI channel, which don't actually need to be rebound. Ignore 1523 * virq or IPI channel, which don't actually need to be rebound. Ignore
1516 * it, but don't do the xenlinux-level rebind in that case. 1524 * it, but don't do the xenlinux-level rebind in that case.
@@ -1518,6 +1526,9 @@ static int rebind_irq_to_cpu(unsigned irq, unsigned tcpu)
1518 if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu) >= 0) 1526 if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu) >= 0)
1519 bind_evtchn_to_cpu(evtchn, tcpu); 1527 bind_evtchn_to_cpu(evtchn, tcpu);
1520 1528
1529 if (!masked)
1530 unmask_evtchn(evtchn);
1531
1521 return 0; 1532 return 0;
1522} 1533}
1523 1534
diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c
index 8feecf01d55c..b6165e047f48 100644
--- a/drivers/xen/evtchn.c
+++ b/drivers/xen/evtchn.c
@@ -379,18 +379,12 @@ static long evtchn_ioctl(struct file *file,
379 if (unbind.port >= NR_EVENT_CHANNELS) 379 if (unbind.port >= NR_EVENT_CHANNELS)
380 break; 380 break;
381 381
382 spin_lock_irq(&port_user_lock);
383
384 rc = -ENOTCONN; 382 rc = -ENOTCONN;
385 if (get_port_user(unbind.port) != u) { 383 if (get_port_user(unbind.port) != u)
386 spin_unlock_irq(&port_user_lock);
387 break; 384 break;
388 }
389 385
390 disable_irq(irq_from_evtchn(unbind.port)); 386 disable_irq(irq_from_evtchn(unbind.port));
391 387
392 spin_unlock_irq(&port_user_lock);
393
394 evtchn_unbind_from_user(u, unbind.port); 388 evtchn_unbind_from_user(u, unbind.port);
395 389
396 rc = 0; 390 rc = 0;
@@ -490,26 +484,15 @@ static int evtchn_release(struct inode *inode, struct file *filp)
490 int i; 484 int i;
491 struct per_user_data *u = filp->private_data; 485 struct per_user_data *u = filp->private_data;
492 486
493 spin_lock_irq(&port_user_lock);
494
495 free_page((unsigned long)u->ring);
496
497 for (i = 0; i < NR_EVENT_CHANNELS; i++) { 487 for (i = 0; i < NR_EVENT_CHANNELS; i++) {
498 if (get_port_user(i) != u) 488 if (get_port_user(i) != u)
499 continue; 489 continue;
500 490
501 disable_irq(irq_from_evtchn(i)); 491 disable_irq(irq_from_evtchn(i));
502 }
503
504 spin_unlock_irq(&port_user_lock);
505
506 for (i = 0; i < NR_EVENT_CHANNELS; i++) {
507 if (get_port_user(i) != u)
508 continue;
509
510 evtchn_unbind_from_user(get_port_user(i), i); 492 evtchn_unbind_from_user(get_port_user(i), i);
511 } 493 }
512 494
495 free_page((unsigned long)u->ring);
513 kfree(u->name); 496 kfree(u->name);
514 kfree(u); 497 kfree(u);
515 498
diff --git a/drivers/xen/xenbus/xenbus_probe_frontend.c b/drivers/xen/xenbus/xenbus_probe_frontend.c
index 6ed8a9df4472..34b20bfa4e8c 100644
--- a/drivers/xen/xenbus/xenbus_probe_frontend.c
+++ b/drivers/xen/xenbus/xenbus_probe_frontend.c
@@ -115,7 +115,6 @@ static int xenbus_frontend_dev_resume(struct device *dev)
115 return -EFAULT; 115 return -EFAULT;
116 } 116 }
117 117
118 INIT_WORK(&xdev->work, xenbus_frontend_delayed_resume);
119 queue_work(xenbus_frontend_wq, &xdev->work); 118 queue_work(xenbus_frontend_wq, &xdev->work);
120 119
121 return 0; 120 return 0;
@@ -124,6 +123,16 @@ static int xenbus_frontend_dev_resume(struct device *dev)
124 return xenbus_dev_resume(dev); 123 return xenbus_dev_resume(dev);
125} 124}
126 125
126static int xenbus_frontend_dev_probe(struct device *dev)
127{
128 if (xen_store_domain_type == XS_LOCAL) {
129 struct xenbus_device *xdev = to_xenbus_device(dev);
130 INIT_WORK(&xdev->work, xenbus_frontend_delayed_resume);
131 }
132
133 return xenbus_dev_probe(dev);
134}
135
127static const struct dev_pm_ops xenbus_pm_ops = { 136static const struct dev_pm_ops xenbus_pm_ops = {
128 .suspend = xenbus_dev_suspend, 137 .suspend = xenbus_dev_suspend,
129 .resume = xenbus_frontend_dev_resume, 138 .resume = xenbus_frontend_dev_resume,
@@ -142,7 +151,7 @@ static struct xen_bus_type xenbus_frontend = {
142 .name = "xen", 151 .name = "xen",
143 .match = xenbus_match, 152 .match = xenbus_match,
144 .uevent = xenbus_uevent_frontend, 153 .uevent = xenbus_uevent_frontend,
145 .probe = xenbus_dev_probe, 154 .probe = xenbus_frontend_dev_probe,
146 .remove = xenbus_dev_remove, 155 .remove = xenbus_dev_remove,
147 .shutdown = xenbus_dev_shutdown, 156 .shutdown = xenbus_dev_shutdown,
148 .dev_attrs = xenbus_dev_attrs, 157 .dev_attrs = xenbus_dev_attrs,
@@ -474,7 +483,11 @@ static int __init xenbus_probe_frontend_init(void)
474 483
475 register_xenstore_notifier(&xenstore_notifier); 484 register_xenstore_notifier(&xenstore_notifier);
476 485
477 xenbus_frontend_wq = create_workqueue("xenbus_frontend"); 486 if (xen_store_domain_type == XS_LOCAL) {
487 xenbus_frontend_wq = create_workqueue("xenbus_frontend");
488 if (!xenbus_frontend_wq)
489 pr_warn("create xenbus frontend workqueue failed, S3 resume is likely to fail\n");
490 }
478 491
479 return 0; 492 return 0;
480} 493}